freedreno/a6xx: un-swap X24S8_UINT
authorRob Clark <robdclark@chromium.org>
Thu, 13 Jun 2019 18:58:30 +0000 (11:58 -0700)
committerRob Clark <robdclark@gmail.com>
Mon, 17 Jun 2019 20:29:13 +0000 (20:29 +0000)
The stencil is actually in the .w component, but we used to use SWAP to
remap the channels.  This doesn't work when tiled/ubwc.

Fixes:
  dEQP-GLES31.functional.stencil_texturing.format.depth24_stencil8_2d_array
  dEQP-GLES31.functional.stencil_texturing.format.depth24_stencil8_cube
  dEQP-GLES31.functional.stencil_texturing.format.stencil_index8_2d_array
  dEQP-GLES31.functional.stencil_texturing.format.stencil_index8_cube
  dEQP-GLES31.functional.stencil_texturing.misc.base_level
  dEQP-GLES31.functional.texture.border_clamp.formats.stencil_index8.nearest_size_pot
  dEQP-GLES31.functional.texture.border_clamp.formats.stencil_index8.nearest_size_npot
  dEQP-GLES31.functional.texture.border_clamp.formats.depth24_stencil8_sample_stencil.nearest_size_pot
  dEQP-GLES31.functional.texture.border_clamp.formats.depth24_stencil8_sample_stencil.nearest_size_npot
  dEQP-GLES31.functional.texture.border_clamp.sampler.uint_stencil

Signed-off-by: Rob Clark <robdclark@chromium.org>
src/gallium/drivers/freedreno/a6xx/fd6_emit.c
src/gallium/drivers/freedreno/a6xx/fd6_format.c

index 10ebc04550391e85c7294d0382b9057cef3fd52f..1240786e4dd10143306b740c0352bd9bffe4e935 100644 (file)
@@ -209,15 +209,16 @@ setup_border_colors(struct fd_texture_stateobj *tex, struct bcolor_entry *entrie
                        /*
                         * HACK: for PIPE_FORMAT_X24S8_UINT we end up w/ the
                         * stencil border color value in bc->ui[0] but according
-                        * to desc->swizzle and desc->channel, the .x component
+                        * to desc->swizzle and desc->channel, the .x/.w component
                         * is NONE and the stencil value is in the y component.
-                        * Meanwhile the hardware wants this in the .x componetn.
+                        * Meanwhile the hardware wants this in the .w component
+                        * for x24s8 and the .x component for x32_s8x24.
                         */
                        if ((format == PIPE_FORMAT_X24S8_UINT) ||
                                        (format == PIPE_FORMAT_X32_S8X24_UINT)) {
                                if (j == 0) {
                                        c = 1;
-                                       cd = 0;
+                                       cd = (format == PIPE_FORMAT_X32_S8X24_UINT) ? 0 : 3;
                                } else {
                                        continue;
                                }
index 492de2edfcd41392e39e733f2e080cd0541446ee..5748017633a13b156c39b9d7e05ff6ac3a337246 100644 (file)
@@ -216,7 +216,7 @@ static struct fd6_format formats[PIPE_FORMAT_COUNT] = {
        _T(R9G9B9E5_FLOAT,  9_9_9_E5_FLOAT, NONE,            WZYX),
 
        _T(Z24X8_UNORM,       X8Z24_UNORM,  X8Z24_UNORM,   WZYX),
-       _T(X24S8_UINT,        8_8_8_8_UINT, X8Z24_UNORM,   XYZW),  // XXX
+       _T(X24S8_UINT,        8_8_8_8_UINT, X8Z24_UNORM,   WZYX),
        _T(Z24_UNORM_S8_UINT, X8Z24_UNORM,  X8Z24_UNORM,   WZYX),
        _T(Z32_FLOAT,         32_FLOAT,     R32_FLOAT,     WZYX),
        _T(Z32_FLOAT_S8X24_UINT, 32_FLOAT,  R32_FLOAT,     WZYX),
@@ -453,7 +453,7 @@ fd6_tex_swiz(enum pipe_format format, unsigned char *swiz,
         */
        if (format == PIPE_FORMAT_X24S8_UINT) {
                const unsigned char stencil_swiz[4] = {
-                       PIPE_SWIZZLE_X, PIPE_SWIZZLE_X, PIPE_SWIZZLE_X, PIPE_SWIZZLE_X
+                       PIPE_SWIZZLE_W, PIPE_SWIZZLE_W, PIPE_SWIZZLE_W, PIPE_SWIZZLE_W
                };
                util_format_compose_swizzles(stencil_swiz, uswiz, swiz);
        } else if (fd6_pipe2swap(format) != WZYX) {