From 93f9f2bcbbb1444ff80ec847cc1a2d65381459f9 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Thu, 29 Feb 2024 12:10:18 +0100 Subject: [PATCH] v3dv: always set view index before drawing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is allowed for a shader to enable the multiview extension even if the draw call in which it is used doesn't use multidraw. This allows the shader to still use gl_ViewIndex, which will always be 0 in that scenario. Reviewed-by: Alejandro PiƱeiro Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 05278552325..2d936300fa3 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -3012,8 +3012,10 @@ static inline void cmd_buffer_set_view_index(struct v3dv_cmd_buffer *cmd_buffer, uint32_t view_index) { - cmd_buffer->state.view_index = view_index; - cmd_buffer->state.dirty |= V3DV_CMD_DIRTY_VIEW_INDEX; + if (view_index != cmd_buffer->state.view_index) { + cmd_buffer->state.view_index = view_index; + cmd_buffer->state.dirty |= V3DV_CMD_DIRTY_VIEW_INDEX; + } } static void @@ -3025,6 +3027,7 @@ cmd_buffer_draw(struct v3dv_cmd_buffer *cmd_buffer, struct v3dv_render_pass *pass = cmd_buffer->state.pass; if (likely(!pass->multiview_enabled)) { + cmd_buffer_set_view_index(cmd_buffer, 0); v3dv_cmd_buffer_emit_pre_draw(cmd_buffer, false, false, vertex_count); v3dv_X(cmd_buffer->device, cmd_buffer_emit_draw)(cmd_buffer, info); return; @@ -3104,6 +3107,7 @@ v3dv_CmdDrawIndexed(VkCommandBuffer commandBuffer, struct v3dv_render_pass *pass = cmd_buffer->state.pass; if (likely(!pass->multiview_enabled)) { + cmd_buffer_set_view_index(cmd_buffer, 0); v3dv_cmd_buffer_emit_pre_draw(cmd_buffer, true, false, vertex_count); v3dv_X(cmd_buffer->device, cmd_buffer_emit_draw_indexed) (cmd_buffer, indexCount, instanceCount, @@ -3145,13 +3149,13 @@ v3dv_CmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, struct v3dv_render_pass *pass = cmd_buffer->state.pass; if (likely(!pass->multiview_enabled)) { + cmd_buffer_set_view_index(cmd_buffer, 0); v3dv_cmd_buffer_emit_pre_draw(cmd_buffer, true, false, vertex_count); v3dv_X(cmd_buffer->device, cmd_buffer_emit_draw_indexed) (cmd_buffer, draw->indexCount, instanceCount, draw->firstIndex, vertexOffset, firstInstance); continue; } - uint32_t view_mask = pass->subpasses[cmd_buffer->state.subpass_idx].view_mask; while (view_mask) { cmd_buffer_set_view_index(cmd_buffer, u_bit_scan(&view_mask)); @@ -3179,6 +3183,7 @@ v3dv_CmdDrawIndirect(VkCommandBuffer commandBuffer, struct v3dv_render_pass *pass = cmd_buffer->state.pass; if (likely(!pass->multiview_enabled)) { + cmd_buffer_set_view_index(cmd_buffer, 0); v3dv_cmd_buffer_emit_pre_draw(cmd_buffer, false, true, 0); v3dv_X(cmd_buffer->device, cmd_buffer_emit_draw_indirect) (cmd_buffer, buffer, offset, drawCount, stride); @@ -3210,6 +3215,7 @@ v3dv_CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, struct v3dv_render_pass *pass = cmd_buffer->state.pass; if (likely(!pass->multiview_enabled)) { + cmd_buffer_set_view_index(cmd_buffer, 0); v3dv_cmd_buffer_emit_pre_draw(cmd_buffer, true, true, 0); v3dv_X(cmd_buffer->device, cmd_buffer_emit_indexed_indirect) (cmd_buffer, buffer, offset, drawCount, stride);