v3dv: always set view index before drawing
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 <apinheiro@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27978>
This commit is contained in:
committed by
Marge Bot
parent
aeee18be1b
commit
93f9f2bcbb
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user