Mesa (master): mesa/swrast: fix GL_TEXTURE_2D_ARRAY texture fetches for latc/rgtc formats

Brian Paul brianp at kemper.freedesktop.org
Fri Aug 24 12:20:56 UTC 2012


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

Author: Brian Paul <brianp at vmware.com>
Date:   Wed Aug 22 21:22:00 2012 -0600

mesa/swrast: fix GL_TEXTURE_2D_ARRAY texture fetches for latc/rgtc formats

Fix-up the texel fetch functions so that they handle 3D coords (as used for
array textures) and remove the "f_2d" part from their names.

Helps fix swrast crashes in piglit's copyteximage test.  More to come.

---

 src/mesa/main/texcompress.c      |   16 +++---
 src/mesa/main/texcompress_rgtc.c |  100 +++++++++++++++++++++++---------------
 src/mesa/main/texcompress_rgtc.h |   32 ++++++------
 src/mesa/swrast/s_texfetch.c     |   48 +++++++++---------
 4 files changed, 108 insertions(+), 88 deletions(-)

diff --git a/src/mesa/main/texcompress.c b/src/mesa/main/texcompress.c
index 48c472e..5e66937 100644
--- a/src/mesa/main/texcompress.c
+++ b/src/mesa/main/texcompress.c
@@ -516,30 +516,30 @@ _mesa_decompress_image(gl_format format, GLuint width, GLuint height,
 
    /* Red/RG formats */
    case MESA_FORMAT_RED_RGTC1:
-      fetch = _mesa_fetch_texel_2d_f_red_rgtc1;
+      fetch = _mesa_fetch_texel_red_rgtc1;
       break;
    case MESA_FORMAT_SIGNED_RED_RGTC1:
-      fetch = _mesa_fetch_texel_2d_f_signed_red_rgtc1;
+      fetch = _mesa_fetch_texel_signed_red_rgtc1;
       break;
    case MESA_FORMAT_RG_RGTC2:
-      fetch = _mesa_fetch_texel_2d_f_rg_rgtc2;
+      fetch = _mesa_fetch_texel_rg_rgtc2;
       break;
    case MESA_FORMAT_SIGNED_RG_RGTC2:
-      fetch = _mesa_fetch_texel_2d_f_signed_rg_rgtc2;
+      fetch = _mesa_fetch_texel_signed_rg_rgtc2;
       break;
 
    /* L/LA formats */
    case MESA_FORMAT_L_LATC1:
-      fetch = _mesa_fetch_texel_2d_f_l_latc1;
+      fetch = _mesa_fetch_texel_l_latc1;
       break;
    case MESA_FORMAT_SIGNED_L_LATC1:
-      fetch = _mesa_fetch_texel_2d_f_signed_l_latc1;
+      fetch = _mesa_fetch_texel_signed_l_latc1;
       break;
    case MESA_FORMAT_LA_LATC2:
-      fetch = _mesa_fetch_texel_2d_f_la_latc2;
+      fetch = _mesa_fetch_texel_la_latc2;
       break;
    case MESA_FORMAT_SIGNED_LA_LATC2:
-      fetch = _mesa_fetch_texel_2d_f_signed_la_latc2;
+      fetch = _mesa_fetch_texel_signed_la_latc2;
       break;
 
    /* ETC1 formats */
diff --git a/src/mesa/main/texcompress_rgtc.c b/src/mesa/main/texcompress_rgtc.c
index f707a09..84d8fc7 100644
--- a/src/mesa/main/texcompress_rgtc.c
+++ b/src/mesa/main/texcompress_rgtc.c
@@ -292,12 +292,14 @@ _mesa_texstore_signed_rg_rgtc2(TEXSTORE_PARAMS)
 }
 
 void
-_mesa_fetch_texel_2d_f_red_rgtc1(const struct swrast_texture_image *texImage,
-				 GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_red_rgtc1(const struct swrast_texture_image *texImage,
+                            GLint i, GLint j, GLint k, GLfloat *texel)
 {
    GLubyte red;
-   unsigned_fetch_texel_rgtc(texImage->RowStride, texImage->Map,
-		       i, j, &red, 1);
+   GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
+   unsigned_fetch_texel_rgtc(texImage->RowStride,
+                             texImage->Map + sliceOffset,
+                             i, j, &red, 1);
    texel[RCOMP] = UBYTE_TO_FLOAT(red);
    texel[GCOMP] = 0.0;
    texel[BCOMP] = 0.0;
@@ -305,12 +307,14 @@ _mesa_fetch_texel_2d_f_red_rgtc1(const struct swrast_texture_image *texImage,
 }
 
 void
-_mesa_fetch_texel_2d_f_signed_red_rgtc1(const struct swrast_texture_image *texImage,
-					GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_signed_red_rgtc1(const struct swrast_texture_image *texImage,
+                                   GLint i, GLint j, GLint k, GLfloat *texel)
 {
    GLbyte red;
-   signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Map),
-		       i, j, &red, 1);
+   GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
+   signed_fetch_texel_rgtc(texImage->RowStride,
+                           (GLbyte *)(texImage->Map) + sliceOffset,
+                           i, j, &red, 1);
    texel[RCOMP] = BYTE_TO_FLOAT_TEX(red);
    texel[GCOMP] = 0.0;
    texel[BCOMP] = 0.0;
@@ -318,14 +322,17 @@ _mesa_fetch_texel_2d_f_signed_red_rgtc1(const struct swrast_texture_image *texIm
 }
 
 void
-_mesa_fetch_texel_2d_f_rg_rgtc2(const struct swrast_texture_image *texImage,
-				 GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_rg_rgtc2(const struct swrast_texture_image *texImage,
+                           GLint i, GLint j, GLint k, GLfloat *texel)
 {
    GLubyte red, green;
-   unsigned_fetch_texel_rgtc(texImage->RowStride, texImage->Map,
-		     i, j, &red, 2);
-   unsigned_fetch_texel_rgtc(texImage->RowStride, texImage->Map + 8,
-		     i, j, &green, 2);
+   GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
+   unsigned_fetch_texel_rgtc(texImage->RowStride,
+                             texImage->Map + sliceOffset,
+                             i, j, &red, 2);
+   unsigned_fetch_texel_rgtc(texImage->RowStride,
+                             texImage->Map + sliceOffset + 8,
+                             i, j, &green, 2);
    texel[RCOMP] = UBYTE_TO_FLOAT(red);
    texel[GCOMP] = UBYTE_TO_FLOAT(green);
    texel[BCOMP] = 0.0;
@@ -333,14 +340,17 @@ _mesa_fetch_texel_2d_f_rg_rgtc2(const struct swrast_texture_image *texImage,
 }
 
 void
-_mesa_fetch_texel_2d_f_signed_rg_rgtc2(const struct swrast_texture_image *texImage,
-				       GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_signed_rg_rgtc2(const struct swrast_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, GLfloat *texel)
 {
    GLbyte red, green;
-   signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Map),
-		     i, j, &red, 2);
-   signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Map) + 8,
-		     i, j, &green, 2);
+   GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
+   signed_fetch_texel_rgtc(texImage->RowStride,
+                           (GLbyte *)(texImage->Map) + sliceOffset,
+                           i, j, &red, 2);
+   signed_fetch_texel_rgtc(texImage->RowStride,
+                           (GLbyte *)(texImage->Map) + sliceOffset + 8,
+                           i, j, &green, 2);
    texel[RCOMP] = BYTE_TO_FLOAT_TEX(red);
    texel[GCOMP] = BYTE_TO_FLOAT_TEX(green);
    texel[BCOMP] = 0.0;
@@ -348,12 +358,14 @@ _mesa_fetch_texel_2d_f_signed_rg_rgtc2(const struct swrast_texture_image *texIma
 }
 
 void
-_mesa_fetch_texel_2d_f_l_latc1(const struct swrast_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_l_latc1(const struct swrast_texture_image *texImage,
+                          GLint i, GLint j, GLint k, GLfloat *texel)
 {
    GLubyte red;
-   unsigned_fetch_texel_rgtc(texImage->RowStride, texImage->Map,
-                       i, j, &red, 1);
+   GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
+   unsigned_fetch_texel_rgtc(texImage->RowStride,
+                             texImage->Map + sliceOffset,
+                             i, j, &red, 1);
    texel[RCOMP] =
    texel[GCOMP] =
    texel[BCOMP] = UBYTE_TO_FLOAT(red);
@@ -361,12 +373,14 @@ _mesa_fetch_texel_2d_f_l_latc1(const struct swrast_texture_image *texImage,
 }
 
 void
-_mesa_fetch_texel_2d_f_signed_l_latc1(const struct swrast_texture_image *texImage,
-                                        GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_signed_l_latc1(const struct swrast_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, GLfloat *texel)
 {
    GLbyte red;
-   signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Map),
-                       i, j, &red, 1);
+   GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
+   signed_fetch_texel_rgtc(texImage->RowStride,
+                           (GLbyte *)(texImage->Map) + sliceOffset,
+                           i, j, &red, 1);
    texel[RCOMP] =
    texel[GCOMP] =
    texel[BCOMP] = BYTE_TO_FLOAT_TEX(red);
@@ -374,14 +388,17 @@ _mesa_fetch_texel_2d_f_signed_l_latc1(const struct swrast_texture_image *texImag
 }
 
 void
-_mesa_fetch_texel_2d_f_la_latc2(const struct swrast_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_la_latc2(const struct swrast_texture_image *texImage,
+                           GLint i, GLint j, GLint k, GLfloat *texel)
 {
    GLubyte red, green;
-   unsigned_fetch_texel_rgtc(texImage->RowStride, texImage->Map,
-                     i, j, &red, 2);
-   unsigned_fetch_texel_rgtc(texImage->RowStride, texImage->Map + 8,
-                     i, j, &green, 2);
+   GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
+   unsigned_fetch_texel_rgtc(texImage->RowStride,
+                             texImage->Map + sliceOffset,
+                             i, j, &red, 2);
+   unsigned_fetch_texel_rgtc(texImage->RowStride,
+                             texImage->Map + sliceOffset + 8,
+                             i, j, &green, 2);
    texel[RCOMP] =
    texel[GCOMP] =
    texel[BCOMP] = UBYTE_TO_FLOAT(red);
@@ -389,14 +406,17 @@ _mesa_fetch_texel_2d_f_la_latc2(const struct swrast_texture_image *texImage,
 }
 
 void
-_mesa_fetch_texel_2d_f_signed_la_latc2(const struct swrast_texture_image *texImage,
-                                       GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_signed_la_latc2(const struct swrast_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, GLfloat *texel)
 {
    GLbyte red, green;
-   signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Map),
-                     i, j, &red, 2);
-   signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Map) + 8,
-                     i, j, &green, 2);
+   GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
+   signed_fetch_texel_rgtc(texImage->RowStride,
+                           (GLbyte *)(texImage->Map) + sliceOffset,
+                           i, j, &red, 2);
+   signed_fetch_texel_rgtc(texImage->RowStride,
+                           (GLbyte *)(texImage->Map) + sliceOffset + 8,
+                           i, j, &green, 2);
    texel[RCOMP] =
    texel[GCOMP] =
    texel[BCOMP] = BYTE_TO_FLOAT_TEX(red);
diff --git a/src/mesa/main/texcompress_rgtc.h b/src/mesa/main/texcompress_rgtc.h
index 6be6ad9..91fda88 100644
--- a/src/mesa/main/texcompress_rgtc.h
+++ b/src/mesa/main/texcompress_rgtc.h
@@ -43,35 +43,35 @@ extern GLboolean
 _mesa_texstore_signed_rg_rgtc2(TEXSTORE_PARAMS);
 
 extern void
-_mesa_fetch_texel_2d_f_red_rgtc1(const struct swrast_texture_image *texImage,
-				 GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_red_rgtc1(const struct swrast_texture_image *texImage,
+                            GLint i, GLint j, GLint k, GLfloat *texel);
 
 extern void
-_mesa_fetch_texel_2d_f_signed_red_rgtc1(const struct swrast_texture_image *texImage,
-					GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_signed_red_rgtc1(const struct swrast_texture_image *texImage,
+                                   GLint i, GLint j, GLint k, GLfloat *texel);
 
 extern void
-_mesa_fetch_texel_2d_f_rg_rgtc2(const struct swrast_texture_image *texImage,
-				 GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_rg_rgtc2(const struct swrast_texture_image *texImage,
+                           GLint i, GLint j, GLint k, GLfloat *texel);
 
 extern void
-_mesa_fetch_texel_2d_f_signed_rg_rgtc2(const struct swrast_texture_image *texImage,
-				       GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_signed_rg_rgtc2(const struct swrast_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, GLfloat *texel);
 
 extern void
-_mesa_fetch_texel_2d_f_l_latc1(const struct swrast_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_l_latc1(const struct swrast_texture_image *texImage,
+                          GLint i, GLint j, GLint k, GLfloat *texel);
 
 extern void
-_mesa_fetch_texel_2d_f_signed_l_latc1(const struct swrast_texture_image *texImage,
-                                        GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_signed_l_latc1(const struct swrast_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, GLfloat *texel);
 
 extern void
-_mesa_fetch_texel_2d_f_la_latc2(const struct swrast_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_la_latc2(const struct swrast_texture_image *texImage,
+                           GLint i, GLint j, GLint k, GLfloat *texel);
 
 extern void
-_mesa_fetch_texel_2d_f_signed_la_latc2(const struct swrast_texture_image *texImage,
-                                       GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_signed_la_latc2(const struct swrast_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, GLfloat *texel);
 
 #endif
diff --git a/src/mesa/swrast/s_texfetch.c b/src/mesa/swrast/s_texfetch.c
index db7c887..cd3a2b1 100644
--- a/src/mesa/swrast/s_texfetch.c
+++ b/src/mesa/swrast/s_texfetch.c
@@ -976,51 +976,51 @@ texfetch_funcs[MESA_FORMAT_COUNT] =
    },
    {
       MESA_FORMAT_RED_RGTC1,
-      NULL,
-      _mesa_fetch_texel_2d_f_red_rgtc1,
-      NULL
+      _mesa_fetch_texel_red_rgtc1,
+      _mesa_fetch_texel_red_rgtc1,
+      _mesa_fetch_texel_red_rgtc1
    },
    {
       MESA_FORMAT_SIGNED_RED_RGTC1,
-      NULL,
-      _mesa_fetch_texel_2d_f_signed_red_rgtc1,
-      NULL
+      _mesa_fetch_texel_signed_red_rgtc1,
+      _mesa_fetch_texel_signed_red_rgtc1,
+      _mesa_fetch_texel_signed_red_rgtc1
    },
    {
       MESA_FORMAT_RG_RGTC2,
-      NULL,
-      _mesa_fetch_texel_2d_f_rg_rgtc2,
-      NULL
+      _mesa_fetch_texel_rg_rgtc2,
+      _mesa_fetch_texel_rg_rgtc2,
+      _mesa_fetch_texel_rg_rgtc2
    },
    {
       MESA_FORMAT_SIGNED_RG_RGTC2,
-      NULL,
-      _mesa_fetch_texel_2d_f_signed_rg_rgtc2,
-      NULL
+      _mesa_fetch_texel_signed_rg_rgtc2,
+      _mesa_fetch_texel_signed_rg_rgtc2,
+      _mesa_fetch_texel_signed_rg_rgtc2
    },
    {
       MESA_FORMAT_L_LATC1,
-      NULL,
-      _mesa_fetch_texel_2d_f_l_latc1,
-      NULL
+      _mesa_fetch_texel_l_latc1,
+      _mesa_fetch_texel_l_latc1,
+      _mesa_fetch_texel_l_latc1
    },
    {
       MESA_FORMAT_SIGNED_L_LATC1,
-      NULL,
-      _mesa_fetch_texel_2d_f_signed_l_latc1,
-      NULL
+      _mesa_fetch_texel_signed_l_latc1,
+      _mesa_fetch_texel_signed_l_latc1,
+      _mesa_fetch_texel_signed_l_latc1
    },
    {
       MESA_FORMAT_LA_LATC2,
-      NULL,
-      _mesa_fetch_texel_2d_f_la_latc2,
-      NULL
+      _mesa_fetch_texel_la_latc2,
+      _mesa_fetch_texel_la_latc2,
+      _mesa_fetch_texel_la_latc2
    },
    {
       MESA_FORMAT_SIGNED_LA_LATC2,
-      NULL,
-      _mesa_fetch_texel_2d_f_signed_la_latc2,
-      NULL
+      _mesa_fetch_texel_signed_la_latc2,
+      _mesa_fetch_texel_signed_la_latc2,
+      _mesa_fetch_texel_signed_la_latc2
    },
    {
       MESA_FORMAT_ETC1_RGB8,




More information about the mesa-commit mailing list