Module: Mesa Branch: main Commit: 76555a47770410e55b00ecf612037efc858abc53 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=76555a47770410e55b00ecf612037efc858abc53
Author: Samuel Pitoiset <[email protected]> Date: Mon Oct 31 13:53:05 2022 +0100 radv: fix primitives generated query with NGG only According to the AMD registers database, SAMPLE_STREAMOUTSTATS no longer exists on GFX11. This fixes primitives generated query if only the NGG path is used. Tested on GFX10.3 by forcing NGG everywhere. Signed-off-by: Samuel Pitoiset <[email protected]> Reviewed-by: Bas Nieuwenhuizen <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19410> --- src/amd/vulkan/radv_query.c | 85 ++++++++++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 32 deletions(-) diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c index 5fd4617d9ba..4ff4aab5fb9 100644 --- a/src/amd/vulkan/radv_query.c +++ b/src/amd/vulkan/radv_query.c @@ -1120,8 +1120,10 @@ radv_CreateQueryPool(VkDevice _device, const VkQueryPoolCreateInfo *pCreateInfo, break; case VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT: pool->stride = 32; - if (pool->uses_gds) { - /* When the query pool needs GDS, allocate 2x32-bit values for begin/end. */ + if (pool->uses_gds && device->physical_device->rad_info.gfx_level < GFX11) { + /* When the hardware can use both the legacy and the NGG paths in the same begin/end pair, + * allocate 2x32-bit values for the GDS counters. + */ pool->stride += 4 * 2; } break; @@ -1384,7 +1386,7 @@ radv_GetQueryPoolResults(VkDevice _device, VkQueryPool queryPool, uint32_t first primitive_storage_needed = src64[2] - src64[0]; - if (pool->uses_gds) { + if (pool->uses_gds && device->physical_device->rad_info.gfx_level < GFX11) { uint32_t const *src32 = (uint32_t const *)src; /* Accumulate the result that was copied from GDS in case NGG shader has been used. */ @@ -1616,7 +1618,7 @@ radv_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPoo radv_query_shader(cmd_buffer, &cmd_buffer->device->meta_state.query.pg_query_pipeline, pool->bo, dst_buffer->bo, firstQuery * pool->stride, dst_buffer->offset + dstOffset, pool->stride, stride, dst_size, queryCount, - flags, 0, 0, pool->uses_gds); + flags, 0, 0, pool->uses_gds && cmd_buffer->device->physical_device->rad_info.gfx_level < GFX11); break; default: unreachable("trying to get results of unhandled query type"); @@ -1838,28 +1840,39 @@ emit_begin_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *poo } break; case VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT: { - if (!cmd_buffer->state.active_prims_gen_queries) { - bool old_streamout_enabled = radv_is_streamout_enabled(cmd_buffer); + if (cmd_buffer->device->physical_device->rad_info.gfx_level >= GFX11) { + /* On GFX11+, primitives generated query always use GDS. */ + gfx10_copy_gds_query(cmd_buffer, 4 + index * 4, va); + radv_emit_write_data_imm(cs, V_370_ME, va + 4, 0x80000000); - cmd_buffer->state.active_prims_gen_queries++; + /* Record that the command buffer needs GDS. */ + cmd_buffer->gds_needed = true; - if (old_streamout_enabled != radv_is_streamout_enabled(cmd_buffer)) { - radv_emit_streamout_enable(cmd_buffer); - } + cmd_buffer->state.active_prims_gen_gds_queries++; } else { - cmd_buffer->state.active_prims_gen_queries++; - } + if (!cmd_buffer->state.active_prims_gen_queries) { + bool old_streamout_enabled = radv_is_streamout_enabled(cmd_buffer); - emit_sample_streamout(cmd_buffer, va, index); + cmd_buffer->state.active_prims_gen_queries++; - if (pool->uses_gds) { - /* generated prim counter */ - gfx10_copy_gds_query(cmd_buffer, 4 + index * 4, va + 32); + if (old_streamout_enabled != radv_is_streamout_enabled(cmd_buffer)) { + radv_emit_streamout_enable(cmd_buffer); + } + } else { + cmd_buffer->state.active_prims_gen_queries++; + } - /* Record that the command buffer needs GDS. */ - cmd_buffer->gds_needed = true; + emit_sample_streamout(cmd_buffer, va, index); - cmd_buffer->state.active_prims_gen_gds_queries++; + if (pool->uses_gds) { + /* generated prim counter */ + gfx10_copy_gds_query(cmd_buffer, 4 + index * 4, va + 32); + + /* Record that the command buffer needs GDS. */ + cmd_buffer->gds_needed = true; + + cmd_buffer->state.active_prims_gen_gds_queries++; + } } break; } @@ -1949,25 +1962,33 @@ emit_end_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *pool, } break; case VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT: { - if (cmd_buffer->state.active_prims_gen_queries == 1) { - bool old_streamout_enabled = radv_is_streamout_enabled(cmd_buffer); + if (cmd_buffer->device->physical_device->rad_info.gfx_level >= GFX11) { + /* On GFX11+, primitives generated query always use GDS. */ + gfx10_copy_gds_query(cmd_buffer, 4 + index * 4, va + 16); + radv_emit_write_data_imm(cs, V_370_ME, va + 20, 0x80000000); - cmd_buffer->state.active_prims_gen_queries--; + cmd_buffer->state.active_prims_gen_gds_queries--; + } else { + if (cmd_buffer->state.active_prims_gen_queries == 1) { + bool old_streamout_enabled = radv_is_streamout_enabled(cmd_buffer); - if (old_streamout_enabled != radv_is_streamout_enabled(cmd_buffer)) { - radv_emit_streamout_enable(cmd_buffer); + cmd_buffer->state.active_prims_gen_queries--; + + if (old_streamout_enabled != radv_is_streamout_enabled(cmd_buffer)) { + radv_emit_streamout_enable(cmd_buffer); + } + } else { + cmd_buffer->state.active_prims_gen_queries--; } - } else { - cmd_buffer->state.active_prims_gen_queries--; - } - emit_sample_streamout(cmd_buffer, va + 16, index); + emit_sample_streamout(cmd_buffer, va + 16, index); - if (pool->uses_gds) { - /* generated prim counter */ - gfx10_copy_gds_query(cmd_buffer, 4 + index * 4, va + 36); + if (pool->uses_gds) { + /* generated prim counter */ + gfx10_copy_gds_query(cmd_buffer, 4 + index * 4, va + 36); - cmd_buffer->state.active_prims_gen_gds_queries--; + cmd_buffer->state.active_prims_gen_gds_queries--; + } } break; }
