[Mesa-dev] [PATCH] mesa: fix software mipmap generation code for packed Z/stencil formats

Brian Paul brian.e.paul at gmail.com
Fri Oct 7 07:21:55 PDT 2011


From: Brian Paul <brianp at vmware.com>

Fixes https://bugs.freedesktop.org/show_bug.cgi?id=32458
---
 src/mesa/main/formats.c |    8 ++++----
 src/mesa/main/mipmap.c  |   38 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 41 insertions(+), 5 deletions(-)

diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
index 02b2028..6307f8e 100644
--- a/src/mesa/main/formats.c
+++ b/src/mesa/main/formats.c
@@ -2075,13 +2075,13 @@ _mesa_format_to_type_and_comps(gl_format format,
       return;
 
    case MESA_FORMAT_Z24_S8:
-      *datatype = GL_UNSIGNED_INT;
-      *comps = 1; /* XXX OK? */
+      *datatype = GL_UNSIGNED_INT_24_8_MESA;
+      *comps = 2;
       return;
 
    case MESA_FORMAT_S8_Z24:
-      *datatype = GL_UNSIGNED_INT;
-      *comps = 1; /* XXX OK? */
+      *datatype = GL_UNSIGNED_INT_8_24_REV_MESA;
+      *comps = 2;
       return;
 
    case MESA_FORMAT_Z16:
diff --git a/src/mesa/main/mipmap.c b/src/mesa/main/mipmap.c
index f04a98b..46d71bb 100644
--- a/src/mesa/main/mipmap.c
+++ b/src/mesa/main/mipmap.c
@@ -43,7 +43,13 @@
 static GLint
 bytes_per_pixel(GLenum datatype, GLuint comps)
 {
-   GLint b = _mesa_sizeof_packed_type(datatype);
+   GLint b;
+
+   if (datatype == GL_UNSIGNED_INT_8_24_REV_MESA ||
+       datatype == GL_UNSIGNED_INT_24_8_MESA)
+      return 4;
+
+   b = _mesa_sizeof_packed_type(datatype);
    assert(b >= 0);
 
    if (_mesa_type_is_packed(datatype))
@@ -717,6 +723,36 @@ do_row(GLenum datatype, GLuint comps, GLint srcWidth,
       }
    }
 
+   else if (datatype == GL_UNSIGNED_INT_24_8_MESA && comps == 2) {
+      GLuint i, j, k;
+      const GLuint *rowA = (const GLuint *) srcRowA;
+      const GLuint *rowB = (const GLuint *) srcRowB;
+      GLuint *dst = (GLuint *) dstRow;
+      /* note: averaging stencil values seems weird, but what else? */
+      for (i = j = 0, k = k0; i < (GLuint) dstWidth;
+           i++, j += colStride, k += colStride) {
+         GLuint z = (((rowA[j] >> 8) + (rowA[k] >> 8) +
+                      (rowB[j] >> 8) + (rowB[k] >> 8)) / 4) << 8;
+         GLuint s = ((rowA[j] & 0xff) + (rowA[k] & 0xff) +
+                     (rowB[j] & 0xff) + (rowB[k] & 0xff)) / 4;
+         dst[i] = z | s;
+      }
+   }
+   else if (datatype == GL_UNSIGNED_INT_8_24_REV_MESA && comps == 2) {
+      GLuint i, j, k;
+      const GLuint *rowA = (const GLuint *) srcRowA;
+      const GLuint *rowB = (const GLuint *) srcRowB;
+      GLuint *dst = (GLuint *) dstRow;
+      for (i = j = 0, k = k0; i < (GLuint) dstWidth;
+           i++, j += colStride, k += colStride) {
+         GLuint z = ((rowA[j] & 0xffffff) + (rowA[k] & 0xffffff) +
+                     (rowB[j] & 0xffffff) + (rowB[k] & 0xffffff)) / 4;
+         GLuint s = (((rowA[j] >> 24) + (rowA[k] >> 24) +
+                      (rowB[j] >> 24) + (rowB[k] >> 24)) / 4) << 24;
+         dst[i] = z | s;
+      }
+   }
+
    else {
       _mesa_problem(NULL, "bad format in do_row()");
    }
-- 
1.7.3.4



More information about the mesa-dev mailing list