radv: use LOAD_CONTEXT_REG_INDEX when supported for streamout

It's supported on GFX9+ and on GFX8+ with a specific fw version. It's
more correct with preemption.

Also rewrite the comment now that we got more information from Marek.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40341>
This commit is contained in:
Samuel Pitoiset 2026-03-11 10:09:45 +01:00 committed by Marge Bot
parent dfbed0d016
commit 2751a427e1

View file

@ -15574,7 +15574,6 @@ radv_emit_strmout_buffer(struct radv_cmd_buffer *cmd_buffer, const struct radv_d
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
const enum amd_gfx_level gfx_level = pdev->info.gfx_level;
struct radv_cmd_stream *cs = cmd_buffer->cs;
radeon_begin(cs);
@ -15594,9 +15593,10 @@ radv_emit_strmout_buffer(struct radv_cmd_buffer *cmd_buffer, const struct radv_d
}
radeon_end();
if (gfx_level >= GFX10) {
if (pdev->info.has_load_ctx_reg_pkt) {
/* Make sure that PFP waits for ME to avoid a race condition because the data is written by
* STRMOUT_BUFFER_UPDATE in ME, but LOAD_CONTEXT_REG_INDEX is in PFP.
* STRMOUT_BUFFER_UPDATE in ME, but LOAD_CONTEXT_REG_INDEX loads the value from memory between
* PFP and ME.
*/
ac_emit_cp_pfp_sync_me(cs->b, false);