radv: fix the late scissor emission workaround with ESO on GFX9
graphics_pipeline is NULL when ESO is used. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27236>
This commit is contained in:

committed by
Marge Bot

parent
411e23e193
commit
70c288558a
@@ -8745,6 +8745,24 @@ radv_emit_indirect_draw_packets(struct radv_cmd_buffer *cmd_buffer, const struct
|
||||
}
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
radv_get_needed_dynamic_states(struct radv_cmd_buffer *cmd_buffer)
|
||||
{
|
||||
uint64_t dynamic_states = RADV_DYNAMIC_ALL;
|
||||
|
||||
if (cmd_buffer->state.graphics_pipeline)
|
||||
return cmd_buffer->state.graphics_pipeline->needed_dynamic_state;
|
||||
|
||||
/* Clear unnecessary dynamic states for shader objects. */
|
||||
if (!cmd_buffer->state.shaders[MESA_SHADER_TESS_CTRL])
|
||||
dynamic_states &= ~RADV_DYNAMIC_PATCH_CONTROL_POINTS;
|
||||
if (!cmd_buffer->state.shaders[MESA_SHADER_TESS_EVAL])
|
||||
dynamic_states &= ~RADV_DYNAMIC_TESS_DOMAIN_ORIGIN;
|
||||
dynamic_states &= ~RADV_DYNAMIC_FRAGMENT_SHADING_RATE;
|
||||
|
||||
return dynamic_states;
|
||||
}
|
||||
|
||||
/*
|
||||
* Vega and raven have a bug which triggers if there are multiple context
|
||||
* register contexts active at the same time with different scissor values.
|
||||
@@ -8767,7 +8785,7 @@ radv_need_late_scissor_emission(struct radv_cmd_buffer *cmd_buffer, const struct
|
||||
if (cmd_buffer->state.context_roll_without_scissor_emitted || info->strmout_buffer)
|
||||
return true;
|
||||
|
||||
uint64_t used_states = cmd_buffer->state.graphics_pipeline->needed_dynamic_state | ~RADV_CMD_DIRTY_DYNAMIC_ALL;
|
||||
uint64_t used_states = radv_get_needed_dynamic_states(cmd_buffer) | ~RADV_CMD_DIRTY_DYNAMIC_ALL;
|
||||
|
||||
/* Index, vertex and streamout buffers don't change context regs.
|
||||
* We assume that any other dirty flag causes context rolls.
|
||||
@@ -9058,24 +9076,6 @@ radv_emit_shaders(struct radv_cmd_buffer *cmd_buffer)
|
||||
cmd_buffer->state.dirty &= ~RADV_CMD_DIRTY_SHADERS;
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
radv_get_needed_dynamic_states(struct radv_cmd_buffer *cmd_buffer)
|
||||
{
|
||||
uint64_t dynamic_states = RADV_DYNAMIC_ALL;
|
||||
|
||||
if (cmd_buffer->state.graphics_pipeline)
|
||||
return cmd_buffer->state.graphics_pipeline->needed_dynamic_state;
|
||||
|
||||
/* Clear unnecessary dynamic states for shader objects. */
|
||||
if (!cmd_buffer->state.shaders[MESA_SHADER_TESS_CTRL])
|
||||
dynamic_states &= ~RADV_DYNAMIC_PATCH_CONTROL_POINTS;
|
||||
if (!cmd_buffer->state.shaders[MESA_SHADER_TESS_EVAL])
|
||||
dynamic_states &= ~RADV_DYNAMIC_TESS_DOMAIN_ORIGIN;
|
||||
dynamic_states &= ~RADV_DYNAMIC_FRAGMENT_SHADING_RATE;
|
||||
|
||||
return dynamic_states;
|
||||
}
|
||||
|
||||
static void
|
||||
radv_emit_all_graphics_states(struct radv_cmd_buffer *cmd_buffer, const struct radv_draw_info *info)
|
||||
{
|
||||
|
Reference in New Issue
Block a user