diff --git a/.pick_status.json b/.pick_status.json index 817bc8c959a..13ea2e0f05b 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -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 }, diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index d738f53b74b..227ec2b671f 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -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; diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index be787a98c78..bd4d45bbed7 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -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;