[Mesa-dev] [PATCH] mesa: Don't allow blits to / from the same buffer in OpenGL ES 3.0
Ian Romanick
idr at freedesktop.org
Fri Jan 18 13:55:43 PST 2013
On 01/18/2013 11:16 AM, Kenneth Graunke wrote:
> On 01/18/2013 10:54 AM, Ian Romanick wrote:
>> From: Ian Romanick <ian.d.romanick at intel.com>
>>
>> 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.
>>
>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>> ---
>> src/mesa/main/fbobject.c | 31 +++++++++++++++++++++++++++++++
>> 1 file changed, 31 insertions(+)
>>
>> diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
>> index 9db5035..721ecea 100644
>> --- a/src/mesa/main/fbobject.c
>> +++ b/src/mesa/main/fbobject.c
>> @@ -2856,6 +2856,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,
>> @@ -2905,6 +2922,13 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0,
>> GLint srcX1, GLint srcY1,
>> else {
>> int read_z_bits, draw_z_bits;
>>
>> + if (_mesa_is_gles3(ctx) && (drawFb == readFb)) {
>
> Don't you want drawRb == readRb here?
Yes, of course.
>
>> + _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
>> @@ -2952,6 +2976,13 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0,
>> GLint srcX1, GLint srcY1,
>> else {
>> int read_s_bit, draw_s_bit;
>>
>> + if (_mesa_is_gles3(ctx) && (drawFb == readFb)) {
>
> Ditto.
>
>> + _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) !=
>
More information about the mesa-dev
mailing list