blit: Don't take into account the Mesa format when checking MSRT blit
authorNeil Roberts <neil@linux.intel.com>
Thu, 19 Nov 2015 14:29:19 +0000 (15:29 +0100)
committerNeil Roberts <neil@linux.intel.com>
Thu, 10 Dec 2015 11:03:58 +0000 (11:03 +0000)
According to the GLES3 spec, blitting between multisample FBOs with
different internal formats should not be allowed. The
compatible_resolve_formats function implements this check. Previously
it had a shortcut where if the Mesa formats of the two renderbuffers
were the same then it would assume the blit is ok. However some
drivers map different internal formats to the same Mesa format, for
example it might implement both GL_RGB and GL_RGBA textures with
MESA_FORMAT_R8G8B8A_UNORM. The function is used to generate a GL error
according to what the GL spec requires so the blit should not be
allowed in that case. This patch just removes the shortcut so that it
only ever looks at the internal format.

Note that I posted a related patch to disable this check altogether
for desktop GL. However this function is still used on GLES3 because
there are conformance tests that require this behaviour so this patch
is still useful.

Cc: Marek Olšák <maraeo@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/main/blit.c

index a32f1a42aea3595b609562aac71665b52c0b84d5..abc553966e9831d9aa182cbfd6eacb384aea955f 100644 (file)
@@ -129,20 +129,22 @@ compatible_resolve_formats(const struct gl_renderbuffer *readRb,
 {
    GLenum readFormat, drawFormat;
 
-   /* The simple case where we know the backing Mesa formats are the same.
-    */
-   if (_mesa_get_srgb_format_linear(readRb->Format) ==
-       _mesa_get_srgb_format_linear(drawRb->Format)) {
-      return GL_TRUE;
-   }
-
-   /* The Mesa formats are different, so we must check whether the internal
-    * formats are compatible.
+   /* This checks whether the internal formats are compatible rather than the
+    * Mesa format for two reasons:
+    *
+    * • Under some circumstances, the user may request e.g. two GL_RGBA8
+    *   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.
+    *
+    * • Picking two different internal formats can end up with the same Mesa
+    *   format. For example the driver might be simulating GL_RGB textures
+    *   with GL_RGBA internally and in that case both internal formats would
+    *   end up with RGBA8888.
     *
-    * Under some circumstances, the user may request e.g. two GL_RGBA8
-    * 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.
+    * This function is used to generate a GL error according to the spec so in
+    * both cases we want to be looking at the application-level format, which
+    * is InternalFormat.
     *
     * Blits between linear and sRGB formats are also allowed.
     */