intel: Implement Wa_16011448509
"Use 3DSTATE_CONST command for individual shaders instead of 3DSTATE_CONST_ALL COMMAND" On gen 12.0 platforms, 3DSTATE_CONSTANT_ALL command is not processed correctly in certain cases. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Tapani Pälli <tapani.palli@intel.com> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21301>
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user