mesa: add NV_read_{depth,stencil,depth_stencil} extensions

These extensions allow reading depth/stencil for GLES contexts, which is
useful for tools like apitrace.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Rob Clark
2015-08-10 06:58:37 -04:00
parent 078aef0e97
commit 81d2fd91a9
2 changed files with 42 additions and 9 deletions
+3
View File
@@ -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 },
+39 -9
View File
@@ -916,10 +916,8 @@ read_pixels_es3_error_check(GLenum format, GLenum type,
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),