diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index a3f606600b8..4ad04f1ff54 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -7493,7 +7493,8 @@ radv_bind_pre_rast_shader(struct radv_cmd_buffer *cmd_buffer, const struct radv_ shader->info.stage == MESA_SHADER_TESS_EVAL || shader->info.stage == MESA_SHADER_GEOMETRY || shader->info.stage == MESA_SHADER_MESH); - if (radv_get_user_sgpr_info(shader, AC_UD_NGG_STATE)->sgpr_idx != -1) + if (radv_get_user_sgpr_info(shader, AC_UD_NGG_STATE)->sgpr_idx != -1 || + radv_get_user_sgpr_info(shader, AC_UD_NGG_QUERY_BUF_VA)->sgpr_idx != -1) cmd_buffer->state.dirty |= RADV_CMD_DIRTY_NGG_STATE; if (radv_get_user_sgpr_info(shader, AC_UD_STREAMOUT_BUFFERS)->sgpr_idx != -1) { @@ -10408,6 +10409,8 @@ radv_get_ngg_state_query(struct radv_cmd_buffer *cmd_buffer) static void radv_emit_ngg_state(struct radv_cmd_buffer *cmd_buffer) { + const struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); + const struct radv_physical_device *pdev = radv_device_physical(device); const struct radv_shader *last_vgt_shader = cmd_buffer->state.last_vgt_shader; const uint32_t ngg_state_offset = radv_get_user_sgpr_loc(last_vgt_shader, AC_UD_NGG_STATE); @@ -10420,6 +10423,14 @@ radv_emit_ngg_state(struct radv_cmd_buffer *cmd_buffer) SET_SGPR_FIELD(NGG_STATE_QUERY, radv_get_ngg_state_query(cmd_buffer)); radeon_set_sh_reg(cmd_buffer->cs, ngg_state_offset, ngg_state); + + if (pdev->info.gfx_level >= GFX12) { + const uint32_t ngg_query_buf_va_offset = radv_get_user_sgpr_loc(last_vgt_shader, AC_UD_NGG_QUERY_BUF_VA); + if (!ngg_query_buf_va_offset) + return; + + radeon_set_sh_reg(cmd_buffer->cs, ngg_query_buf_va_offset, cmd_buffer->state.shader_query_buf_va); + } } static void