From 2b37f233143275d5d11fc0a5f392b8d99c7bad29 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 19 Feb 2025 15:56:50 -0500 Subject: [PATCH] gallium: fix pipe_framebuffer_state::view_mask MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit this is the mask of the number of views, not the actual views being selected llvmpipe previously had this wrong, though I don't understand how vkcts didn't cover it cc: mesa-stable Reviewed-by: Marek Olšák Part-of: --- src/gallium/drivers/llvmpipe/lp_rast.c | 10 ++++++---- src/gallium/drivers/llvmpipe/lp_rast_priv.h | 17 +++++++++-------- src/gallium/drivers/llvmpipe/lp_scene.c | 1 + src/gallium/drivers/llvmpipe/lp_scene.h | 1 + src/mesa/state_tracker/st_atom_framebuffer.c | 11 ++++------- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c index a72d96e0933..6f0c1e10495 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast.c +++ b/src/gallium/drivers/llvmpipe/lp_rast.c @@ -317,6 +317,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task, const struct lp_fragment_shader_variant *variant = state->variant; + unsigned view_index = inputs->view_index; /* render the whole 64x64 tile in 4x4 chunks */ for (unsigned y = 0; y < task->height; y += 4){ for (unsigned x = 0; x < task->width; x += 4) { @@ -330,7 +331,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task, sample_stride[i] = scene->cbufs[i].sample_stride; color[i] = lp_rast_get_color_block_pointer(task, i, tile_x + x, tile_y + y, - inputs->layer + inputs->view_index); + inputs->layer, view_index); } else { stride[i] = 0; sample_stride[i] = 0; @@ -345,7 +346,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task, if (scene->zsbuf.map) { depth = lp_rast_get_depth_block_pointer(task, tile_x + x, tile_y + y, - inputs->layer + inputs->view_index); + inputs->layer, view_index); depth_stride = scene->zsbuf.stride; depth_sample_stride = scene->zsbuf.sample_stride; } @@ -432,12 +433,13 @@ lp_rast_shade_quads_mask_sample(struct lp_rasterizer_task *task, uint8_t *color[PIPE_MAX_COLOR_BUFS]; unsigned stride[PIPE_MAX_COLOR_BUFS]; unsigned sample_stride[PIPE_MAX_COLOR_BUFS]; + unsigned view_index = inputs->view_index; for (unsigned i = 0; i < scene->fb.nr_cbufs; i++) { if (scene->fb.cbufs[i]) { stride[i] = scene->cbufs[i].stride; sample_stride[i] = scene->cbufs[i].sample_stride; color[i] = lp_rast_get_color_block_pointer(task, i, x, y, - inputs->layer + inputs->view_index); + inputs->layer, view_index); } else { stride[i] = 0; sample_stride[i] = 0; @@ -452,7 +454,7 @@ lp_rast_shade_quads_mask_sample(struct lp_rasterizer_task *task, if (scene->zsbuf.map) { depth_stride = scene->zsbuf.stride; depth_sample_stride = scene->zsbuf.sample_stride; - depth = lp_rast_get_depth_block_pointer(task, x, y, inputs->layer + inputs->view_index); + depth = lp_rast_get_depth_block_pointer(task, x, y, inputs->layer, view_index); } assert(lp_check_alignment(state->jit_context.u8_blend_color, 16)); diff --git a/src/gallium/drivers/llvmpipe/lp_rast_priv.h b/src/gallium/drivers/llvmpipe/lp_rast_priv.h index 48407cef1b2..390988c471b 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast_priv.h +++ b/src/gallium/drivers/llvmpipe/lp_rast_priv.h @@ -157,7 +157,7 @@ lp_rast_shade_quads_mask(struct lp_rasterizer_task *task, static inline uint8_t * lp_rast_get_color_block_pointer(struct lp_rasterizer_task *task, unsigned buf, unsigned x, unsigned y, - unsigned layer) + unsigned layer, unsigned view_index) { assert(x < task->scene->tiles_x * TILE_SIZE); assert(y < task->scene->tiles_y * TILE_SIZE); @@ -178,9 +178,9 @@ lp_rast_get_color_block_pointer(struct lp_rasterizer_task *task, py * task->scene->cbufs[buf].stride; uint8_t *color = task->color_tiles[buf] + pixel_offset; - if (layer) { + if (layer || view_index) { assert(layer <= task->scene->fb_max_layer); - color += layer * task->scene->cbufs[buf].layer_stride; + color += (layer + view_index) * task->scene->cbufs[buf].layer_stride; } assert(lp_check_alignment(color, llvmpipe_get_format_alignment(task->scene->fb.cbufs[buf]->format))); @@ -194,7 +194,7 @@ lp_rast_get_color_block_pointer(struct lp_rasterizer_task *task, */ static inline uint8_t * lp_rast_get_depth_block_pointer(struct lp_rasterizer_task *task, - unsigned x, unsigned y, unsigned layer) + unsigned x, unsigned y, unsigned layer, unsigned view_index) { assert(x < task->scene->tiles_x * TILE_SIZE); assert(y < task->scene->tiles_y * TILE_SIZE); @@ -209,8 +209,8 @@ lp_rast_get_depth_block_pointer(struct lp_rasterizer_task *task, py * task->scene->zsbuf.stride; uint8_t *depth = task->depth_tile + pixel_offset; - if (layer) { - depth += layer * task->scene->zsbuf.layer_stride; + if (layer || view_index) { + depth += (layer + view_index) * task->scene->zsbuf.layer_stride; } assert(lp_check_alignment(depth, llvmpipe_get_format_alignment(task->scene->fb.zsbuf->format))); @@ -237,6 +237,7 @@ lp_rast_shade_quads_all(struct lp_rasterizer_task *task, uint8_t *depth = NULL; unsigned depth_stride = 0; unsigned depth_sample_stride = 0; + unsigned view_index = inputs->view_index; /* color buffer */ for (unsigned i = 0; i < scene->fb.nr_cbufs; i++) { @@ -244,7 +245,7 @@ lp_rast_shade_quads_all(struct lp_rasterizer_task *task, stride[i] = scene->cbufs[i].stride; sample_stride[i] = scene->cbufs[i].sample_stride; color[i] = lp_rast_get_color_block_pointer(task, i, x, y, - inputs->layer + inputs->view_index); + inputs->layer, view_index); } else { stride[i] = 0; sample_stride[i] = 0; @@ -253,7 +254,7 @@ lp_rast_shade_quads_all(struct lp_rasterizer_task *task, } if (scene->zsbuf.map) { - depth = lp_rast_get_depth_block_pointer(task, x, y, inputs->layer + inputs->view_index); + depth = lp_rast_get_depth_block_pointer(task, x, y, inputs->layer, view_index); depth_sample_stride = scene->zsbuf.sample_stride; depth_stride = scene->zsbuf.stride; } diff --git a/src/gallium/drivers/llvmpipe/lp_scene.c b/src/gallium/drivers/llvmpipe/lp_scene.c index 1a5f6b7d8c0..aa8f93345fe 100644 --- a/src/gallium/drivers/llvmpipe/lp_scene.c +++ b/src/gallium/drivers/llvmpipe/lp_scene.c @@ -181,6 +181,7 @@ init_scene_texture(struct lp_scene_surface *ssurf, struct pipe_surface *psurf) assert(ssurf->map); ssurf->format_bytes = util_format_get_blocksize(psurf->format); ssurf->nr_samples = util_res_sample_count(psurf->texture); + ssurf->base_layer = psurf->u.tex.first_layer; ssurf->layer_count = psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1; } else { struct llvmpipe_resource *lpr = llvmpipe_resource(psurf->texture); diff --git a/src/gallium/drivers/llvmpipe/lp_scene.h b/src/gallium/drivers/llvmpipe/lp_scene.h index ef2002ef64a..0c68ae90d4e 100644 --- a/src/gallium/drivers/llvmpipe/lp_scene.h +++ b/src/gallium/drivers/llvmpipe/lp_scene.h @@ -127,6 +127,7 @@ struct lp_scene_surface { unsigned format_bytes; unsigned sample_stride; unsigned nr_samples; + unsigned base_layer; unsigned layer_count; }; diff --git a/src/mesa/state_tracker/st_atom_framebuffer.c b/src/mesa/state_tracker/st_atom_framebuffer.c index 4f831a30cfb..87394935aff 100644 --- a/src/mesa/state_tracker/st_atom_framebuffer.c +++ b/src/mesa/state_tracker/st_atom_framebuffer.c @@ -147,7 +147,6 @@ st_update_framebuffer_state( struct st_context *st ) framebuffer.nr_cbufs = fb->_NumColorDrawBuffers; unsigned num_multiview_layer = 0; - unsigned first_multiview_layer = 0; for (i = 0; i < fb->_NumColorDrawBuffers; i++) { framebuffer.cbufs[i] = NULL; rb = fb->_ColorDrawBuffers[i]; @@ -159,10 +158,7 @@ st_update_framebuffer_state( struct st_context *st ) _mesa_update_renderbuffer_surface(ctx, rb); - if (rb->rtt_numviews) { - first_multiview_layer = rb->rtt_slice; - num_multiview_layer = MAX2(num_multiview_layer, rb->rtt_numviews); - } + num_multiview_layer = MAX2(num_multiview_layer, rb->rtt_numviews); } if (rb->surface) { @@ -175,8 +171,6 @@ st_update_framebuffer_state( struct st_context *st ) rb->defined = GL_TRUE; /* we'll be drawing something */ } } - if (num_multiview_layer) - framebuffer.viewmask = BITFIELD_RANGE(first_multiview_layer, num_multiview_layer); for (i = framebuffer.nr_cbufs; i < PIPE_MAX_COLOR_BUFS; i++) { framebuffer.cbufs[i] = NULL; @@ -199,6 +193,7 @@ st_update_framebuffer_state( struct st_context *st ) if (rb->is_rtt) { /* rendering to a GL texture, may have to update surface */ _mesa_update_renderbuffer_surface(ctx, rb); + num_multiview_layer = MAX2(num_multiview_layer, rb->rtt_numviews); } if (rb->surface && rb->surface->context != ctx->pipe) { _mesa_regen_renderbuffer_surface(ctx, rb); @@ -210,6 +205,8 @@ st_update_framebuffer_state( struct st_context *st ) else framebuffer.zsbuf = NULL; + framebuffer.viewmask = BITFIELD_MASK(num_multiview_layer); + #ifndef NDEBUG /* Make sure the resource binding flags were set properly */ for (i = 0; i < framebuffer.nr_cbufs; i++) {