mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 18:18:06 +02:00
gallium: fix pipe_framebuffer_state::view_mask
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 <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33632>
(cherry picked from commit 2b37f23314)
This commit is contained in:
parent
30455e071c
commit
3a2e0fb0f7
6 changed files with 22 additions and 20 deletions
|
|
@ -64,7 +64,7 @@
|
|||
"description": "gallium: fix pipe_framebuffer_state::view_mask",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": null,
|
||||
"notes": null
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -127,6 +127,7 @@ struct lp_scene_surface {
|
|||
unsigned format_bytes;
|
||||
unsigned sample_stride;
|
||||
unsigned nr_samples;
|
||||
unsigned base_layer;
|
||||
unsigned layer_count;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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++) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue