mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 11:30:11 +01:00
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:
parent
f8a1100ca1
commit
880a3efe6c
1 changed files with 44 additions and 7 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
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
|
||||
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;
|
||||
}
|
||||
|
||||
/* 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 &&
|
||||
!any_dynamic_state_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)
|
||||
genX(cmd_buffer_flush_dynamic_state)(cmd_buffer);
|
||||
}
|
||||
|
|
@ -4189,6 +4200,13 @@ void genX(CmdDrawMultiEXT)(
|
|||
}
|
||||
#else
|
||||
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) {
|
||||
prim.PredicateEnable = cmd_buffer->state.conditional_render_enabled;
|
||||
prim.VertexAccessType = SEQUENTIAL;
|
||||
|
|
@ -4389,6 +4407,13 @@ void genX(CmdDrawMultiIndexedEXT)(
|
|||
}
|
||||
#else
|
||||
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) {
|
||||
prim.PredicateEnable = cmd_buffer->state.conditional_render_enabled;
|
||||
prim.VertexAccessType = RANDOM;
|
||||
|
|
@ -4633,6 +4658,12 @@ emit_indirect_draws(struct anv_cmd_buffer *cmd_buffer,
|
|||
|
||||
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,
|
||||
#if GFX_VER < 11
|
||||
GENX(3DPRIMITIVE),
|
||||
|
|
@ -4861,6 +4892,12 @@ emit_indirect_count_draws(struct anv_cmd_buffer *cmd_buffer,
|
|||
|
||||
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,
|
||||
#if GFX_VER < 11
|
||||
GENX(3DPRIMITIVE),
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue