Mesa (master): r300g: compose swizzles from texture formats and sampler views

Marek Olšák mareko at kemper.freedesktop.org
Thu Apr 29 02:39:49 UTC 2010


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Thu Apr 29 04:32:25 2010 +0200

r300g: compose swizzles from texture formats and sampler views

---

 src/gallium/drivers/r300/r300_state.c   |    4 +---
 src/gallium/drivers/r300/r300_texture.c |   30 ++++++++++++------------------
 src/gallium/drivers/r300/r300_texture.h |    2 +-
 3 files changed, 14 insertions(+), 22 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index edd5222..9319dad 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -1075,11 +1075,9 @@ r300_create_sampler_view(struct pipe_context *pipe,
         swizzle[2] = templ->swizzle_b;
         swizzle[3] = templ->swizzle_a;
 
-        /* XXX Enable swizzles when they become supported. Now we get RGBA
-         * everywhere. And do testing! */
         view->format = tex->tx_format;
         view->format.format1 |= r300_translate_texformat(templ->format,
-                                                         0); /*swizzle);*/
+                                                         swizzle);
         if (r300_screen(pipe->screen)->caps.is_r500) {
             view->format.format2 |= r500_tx_format_msb_bit(templ->format);
         }
diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c
index bffda84..50b355c 100644
--- a/src/gallium/drivers/r300/r300_texture.c
+++ b/src/gallium/drivers/r300/r300_texture.c
@@ -74,7 +74,7 @@ static boolean r300_format_is_plain(enum pipe_format format)
  * The FORMAT specifies how the texture sampler will treat the texture, and
  * makes available X, Y, Z, W, ZERO, and ONE for swizzling. */
 uint32_t r300_translate_texformat(enum pipe_format format,
-                                  const unsigned char *swizzle)
+                                  const unsigned char *swizzle_view)
 {
     uint32_t result = 0;
     const struct util_format_description *desc;
@@ -98,6 +98,7 @@ uint32_t r300_translate_texformat(enum pipe_format format,
         R300_TX_FORMAT_SIGNED_Z,
         R300_TX_FORMAT_SIGNED_W,
     };
+    unsigned char swizzle[4];
 
     desc = util_format_description(format);
 
@@ -144,25 +145,18 @@ uint32_t r300_translate_texformat(enum pipe_format format,
             }
     }
 
-    /* Add swizzle. */
-    if (!swizzle) {
-        swizzle = desc->swizzle;
-    } /*else {
-        if (swizzle[0] != desc->swizzle[0] ||
-            swizzle[1] != desc->swizzle[1] ||
-            swizzle[2] != desc->swizzle[2] ||
-            swizzle[3] != desc->swizzle[3])
-        {
-            const char n[6] = "RGBA01";
-            fprintf(stderr, "Got different swizzling! Format: %c%c%c%c, "
-                    "View: %c%c%c%c\n",
-                    n[desc->swizzle[0]], n[desc->swizzle[1]],
-                    n[desc->swizzle[2]], n[desc->swizzle[3]],
-                    n[swizzle[0]], n[swizzle[1]], n[swizzle[2]],
-                    n[swizzle[3]]);
+    /* Get swizzle. */
+    if (swizzle_view) {
+        /* Compose two sets of swizzles. */
+        for (i = 0; i < 4; i++) {
+            swizzle[i] = swizzle_view[i] <= UTIL_FORMAT_SWIZZLE_W ?
+                         desc->swizzle[swizzle_view[i]] : swizzle_view[i];
         }
-    }*/
+    } else {
+        memcpy(swizzle, desc->swizzle, sizeof(swizzle));
+    }
 
+    /* Add swizzle. */
     for (i = 0; i < 4; i++) {
         switch (swizzle[i]) {
             case UTIL_FORMAT_SWIZZLE_X:
diff --git a/src/gallium/drivers/r300/r300_texture.h b/src/gallium/drivers/r300/r300_texture.h
index 453d42b..ba79ec0 100644
--- a/src/gallium/drivers/r300/r300_texture.h
+++ b/src/gallium/drivers/r300/r300_texture.h
@@ -28,7 +28,7 @@
 struct r300_texture;
 
 uint32_t r300_translate_texformat(enum pipe_format format,
-                                  const unsigned char *swizzle);
+                                  const unsigned char *swizzle_view);
 
 uint32_t r500_tx_format_msb_bit(enum pipe_format format);
 




More information about the mesa-commit mailing list