mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 14:38:06 +02:00
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:
parent
d25aec0d38
commit
314c8965a6
13 changed files with 233 additions and 59 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -65,6 +65,7 @@ files_per_version = files(
|
|||
'v3dvx_pipeline.c',
|
||||
'v3dvx_meta_common.c',
|
||||
'v3dvx_pipeline.c',
|
||||
'v3dvx_query.c',
|
||||
'v3dvx_queue.c',
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
67
src/broadcom/vulkan/v3dvx_query.c
Normal file
67
src/broadcom/vulkan/v3dvx_query.c
Normal 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);
|
||||
}
|
||||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
Loading…
Add table
Reference in a new issue