[Mesa-dev] [PATCH] mesa/msaa: Allow X and Y flips in multisampled blits.

Kenneth Graunke kenneth at whitecape.org
Thu Sep 6 16:30:08 PDT 2012


On 09/05/2012 04:22 PM, Paul Berry wrote:
> From the GL 4.3 spec, section 18.3.1 "Blitting Pixel Rectangles":
> 
>     If SAMPLE_BUFFERS for either the read framebuffer or draw
>     framebuffer is greater than zero, no copy is performed and an
>     INVALID_OPERATION error is generated if the dimensions of the
>     source and destination rectangles provided to BlitFramebuffer are
>     not identical, or if the formats of the read and draw framebuffers
>     are not identical.
> 
> It is not clear from the spec whether "dimensions" should mean both
> sign and magnitude, or just magnitude.
> 
> Previously, Mesa interpreted "dimensions" as meaning both sign and
> magnitude, so any multisampled blit that attempted to flip the image
> in the X and/or Y direction would fail.
> 
> However, Y flips are likely to be commonplace in OpenGL applications
> that have been ported from DirectX applications, as a result of the
> fact that DirectX and OpenGL differ in their orientation of the Y
> axis.  Furthermore, at least one commercial driver (nVidia) permits Y
> filps, and L4D2 relies on them being permitted.  So it seems prudent
> for Mesa to permit them.
> 
> This patch changes Mesa to allow both X and Y flips, since there is no
> language in the spec to indicate that X and Y flips should be treated
> differently.
> 
> NOTE: This is a candidate for stable release branches.
> ---
>  src/mesa/main/fbobject.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
> index 59a5ec3..abc9d83 100644
> --- a/src/mesa/main/fbobject.c
> +++ b/src/mesa/main/fbobject.c
> @@ -2979,8 +2979,8 @@ _mesa_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>     /* extra checks for multisample copies... */
>     if (readFb->Visual.samples > 0 || drawFb->Visual.samples > 0) {
>        /* src and dest region sizes must be the same */
> -      if (srcX1 - srcX0 != dstX1 - dstX0 ||
> -          srcY1 - srcY0 != dstY1 - dstY0) {
> +      if (abs(srcX1 - srcX0) != abs(dstX1 - dstX0) ||
> +          abs(srcY1 - srcY0) != abs(dstY1 - dstY0)) {
>           _mesa_error(ctx, GL_INVALID_OPERATION,
>                  "glBlitFramebufferEXT(bad src/dst multisample region sizes)");
>           return;
> 

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>


More information about the mesa-dev mailing list