mesa: fix software mipmap generation code for packed Z/stencil formats
authorBrian Paul <brianp@vmware.com>
Thu, 6 Oct 2011 22:52:36 +0000 (16:52 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 7 Oct 2011 15:52:04 +0000 (09:52 -0600)
Fixes https://bugs.freedesktop.org/show_bug.cgi?id=32458

Reviewed-by: Chad Versace <chad@chad-versace.us>
src/mesa/main/formats.c
src/mesa/main/mipmap.c

index 02b20284bb766498bc9932b68de6581f1caec42c..6307f8e4df7719f9151a2b3d7dfe46fed7dc9071 100644 (file)
@@ -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:
index f04a98b0337fbcfa62706ebcc206f899b31e1ce2..46d71bb22181c1074bbca993c0f8ba0b2fba2c68 100644 (file)
 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()");
    }