diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c index a184370ae51..d3ec27c3f65 100644 --- a/src/gallium/auxiliary/draw/draw_context.c +++ b/src/gallium/auxiliary/draw/draw_context.c @@ -372,6 +372,12 @@ draw_set_clip_state(struct draw_context *draw, memcpy(&draw->plane[6], clip->ucp, sizeof(clip->ucp)); } +void +draw_set_viewmask(struct draw_context *draw, uint8_t viewmask) +{ + draw->viewmask = viewmask; +} + /** * Set the draw module's viewport state. diff --git a/src/gallium/auxiliary/draw/draw_context.h b/src/gallium/auxiliary/draw/draw_context.h index 0f94285b0a7..4d69f032010 100644 --- a/src/gallium/auxiliary/draw/draw_context.h +++ b/src/gallium/auxiliary/draw/draw_context.h @@ -327,6 +327,9 @@ void draw_set_vertex_elements(struct draw_context *draw, unsigned count, const struct pipe_vertex_element *elements); +void +draw_set_viewmask(struct draw_context *draw, uint8_t viewmask); + void draw_set_indexes(struct draw_context *draw, const void *elements, unsigned elem_size, unsigned available_space); diff --git a/src/gallium/auxiliary/draw/draw_private.h b/src/gallium/auxiliary/draw/draw_private.h index 6b2f1d319c5..e77a4c04e73 100644 --- a/src/gallium/auxiliary/draw/draw_private.h +++ b/src/gallium/auxiliary/draw/draw_private.h @@ -355,6 +355,8 @@ struct draw_context */ float plane[DRAW_TOTAL_CLIP_PLANES][4]; + uint32_t viewmask; + /* If a prim stage introduces new vertex attributes, they'll be stored here */ struct { diff --git a/src/gallium/auxiliary/draw/draw_pt.c b/src/gallium/auxiliary/draw/draw_pt.c index 9ab6fb510b8..5f07fe55d36 100644 --- a/src/gallium/auxiliary/draw/draw_pt.c +++ b/src/gallium/auxiliary/draw/draw_pt.c @@ -619,8 +619,8 @@ draw_vbo(struct draw_context *draw, * the min_index/max_index hints given by gallium frontends. */ - if (use_info->view_mask) { - u_foreach_bit(i, use_info->view_mask) { + if (draw->viewmask) { + u_foreach_bit(i, draw->viewmask) { draw->pt.user.viewid = i; draw_instances(draw, drawid_offset, use_info, use_draws, num_draws); } diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index 954cd04f9ac..2f7f770e5f1 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -4281,7 +4281,6 @@ agx_draw_without_restart(struct agx_batch *batch, .mode = u_decomposed_prim(info->mode), .index_size = info->index_size, .index.resource = ctx->heap, - .view_mask = info->view_mask, .increment_draw_id = info->increment_draw_id, .index_bias_varies = info->index_bias_varies, }; @@ -4813,7 +4812,6 @@ agx_draw_patches(struct agx_context *ctx, const struct pipe_draw_info *info, .index_size = with_counts ? 4 : (point_mode ? 0 : 2), .index.resource = (!with_counts && point_mode) ? NULL : ctx->heap, .instance_count = 1, - .view_mask = info->view_mask, }; /* Wrap the pool allocation in a fake resource for meta-Gallium use */ @@ -5147,7 +5145,6 @@ agx_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info, .restart_index = ~0, .index.resource = ctx->heap, .instance_count = 1, - .view_mask = info->view_mask, }; indirect_gs = (struct pipe_draw_indirect_info){ diff --git a/src/gallium/drivers/llvmpipe/lp_state_surface.c b/src/gallium/drivers/llvmpipe/lp_state_surface.c index c4b85f18c52..a4ebcbc8390 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_surface.c +++ b/src/gallium/drivers/llvmpipe/lp_state_surface.c @@ -97,6 +97,7 @@ llvmpipe_set_framebuffer_state(struct pipe_context *pipe, draw_set_zs_format(lp->draw, depth_format); lp_setup_bind_framebuffer(lp->setup, &lp->framebuffer); + draw_set_viewmask(lp->draw, fb->viewmask); lp->dirty |= LP_NEW_FRAMEBUFFER; } diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index c7d7bd04bcf..bd7279c9a4e 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -1450,8 +1450,8 @@ static void render_clear(struct rendering_state *state) struct lvp_image_view *imgv = state->color_att[i].imgv; assert(imgv->surface); - if (state->info.view_mask) { - u_foreach_bit(i, state->info.view_mask) + if (state->framebuffer.viewmask) { + u_foreach_bit(i, state->framebuffer.viewmask) clear_attachment_layers(state, imgv, &state->render_area, i, 1, 0, 0, 0, &color_clear_val); } else { @@ -1480,8 +1480,8 @@ static void render_clear(struct rendering_state *state) } if (ds_clear_flags) { - if (state->info.view_mask) { - u_foreach_bit(i, state->info.view_mask) + if (state->framebuffer.viewmask) { + u_foreach_bit(i, state->framebuffer.viewmask) clear_attachment_layers(state, state->ds_imgv, &state->render_area, i, 1, ds_clear_flags, dclear_val, sclear_val, NULL); } else { @@ -1512,7 +1512,7 @@ static void render_clear_fast(struct rendering_state *state) state->render_area.extent.height != state->framebuffer.height) goto slow_clear; - if (state->info.view_mask) + if (state->framebuffer.viewmask) goto slow_clear; if (state->render_cond) @@ -1828,7 +1828,7 @@ handle_begin_rendering(struct vk_cmd_queue_entry *cmd, state->forced_stencil_resolve_mode = 0; } - state->info.view_mask = info->viewMask; + state->framebuffer.viewmask = info->viewMask; state->render_area = info->renderArea; state->suspending = suspending; state->framebuffer.width = info->renderArea.offset.x + @@ -1915,8 +1915,8 @@ static void handle_end_rendering(struct vk_cmd_queue_entry *cmd, for (unsigned i = 0; i < state->framebuffer.nr_cbufs; i++) { if (state->color_att[i].imgv && state->color_att[i].store_op == VK_ATTACHMENT_STORE_OP_DONT_CARE) { - if (state->info.view_mask) { - u_foreach_bit(i, state->info.view_mask) + if (state->framebuffer.viewmask) { + u_foreach_bit(i, state->framebuffer.viewmask) clear_attachment_layers(state, state->color_att[i].imgv, &state->render_area, i, 1, 0, 0, 0, &color_clear_val); } else { @@ -1939,8 +1939,8 @@ static void handle_end_rendering(struct vk_cmd_queue_entry *cmd, double dclear_val = 0.2389234; uint32_t sclear_val = rand() % UINT8_MAX; if (ds_clear_flags) { - if (state->info.view_mask) { - u_foreach_bit(i, state->info.view_mask) + if (state->framebuffer.viewmask) { + u_foreach_bit(i, state->framebuffer.viewmask) clear_attachment_layers(state, state->ds_imgv, &state->render_area, i, 1, ds_clear_flags, dclear_val, sclear_val, NULL); } else { @@ -2885,7 +2885,7 @@ static void handle_begin_query(struct vk_cmd_queue_entry *cmd, emit_state(state); - uint32_t count = util_bitcount(state->info.view_mask ? state->info.view_mask : BITFIELD_BIT(0)); + uint32_t count = util_bitcount(state->framebuffer.viewmask ? state->framebuffer.viewmask : BITFIELD_BIT(0)); for (unsigned idx = 0; idx < count; idx++) { if (!pool->queries[qcmd->query + idx]) { enum pipe_query_type qtype = pool->base_type; @@ -2922,7 +2922,7 @@ static void handle_begin_query_indexed_ext(struct vk_cmd_queue_entry *cmd, emit_state(state); - uint32_t count = util_bitcount(state->info.view_mask ? state->info.view_mask : BITFIELD_BIT(0)); + uint32_t count = util_bitcount(state->framebuffer.viewmask ? state->framebuffer.viewmask : BITFIELD_BIT(0)); for (unsigned idx = 0; idx < count; idx++) { if (!pool->queries[qcmd->query + idx]) { enum pipe_query_type qtype = pool->base_type; @@ -2968,7 +2968,7 @@ static void handle_write_timestamp2(struct vk_cmd_queue_entry *cmd, if (!(qcmd->stage == VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT)) state->pctx->flush(state->pctx, NULL, 0); - uint32_t count = util_bitcount(state->info.view_mask ? state->info.view_mask : BITFIELD_BIT(0)); + uint32_t count = util_bitcount(state->framebuffer.viewmask ? state->framebuffer.viewmask : BITFIELD_BIT(0)); for (unsigned idx = 0; idx < count; idx++) { if (!pool->queries[qcmd->query + idx]) { pool->queries[qcmd->query + idx] = state->pctx->create_query(state->pctx, PIPE_QUERY_TIMESTAMP, 0); @@ -3185,8 +3185,8 @@ static void handle_clear_attachments(struct vk_cmd_queue_entry *cmd, rect->rect.offset.y = MAX2(rect->rect.offset.y, 0); rect->rect.extent.width = MIN2(rect->rect.extent.width, state->framebuffer.width - rect->rect.offset.x); rect->rect.extent.height = MIN2(rect->rect.extent.height, state->framebuffer.height - rect->rect.offset.y); - if (state->info.view_mask) { - u_foreach_bit(i, state->info.view_mask) + if (state->framebuffer.viewmask) { + u_foreach_bit(i, state->framebuffer.viewmask) clear_attachment_layers(state, imgv, &rect->rect, i, 1, ds_clear_flags, dclear_val, sclear_val, diff --git a/src/gallium/frontends/nine/nine_state.c b/src/gallium/frontends/nine/nine_state.c index 8b8e1a992c0..04470ec5a3b 100644 --- a/src/gallium/frontends/nine/nine_state.c +++ b/src/gallium/frontends/nine/nine_state.c @@ -2425,7 +2425,6 @@ init_draw_info(struct pipe_draw_info *info, info->increment_draw_id = false; info->was_line_loop = false; info->restart_index = 0; - info->view_mask = 0; } CSMT_ITEM_NO_WAIT(nine_context_draw_primitive, diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index 3372c915bc7..a384fb0178a 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -854,8 +854,7 @@ struct pipe_draw_info /* sizeof(mode) == 1 is required by draw merging in u_threaded_context. */ uint8_t mode; /**< the mode of the primitive */ #endif - uint8_t index_size; /**< if 0, the draw is not indexed. */ - uint8_t view_mask; /**< mask of multiviews for this draw */ + uint16_t index_size; /**< if 0, the draw is not indexed. */ bool primitive_restart:1; bool has_user_indices:1; /**< if true, use index.user_buffer */ bool index_bounds_valid:1; /**< whether min_index and max_index are valid; diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c index 848c9bf1aa4..485ae07ecb0 100644 --- a/src/mesa/main/draw.c +++ b/src/mesa/main/draw.c @@ -1167,7 +1167,6 @@ _mesa_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start, /* Packed section end. */ info.start_instance = baseInstance; info.instance_count = numInstances; - info.view_mask = 0; info.min_index = start; info.max_index = start + count - 1; @@ -1474,7 +1473,6 @@ _mesa_MultiDrawArrays(GLenum mode, const GLint *first, /* Packed section end. */ info.start_instance = 0; info.instance_count = 1; - info.view_mask = 0; for (int i = 0; i < primcount; i++) { draw[i].start = first[i]; @@ -1640,7 +1638,6 @@ _mesa_validated_drawrangeelements(struct gl_context *ctx, */ draw->info.mode = mode; draw->info.index_size = 1 << index_size_shift; - draw->info.view_mask = 0; /* Packed section begin. */ draw->info.primitive_restart = primitive_restart; draw->info.has_user_indices = false; @@ -1680,7 +1677,6 @@ _mesa_validated_drawrangeelements(struct gl_context *ctx, /* Packed section end. */ info.start_instance = baseInstance; info.instance_count = numInstances; - info.view_mask = 0; info.restart_index = ctx->Array._RestartIndex[index_size_shift]; if (info.has_user_indices) { @@ -2071,7 +2067,6 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, /* Packed section end. */ info.start_instance = 0; info.instance_count = 1; - info.view_mask = 0; info.restart_index = ctx->Array._RestartIndex[index_size_shift]; if (info.has_user_indices) { @@ -2450,7 +2445,6 @@ _mesa_MultiDrawArraysIndirect(GLenum mode, const GLvoid *indirect, struct pipe_draw_info info; info.mode = mode; info.index_size = 0; - info.view_mask = 0; /* Packed section begin. */ info.primitive_restart = false; info.has_user_indices = false; @@ -2545,7 +2539,6 @@ _mesa_MultiDrawElementsIndirect(GLenum mode, GLenum type, struct pipe_draw_info info; info.mode = mode; info.index_size = 1 << index_size_shift; - info.view_mask = 0; /* Packed section begin. */ info.primitive_restart = ctx->Array._PrimitiveRestart[index_size_shift]; info.has_user_indices = false;