Module: Mesa
Branch: main
Commit: 20d4c592c9686374209796ea7ba17fc562279c85
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=20d4c592c9686374209796ea7ba17fc562279c85

Author: Amber <[email protected]>
Date:   Wed Feb  1 16:38:36 2023 +0100

freedreno: make sure depth/stencil layouts are always tiled

Small depth/stencil textures were using linear tiling, but depth/stencil
attachments cannot use linear tiling for sysmem rendering.

Fixes:
 KHR-GL45.geometry_shader.layered_framebuffer.stencil_support
 KHR-GL45.geometry_shader.layered_framebuffer.depth_support

Signed-off-by: Amber Amber <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21046>

---

 src/freedreno/ci/freedreno-a618-fails.txt          |  7 -------
 src/freedreno/ci/freedreno-a630-fails.txt          |  7 -------
 src/gallium/drivers/freedreno/a6xx/fd6_blitter.c   |  3 ++-
 src/gallium/drivers/freedreno/freedreno_resource.c | 16 ++++++++--------
 src/gallium/drivers/freedreno/freedreno_resource.h | 15 ---------------
 5 files changed, 10 insertions(+), 38 deletions(-)

diff --git a/src/freedreno/ci/freedreno-a618-fails.txt 
b/src/freedreno/ci/freedreno-a618-fails.txt
index 0cb7d77e110..dd3cdad5517 100644
--- a/src/freedreno/ci/freedreno-a618-fails.txt
+++ b/src/freedreno/ci/freedreno-a618-fails.txt
@@ -12,13 +12,6 @@ KHR-GL45.shading_language_420pack.binding_images,Fail
 KHR-GL45.compute_shader.conditional-dispatching,Fail
 KHR-GL45.buffer_storage.map_persistent_draw,Fail
 
-# Lots of errors like "[279] Check failed. Received: [3,0,0,2] instead of: 
[5,0,0,2]"
-KHR-GLES31.core.geometry_shader.layered_framebuffer.depth_support,Fail
-KHR-GL45.geometry_shader.layered_framebuffer.depth_support,Fail
-
-KHR-GLES31.core.geometry_shader.layered_framebuffer.stencil_support,Fail
-KHR-GL45.geometry_shader.layered_framebuffer.stencil_support,Fail
-
 # "Invalid value returned: expected:[1, 1, 1, 1] retrieved: [0, 0, 0, 0
 #  Invalid rendering result at esextcTessellationShaderBarrier.cpp:504"
 
KHR-GLES31.core.tessellation_shader.tessellation_shader_tc_barriers.barrier_guarded_read_calls,Fail
diff --git a/src/freedreno/ci/freedreno-a630-fails.txt 
b/src/freedreno/ci/freedreno-a630-fails.txt
index b36e643c110..38682ef09cb 100644
--- a/src/freedreno/ci/freedreno-a630-fails.txt
+++ b/src/freedreno/ci/freedreno-a630-fails.txt
@@ -11,13 +11,6 @@ KHR-GL45.shading_language_420pack.binding_images,Fail
 KHR-GL45.compute_shader.conditional-dispatching,Fail
 KHR-GL45.buffer_storage.map_persistent_draw,Fail
 
-# Lots of errors like "[279] Check failed. Received: [3,0,0,2] instead of: 
[5,0,0,2]"
-KHR-GLES31.core.geometry_shader.layered_framebuffer.depth_support,Fail
-KHR-GL45.geometry_shader.layered_framebuffer.depth_support,Fail
-
-KHR-GLES31.core.geometry_shader.layered_framebuffer.stencil_support,Fail
-KHR-GL45.geometry_shader.layered_framebuffer.stencil_support,Fail
-
 # "Invalid value returned: expected:[1, 1, 1, 1] retrieved: [0, 0, 0, 0
 #  Invalid rendering result at esextcTessellationShaderBarrier.cpp:504"
 
KHR-GLES31.core.tessellation_shader.tessellation_shader_tc_barriers.barrier_guarded_read_calls,Fail
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c 
b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
index 6976e6c707f..72c11083299 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
@@ -1307,7 +1307,8 @@ fd6_tile_mode(const struct pipe_resource *tmpl)
    /* if the mipmap level 0 is still too small to be tiled, then don't
     * bother pretending:
     */
-   if (fd_resource_level_linear(tmpl, 0))
+   if ((tmpl->width0 < FDL_MIN_UBWC_WIDTH) &&
+         !util_format_is_depth_or_stencil(tmpl->format))
       return TILE6_LINEAR;
 
    /* basically just has to be a format we can blit, so uploads/downloads
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c 
b/src/gallium/drivers/freedreno/freedreno_resource.c
index f5d20b16280..48dc555e764 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -1207,7 +1207,7 @@ has_explicit_modifier(const uint64_t *modifiers, int 
count)
 }
 
 static enum fd_layout_type
-get_best_layout(struct fd_screen *screen, struct pipe_resource *prsc,
+get_best_layout(struct fd_screen *screen,
                 const struct pipe_resource *tmpl, const uint64_t *modifiers,
                 int count)
 {
@@ -1218,7 +1218,7 @@ get_best_layout(struct fd_screen *screen, struct 
pipe_resource *prsc,
    if (!screen->tile_mode)
       return LINEAR;
 
-   if (!screen->tile_mode(prsc))
+   if (!screen->tile_mode(tmpl))
       return LINEAR;
 
    if (tmpl->target == PIPE_BUFFER)
@@ -1227,7 +1227,7 @@ get_best_layout(struct fd_screen *screen, struct 
pipe_resource *prsc,
    if (tmpl->bind & PIPE_BIND_LINEAR) {
       if (tmpl->usage != PIPE_USAGE_STAGING)
          perf_debug("%" PRSC_FMT ": forcing linear: bind flags",
-                    PRSC_ARGS(prsc));
+                    PRSC_ARGS(tmpl));
       return LINEAR;
    }
 
@@ -1238,7 +1238,7 @@ get_best_layout(struct fd_screen *screen, struct 
pipe_resource *prsc,
    if (!can_explicit && (tmpl->bind & PIPE_BIND_SHARED)) {
       perf_debug("%" PRSC_FMT
                  ": forcing linear: shared resource + implicit modifiers",
-                 PRSC_ARGS(prsc));
+                 PRSC_ARGS(tmpl));
       return LINEAR;
    }
 
@@ -1257,7 +1257,7 @@ get_best_layout(struct fd_screen *screen, struct 
pipe_resource *prsc,
        !drm_find_modifier(DRM_FORMAT_MOD_QCOM_COMPRESSED, modifiers, count)) {
       perf_debug("%" PRSC_FMT
                  ": not using UBWC: not in acceptable modifier set",
-                 PRSC_ARGS(prsc));
+                 PRSC_ARGS(tmpl));
       ubwc_ok = false;
    }
 
@@ -1277,12 +1277,12 @@ get_best_layout(struct fd_screen *screen, struct 
pipe_resource *prsc,
 
    if (!drm_find_modifier(DRM_FORMAT_MOD_LINEAR, modifiers, count)) {
       perf_debug("%" PRSC_FMT ": need linear but not in modifier set",
-                 PRSC_ARGS(prsc));
+                 PRSC_ARGS(tmpl));
       return ERROR;
    }
 
    perf_debug("%" PRSC_FMT ": not using tiling: explicit modifiers and no 
UBWC",
-              PRSC_ARGS(prsc));
+              PRSC_ARGS(tmpl));
    return LINEAR;
 }
 
@@ -1323,7 +1323,7 @@ fd_resource_allocate_and_resolve(struct pipe_screen 
*pscreen,
    fd_resource_layout_init(prsc);
 
    enum fd_layout_type layout =
-      get_best_layout(screen, prsc, tmpl, modifiers, count);
+      get_best_layout(screen, tmpl, modifiers, count);
    if (layout == ERROR) {
       free(prsc);
       return NULL;
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.h 
b/src/gallium/drivers/freedreno/freedreno_resource.h
index d076de046e0..0d95f7c0386 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.h
+++ b/src/gallium/drivers/freedreno/freedreno_resource.h
@@ -180,12 +180,6 @@ fd_resource(struct pipe_resource *ptex)
    return (struct fd_resource *)ptex;
 }
 
-static inline const struct fd_resource *
-fd_resource_const(const struct pipe_resource *ptex)
-{
-   return (const struct fd_resource *)ptex;
-}
-
 static inline struct fd_memory_object *
 fd_memory_object(struct pipe_memory_object *pmemobj)
 {
@@ -310,15 +304,6 @@ fd_resource_ubwc_offset(struct fd_resource *rsc, unsigned 
level, unsigned layer)
    return offset;
 }
 
-/* This might be a5xx specific, but higher mipmap levels are always linear: */
-static inline bool
-fd_resource_level_linear(const struct pipe_resource *prsc, int level)
-{
-   assert(!is_a3xx(fd_screen(prsc->screen)));
-
-   return fdl_level_linear(&fd_resource_const(prsc)->layout, level);
-}
-
 static inline uint32_t
 fd_resource_tile_mode(struct pipe_resource *prsc, int level)
 {

Reply via email to