anv: implement emission of 3DSTATE_HS for Wa_1306463417

We need to emit 3DSTATE_HS for each primitive with tessellation.

Signed-off-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/21308>
This commit is contained in:
Tapani Pälli 2023-02-09 17:29:28 +02:00 committed by Marge Bot
parent f8a1100ca1
commit 880a3efe6c

View file

@ -3265,6 +3265,19 @@ cmd_buffer_emit_streamout(struct anv_cmd_buffer *cmd_buffer)
anv_batch_emit_merge(&cmd_buffer->batch, dwords, pipeline->gfx8.streamout_state); anv_batch_emit_merge(&cmd_buffer->batch, dwords, pipeline->gfx8.streamout_state);
} }
ALWAYS_INLINE static void
genX(emit_hs)(struct anv_cmd_buffer *cmd_buffer)
{
struct anv_graphics_pipeline *pipeline = cmd_buffer->state.gfx.pipeline;
if (!anv_pipeline_has_stage(pipeline, MESA_SHADER_TESS_EVAL))
return;
uint32_t *dw =
anv_batch_emitn(&cmd_buffer->batch, GENX(3DSTATE_HS_length),
GENX(3DSTATE_HS));
memcpy(dw, &pipeline->gfx8.hs, sizeof(pipeline->gfx8.hs));
}
ALWAYS_INLINE static void ALWAYS_INLINE static void
genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer *cmd_buffer) genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer *cmd_buffer)
{ {
@ -3378,6 +3391,11 @@ genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer *cmd_buffer)
cmd_buffer->state.push_descriptors_dirty &= ~push_descriptor_dirty; cmd_buffer->state.push_descriptors_dirty &= ~push_descriptor_dirty;
} }
/* Wa_1306463417 - Send HS state for every primitive on gfx11. */
if (cmd_buffer->state.gfx.dirty & ANV_CMD_DIRTY_PIPELINE || GFX_VER == 11) {
genX(emit_hs)(cmd_buffer);
}
if (!cmd_buffer->state.gfx.dirty && !descriptors_dirty && if (!cmd_buffer->state.gfx.dirty && !descriptors_dirty &&
!any_dynamic_state_dirty && !any_dynamic_state_dirty &&
!cmd_buffer->state.push_constants_dirty) !cmd_buffer->state.push_constants_dirty)
@ -3522,13 +3540,6 @@ genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer *cmd_buffer)
} }
} }
if (cmd_buffer->state.gfx.dirty & ANV_CMD_DIRTY_PIPELINE) {
uint32_t *dw =
anv_batch_emitn(&cmd_buffer->batch, GENX(3DSTATE_HS_length),
GENX(3DSTATE_HS));
memcpy(dw, &pipeline->gfx8.hs, sizeof(pipeline->gfx8.hs));
}
if (any_dynamic_state_dirty || cmd_buffer->state.gfx.dirty) if (any_dynamic_state_dirty || cmd_buffer->state.gfx.dirty)
genX(cmd_buffer_flush_dynamic_state)(cmd_buffer); genX(cmd_buffer_flush_dynamic_state)(cmd_buffer);
} }
@ -4189,6 +4200,13 @@ void genX(CmdDrawMultiEXT)(
} }
#else #else
vk_foreach_multi_draw(draw, i, pVertexInfo, drawCount, stride) { vk_foreach_multi_draw(draw, i, pVertexInfo, drawCount, stride) {
/* Wa_1306463417 - Send HS state for every primitive, first
* one was handled by cmd_buffer_flush_gfx_state.
*/
if (i && GFX_VER == 11)
genX(emit_hs)(cmd_buffer);
anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE_EXTENDED), prim) { anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE_EXTENDED), prim) {
prim.PredicateEnable = cmd_buffer->state.conditional_render_enabled; prim.PredicateEnable = cmd_buffer->state.conditional_render_enabled;
prim.VertexAccessType = SEQUENTIAL; prim.VertexAccessType = SEQUENTIAL;
@ -4389,6 +4407,13 @@ void genX(CmdDrawMultiIndexedEXT)(
} }
#else #else
vk_foreach_multi_draw_indexed(draw, i, pIndexInfo, drawCount, stride) { vk_foreach_multi_draw_indexed(draw, i, pIndexInfo, drawCount, stride) {
/* Wa_1306463417 - Send HS state for every primitive, first
* one was handled by cmd_buffer_flush_gfx_state.
*/
if (i && GFX_VER == 11)
genX(emit_hs)(cmd_buffer);
anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE_EXTENDED), prim) { anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE_EXTENDED), prim) {
prim.PredicateEnable = cmd_buffer->state.conditional_render_enabled; prim.PredicateEnable = cmd_buffer->state.conditional_render_enabled;
prim.VertexAccessType = RANDOM; prim.VertexAccessType = RANDOM;
@ -4633,6 +4658,12 @@ emit_indirect_draws(struct anv_cmd_buffer *cmd_buffer,
load_indirect_parameters(cmd_buffer, draw, indexed, i); load_indirect_parameters(cmd_buffer, draw, indexed, i);
/* Wa_1306463417 - Send HS state for every primitive HS, first
* one was handled by cmd_buffer_flush_gfx_state.
*/
if (i && GFX_VER == 11)
genX(emit_hs)(cmd_buffer);
anv_batch_emit(&cmd_buffer->batch, anv_batch_emit(&cmd_buffer->batch,
#if GFX_VER < 11 #if GFX_VER < 11
GENX(3DPRIMITIVE), GENX(3DPRIMITIVE),
@ -4861,6 +4892,12 @@ emit_indirect_count_draws(struct anv_cmd_buffer *cmd_buffer,
load_indirect_parameters(cmd_buffer, draw, indexed, i); load_indirect_parameters(cmd_buffer, draw, indexed, i);
/* Wa_1306463417 - Send HS state for every primitive HS, first
* one was handled by cmd_buffer_flush_gfx_state.
*/
if (i && GFX_VER == 11)
genX(emit_hs)(cmd_buffer);
anv_batch_emit(&cmd_buffer->batch, anv_batch_emit(&cmd_buffer->batch,
#if GFX_VER < 11 #if GFX_VER < 11
GENX(3DPRIMITIVE), GENX(3DPRIMITIVE),