freedreno/registers: fix RBBM_PRIMCTR understanding and usage

RBBM_PRIMCTR registers are used for different pipeline statistics that can
be queried, but current usage was wrong in some cases. Comments in the
register file are updated, and the per-statistic register index mapping is
updated accordingly.

Fixes on a750:
  test_query_pipeline_statistics in vkd3d-proton
  arb_query_buffer_object failures in piglit (zink)

Signed-off-by: Zan Dobersek <zdobersek@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32900>
This commit is contained in:
Zan Dobersek 2025-01-06 12:57:08 +01:00 committed by Marge Bot
parent 3fed68b607
commit 7c927144b3
5 changed files with 22 additions and 46 deletions

View file

@ -4,7 +4,6 @@ test_early_depth_stencil_tests,Fail
test_index_buffer_edge_case_stream_output,Fail
test_multisample_resolve_strongly_typed,Fail
test_primitive_restart_list_topology_stream_output,Fail
test_query_pipeline_statistics,Fail
test_sampler_rounding,Fail
test_shader_instructions,Fail
test_shader_sm66_quad_op_semantics,Fail

View file

@ -2633,27 +2633,27 @@ to upconvert to 32b float internally?
vertices in, number of primnitives assembled etc.
-->
<reg32 offset="0x0540" name="RBBM_PRIMCTR_0_LO"/> <!-- vs vertices in -->
<reg32 offset="0x0540" name="RBBM_PRIMCTR_0_LO"/> <!-- IA_VERTICES -->
<reg32 offset="0x0541" name="RBBM_PRIMCTR_0_HI"/>
<reg32 offset="0x0542" name="RBBM_PRIMCTR_1_LO"/> <!-- vs primitives out -->
<reg32 offset="0x0542" name="RBBM_PRIMCTR_1_LO"/> <!-- IA_PRIMITIVES -->
<reg32 offset="0x0543" name="RBBM_PRIMCTR_1_HI"/>
<reg32 offset="0x0544" name="RBBM_PRIMCTR_2_LO"/> <!-- hs vertices in -->
<reg32 offset="0x0544" name="RBBM_PRIMCTR_2_LO"/> <!-- VS_INVOCATIONS -->
<reg32 offset="0x0545" name="RBBM_PRIMCTR_2_HI"/>
<reg32 offset="0x0546" name="RBBM_PRIMCTR_3_LO"/> <!-- hs patches out -->
<reg32 offset="0x0546" name="RBBM_PRIMCTR_3_LO"/> <!-- HS_INVOCATIONS -->
<reg32 offset="0x0547" name="RBBM_PRIMCTR_3_HI"/>
<reg32 offset="0x0548" name="RBBM_PRIMCTR_4_LO"/> <!-- dss vertices in -->
<reg32 offset="0x0548" name="RBBM_PRIMCTR_4_LO"/> <!-- DS_INVOCATIONS -->
<reg32 offset="0x0549" name="RBBM_PRIMCTR_4_HI"/>
<reg32 offset="0x054a" name="RBBM_PRIMCTR_5_LO"/> <!-- ds primitives out -->
<reg32 offset="0x054a" name="RBBM_PRIMCTR_5_LO"/> <!-- GS_INVOCATIONS -->
<reg32 offset="0x054b" name="RBBM_PRIMCTR_5_HI"/>
<reg32 offset="0x054c" name="RBBM_PRIMCTR_6_LO"/> <!-- gs primitives in -->
<reg32 offset="0x054c" name="RBBM_PRIMCTR_6_LO"/> <!-- GS_PRIMITIVES -->
<reg32 offset="0x054d" name="RBBM_PRIMCTR_6_HI"/>
<reg32 offset="0x054e" name="RBBM_PRIMCTR_7_LO"/> <!-- gs primitives out -->
<reg32 offset="0x054e" name="RBBM_PRIMCTR_7_LO"/> <!-- C_INVOCATIONS -->
<reg32 offset="0x054f" name="RBBM_PRIMCTR_7_HI"/>
<reg32 offset="0x0550" name="RBBM_PRIMCTR_8_LO"/> <!-- gs primitives out -->
<reg32 offset="0x0550" name="RBBM_PRIMCTR_8_LO"/> <!-- C_PRIMITIVES -->
<reg32 offset="0x0551" name="RBBM_PRIMCTR_8_HI"/>
<reg32 offset="0x0552" name="RBBM_PRIMCTR_9_LO"/> <!-- raster primitives in -->
<reg32 offset="0x0552" name="RBBM_PRIMCTR_9_LO"/> <!-- PS_INVOCATIONS -->
<reg32 offset="0x0553" name="RBBM_PRIMCTR_9_HI"/>
<reg32 offset="0x0554" name="RBBM_PRIMCTR_10_LO"/>
<reg32 offset="0x0554" name="RBBM_PRIMCTR_10_LO"/> <!-- CS_INVOCATIONS -->
<reg32 offset="0x0555" name="RBBM_PRIMCTR_10_HI"/>
<reg32 offset="0xF400" name="RBBM_SECVID_TRUST_CNTL"/>

View file

@ -388,14 +388,11 @@ statistics_index(uint32_t *statistics)
switch (1 << stat) {
case VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT:
case VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT:
return 0;
case VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT:
return 1;
case VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT:
case VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT:
return 2;
case VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT:
return 4;
case VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT:
return 5;
case VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT:
@ -406,6 +403,10 @@ statistics_index(uint32_t *statistics)
return 8;
case VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT:
return 9;
case VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT:
return 3;
case VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT:
return 4;
case VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT:
return 10;
default:

View file

@ -403,18 +403,15 @@ FD_DEFINE_CAST(fd_acc_query_sample, fd6_pipeline_stats_sample);
* ----------------------------+--------------------------------------------+----------------
* IA_VERTICES | INPUT_ASSEMBLY_VERTICES | RBBM_PRIMCTR_0
* IA_PRIMITIVES | INPUT_ASSEMBLY_PRIMITIVES | RBBM_PRIMCTR_1
* VS_INVOCATIONS | VERTEX_SHADER_INVOCATIONS | RBBM_PRIMCTR_0
* VS_INVOCATIONS | VERTEX_SHADER_INVOCATIONS | RBBM_PRIMCTR_2
* GS_INVOCATIONS | GEOMETRY_SHADER_INVOCATIONS | RBBM_PRIMCTR_5
* GS_PRIMITIVES | GEOMETRY_SHADER_PRIMITIVES | RBBM_PRIMCTR_6
* C_INVOCATIONS | CLIPPING_INVOCATIONS | RBBM_PRIMCTR_7
* C_PRIMITIVES | CLIPPING_PRIMITIVES | RBBM_PRIMCTR_8
* PS_INVOCATIONS | FRAGMENT_SHADER_INVOCATIONS | RBBM_PRIMCTR_9
* HS_INVOCATIONS | TESSELLATION_CONTROL_SHADER_PATCHES | RBBM_PRIMCTR_2
* HS_INVOCATIONS | TESSELLATION_CONTROL_SHADER_PATCHES | RBBM_PRIMCTR_3
* DS_INVOCATIONS | TESSELLATION_EVALUATION_SHADER_INVOCATIONS | RBBM_PRIMCTR_4
* CS_INVOCATIONS | COMPUTE_SHADER_INVOCATIONS | RBBM_PRIMCTR_10
*
* Note that "Vertices corresponding to incomplete primitives may contribute to the count.",
* in our case they do not, so IA_VERTICES and VS_INVOCATIONS are the same thing.
*/
enum stats_type {
@ -454,13 +451,13 @@ stats_counter_index(struct fd_acc_query *aq)
switch (aq->base.index) {
case PIPE_STAT_QUERY_IA_VERTICES: return 0;
case PIPE_STAT_QUERY_IA_PRIMITIVES: return 1;
case PIPE_STAT_QUERY_VS_INVOCATIONS: return 0;
case PIPE_STAT_QUERY_VS_INVOCATIONS: return 2;
case PIPE_STAT_QUERY_GS_INVOCATIONS: return 5;
case PIPE_STAT_QUERY_GS_PRIMITIVES: return 6;
case PIPE_STAT_QUERY_C_INVOCATIONS: return 7;
case PIPE_STAT_QUERY_C_PRIMITIVES: return 8;
case PIPE_STAT_QUERY_PS_INVOCATIONS: return 9;
case PIPE_STAT_QUERY_HS_INVOCATIONS: return 2;
case PIPE_STAT_QUERY_HS_INVOCATIONS: return 3;
case PIPE_STAT_QUERY_DS_INVOCATIONS: return 4;
case PIPE_STAT_QUERY_CS_INVOCATIONS: return 10;
default:
@ -473,10 +470,10 @@ log_pipeline_stats(struct fd6_pipeline_stats_sample *ps, unsigned idx)
{
#ifdef DEBUG_COUNTERS
const char *labels[] = {
"VS_INVOCATIONS",
"IA_VERTICES",
"IA_PRIMITIVES",
"VS_INVOCATIONS",
"HS_INVOCATIONS",
"??",
"DS_INVOCATIONS",
"GS_INVOCATIONS",
"GS_PRIMITIVES",

View file

@ -100,27 +100,6 @@ spec@arb_internalformat_query2@all internalformat_<x>_type pname checks@GL_INTER
spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex,Fail
spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex@'vs_input2' on GL_PROGRAM_INPUT,Fail
spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex@'vs_input2[1][0]' on GL_PROGRAM_INPUT,Fail
spec@arb_query_buffer_object@coherency,Fail
spec@arb_query_buffer_object@coherency@index-buffer-GL_TESS_CONTROL_SHADER_PATCHES,Fail
spec@arb_query_buffer_object@coherency@indirect-dispatch-GL_TESS_CONTROL_SHADER_PATCHES,Fail
spec@arb_query_buffer_object@coherency@indirect-draw-GL_TESS_CONTROL_SHADER_PATCHES,Fail
spec@arb_query_buffer_object@coherency@indirect-draw-count-GL_TESS_CONTROL_SHADER_PATCHES,Fail
spec@arb_query_buffer_object@qbo,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-ASYNC-GL_INT,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-ASYNC-GL_UNSIGNED_INT,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-ASYNC-GL_UNSIGNED_INT64_ARB,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-ASYNC_CPU_READ_AFTER-GL_INT,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-ASYNC_CPU_READ_AFTER-GL_UNSIGNED_INT,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-ASYNC_CPU_READ_AFTER-GL_UNSIGNED_INT64_ARB,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-ASYNC_CPU_READ_BEFORE-GL_INT,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-ASYNC_CPU_READ_BEFORE-GL_UNSIGNED_INT,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-ASYNC_CPU_READ_BEFORE-GL_UNSIGNED_INT64_ARB,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-SYNC-GL_INT,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-SYNC-GL_UNSIGNED_INT,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-SYNC-GL_UNSIGNED_INT64_ARB,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-SYNC_CPU_READ_AFTER_CACHE_TEST-GL_INT,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-SYNC_CPU_READ_AFTER_CACHE_TEST-GL_UNSIGNED_INT,Fail
spec@arb_query_buffer_object@qbo@query-GL_TESS_CONTROL_SHADER_PATCHES-SYNC_CPU_READ_AFTER_CACHE_TEST-GL_UNSIGNED_INT64_ARB,Fail
spec@arb_sample_locations@test,Fail
spec@arb_sample_locations@test@MSAA: 1- X: 0- Y: 0- Grid: false,Fail
spec@arb_sample_locations@test@MSAA: 1- X: 0- Y: 0- Grid: true,Fail