diff options
author | Brian Paul <[email protected]> | 2011-10-06 16:52:36 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2011-10-07 09:52:04 -0600 |
commit | 23c6eb035ba63d39652a10107f323d47b86b90f1 (patch) | |
tree | 642f3dbad5fd09bb29b7bbc39af0211c3887f3d6 /src | |
parent | 9938912ccb7f95961464b52412396489f6c35429 (diff) |
mesa: fix software mipmap generation code for packed Z/stencil formats
Fixes https://bugs.freedesktop.org/show_bug.cgi?id=32458
Reviewed-by: Chad Versace <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/formats.c | 8 | ||||
-rw-r--r-- | 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 02b20284bb7..6307f8e4df7 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 f04a98b0337..46d71bb2218 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()"); } |