Mesa (9.0): mesa: fix BlitFramebuffer between linear and sRGB formats

Marek Olšák mareko at kemper.freedesktop.org
Sat Dec 22 01:48:22 UTC 2012


Module: Mesa
Branch: 9.0
Commit: e1cb624a43cf3ef1c928bf03c26c0cf2f236a1a1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e1cb624a43cf3ef1c928bf03c26c0cf2f236a1a1

Author: Marek Olšák <maraeo at gmail.com>
Date:   Fri Nov 23 03:02:44 2012 +0100

mesa: fix BlitFramebuffer between linear and sRGB formats

NOTE: This is a candidate for the stable branches.

Reviewed-by: Brian Paul <brianp at vmware.com>
(cherry picked from commit 91ca053714957aca5205122e8478002c62cc4344)

---

 src/mesa/main/fbobject.c |   42 +++++++++++++++++++++++++++++++++++++++---
 1 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 6d9bf35..c812aaf 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -2796,11 +2796,41 @@ get_nongeneric_internalformat(GLenum format)
 }
 
 
+static GLenum
+get_linear_internalformat(GLenum format)
+{
+   switch (format) {
+   case GL_SRGB:
+      return GL_RGB;
+
+   case GL_SRGB_ALPHA:
+      return GL_RGBA;
+
+   case GL_SRGB8:
+      return GL_RGB8;
+
+   case GL_SRGB8_ALPHA8:
+      return GL_RGBA8;
+
+   case GL_SLUMINANCE:
+      return GL_LUMINANCE8;
+
+   case GL_SLUMINANCE_ALPHA:
+      return GL_LUMINANCE8_ALPHA8;
+
+   default:
+      return format;
+   }
+}
+
+
 static GLboolean
 compatible_resolve_formats(const struct gl_renderbuffer *colorReadRb,
                            const struct gl_renderbuffer *colorDrawRb)
 {
-   /* The simple case where we know the backing formats are the same.
+   GLenum readFormat, drawFormat;
+
+   /* The simple case where we know the backing Mesa formats are the same.
     */
    if (_mesa_get_srgb_format_linear(colorReadRb->Format) ==
        _mesa_get_srgb_format_linear(colorDrawRb->Format)) {
@@ -2814,9 +2844,15 @@ compatible_resolve_formats(const struct gl_renderbuffer *colorReadRb,
     * textures and get two entirely different Mesa formats like RGBA8888 and
     * ARGB8888. Drivers behaving like that should be able to cope with
     * non-matching formats by themselves, because it's not the user's fault.
+    *
+    * Blits between linear and sRGB formats are also allowed.
     */
-   if (get_nongeneric_internalformat(colorReadRb->InternalFormat) ==
-       get_nongeneric_internalformat(colorDrawRb->InternalFormat)) {
+   readFormat = get_nongeneric_internalformat(colorReadRb->InternalFormat);
+   drawFormat = get_nongeneric_internalformat(colorDrawRb->InternalFormat);
+   readFormat = get_linear_internalformat(readFormat);
+   drawFormat = get_linear_internalformat(drawFormat);
+
+   if (readFormat == drawFormat) {
       return GL_TRUE;
    }
 




More information about the mesa-commit mailing list