V2: Follow the new naming convention for unpack functions. Use double precision for converting Z24 to a float.
Cc: <mesa-sta...@lists.freedesktop.org> Signed-off-by: Anuj Phogat <anuj.pho...@gmail.com> --- src/mesa/main/format_unpack.c | 86 ++++++++++++++++++++++++++++++++++++++++++- src/mesa/main/format_unpack.h | 5 +++ 2 files changed, 90 insertions(+), 1 deletion(-) diff --git a/src/mesa/main/format_unpack.c b/src/mesa/main/format_unpack.c index 7abbe46..d1a83e8 100644 --- a/src/mesa/main/format_unpack.c +++ b/src/mesa/main/format_unpack.c @@ -4264,6 +4264,86 @@ _mesa_unpack_uint_24_8_depth_stencil_row(mesa_format format, GLuint n, } } +static void +unpack_float_32_uint_24_8_Z24_UNORM_S8_UINT(const GLuint *src, + GLuint *dst, GLuint n) +{ + GLuint i; + GLfloat *d = ((GLfloat *) dst); + const GLdouble scale = 1.0 / (GLdouble) 0xffffff; + + for (i = 0; i < n; i++) { + const GLuint z24 = src[i] & 0xffffff; + const GLfloat zf = z24 * scale; + const GLuint s = src[i] & 0xff000000; + d[i * 2] = zf; + dst[i * 2 + 1] = s; + assert(zf >= 0.0f); + assert(zf <= 1.0f); + } +} + +static void +unpack_float_32_uint_24_8_Z32_FLOAT_S8X24_UINT(const GLuint *src, + GLuint *dst, GLuint n) +{ + GLuint i; + GLfloat *s = ((GLfloat *) src); + GLfloat *d = ((GLfloat *) dst); + + for (i = 0; i < n; i++) { + const GLfloat zf = s[i * 2 + 0]; + const GLuint s = src[i * 2 + 1] & 0xff; + d[i * 2] = zf; + dst[i * 2 + 1] = s; + } +} + +static void +unpack_float_32_uint_24_8_S8_UINT_Z24_UNORM(const GLuint *src, + GLuint *dst, GLuint n) +{ + GLuint i; + GLfloat *d = ((GLfloat *) dst); + const GLdouble scale = 1.0 / (GLdouble) 0xffffff; + + for (i = 0; i < n; i++) { + const GLuint z24 = src[i] >> 8; + const GLfloat zf = z24 * scale; + const GLuint s = src[i] & 0xff; + d[i * 2] = zf; + dst[i * 2 + 1] = s << 24; + assert(zf >= 0.0f); + assert(zf <= 1.0f); + } +} + +/** + * Unpack depth/stencil returning as GL_FLOAT_32_UNSIGNED_INT_24_8_REV. + * \param format the source data format + */ +void +_mesa_unpack_float_32_uint_24_8_depth_stencil_row(mesa_format format, GLuint n, + const void *src, GLuint *dst) +{ + switch (format) { + case MESA_FORMAT_S8_UINT_Z24_UNORM: + unpack_float_32_uint_24_8_S8_UINT_Z24_UNORM(src, dst, n); + break; + case MESA_FORMAT_Z24_UNORM_S8_UINT: + unpack_float_32_uint_24_8_Z24_UNORM_S8_UINT(src, dst, n); + break; + case MESA_FORMAT_Z32_FLOAT_S8X24_UINT: + unpack_float_32_uint_24_8_Z32_FLOAT_S8X24_UINT(src, dst, n); + break; + default: + _mesa_problem(NULL, + "bad format %s in _mesa_unpack_uint_24_8_depth_stencil_row", + _mesa_get_format_name(format)); + return; + } +} + /** * Unpack depth/stencil * \param format the source data format @@ -4274,12 +4354,16 @@ _mesa_unpack_depth_stencil_row(mesa_format format, GLuint n, const void *src, GLenum type, GLuint *dst) { - assert(type == GL_UNSIGNED_INT_24_8); + assert(type == GL_UNSIGNED_INT_24_8 || + type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); switch (type) { case GL_UNSIGNED_INT_24_8: _mesa_unpack_uint_24_8_depth_stencil_row(format, n, src, dst); break; + case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: + _mesa_unpack_float_32_uint_24_8_depth_stencil_row(format, n, src, dst); + break; default: _mesa_problem(NULL, "bad type 0x%x in _mesa_unpack_depth_stencil_row", diff --git a/src/mesa/main/format_unpack.h b/src/mesa/main/format_unpack.h index 5904a28..51f97df 100644 --- a/src/mesa/main/format_unpack.h +++ b/src/mesa/main/format_unpack.h @@ -64,6 +64,11 @@ _mesa_unpack_uint_24_8_depth_stencil_row(mesa_format format, GLuint n, const void *src, GLuint *dst); void +_mesa_unpack_float_32_uint_24_8_depth_stencil_row(mesa_format format, + GLuint n, + const void *src, + GLuint *dst); +void _mesa_unpack_depth_stencil_row(mesa_format format, GLuint n, const void *src, GLenum type, GLuint *dst); -- 1.8.3.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev