broadcom: add performance counters for V3D 7.x

Some of the counters need to be defined correctly.

v2: Remove references to extended performance counters. The hw does
    not support them.

Signed-off-by: Juan A. Suarez Romero <jasuarez@igalia.com>

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450>
This commit is contained in:
Juan A. Suarez Romero 2023-02-22 09:43:40 +01:00 committed by Marge Bot
parent d25aec0d38
commit 314c8965a6
13 changed files with 233 additions and 59 deletions

View file

@ -28,6 +28,110 @@
#define V3D_PERFCNT_NAME 1
#define V3D_PERFCNT_DESCRIPTION 2
#ifndef V3D_VERSION
# error "The V3D_VERSION macro must be defined"
#endif
#if (V3D_VERSION >= 71)
static const char *v3d_performance_counters[][3] = {
{"CORE", "cycle-count", "[CORE] Cycle counter"},
{"CORE", "core-active", "[CORE] Bin/Render/Compute active cycles"},
{"CLE", "CLE-bin-thread-active-cycles", "[CLE] Bin thread active cycles"},
{"CLE", "CLE-render-thread-active-cycles", "[CLE] Render thread active cycles"},
{"CORE", "compute-active-cycles", "[CORE] Compute active cycles"},
{"FEP", "FEP-valid-primitives-no-rendered-pixels", "[FEP] Valid primitives that result in no rendered pixels, for all rendered tiles"},
{"FEP", "FEP-valid-primitives-rendered-pixels", "[FEP] Valid primitives for all rendered tiles (primitives may be counted in more than one tile)"},
{"FEP", "FEP-clipped-quads", "[FEP] Early-Z/Near/Far clipped quads"},
{"FEP", "FEP-valid-quads", "[FEP] Valid quads"},
{"TLB", "TLB-quads-not-passing-stencil-test", "[TLB] Quads with no pixels passing the stencil test"},
{"TLB", "TLB-quads-not-passing-z-and-stencil-test", "[TLB] Quads with no pixels passing the Z and stencil tests"},
{"TLB", "TLB-quads-passing-z-and-stencil-test", "[TLB] Quads with any pixels passing the Z and stencil tests"},
{"TLB", "TLB-quads-written-to-color-buffer", "[TLB] Quads with valid pixels written to colour buffer"},
{"TLB", "TLB-partial-quads-written-to-color-buffer", "[TLB] Partial quads written to the colour buffer"},
{"PTB", "PTB-primitives-need-clipping", "[PTB] Primitives that need clipping"},
{"PTB", "PTB-primitives-discarded-outside-viewport", "[PTB] Primitives discarded by being outside the viewport"},
{"PTB", "PTB-primitives-binned", "[PTB] Total primitives binned"},
{"PTB", "PTB-primitives-discarded-reversed", "[PTB] Primitives that are discarded because they are reversed"},
{"QPU", "QPU-total-instr-cache-hit", "[QPU] Total instruction cache hits for all slices"},
{"QPU", "QPU-total-instr-cache-miss", "[QPU] Total instruction cache misses for all slices"},
{"QPU", "QPU-total-uniform-cache-hit", "[QPU] Total uniforms cache hits for all slices"},
{"QPU", "QPU-total-uniform-cache-miss", "[QPU] Total uniforms cache misses for all slices"},
{"TMU", "TMU-active-cycles", "[TMU] Active cycles"},
{"TMU", "TMU-stalled-cycles", "[TMU] Stalled cycles"},
{"TMU", "TMU-total-text-quads-access", "[TMU] Total texture cache accesses"},
{"TMU", "TMU-cache-x4-active-cycles", "[TMU] Cache active cycles for x4 access"},
{"TMU", "TMU-cache-x4-stalled-cycles", "[TMU] Cache stalled cycles for x4 access"},
{"TMU", "TMU-total-text-quads-x4-access", "[TMU] Total texture cache x4 access"},
{"L2T", "L2T-total-cache-hit", "[L2T] Total Level 2 cache hits"},
{"L2T", "L2T-total-cache-miss", "[L2T] Total Level 2 cache misses"},
{"L2T", "L2T-local", "[L2T] Local mode access"},
{"L2T", "L2T-writeback", "[L2T] Writeback"},
{"L2T", "L2T-zero", "[L2T] Zero"},
{"L2T", "L2T-merge", "[L2T] Merge"},
{"L2T", "L2T-fill", "[L2T] Fill"},
{"L2T", "L2T-stalls-no-wid", "[L2T] Stalls because no WID available"},
{"L2T", "L2T-stalls-no-rid", "[L2T] Stalls because no RID available"},
{"L2T", "L2T-stalls-queue-full", "[L2T] Stalls because internal queue full"},
{"L2T", "L2T-stalls-wrightback", "[L2T] Stalls because writeback in flight"},
{"L2T", "L2T-stalls-mem", "[L2T] Stalls because AXI blocks read"},
{"L2T", "L2T-stalls-fill", "[L2T] Stalls because fill pending for victim cache-line"},
{"L2T", "L2T-hitq", "[L2T] Sent request via hit queue"},
{"L2T", "L2T-hitq-full", "[L2T] Sent request via main queue because hit queue is full"},
{"L2T", "L2T-stalls-read-data", "[L2T] Stalls because waiting for data from SDRAM"},
{"L2T", "L2T-TMU-read-hits", "[L2T] TMU read hits"},
{"L2T", "L2T-TMU-read-miss", "[L2T] TMU read misses"},
{"L2T", "L2T-VCD-read-hits", "[L2T] VCD read hits"},
{"L2T", "L2T-VCD-read-miss", "[L2T] VCD read misses"},
{"L2T", "L2T-SLC-read-hits", "[L2T] SLC read hits (all slices)"},
{"L2T", "L2T-SLC-read-miss", "[L2T] SLC read misses (all slices)"},
{"AXI", "AXI-writes-seen-watch-0", "[AXI] Writes seen by watch 0"},
{"AXI", "AXI-reads-seen-watch-0", "[AXI] Reads seen by watch 0"},
{"AXI", "AXI-writes-stalled-seen-watch-0", "[AXI] Write stalls seen by watch 0"},
{"AXI", "AXI-reads-stalled-seen-watch-0", "[AXI] Read stalls seen by watch 0"},
{"AXI", "AXI-write-bytes-seen-watch-0", "[AXI] Total bytes written seen by watch 0"},
{"AXI", "AXI-read-bytes-seen-watch-0", "[AXI] Total bytes read seen by watch 0"},
{"AXI", "AXI-writes-seen-watch-1", "[AXI] Writes seen by watch 1"},
{"AXI", "AXI-reads-seen-watch-1", "[AXI] Reads seen by watch 1"},
{"AXI", "AXI-writes-stalled-seen-watch-1", "[AXI] Write stalls seen by watch 1"},
{"AXI", "AXI-reads-stalled-seen-watch-1", "[AXI] Read stalls seen by watch 1"},
{"AXI", "AXI-write-bytes-seen-watch-1", "[AXI] Total bytes written seen by watch 1"},
{"AXI", "AXI-read-bytes-seen-watch-1", "[AXI] Total bytes read seen by watch 1"},
{"CORE", "core-memory-writes", "[CORE] Total memory writes"},
{"L2T", "L2T-memory-writes", "[L2T] Total memory writes"},
{"PTB", "PTB-memory-writes", "[PTB] Total memory writes"},
{"TLB", "TLB-memory-writes", "[TLB] Total memory writes"},
{"CORE", "core-memory-reads", "[CORE] Total memory reads"},
{"L2T", "L2T-memory-reads", "[L2T] Total memory reads"},
{"PTB", "PTB-memory-reads", "[PTB] Total memory reads"},
{"PSE", "PSE-memory-reads", "[PSE] Total memory reads"},
{"TLB", "TLB-memory-reads", "[TLB] Total memory reads"},
{"PTB", "PTB-memory-words-writes", "[PTB] Total memory words written"},
{"TLB", "TLB-memory-words-writes", "[TLB] Total memory words written"},
{"PSE", "PSE-memory-words-reads", "[PSE] Total memory words read"},
{"TLB", "TLB-memory-words-reads", "[TLB] Total memory words read"},
{"AXI", "AXI-read-trans", "[AXI] Read transaction count"},
{"AXI", "AXI-write-trans", "[AXI] Write transaction count"},
{"AXI", "AXI-read-wait-cycles", "[AXI] Read total wait cycles"},
{"AXI", "AXI-write-wait-cycles", "[AXI] Write total wait cycles"},
{"AXI", "AXI-max-outstanding-reads", "[AXI] Maximium outstanding read transactions"},
{"AXI", "AXI-max-outstanding-writes", "[AXI] Maximum outstanding write transactions"},
{"QPU", "QPU-wait-bubble", "[QPU] Pipeline bubble in qcycles due all threads waiting"},
{"QPU", "QPU-ic-miss-bubble", "[QPU] Pipeline bubble in qcycles due instruction-cache miss"},
{"QPU", "QPU-active", "[QPU] Executed shader instruction"},
{"QPU", "QPU-total-active-clk-cycles-fragment-shading", "[QPU] Total active clock cycles for all QPUs doing fragment shading (counts only when QPU is not stalled)"},
{"QPU", "QPU-stalls", "[QPU] Stalled qcycles executing shader instruction"},
{"QPU", "QPU-total-clk-cycles-waiting-fragment-shading", "[QPU] Total stalled clock cycles for all QPUs doing fragment shading"},
{"QPU", "QPU-stalls-TMU", "[QPU] Stalled qcycles waiting for TMU"},
{"QPU", "QPU-stalls-TLB", "[QPU] Stalled qcycles waiting for TLB"},
{"QPU", "QPU-stalls-VPM", "[QPU] Stalled qcycles waiting for VPM"},
{"QPU", "QPU-stalls-uniforms", "[QPU] Stalled qcycles waiting for uniforms"},
{"QPU", "QPU-stalls-SFU", "[QPU] Stalled qcycles waiting for SFU"},
{"QPU", "QPU-stalls-other", "[QPU] Stalled qcycles waiting for any other reason (vary/W/Z)"},
};
#elif (V3D_VERSION >= 41)
static const char *v3d_performance_counters[][3] = {
{"FEP", "FEP-valid-primitives-no-rendered-pixels", "[FEP] Valid primitives that result in no rendered pixels, for all rendered tiles"},
{"FEP", "FEP-valid-primitives-rendered-pixels", "[FEP] Valid primitives for all rendered tiles (primitives may be counted in more than one tile)"},
@ -118,4 +222,8 @@ static const char *v3d_performance_counters[][3] = {
{"CORE", "compute-active-cycles", "[CORE] Compute active cycles"},
};
#else
static const char *v3d_performance_counters[][3] = { };
#endif
#endif

View file

@ -92,6 +92,9 @@ static struct v3d_simulator_state {
/** Last performance monitor ID. */
uint32_t last_perfid;
/** Total performance counters */
uint32_t perfcnt_total;
struct util_dynarray bin_oom;
int refcount;
} sim_state = {
@ -751,7 +754,7 @@ v3d_simulator_perfmon_create_ioctl(int fd, struct drm_v3d_perfmon_create *args)
perfmon->ncounters = args->ncounters;
for (int i = 0; i < args->ncounters; i++) {
if (args->counters[i] >= V3D_PERFCNT_NUM) {
if (args->counters[i] >= sim_state.perfcnt_total) {
ralloc_free(perfmon);
return -EINVAL;
} else {
@ -918,13 +921,16 @@ v3d_simulator_init_global()
switch(sim_state.ver) {
case 33:
v3d33_simulator_init_regs(sim_state.v3d);
sim_state.perfcnt_total = 0;
break;
case 41:
case 42:
v3d41_simulator_init_regs(sim_state.v3d);
sim_state.perfcnt_total = 87;
break;
case 71:
v3d71_simulator_init_regs(sim_state.v3d);
sim_state.perfcnt_total = 93;
break;
default:
unreachable("Not supported V3D version\n");

View file

@ -50,7 +50,7 @@
#include "libs/core/v3d/registers/7.1.6.0/v3d.h"
#else
#if V3D_VERSION == 41 || V3D_VERSION == 42
#include "libs/core/v3d/registers/4.1.35.0/v3d.h"
#include "libs/core/v3d/registers/4.2.14.0/v3d.h"
#else
#include "libs/core/v3d/registers/3.3.0.0/v3d.h"
#endif

View file

@ -65,6 +65,7 @@ files_per_version = files(
'v3dvx_pipeline.c',
'v3dvx_meta_common.c',
'v3dvx_pipeline.c',
'v3dvx_query.c',
'v3dvx_queue.c',
)

View file

@ -129,6 +129,9 @@ struct v3d_simulator_file;
/* Minimum required by the Vulkan 1.1 spec */
#define MAX_MEMORY_ALLOCATION_SIZE (1ull << 30)
/* Maximum performance counters number */
#define V3D_MAX_PERFCNT 93
struct v3dv_physical_device {
struct vk_physical_device vk;
@ -1209,7 +1212,7 @@ struct v3dv_timestamp_query_cpu_job_info {
};
/* Number of perfmons required to handle all supported performance counters */
#define V3DV_MAX_PERFMONS DIV_ROUND_UP(V3D_PERFCNT_NUM, \
#define V3DV_MAX_PERFMONS DIV_ROUND_UP(V3D_MAX_PERFCNT, \
DRM_V3D_MAX_PERF_COUNTERS)
struct v3dv_perf_query {
@ -1680,7 +1683,7 @@ struct v3dv_query_pool {
/* Only used with performance queries */
struct {
uint32_t ncounters;
uint8_t counters[V3D_PERFCNT_NUM];
uint8_t counters[V3D_MAX_PERFCNT];
/* V3D has a limit on the number of counters we can track in a
* single performance monitor, so if too many counters are requested

View file

@ -23,7 +23,6 @@
#include "v3dv_private.h"
#include "common/v3d_performance_counters.h"
#include "util/timespec.h"
#include "compiler/nir/nir_builder.h"
@ -48,7 +47,7 @@ kperfmon_create(struct v3dv_device *device,
DRM_IOCTL_V3D_PERFMON_CREATE,
&req);
if (ret)
fprintf(stderr, "Failed to create perfmon: %s\n", strerror(ret));
fprintf(stderr, "Failed to create perfmon for query %d: %s\n", query, strerror(ret));
pool->queries[query].perf.kperfmon_ids[i] = req.id;
}
@ -303,7 +302,6 @@ v3dv_CreateQueryPool(VkDevice _device,
QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR);
assert(pq_info);
assert(pq_info->counterIndexCount <= V3D_PERFCNT_NUM);
pool->perfmon.ncounters = pq_info->counterIndexCount;
for (uint32_t i = 0; i < pq_info->counterIndexCount; i++)
@ -592,7 +590,7 @@ write_performance_query_result(struct v3dv_device *device,
assert(pool && pool->query_type == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR);
struct v3dv_query *q = &pool->queries[query];
uint64_t counter_values[V3D_PERFCNT_NUM];
uint64_t counter_values[V3D_MAX_PERFCNT];
for (uint32_t i = 0; i < pool->perfmon.nperfmons; i++) {
struct drm_v3d_perfmon_get_values req = {
@ -1284,40 +1282,11 @@ v3dv_EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
VkPerformanceCounterKHR *pCounters,
VkPerformanceCounterDescriptionKHR *pCounterDescriptions)
{
uint32_t desc_count = *pCounterCount;
V3DV_FROM_HANDLE(v3dv_physical_device, pDevice, physicalDevice);
VK_OUTARRAY_MAKE_TYPED(VkPerformanceCounterKHR,
out, pCounters, pCounterCount);
VK_OUTARRAY_MAKE_TYPED(VkPerformanceCounterDescriptionKHR,
out_desc, pCounterDescriptions, &desc_count);
for (int i = 0; i < ARRAY_SIZE(v3d_performance_counters); i++) {
vk_outarray_append_typed(VkPerformanceCounterKHR, &out, counter) {
counter->unit = VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR;
counter->scope = VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR;
counter->storage = VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR;
unsigned char sha1_result[20];
_mesa_sha1_compute(v3d_performance_counters[i][V3D_PERFCNT_NAME],
strlen(v3d_performance_counters[i][V3D_PERFCNT_NAME]),
sha1_result);
memcpy(counter->uuid, sha1_result, sizeof(counter->uuid));
}
vk_outarray_append_typed(VkPerformanceCounterDescriptionKHR,
&out_desc, desc) {
desc->flags = 0;
snprintf(desc->name, sizeof(desc->name), "%s",
v3d_performance_counters[i][V3D_PERFCNT_NAME]);
snprintf(desc->category, sizeof(desc->category), "%s",
v3d_performance_counters[i][V3D_PERFCNT_CATEGORY]);
snprintf(desc->description, sizeof(desc->description), "%s",
v3d_performance_counters[i][V3D_PERFCNT_DESCRIPTION]);
}
}
return vk_outarray_status(&out);
return v3dv_X(pDevice, enumerate_performance_query_counters)(pCounterCount,
pCounters,
pCounterDescriptions);
}
VKAPI_ATTR void VKAPI_CALL

View file

@ -324,6 +324,12 @@ v3dX(create_default_attribute_values)(struct v3dv_device *device,
void
v3dX(job_emit_noop)(struct v3dv_job *job);
/* Used at v3dv_query */
VkResult
v3dX(enumerate_performance_query_counters)(uint32_t *pCounterCount,
VkPerformanceCounterKHR *pCounters,
VkPerformanceCounterDescriptionKHR *pCounterDescriptions);
/* Used at v3dv_descriptor_set, and other descriptor set utils */
uint32_t v3dX(descriptor_bo_size)(VkDescriptorType type);

View file

@ -0,0 +1,67 @@
/*
* Copyright © 2023 Raspberry Pi Ltd
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#include "v3dv_private.h"
#include "common/v3d_performance_counters.h"
VkResult
v3dX(enumerate_performance_query_counters)(uint32_t *pCounterCount,
VkPerformanceCounterKHR *pCounters,
VkPerformanceCounterDescriptionKHR *pCounterDescriptions)
{
uint32_t desc_count = *pCounterCount;
VK_OUTARRAY_MAKE_TYPED(VkPerformanceCounterKHR,
out, pCounters, pCounterCount);
VK_OUTARRAY_MAKE_TYPED(VkPerformanceCounterDescriptionKHR,
out_desc, pCounterDescriptions, &desc_count);
for (int i = 0; i < ARRAY_SIZE(v3d_performance_counters); i++) {
vk_outarray_append_typed(VkPerformanceCounterKHR, &out, counter) {
counter->unit = VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR;
counter->scope = VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR;
counter->storage = VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR;
unsigned char sha1_result[20];
_mesa_sha1_compute(v3d_performance_counters[i][V3D_PERFCNT_NAME],
strlen(v3d_performance_counters[i][V3D_PERFCNT_NAME]),
sha1_result);
memcpy(counter->uuid, sha1_result, sizeof(counter->uuid));
}
vk_outarray_append_typed(VkPerformanceCounterDescriptionKHR,
&out_desc, desc) {
desc->flags = 0;
snprintf(desc->name, sizeof(desc->name), "%s",
v3d_performance_counters[i][V3D_PERFCNT_NAME]);
snprintf(desc->category, sizeof(desc->category), "%s",
v3d_performance_counters[i][V3D_PERFCNT_CATEGORY]);
snprintf(desc->description, sizeof(desc->description), "%s",
v3d_performance_counters[i][V3D_PERFCNT_DESCRIPTION]);
}
}
return vk_outarray_status(&out);
}

View file

@ -34,7 +34,6 @@ files_libv3d = files(
'v3d_query.c',
'v3d_query.h',
'v3d_query_pipe.c',
'v3d_query_perfcnt.c',
'v3d_resource.c',
'v3d_resource.h',
'v3d_screen.c',
@ -47,6 +46,7 @@ files_per_version = files(
'v3dx_emit.c',
'v3dx_format_table.c',
'v3dx_job.c',
'v3dx_query_perfcnt.c',
'v3dx_rcl.c',
'v3dx_state.c',
'v3dx_tfu.c',

View file

@ -28,8 +28,11 @@ v3d_get_driver_query_group_info(struct pipe_screen *pscreen, unsigned index,
struct pipe_driver_query_group_info *info)
{
struct v3d_screen *screen = v3d_screen(pscreen);
struct v3d_device_info *devinfo = &screen->devinfo;
return v3d_get_driver_query_group_info_perfcnt(screen, index, info);
return v3d_X(devinfo, get_driver_query_group_info_perfcnt)(screen,
index,
info);
}
int
@ -37,8 +40,11 @@ v3d_get_driver_query_info(struct pipe_screen *pscreen, unsigned index,
struct pipe_driver_query_info *info)
{
struct v3d_screen *screen = v3d_screen(pscreen);
struct v3d_device_info *devinfo = &screen->devinfo;
return v3d_get_driver_query_info_perfcnt(screen, index, info);
return v3d_X(devinfo, get_driver_query_info_perfcnt)(screen,
index,
info);
}
static struct pipe_query *
@ -53,9 +59,13 @@ static struct pipe_query *
v3d_create_batch_query(struct pipe_context *pctx, unsigned num_queries,
unsigned *query_types)
{
return v3d_create_batch_query_perfcnt(v3d_context(pctx),
num_queries,
query_types);
struct v3d_context *v3d = v3d_context(pctx);
struct v3d_screen *screen = v3d->screen;
struct v3d_device_info *devinfo = &screen->devinfo;
return v3d_X(devinfo, create_batch_query_perfcnt)(v3d_context(pctx),
num_queries,
query_types);
}
static void

View file

@ -42,11 +42,5 @@ struct v3d_query
};
struct pipe_query *v3d_create_query_pipe(struct v3d_context *v3d, unsigned query_type, unsigned index);
struct pipe_query *v3d_create_batch_query_perfcnt(struct v3d_context *v3d, unsigned num_queries,
unsigned *query_types);
int v3d_get_driver_query_group_info_perfcnt(struct v3d_screen *screen, unsigned index,
struct pipe_driver_query_group_info *info);
int v3d_get_driver_query_info_perfcnt(struct v3d_screen *screen, unsigned index,
struct pipe_driver_query_info *info);
#endif /* V3D_QUERY_H */

View file

@ -61,3 +61,13 @@ bool v3dX(tfu)(struct pipe_context *pctx,
unsigned int src_layer,
unsigned int dst_layer,
bool for_mipmap);
int v3dX(get_driver_query_group_info_perfcnt)(struct v3d_screen *screen,
unsigned index,
struct pipe_driver_query_group_info *info);
int v3dX(get_driver_query_info_perfcnt)(struct v3d_screen *screen,
unsigned index,
struct pipe_driver_query_info *info);
struct pipe_query *v3dX(create_batch_query_perfcnt)(struct v3d_context *v3d,
unsigned num_queries,
unsigned *query_types);

View file

@ -52,8 +52,8 @@ kperfmon_destroy(struct v3d_context *v3d, struct v3d_perfmon_state *perfmon)
}
int
v3d_get_driver_query_group_info_perfcnt(struct v3d_screen *screen, unsigned index,
struct pipe_driver_query_group_info *info)
v3dX(get_driver_query_group_info_perfcnt)(struct v3d_screen *screen, unsigned index,
struct pipe_driver_query_group_info *info)
{
if (!screen->has_perfmon)
return 0;
@ -72,8 +72,8 @@ v3d_get_driver_query_group_info_perfcnt(struct v3d_screen *screen, unsigned inde
}
int
v3d_get_driver_query_info_perfcnt(struct v3d_screen *screen, unsigned index,
struct pipe_driver_query_info *info)
v3dX(get_driver_query_info_perfcnt)(struct v3d_screen *screen, unsigned index,
struct pipe_driver_query_info *info)
{
if (!screen->has_perfmon)
return 0;
@ -222,8 +222,8 @@ static const struct v3d_query_funcs perfcnt_query_funcs = {
};
struct pipe_query *
v3d_create_batch_query_perfcnt(struct v3d_context *v3d, unsigned num_queries,
unsigned *query_types)
v3dX(create_batch_query_perfcnt)(struct v3d_context *v3d, unsigned num_queries,
unsigned *query_types)
{
struct v3d_query_perfcnt *pquery = NULL;
struct v3d_query *query;