diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 4a2d23a0b29..2bf87155ab8 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -4083,10 +4083,17 @@ v3dv_CmdBindIndexBuffer(VkCommandBuffer commandBuffer, v3dv_return_if_oom(cmd_buffer, NULL); const uint32_t index_size = get_index_size(indexType); - if (buffer == cmd_buffer->state.index_buffer.buffer && - offset == cmd_buffer->state.index_buffer.offset && - index_size == cmd_buffer->state.index_buffer.index_size) { - return; + + /* If we have started a new job we always need to emit index buffer state. + * We know we are in that scenario because that is the only case where we + * set the dirty bit. + */ + if (!(cmd_buffer->state.dirty & V3DV_CMD_DIRTY_INDEX_BUFFER)) { + if (buffer == cmd_buffer->state.index_buffer.buffer && + offset == cmd_buffer->state.index_buffer.offset && + index_size == cmd_buffer->state.index_buffer.index_size) { + return; + } } cl_emit(&job->bcl, INDEX_BUFFER_SETUP, ib) { @@ -4098,6 +4105,8 @@ v3dv_CmdBindIndexBuffer(VkCommandBuffer commandBuffer, cmd_buffer->state.index_buffer.buffer = buffer; cmd_buffer->state.index_buffer.offset = offset; cmd_buffer->state.index_buffer.index_size = index_size; + + cmd_buffer->state.dirty &= ~V3DV_CMD_DIRTY_INDEX_BUFFER; } void diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index ca54ac10ba4..b3564241a4e 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -605,13 +605,14 @@ enum v3dv_cmd_dirty_bits { V3DV_CMD_DIRTY_STENCIL_REFERENCE = 1 << 4, V3DV_CMD_DIRTY_PIPELINE = 1 << 5, V3DV_CMD_DIRTY_VERTEX_BUFFER = 1 << 6, - V3DV_CMD_DIRTY_DESCRIPTOR_SETS = 1 << 7, - V3DV_CMD_DIRTY_COMPUTE_DESCRIPTOR_SETS = 1 << 8, - V3DV_CMD_DIRTY_PUSH_CONSTANTS = 1 << 9, - V3DV_CMD_DIRTY_BLEND_CONSTANTS = 1 << 10, - V3DV_CMD_DIRTY_OCCLUSION_QUERY = 1 << 11, - V3DV_CMD_DIRTY_DEPTH_BIAS = 1 << 12, - V3DV_CMD_DIRTY_LINE_WIDTH = 1 << 13, + V3DV_CMD_DIRTY_INDEX_BUFFER = 1 << 7, + V3DV_CMD_DIRTY_DESCRIPTOR_SETS = 1 << 8, + V3DV_CMD_DIRTY_COMPUTE_DESCRIPTOR_SETS = 1 << 9, + V3DV_CMD_DIRTY_PUSH_CONSTANTS = 1 << 10, + V3DV_CMD_DIRTY_BLEND_CONSTANTS = 1 << 11, + V3DV_CMD_DIRTY_OCCLUSION_QUERY = 1 << 12, + V3DV_CMD_DIRTY_DEPTH_BIAS = 1 << 13, + V3DV_CMD_DIRTY_LINE_WIDTH = 1 << 14, }; struct v3dv_dynamic_state {