[Mesa-dev] [PATCH] mesa: add NV_read_{depth, stencil, depth_stencil} extensions

Rob Clark robdclark at gmail.com
Mon Aug 10 14:41:58 PDT 2015


On Mon, Aug 10, 2015 at 5:37 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> On Mon, Aug 10, 2015 at 5:28 PM, Rob Clark <robdclark at gmail.com> wrote:
>> From: Rob Clark <robclark at freedesktop.org>
>>
>> These extensions allow reading depth/stencil for GLES contexts, which is
>> useful for tools like apitrace.
>>
>> Signed-off-by: Rob Clark <robclark at freedesktop.org>
>> ---
>> v2: rework format/type checking
>>
>>  src/mesa/main/extensions.c |  3 +++
>>  src/mesa/main/readpix.c    | 48 +++++++++++++++++++++++++++++++++++++---------
>>  2 files changed, 42 insertions(+), 9 deletions(-)
>>
>> diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
>> index 2dbfabd..d934d19 100644
>> --- a/src/mesa/main/extensions.c
>> +++ b/src/mesa/main/extensions.c
>> @@ -385,6 +385,9 @@ static const struct extension extension_table[] = {
>>     { "GL_NV_point_sprite",                         o(NV_point_sprite),                         GL,             2001 },
>>     { "GL_NV_primitive_restart",                    o(NV_primitive_restart),                    GLL,            2002 },
>>     { "GL_NV_read_buffer",                          o(dummy_true),                              ES2,            2011 },
>> +   { "GL_NV_read_depth",                           o(dummy_true),                              ES2,            2011 },
>> +   { "GL_NV_read_depth_stencil",                   o(dummy_true),                              ES2,            2011 },
>> +   { "GL_NV_read_stencil",                         o(dummy_true),                              ES2,            2011 },
>>     { "GL_NV_texgen_reflection",                    o(dummy_true),                              GLL,            1999 },
>>     { "GL_NV_texture_barrier",                      o(NV_texture_barrier),                      GL,             2009 },
>>     { "GL_NV_texture_env_combine4",                 o(NV_texture_env_combine4),                 GLL,            1999 },
>> diff --git a/src/mesa/main/readpix.c b/src/mesa/main/readpix.c
>> index 2744232..d826ecf 100644
>> --- a/src/mesa/main/readpix.c
>> +++ b/src/mesa/main/readpix.c
>> @@ -916,10 +916,8 @@ read_pixels_es3_error_check(GLenum format, GLenum type,
>
> Does something need to be done differently for ES2?

I don't *think* so.. in the es2 case it uses the same
_mesa_es_error_check_format_and_type() which is used for texsubimage,
etc (plus the additional is-depth-or-stencil check which I dropped).
That said I'm not 100% sure why gles3 has it's own special readpix
format check fxn while gles2 doesn't.

BR,
-R

>>     const GLenum data_type = _mesa_get_format_datatype(rb->Format);
>>     GLboolean is_unsigned_int = GL_FALSE;
>>     GLboolean is_signed_int = GL_FALSE;
>> -
>> -   if (!_mesa_is_color_format(internalFormat)) {
>> -      return GL_INVALID_OPERATION;
>> -   }
>> +   GLboolean is_float_depth = (internalFormat == GL_DEPTH_COMPONENT32F) ||
>> +         (internalFormat == GL_DEPTH32F_STENCIL8);
>>
>>     is_unsigned_int = _mesa_is_enum_format_unsigned_int(internalFormat);
>>     if (!is_unsigned_int) {
>> @@ -950,6 +948,43 @@ read_pixels_es3_error_check(GLenum format, GLenum type,
>>            (is_unsigned_int && type == GL_UNSIGNED_INT))
>>           return GL_NO_ERROR;
>>        break;
>> +   case GL_DEPTH_STENCIL:
>> +      switch (type) {
>> +      case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
>> +         if (is_float_depth)
>> +            return GL_NO_ERROR;
>> +         break;
>> +      case GL_UNSIGNED_INT_24_8:
>> +         if (!is_float_depth)
>> +            return GL_NO_ERROR;
>> +         break;
>> +      default:
>> +         return GL_INVALID_ENUM;
>> +      }
>> +      break;
>> +   case GL_DEPTH_COMPONENT:
>> +      switch (type) {
>> +      case GL_FLOAT:
>> +         if (is_float_depth)
>> +            return GL_NO_ERROR;
>> +         break;
>> +      case GL_UNSIGNED_SHORT:
>> +      case GL_UNSIGNED_INT_24_8:
>> +         if (!is_float_depth)
>> +            return GL_NO_ERROR;
>> +         break;
>> +      default:
>> +         return GL_INVALID_ENUM;
>> +      }
>> +      break;
>> +   case GL_STENCIL_INDEX:
>> +      switch (type) {
>> +      case GL_UNSIGNED_BYTE:
>> +         return GL_NO_ERROR;
>> +      default:
>> +         return GL_INVALID_ENUM;
>> +      }
>> +      break;
>>     }
>>
>>     return GL_INVALID_OPERATION;
>> @@ -1023,11 +1058,6 @@ _mesa_ReadnPixelsARB( GLint x, GLint y, GLsizei width, GLsizei height,
>>           err = read_pixels_es3_error_check(format, type, rb);
>>        }
>>
>> -      if (err == GL_NO_ERROR && (format == GL_DEPTH_COMPONENT
>> -          || format == GL_DEPTH_STENCIL)) {
>> -         err = GL_INVALID_ENUM;
>> -      }
>> -
>>        if (err != GL_NO_ERROR) {
>>           _mesa_error(ctx, err, "glReadPixels(invalid format %s and/or type %s)",
>>                       _mesa_enum_to_string(format),
>> --
>> 2.4.3
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list