mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 04:50:11 +01:00
mesa: Don't allow blits to / from the same buffer in OpenGL ES 3.0
Fixes gles3conform test CoverageES30. It temporarily regresses some framebuffer_blit tests, but the failing subcases have been determined to be invalid for OpenGL ES 3.0. v2: Fix typo in depth (and stencil) RB checking. Noticed by Ken. Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
parent
85c2e99039
commit
9cb64a4cb6
1 changed files with 31 additions and 0 deletions
|
|
@ -2885,6 +2885,23 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
|
|||
if (!colorDrawRb)
|
||||
continue;
|
||||
|
||||
/* Page 193 (page 205 of the PDF) in section 4.3.2 of the OpenGL
|
||||
* ES 3.0.1 spec says:
|
||||
*
|
||||
* "If the source and destination buffers are identical, an
|
||||
* INVALID_OPERATION error is generated. Different mipmap
|
||||
* levels of a texture, different layers of a three-
|
||||
* dimensional texture or two-dimensional array texture, and
|
||||
* different faces of a cube map texture do not constitute
|
||||
* identical buffers."
|
||||
*/
|
||||
if (_mesa_is_gles3(ctx) && (colorDrawRb == colorReadRb)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glBlitFramebuffer(source and destination color "
|
||||
"buffer cannot be the same)");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!compatible_color_datatypes(colorReadRb->Format,
|
||||
colorDrawRb->Format)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
|
|
@ -2934,6 +2951,13 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
|
|||
else {
|
||||
int read_z_bits, draw_z_bits;
|
||||
|
||||
if (_mesa_is_gles3(ctx) && (drawRb == readRb)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glBlitFramebuffer(source and destination stencil "
|
||||
"buffer cannot be the same)");
|
||||
return;
|
||||
}
|
||||
|
||||
if (_mesa_get_format_bits(readRb->Format, GL_STENCIL_BITS) !=
|
||||
_mesa_get_format_bits(drawRb->Format, GL_STENCIL_BITS)) {
|
||||
/* There is no need to check the stencil datatype here, because
|
||||
|
|
@ -2981,6 +3005,13 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
|
|||
else {
|
||||
int read_s_bit, draw_s_bit;
|
||||
|
||||
if (_mesa_is_gles3(ctx) && (drawRb == readRb)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glBlitFramebuffer(source and destination depth "
|
||||
"buffer cannot be the same)");
|
||||
return;
|
||||
}
|
||||
|
||||
if ((_mesa_get_format_bits(readRb->Format, GL_DEPTH_BITS) !=
|
||||
_mesa_get_format_bits(drawRb->Format, GL_DEPTH_BITS)) ||
|
||||
(_mesa_get_format_datatype(readRb->Format) !=
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue