radv: fix radv_emit_userdata_vertex for vertex offset -1

-1 is a legit vertex offset upon vkCmdDrawIndexed and other cmds. This
change fixes to track last_vertex_offset with an additional valid bit.

Cc: mesa-stable
Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23157>
(cherry picked from commit 4c8be22c66)
This commit is contained in:
Yiwei Zhang 2023-05-22 00:54:32 +00:00 committed by Eric Engestrom
parent d61e376497
commit ab570dd3fc
3 changed files with 13 additions and 8 deletions

View file

@ -706,7 +706,7 @@
"description": "radv: fix radv_emit_userdata_vertex for vertex offset -1",
"nominated": true,
"nomination_type": 0,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": null
},

View file

@ -5869,7 +5869,7 @@ radv_BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBegi
memset(&cmd_buffer->state, 0, sizeof(cmd_buffer->state));
cmd_buffer->state.last_index_type = -1;
cmd_buffer->state.last_num_instances = -1;
cmd_buffer->state.last_vertex_offset = -1;
cmd_buffer->state.last_vertex_offset_valid = false;
cmd_buffer->state.last_first_instance = -1;
cmd_buffer->state.last_drawid = -1;
cmd_buffer->state.last_subpass_color_count = MAX_RTS;
@ -6496,7 +6496,7 @@ radv_bind_pre_rast_shader(struct radv_cmd_buffer *cmd_buffer, const struct radv_
/* Re-emit some vertex states because the SGPR idx can be different. */
cmd_buffer->state.last_first_instance = -1;
cmd_buffer->state.last_vertex_offset = -1;
cmd_buffer->state.last_vertex_offset_valid = false;
cmd_buffer->state.last_drawid = -1;
}
@ -7694,7 +7694,7 @@ radv_CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCou
primary->state.last_first_instance = -1;
primary->state.last_drawid = -1;
primary->state.last_vertex_offset = -1;
primary->state.last_vertex_offset_valid = false;
primary->state.last_db_count_control = -1;
}
@ -8100,7 +8100,7 @@ radv_cs_emit_indirect_draw_packet(struct radv_cmd_buffer *cmd_buffer, bool index
cmd_buffer->state.last_first_instance = -1;
cmd_buffer->state.last_num_instances = -1;
cmd_buffer->state.last_drawid = -1;
cmd_buffer->state.last_vertex_offset = -1;
cmd_buffer->state.last_vertex_offset_valid = false;
vertex_offset_reg = (base_reg - SI_SH_REG_OFFSET) >> 2;
if (cmd_buffer->state.uses_baseinstance)
@ -8146,7 +8146,7 @@ radv_cs_emit_indirect_mesh_draw_packet(struct radv_cmd_buffer *cmd_buffer, uint3
cmd_buffer->state.last_first_instance = -1;
cmd_buffer->state.last_num_instances = -1;
cmd_buffer->state.last_drawid = -1;
cmd_buffer->state.last_vertex_offset = -1;
cmd_buffer->state.last_vertex_offset_valid = false;
uint32_t xyz_dim_reg = (base_reg - SI_SH_REG_OFFSET) >> 2;
uint32_t draw_id_reg = (base_reg + 12 - SI_SH_REG_OFFSET) >> 2;
@ -8294,6 +8294,7 @@ radv_emit_userdata_vertex_internal(struct radv_cmd_buffer *cmd_buffer,
radeon_set_sh_reg_seq(cs, state->vtx_base_sgpr, state->vtx_emit_num);
radeon_emit(cs, vertex_offset);
state->last_vertex_offset_valid = true;
state->last_vertex_offset = vertex_offset;
if (uses_drawid) {
radeon_emit(cs, 0);
@ -8313,7 +8314,7 @@ radv_emit_userdata_vertex(struct radv_cmd_buffer *cmd_buffer, const struct radv_
const bool uses_baseinstance = state->uses_baseinstance;
const bool uses_drawid = state->uses_drawid;
if (vertex_offset != state->last_vertex_offset ||
if (!state->last_vertex_offset_valid || vertex_offset != state->last_vertex_offset ||
(uses_drawid && 0 != state->last_drawid) ||
(uses_baseinstance && info->first_instance != state->last_first_instance))
radv_emit_userdata_vertex_internal(cmd_buffer, info, vertex_offset);
@ -8326,6 +8327,7 @@ radv_emit_userdata_vertex_drawid(struct radv_cmd_buffer *cmd_buffer, uint32_t ve
struct radeon_cmdbuf *cs = cmd_buffer->cs;
radeon_set_sh_reg_seq(cs, state->vtx_base_sgpr, 1 + !!drawid);
radeon_emit(cs, vertex_offset);
state->last_vertex_offset_valid = true;
state->last_vertex_offset = vertex_offset;
if (drawid)
radeon_emit(cs, drawid);
@ -8452,6 +8454,7 @@ radv_emit_draw_packets_indexed(struct radv_cmd_buffer *cmd_buffer,
radv_handle_zero_index_buffer_bug(cmd_buffer, &index_va, &remaining_indexes);
if (i > 0) {
assert(state->last_vertex_offset_valid);
if (state->last_vertex_offset != draw->vertexOffset)
radv_emit_userdata_vertex_drawid(cmd_buffer, draw->vertexOffset, i);
else
@ -8566,6 +8569,7 @@ radv_emit_direct_draw_packets(struct radv_cmd_buffer *cmd_buffer, const struct r
}
if (drawCount > 1) {
struct radv_cmd_state *state = &cmd_buffer->state;
assert(state->last_vertex_offset_valid);
state->last_vertex_offset = last_start;
if (uses_drawid)
state->last_drawid = drawCount - 1;
@ -9629,7 +9633,7 @@ radv_CmdExecuteGeneratedCommandsNV(VkCommandBuffer commandBuffer, VkBool32 isPre
cmd_buffer->state.last_index_type = -1;
cmd_buffer->state.last_num_instances = -1;
cmd_buffer->state.last_vertex_offset = -1;
cmd_buffer->state.last_vertex_offset_valid = false;
cmd_buffer->state.last_first_instance = -1;
cmd_buffer->state.last_drawid = -1;

View file

@ -1620,6 +1620,7 @@ struct radv_cmd_state {
uint32_t last_num_instances;
uint32_t last_first_instance;
bool last_vertex_offset_valid;
uint32_t last_vertex_offset;
uint32_t last_drawid;
uint32_t last_subpass_color_count;