summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/blit.c
diff options
context:
space:
mode:
authorNeil Roberts <neil@linux.intel.com>2015-11-19 15:29:19 +0100
committerNeil Roberts <neil@linux.intel.com>2015-12-10 11:03:58 +0000
commitba67739b662eaf68f7a1117005e20079b2653044 (patch)
treec46b42a66998a1b1a47c70567fe52d457144269f /src/mesa/main/blit.c
parent3f10774cbab1e803f8aa3d6d24f8f6f98b8128c3 (diff)
downloadexternal_mesa3d-ba67739b662eaf68f7a1117005e20079b2653044.zip
external_mesa3d-ba67739b662eaf68f7a1117005e20079b2653044.tar.gz
external_mesa3d-ba67739b662eaf68f7a1117005e20079b2653044.tar.bz2
blit: Don't take into account the Mesa format when checking MSRT blit
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>
Diffstat (limited to 'src/mesa/main/blit.c')
-rw-r--r--src/mesa/main/blit.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/src/mesa/main/blit.c b/src/mesa/main/blit.c
index a32f1a4..abc5539 100644
--- a/src/mesa/main/blit.c
+++ b/src/mesa/main/blit.c
@@ -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.
*/