[Mesa-stable] [PATCH V2 09/10] mesa: Add support to unpack depth-stencil texture in to FLOAT_32_UNSIGNED_INT_24_8_REV

Brian Paul brianp at vmware.com
Tue Mar 25 15:40:33 PDT 2014


On 03/25/2014 04:04 PM, Anuj Phogat wrote:
> V2: Follow the new naming convention for unpack functions.
>      Use double precision for converting Z24 to a float.
>
> Cc: <mesa-stable at lists.freedesktop.org>
> Signed-off-by: Anuj Phogat <anuj.phogat at 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;

I think you could use the 'struct z32f_x24s8' type in this function and 
below like some of the other functions.

Also, in this function the stencil value is put in the most significant 
byte position but in the next function it's put in the least significant 
position.  I think one or the other is wrong.

> +      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);
>



More information about the mesa-stable mailing list