Mesa (master): r300g: fix RGTC1_UNORM and RGTC2_UNORM

Marek Olšák mareko at kemper.freedesktop.org
Tue Mar 1 02:29:03 UTC 2011


Module: Mesa
Branch: master
Commit: 7a61957424a457f416d20c2b366232fb4bbc7761
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7a61957424a457f416d20c2b366232fb4bbc7761

Author: Marek Olšák <maraeo at gmail.com>
Date:   Tue Mar  1 03:21:23 2011 +0100

r300g: fix RGTC1_UNORM and RGTC2_UNORM

Signs don't work the way I'd like...

---

 src/gallium/drivers/r300/r300_state_derived.c |   18 ++++++++++++++++--
 src/gallium/drivers/r300/r300_texture.c       |   19 +++++++++++--------
 2 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_state_derived.c b/src/gallium/drivers/r300/r300_state_derived.c
index 7776ab5..7e06958 100644
--- a/src/gallium/drivers/r300/r300_state_derived.c
+++ b/src/gallium/drivers/r300/r300_state_derived.c
@@ -641,8 +641,22 @@ static uint32_t r300_get_border_color(enum pipe_format format,
 
     /* Compressed formats. */
     if (util_format_is_compressed(format)) {
-        util_pack_color(border_swizzled, PIPE_FORMAT_R8G8B8A8_UNORM, &uc);
-        return uc.ui;
+        switch (format) {
+        case PIPE_FORMAT_RGTC1_SNORM:
+        case PIPE_FORMAT_RGTC1_UNORM:
+            /* Add 1/32 to round the border color instead of truncating. */
+            /* The Y component is used for the border color. */
+            border_swizzled[1] = border_swizzled[2] + 1.0f/32;
+            util_pack_color(border_swizzled, PIPE_FORMAT_B4G4R4A4_UNORM, &uc);
+            return uc.ui;
+        case PIPE_FORMAT_RGTC2_SNORM:
+        case PIPE_FORMAT_RGTC2_UNORM:
+            util_pack_color(border_swizzled, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
+            return uc.ui;
+        default:
+            util_pack_color(border_swizzled, PIPE_FORMAT_R8G8B8A8_UNORM, &uc);
+            return uc.ui;
+        }
     }
 
     switch (desc->channel[0].size) {
diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c
index bbd3f97..831b06b 100644
--- a/src/gallium/drivers/r300/r300_texture.c
+++ b/src/gallium/drivers/r300/r300_texture.c
@@ -171,8 +171,16 @@ uint32_t r300_translate_texformat(enum pipe_format format,
             }
     }
 
-    result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view,
-                    util_format_is_compressed(format) && dxtc_swizzle);
+    if (util_format_is_compressed(format) &&
+        dxtc_swizzle &&
+        format != PIPE_FORMAT_RGTC2_UNORM &&
+        format != PIPE_FORMAT_RGTC2_SNORM) {
+        result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view,
+                                            dxtc_swizzle);
+    } else {
+        result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view,
+                                            FALSE);
+    }
 
     /* S3TC formats. */
     if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
@@ -215,17 +223,12 @@ uint32_t r300_translate_texformat(enum pipe_format format,
     if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) {
         switch (format) {
             case PIPE_FORMAT_RGTC1_SNORM:
-                result |= sign_bit[0];
+                result |= sign_bit[1];
             case PIPE_FORMAT_RGTC1_UNORM:
-                result &= ~(0xfff << 9); /* mask off swizzle */
-                result |= R300_TX_FORMAT_Y << R300_TX_FORMAT_R_SHIFT;
                 return R500_TX_FORMAT_ATI1N | result;
             case PIPE_FORMAT_RGTC2_SNORM:
                 result |= sign_bit[0] | sign_bit[1];
             case PIPE_FORMAT_RGTC2_UNORM:
-                result &= ~(0xfff << 9); /* mask off swizzle */
-                result |= R300_TX_FORMAT_Y << R300_TX_FORMAT_R_SHIFT |
-                          R300_TX_FORMAT_X << R300_TX_FORMAT_G_SHIFT;
                 return R400_TX_FORMAT_ATI2N | result;
             default:
                 return ~0; /* Unsupported/unknown. */




More information about the mesa-commit mailing list