[Mesa-dev] [PATCH] mesa: add NV_read_{depth, stencil, depth_stencil} extensions
Ilia Mirkin
imirkin at alum.mit.edu
Mon Aug 10 14:37:35 PDT 2015
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?
> 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