mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-24 14:40:21 +01:00
nv50: make sure to clear _all_ layers of all attachments
Unfortunately there's only one RT_ARRAY_MODE setting for all
attachments, so clears were previously truncated to the minimum number
of layers any attachment had. Instead set the RT_ARRAY_MODE to 512 (the
max number of layers) before doing the clear. This fixes
gl-3.2-layered-rendering-clear-color-mismatched-layer-count.
Also fix clears of individual layered rt/zeta, in case it ever happens.
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Reviewed-by: Christoph Bumiller <e0425955@student.tuwien.ac.at>
Cc: 10.1 <mesa-stable@lists.freedesktop.org>
(cherry picked from commit 6152ba0894)
This commit is contained in:
parent
d8012560d5
commit
e32e2836a3
3 changed files with 21 additions and 3 deletions
|
|
@ -171,6 +171,8 @@ struct nv50_context {
|
|||
|
||||
boolean vbo_push_hint;
|
||||
|
||||
uint32_t rt_array_mode;
|
||||
|
||||
struct pipe_query *cond_query;
|
||||
boolean cond_cond;
|
||||
uint cond_mode;
|
||||
|
|
|
|||
|
|
@ -65,6 +65,7 @@ nv50_validate_fb(struct nv50_context *nv50)
|
|||
PUSH_DATA (push, sf->height);
|
||||
BEGIN_NV04(push, NV50_3D(RT_ARRAY_MODE), 1);
|
||||
PUSH_DATA (push, array_mode | array_size);
|
||||
nv50->rt_array_mode = array_mode | array_size;
|
||||
} else {
|
||||
PUSH_DATA (push, 0);
|
||||
PUSH_DATA (push, 0);
|
||||
|
|
|
|||
|
|
@ -295,7 +295,7 @@ nv50_clear_render_target(struct pipe_context *pipe,
|
|||
PUSH_DATA (push, bo->offset + sf->offset);
|
||||
PUSH_DATA (push, nv50_format_table[dst->format].rt);
|
||||
PUSH_DATA (push, mt->level[sf->base.u.tex.level].tile_mode);
|
||||
PUSH_DATA (push, 0);
|
||||
PUSH_DATA (push, mt->layer_stride >> 2);
|
||||
BEGIN_NV04(push, NV50_3D(RT_HORIZ(0)), 2);
|
||||
if (nouveau_bo_memtype(bo))
|
||||
PUSH_DATA(push, sf->width);
|
||||
|
|
@ -303,7 +303,10 @@ nv50_clear_render_target(struct pipe_context *pipe,
|
|||
PUSH_DATA(push, NV50_3D_RT_HORIZ_LINEAR | mt->level[0].pitch);
|
||||
PUSH_DATA (push, sf->height);
|
||||
BEGIN_NV04(push, NV50_3D(RT_ARRAY_MODE), 1);
|
||||
PUSH_DATA (push, 1);
|
||||
if (mt->layout_3d)
|
||||
PUSH_DATA(push, NV50_3D_RT_ARRAY_MODE_MODE_3D | 512);
|
||||
else
|
||||
PUSH_DATA(push, 512);
|
||||
|
||||
if (!nouveau_bo_memtype(bo)) {
|
||||
BEGIN_NV04(push, NV50_3D(ZETA_ENABLE), 1);
|
||||
|
|
@ -366,7 +369,7 @@ nv50_clear_depth_stencil(struct pipe_context *pipe,
|
|||
PUSH_DATA (push, bo->offset + sf->offset);
|
||||
PUSH_DATA (push, nv50_format_table[dst->format].rt);
|
||||
PUSH_DATA (push, mt->level[sf->base.u.tex.level].tile_mode);
|
||||
PUSH_DATA (push, 0);
|
||||
PUSH_DATA (push, mt->layer_stride >> 2);
|
||||
BEGIN_NV04(push, NV50_3D(ZETA_ENABLE), 1);
|
||||
PUSH_DATA (push, 1);
|
||||
BEGIN_NV04(push, NV50_3D(ZETA_HORIZ), 3);
|
||||
|
|
@ -374,6 +377,9 @@ nv50_clear_depth_stencil(struct pipe_context *pipe,
|
|||
PUSH_DATA (push, sf->height);
|
||||
PUSH_DATA (push, (1 << 16) | 1);
|
||||
|
||||
BEGIN_NV04(push, NV50_3D(RT_ARRAY_MODE), 1);
|
||||
PUSH_DATA (push, 512);
|
||||
|
||||
BEGIN_NV04(push, NV50_3D(VIEWPORT_HORIZ(0)), 2);
|
||||
PUSH_DATA (push, (width << 16) | dstx);
|
||||
PUSH_DATA (push, (height << 16) | dsty);
|
||||
|
|
@ -402,6 +408,11 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers,
|
|||
if (!nv50_state_validate(nv50, NV50_NEW_FRAMEBUFFER, 9 + (fb->nr_cbufs * 2)))
|
||||
return;
|
||||
|
||||
/* We have to clear ALL of the layers, not up to the min number of layers
|
||||
* of any attachment. */
|
||||
BEGIN_NV04(push, NV50_3D(RT_ARRAY_MODE), 1);
|
||||
PUSH_DATA (push, (nv50->rt_array_mode & NV50_3D_RT_ARRAY_MODE_MODE_3D) | 512);
|
||||
|
||||
if (buffers & PIPE_CLEAR_COLOR && fb->nr_cbufs) {
|
||||
BEGIN_NV04(push, NV50_3D(CLEAR_COLOR(0)), 4);
|
||||
PUSH_DATAf(push, color->f[0]);
|
||||
|
|
@ -459,6 +470,10 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers,
|
|||
(j << NV50_3D_CLEAR_BUFFERS_LAYER__SHIFT));
|
||||
}
|
||||
}
|
||||
|
||||
/* restore the array mode */
|
||||
BEGIN_NV04(push, NV50_3D(RT_ARRAY_MODE), 1);
|
||||
PUSH_DATA (push, nv50->rt_array_mode);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue