Mesa (master): r300g: fix texture swizzling for the SRGB formats

Marek Olšák mareko at kemper.freedesktop.org
Wed Feb 24 00:01:36 UTC 2010


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Tue Feb 23 09:08:28 2010 +0100

r300g: fix texture swizzling for the SRGB formats

---

 src/gallium/drivers/r300/r300_texture.c |   24 ++++++++++++++++++++----
 1 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c
index ed2be06..7b116b3 100644
--- a/src/gallium/drivers/r300/r300_texture.c
+++ b/src/gallium/drivers/r300/r300_texture.c
@@ -70,6 +70,19 @@ static uint32_t r300_translate_texformat(enum pipe_format format)
         R300_TX_FORMAT_B_SHIFT,
         R300_TX_FORMAT_A_SHIFT
     };
+    const uint32_t swizzle_arith[4] = {
+        R300_TX_FORMAT_X,
+        R300_TX_FORMAT_Y,
+        R300_TX_FORMAT_Z,
+        R300_TX_FORMAT_W
+    };
+    const uint32_t swizzle_array[4] = {
+        R300_TX_FORMAT_W,
+        R300_TX_FORMAT_Z,
+        R300_TX_FORMAT_Y,
+        R300_TX_FORMAT_X
+    };
+    const uint32_t *swizzle;
     const uint32_t sign_bit[4] = {
         R300_TX_FORMAT_SIGNED_X,
         R300_TX_FORMAT_SIGNED_Y,
@@ -115,20 +128,23 @@ static uint32_t r300_translate_texformat(enum pipe_format format)
     }
 
     /* Add swizzle. */
+    swizzle = desc->layout == UTIL_FORMAT_LAYOUT_ARITH ?
+              swizzle_arith : swizzle_array;
+
     for (i = 0; i < 4; i++) {
         switch (desc->swizzle[i]) {
             case UTIL_FORMAT_SWIZZLE_X:
             case UTIL_FORMAT_SWIZZLE_NONE:
-                result |= R300_TX_FORMAT_X << swizzle_shift[i];
+                result |= swizzle[0] << swizzle_shift[i];
                 break;
             case UTIL_FORMAT_SWIZZLE_Y:
-                result |= R300_TX_FORMAT_Y << swizzle_shift[i];
+                result |= swizzle[1] << swizzle_shift[i];
                 break;
             case UTIL_FORMAT_SWIZZLE_Z:
-                result |= R300_TX_FORMAT_Z << swizzle_shift[i];
+                result |= swizzle[2] << swizzle_shift[i];
                 break;
             case UTIL_FORMAT_SWIZZLE_W:
-                result |= R300_TX_FORMAT_W << swizzle_shift[i];
+                result |= swizzle[3] << swizzle_shift[i];
                 break;
             case UTIL_FORMAT_SWIZZLE_0:
                 result |= R300_TX_FORMAT_ZERO << swizzle_shift[i];




More information about the mesa-commit mailing list