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:
@@ -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
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user