diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index ebee323ef39..3e5a543918e 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -6179,8 +6179,15 @@ iris_upload_dirty_render_state(struct iris_context *ice, /* The Constant Buffer Read Length field from 3DSTATE_CONSTANT_ALL * contains only 5 bits, so we can only use it for buffers smaller than * 32. + * + * According to Wa_16011448509, Gfx12.0 misinterprets some address bits + * in 3DSTATE_CONSTANT_ALL. It should still be safe to use the command + * for disabling stages, where all address bits are zero. However, we + * can't safely use it for general buffers with arbitrary addresses. + * Just fall back to the individual 3DSTATE_CONSTANT_XS commands in that + * case. */ - if (push_bos.max_length < 32) { + if (push_bos.max_length < 32 && GFX_VERx10 > 120) { emit_push_constant_packet_all(ice, batch, 1 << stage, &push_bos); continue; } @@ -6190,6 +6197,7 @@ iris_upload_dirty_render_state(struct iris_context *ice, #if GFX_VER >= 12 if (nobuffer_stages) + /* Wa_16011448509: all address bits are zero */ emit_push_constant_packet_all(ice, batch, nobuffer_stages, NULL); #endif diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 2a7fd9f00a8..0ed8cf4f8a5 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -2815,8 +2815,15 @@ cmd_buffer_flush_gfx_push_constants(struct anv_cmd_buffer *cmd_buffer, /* The Constant Buffer Read Length field from 3DSTATE_CONSTANT_ALL * contains only 5 bits, so we can only use it for buffers smaller than * 32. + * + * According to Wa_16011448509, Gfx12.0 misinterprets some address bits + * in 3DSTATE_CONSTANT_ALL. It should still be safe to use the command + * for disabling stages, where all address bits are zero. However, we + * can't safely use it for general buffers with arbitrary addresses. + * Just fall back to the individual 3DSTATE_CONSTANT_XS commands in that + * case. */ - if (max_push_range < 32) { + if (max_push_range < 32 && GFX_VERx10 > 120) { cmd_buffer_emit_push_constant_all(cmd_buffer, 1 << stage, buffers, buffer_count); continue; @@ -2828,6 +2835,7 @@ cmd_buffer_flush_gfx_push_constants(struct anv_cmd_buffer *cmd_buffer, #if GFX_VER >= 12 if (nobuffer_stages) + /* Wa_16011448509: all address bits are zero */ cmd_buffer_emit_push_constant_all(cmd_buffer, nobuffer_stages, NULL, 0); #endif diff --git a/src/intel/vulkan/genX_cmd_draw_generated_indirect.h b/src/intel/vulkan/genX_cmd_draw_generated_indirect.h index 256037ed07b..8600c9a9350 100644 --- a/src/intel/vulkan/genX_cmd_draw_generated_indirect.h +++ b/src/intel/vulkan/genX_cmd_draw_generated_indirect.h @@ -215,6 +215,8 @@ genX(cmd_buffer_emit_generate_draws_pipeline)(struct anv_cmd_buffer *cmd_buffer) * In 3D mode, after programming push constant alloc command immediately * program push constant command(ZERO length) without any commit between * them. + * + * Note that Wa_16011448509 isn't needed here as all address bits are zero. */ anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_CONSTANT_ALL), c) { /* Update empty push constants for all stages (bitmask = 11111b) */ @@ -291,7 +293,8 @@ genX(cmd_buffer_emit_generated_push_data)(struct anv_cmd_buffer *cmd_buffer, struct anv_address push_data_addr = anv_state_pool_state_address( &cmd_buffer->device->dynamic_state_pool, push_data_state); -#if GFX_VER >= 12 + /* Don't use 3DSTATE_CONSTANT_ALL on Gfx12.0 due to Wa_16011448509 */ +#if GFX_VERx10 > 120 const uint32_t num_dwords = GENX(3DSTATE_CONSTANT_ALL_length) + GENX(3DSTATE_CONSTANT_ALL_DATA_length); uint32_t *dw =