Mesa (master): r300g: S3TC.

Corbin Simpson csimpson at kemper.freedesktop.org
Sat Jun 27 04:33:20 UTC 2009


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

Author: Corbin Simpson <MostAwesomeDude at gmail.com>
Date:   Fri Jun 26 21:13:57 2009 -0700

r300g: S3TC.

tests/texcompress2 doesn't work, but tests/texcmp does (more or less.)

---

 src/gallium/drivers/r300/r300_screen.c  |   31 +++++++++++++++++++++++++------
 src/gallium/drivers/r300/r300_texture.h |   11 +++++++++++
 2 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
index 711c225..6817d71 100644
--- a/src/gallium/drivers/r300/r300_screen.c
+++ b/src/gallium/drivers/r300/r300_screen.c
@@ -94,8 +94,7 @@ static int r300_get_param(struct pipe_screen* pscreen, int param)
                 return 0;
             }
         case PIPE_CAP_S3TC:
-            /* IN THEORY */
-            return 0;
+            return 1;
         case PIPE_CAP_ANISOTROPIC_FILTER:
             return 1;
         case PIPE_CAP_POINT_SPRITE:
@@ -182,7 +181,8 @@ static float r300_get_paramf(struct pipe_screen* pscreen, int param)
     }
 }
 
-static boolean check_tex_2d_format(enum pipe_format format, boolean is_r500)
+static boolean check_tex_2d_format(enum pipe_format format, uint32_t usage,
+                                   boolean is_r500)
 {
     switch (format) {
         /* Supported formats. */
@@ -190,14 +190,33 @@ static boolean check_tex_2d_format(enum pipe_format format, boolean is_r500)
         case PIPE_FORMAT_A4R4G4B4_UNORM:
         case PIPE_FORMAT_R5G6B5_UNORM:
         case PIPE_FORMAT_A1R5G5B5_UNORM:
-        case PIPE_FORMAT_A8R8G8B8_UNORM:
+            return usage &
+                (PIPE_TEXTURE_USAGE_RENDER_TARGET |
+                 PIPE_TEXTURE_USAGE_DISPLAY_TARGET |
+                 PIPE_TEXTURE_USAGE_PRIMARY);
+
+        /* Texture */
+        case PIPE_FORMAT_DXT1_RGB:
+        case PIPE_FORMAT_DXT1_RGBA:
+        case PIPE_FORMAT_DXT3_RGBA:
+        case PIPE_FORMAT_DXT5_RGBA:
+            return usage & PIPE_TEXTURE_USAGE_SAMPLER;
+
         /* Colorbuffer or texture */
+        case PIPE_FORMAT_A8R8G8B8_UNORM:
+        case PIPE_FORMAT_R8G8B8A8_UNORM:
         case PIPE_FORMAT_I8_UNORM:
+            return usage &
+                (PIPE_TEXTURE_USAGE_RENDER_TARGET |
+                 PIPE_TEXTURE_USAGE_DISPLAY_TARGET |
+                 PIPE_TEXTURE_USAGE_PRIMARY |
+                 PIPE_TEXTURE_USAGE_SAMPLER);
+
         /* Z buffer */
         case PIPE_FORMAT_Z16_UNORM:
         /* Z buffer with stencil */
         case PIPE_FORMAT_Z24S8_UNORM:
-            return TRUE;
+            return usage & PIPE_TEXTURE_USAGE_DEPTH_STENCIL;
 
         /* Definitely unsupported formats. */
         /* Non-usable Z buffer/stencil formats. */
@@ -247,7 +266,7 @@ static boolean r300_is_format_supported(struct pipe_screen* pscreen,
 {
     switch (target) {
         case PIPE_TEXTURE_2D:
-            return check_tex_2d_format(format,
+            return check_tex_2d_format(format, tex_usage,
                 r300_screen(pscreen)->caps->is_r500);
         case PIPE_TEXTURE_1D:
         case PIPE_TEXTURE_3D:
diff --git a/src/gallium/drivers/r300/r300_texture.h b/src/gallium/drivers/r300/r300_texture.h
index e2429c0..28157de 100644
--- a/src/gallium/drivers/r300/r300_texture.h
+++ b/src/gallium/drivers/r300/r300_texture.h
@@ -44,6 +44,17 @@ static INLINE uint32_t r300_translate_texformat(enum pipe_format format)
             return R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
         case PIPE_FORMAT_R8G8B8A8_UNORM:
             return R300_EASY_TX_FORMAT(Y, Z, W, X, W8Z8Y8X8);
+        /* DXT1 */
+        case PIPE_FORMAT_DXT1_RGB:
+            return R300_EASY_TX_FORMAT(X, Y, Z, ONE, DXT1);
+        case PIPE_FORMAT_DXT1_RGBA:
+            return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT1);
+        /* DXT3 */
+        case PIPE_FORMAT_DXT3_RGBA:
+            return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT3);
+        /* DXT5 */
+        case PIPE_FORMAT_DXT5_RGBA:
+            return R300_EASY_TX_FORMAT(Y, Z, W, X, DXT5);
         default:
             debug_printf("r300: Implementation error: "
                 "Got unsupported texture format %s in %s\n",




More information about the mesa-commit mailing list