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

Author: Marek Olšák <[email protected]>
Date:   Sat May  7 15:37:34 2022 -0400

radeonsi: report more missing/broken texture formats as unsupported on gfx6-9

Acked-by: Pierre-Eric Pelloux-Prayer <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16386>

---

 src/gallium/drivers/radeonsi/si_state.c | 30 +++++++++++++++++++++++++-----
 1 file changed, 25 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state.c 
b/src/gallium/drivers/radeonsi/si_state.c
index ea194349c86..d28a4010fbf 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -1966,7 +1966,9 @@ static uint32_t si_translate_texformat(struct pipe_screen 
*screen, enum pipe_for
       return V_008F14_IMG_DATA_FORMAT_10_11_11;
    }
 
-   /* R8G8Bx_SNORM - TODO CxV8U8 */
+   /* Other "OTHER" layouts are unsupported. */
+   if (desc->layout == UTIL_FORMAT_LAYOUT_OTHER)
+      goto out_unknown;
 
    /* hw cannot support mixed formats (except depth/stencil, since only
     * depth is read).*/
@@ -1983,6 +1985,16 @@ static uint32_t si_translate_texformat(struct 
pipe_screen *screen, enum pipe_for
        !desc->channel[first_non_void].pure_integer)
       goto out_unknown;
 
+   /* Reject unsupported 32_*NORM and FIXED formats. */
+   if (desc->channel[first_non_void].size == 32 &&
+       (desc->channel[first_non_void].normalized ||
+        desc->channel[first_non_void].type == UTIL_FORMAT_TYPE_FIXED))
+      goto out_unknown;
+
+   /* This format fails on Gfx8/Carrizo´. */
+   if (format == PIPE_FORMAT_A8R8_UNORM)
+      goto out_unknown;
+
    /* See whether the components are of the same size. */
    for (i = 1; i < desc->nr_channels; i++) {
       uniform = uniform && desc->channel[0].size == desc->channel[i].size;
@@ -1998,6 +2010,13 @@ static uint32_t si_translate_texformat(struct 
pipe_screen *screen, enum pipe_for
          }
          goto out_unknown;
       case 4:
+         /* 5551 and 1555 UINT formats fail on Gfx8/Carrizo´. */
+         if (desc->channel[1].size == 5 &&
+             desc->channel[2].size == 5 &&
+             desc->channel[first_non_void].type == UTIL_FORMAT_TYPE_UNSIGNED &&
+             desc->channel[first_non_void].pure_integer)
+            goto out_unknown;
+
          if (desc->channel[0].size == 5 && desc->channel[1].size == 5 &&
              desc->channel[2].size == 5 && desc->channel[3].size == 1) {
             return V_008F14_IMG_DATA_FORMAT_1_5_5_5;
@@ -2019,11 +2038,12 @@ static uint32_t si_translate_texformat(struct 
pipe_screen *screen, enum pipe_for
    switch (desc->channel[first_non_void].size) {
    case 4:
       switch (desc->nr_channels) {
-#if 0 /* Not supported for render targets */
-      case 2:
-         return V_008F14_IMG_DATA_FORMAT_4_4;
-#endif
       case 4:
+         /* 4444 UINT formats fail on Gfx8/Carrizo´. */
+         if (desc->channel[first_non_void].type == UTIL_FORMAT_TYPE_UNSIGNED &&
+             desc->channel[first_non_void].pure_integer)
+            goto out_unknown;
+
          return V_008F14_IMG_DATA_FORMAT_4_4_4_4;
       }
       break;

Reply via email to