From 416da54cce8782227d44d6dffbb0f99860f9725f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20Ondra=C4=8Dka?= Date: Wed, 22 Apr 2026 10:02:07 +0200 Subject: [PATCH] r300: fix MSAA resolve COLORPITCH tiling after pipe_surface de-pointerization r300_simple_msaa_resolve used to patch srcsurf->pitch with the resolve destination's tiling bits before passing the surface to the blitter. That worked when set_framebuffer_state kept the same pipe_surface pointer, so r300_get_nonnull_cb returned the patched object. After the de-pointerization, r300_framebuffer_init creates a fresh r300_surface from the pipe_surface template, discarding the pitch modification. The hardware then uses the MSAA source tiling for R300_RB3D_COLORPITCH0, leading to corruption. Move the tiling override into r300_emit_fb_state and override the tiling bits of COLORPITCH from the destination surface at emit time. Fixes: 2eb45daa9c86 ("gallium: de-pointerize pipe_surface") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/work_items/15303 Part-of: --- src/gallium/drivers/r300/ci/r300-rs740-fails.txt | 7 ------- src/gallium/drivers/r300/ci/r300-rs740-flakes.txt | 2 ++ src/gallium/drivers/r300/ci/r300-rv380-fails.txt | 5 ----- src/gallium/drivers/r300/ci/r300-rv380-flakes.txt | 2 ++ src/gallium/drivers/r300/ci/r300-rv410-fails.txt | 5 ----- src/gallium/drivers/r300/ci/r300-rv410-flakes.txt | 3 +++ src/gallium/drivers/r300/ci/r300-rv530-fails.txt | 5 ----- src/gallium/drivers/r300/ci/r300-rv530-flakes.txt | 1 + src/gallium/drivers/r300/r300_blit.c | 5 ----- src/gallium/drivers/r300/r300_emit.c | 10 +++++++++- 10 files changed, 17 insertions(+), 28 deletions(-) diff --git a/src/gallium/drivers/r300/ci/r300-rs740-fails.txt b/src/gallium/drivers/r300/ci/r300-rs740-fails.txt index da9a55b0ef8..f03a6be5597 100644 --- a/src/gallium/drivers/r300/ci/r300-rs740-fails.txt +++ b/src/gallium/drivers/r300/ci/r300-rs740-fails.txt @@ -1160,16 +1160,9 @@ spec@glsl-1.10@execution@glsl-fs-texture2d-mipmap-const-bias-01,Fail spec@glsl-1.10@execution@glsl-fs-texture2d-mipmap-const-bias-04,Fail spec@glsl-1.10@execution@glsl-fs-texture2d-mipmap-const-bias-05,Fail -glx@glx-copy-sub-buffer samples=2,Fail -glx@glx-copy-sub-buffer samples=4,Fail -glx@glx-copy-sub-buffer samples=6,Fail glx@glx-make-current,Fail glx@glx-multi-window-single-context,Fail glx@glx-swap-pixmap-bad,Fail -glx@glx-visuals-depth,Fail -glx@glx-visuals-depth -pixmap,Fail -glx@glx-visuals-stencil,Fail -glx@glx-visuals-stencil -pixmap,Fail glx@glx_arb_sync_control@waitformsc,Fail spec@egl 1.4@largest possible eglcreatepbuffersurface and then glclear,Fail spec@egl_mesa_configless_context@basic,Fail diff --git a/src/gallium/drivers/r300/ci/r300-rs740-flakes.txt b/src/gallium/drivers/r300/ci/r300-rs740-flakes.txt index 4440c7ded81..d58e03aa14f 100644 --- a/src/gallium/drivers/r300/ci/r300-rs740-flakes.txt +++ b/src/gallium/drivers/r300/ci/r300-rs740-flakes.txt @@ -12,5 +12,7 @@ dEQP-GLES2.functional.fragment_ops.scissor.contained_point shaders@glsl-max-varyings shaders@glsl-vs-point-size +spec@!opengl 1.2@tex3d-maxsize + glx@glx-buffer-age glx@glx-multithread-clearbuffer diff --git a/src/gallium/drivers/r300/ci/r300-rv380-fails.txt b/src/gallium/drivers/r300/ci/r300-rv380-fails.txt index d2a3f78b5df..61c3376857b 100644 --- a/src/gallium/drivers/r300/ci/r300-rv380-fails.txt +++ b/src/gallium/drivers/r300/ci/r300-rv380-fails.txt @@ -478,15 +478,10 @@ KHR-GLES2.texture_3d.filtering.sizes.63x63x63_nearest_mipmap_linear,Fail KHR-GLES2.texture_3d.filtering.sizes.63x63x63_nearest_mipmap_nearest,Fail # Piglit GPU tests -glx@glx-copy-sub-buffer samples=2,Fail -glx@glx-copy-sub-buffer samples=4,Fail -glx@glx-copy-sub-buffer samples=6,Fail glx@glx-make-current,Fail glx@glx-multi-window-single-context,Fail glx@glx-swap-pixmap-bad,Fail -glx@glx-visuals-depth -pixmap,Fail glx@glx-visuals-depth,Fail -glx@glx-visuals-stencil -pixmap,Fail glx@glx-visuals-stencil,Fail glx@glx_arb_sync_control@waitformsc,Fail diff --git a/src/gallium/drivers/r300/ci/r300-rv380-flakes.txt b/src/gallium/drivers/r300/ci/r300-rv380-flakes.txt index e68f3f1da99..d9e28111044 100644 --- a/src/gallium/drivers/r300/ci/r300-rv380-flakes.txt +++ b/src/gallium/drivers/r300/ci/r300-rv380-flakes.txt @@ -13,3 +13,5 @@ spec@!opengl 1.2@tex3d-maxsize glx@glx-buffer-age glx@glx-multithread-clearbuffer + +glx@glx-visuals-stencil diff --git a/src/gallium/drivers/r300/ci/r300-rv410-fails.txt b/src/gallium/drivers/r300/ci/r300-rv410-fails.txt index 0645a94f2f2..66b69243b00 100644 --- a/src/gallium/drivers/r300/ci/r300-rv410-fails.txt +++ b/src/gallium/drivers/r300/ci/r300-rv410-fails.txt @@ -1208,16 +1208,11 @@ spec@glsl-1.10@execution@glsl-fs-texture2d-mipmap-const-bias-05,Fail shaders@glsl-max-varyings,Fail spec@!opengl 1.2@tex3d-maxsize,Fail -glx@glx-copy-sub-buffer samples=2,Fail -glx@glx-copy-sub-buffer samples=4,Fail -glx@glx-copy-sub-buffer samples=6,Fail glx@glx-make-current,Fail glx@glx-multi-window-single-context,Fail glx@glx-swap-pixmap-bad,Fail glx@glx-visuals-depth,Fail -glx@glx-visuals-depth -pixmap,Fail glx@glx-visuals-stencil,Fail -glx@glx-visuals-stencil -pixmap,Fail glx@glx_arb_sync_control@waitformsc,Fail spec@egl 1.4@largest possible eglcreatepbuffersurface and then glclear,Fail spec@egl_mesa_configless_context@basic,Fail diff --git a/src/gallium/drivers/r300/ci/r300-rv410-flakes.txt b/src/gallium/drivers/r300/ci/r300-rv410-flakes.txt index 9f07de5d00a..637f38c0563 100644 --- a/src/gallium/drivers/r300/ci/r300-rv410-flakes.txt +++ b/src/gallium/drivers/r300/ci/r300-rv410-flakes.txt @@ -10,3 +10,6 @@ spec@!opengl 1.2@tex3d-maxsize glx@glx-buffer-age glx@glx-multithread-clearbuffer +glx@glx-visuals-depth +glx@glx-visuals-stencil + diff --git a/src/gallium/drivers/r300/ci/r300-rv530-fails.txt b/src/gallium/drivers/r300/ci/r300-rv530-fails.txt index 40b6142a595..67beb75b850 100644 --- a/src/gallium/drivers/r300/ci/r300-rv530-fails.txt +++ b/src/gallium/drivers/r300/ci/r300-rv530-fails.txt @@ -711,15 +711,10 @@ spec@glsl-1.10@execution@glsl-fs-texture2d-mipmap-const-bias-01,Fail spec@glsl-1.10@execution@glsl-fs-texture2d-mipmap-const-bias-04,Fail spec@glsl-1.10@execution@glsl-fs-texture2d-mipmap-const-bias-05,Fail -glx@glx-copy-sub-buffer samples=2,Fail -glx@glx-copy-sub-buffer samples=4,Fail -glx@glx-copy-sub-buffer samples=6,Fail glx@glx-make-current,Fail glx@glx-multi-window-single-context,Fail glx@glx-swap-pixmap-bad,Fail glx@glx-visuals-depth,Fail -glx@glx-visuals-depth -pixmap,Fail glx@glx-visuals-stencil,Fail -glx@glx-visuals-stencil -pixmap,Fail glx@glx_arb_sync_control@waitformsc,Fail spec@egl_mesa_configless_context@basic,Fail diff --git a/src/gallium/drivers/r300/ci/r300-rv530-flakes.txt b/src/gallium/drivers/r300/ci/r300-rv530-flakes.txt index bf93c8174c4..c6c41662886 100644 --- a/src/gallium/drivers/r300/ci/r300-rv530-flakes.txt +++ b/src/gallium/drivers/r300/ci/r300-rv530-flakes.txt @@ -1,2 +1,3 @@ glx@glx-buffer-age glx@glx-multithread-clearbuffer +glx@glx-visuals-stencil diff --git a/src/gallium/drivers/r300/r300_blit.c b/src/gallium/drivers/r300/r300_blit.c index 49d089e567b..cc953fddc30 100644 --- a/src/gallium/drivers/r300/r300_blit.c +++ b/src/gallium/drivers/r300/r300_blit.c @@ -765,11 +765,6 @@ static void r300_simple_msaa_resolve(struct pipe_context *pipe, surf_tmpl.last_layer = dst_layer; dstsurf = r300_surface(r300_create_surface(pipe, dst, &surf_tmpl)); - /* COLORPITCH should contain the tiling info of the resolve buffer. - * The tiling of the AA buffer isn't programmable anyway. */ - srcsurf->pitch &= ~(R300_COLOR_TILE(1) | R300_COLOR_MICROTILE(3)); - srcsurf->pitch |= dstsurf->pitch & (R300_COLOR_TILE(1) | R300_COLOR_MICROTILE(3)); - /* Enable AA resolve. */ aa->dest = dstsurf; r300->aa_state.size = 8; diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c index 67ea029dadb..3c49094c139 100644 --- a/src/gallium/drivers/r300/r300_emit.c +++ b/src/gallium/drivers/r300/r300_emit.c @@ -416,6 +416,7 @@ void r300_emit_aa_state(struct r300_context *r300, unsigned size, void *state) void r300_emit_fb_state(struct r300_context* r300, unsigned size, void* state) { struct pipe_framebuffer_state* fb = (struct pipe_framebuffer_state*)state; + struct r300_aa_state *aa = (struct r300_aa_state*)r300->aa_state.state; struct r300_surface* surf; unsigned i; uint32_t rb3d_cctl = 0; @@ -445,7 +446,14 @@ void r300_emit_fb_state(struct r300_context* r300, unsigned size, void* state) OUT_CS_REG(R300_RB3D_COLOROFFSET0 + (4 * i), surf->offset); OUT_CS_RELOC(surf); - OUT_CS_REG(R300_RB3D_COLORPITCH0 + (4 * i), surf->pitch); + /* COLORPITCH should contain the tiling info of the resolve buffer. + * The tiling of the AA buffer isn't programmable anyway. */ + uint32_t pitch = surf->pitch; + if (aa->dest) { + pitch &= ~(R300_COLOR_TILE(1) | R300_COLOR_MICROTILE(3)); + pitch |= aa->dest->pitch & (R300_COLOR_TILE(1) | R300_COLOR_MICROTILE(3)); + } + OUT_CS_REG(R300_RB3D_COLORPITCH0 + (4 * i), pitch); OUT_CS_RELOC(surf); if (r300->cmask_in_use && i == 0) {