[PATCH 1/5] wined3d: Add a quirk for GL implementations not supporting sRGB FBO attachments.

Matteo Bruni mbruni at codeweavers.com
Thu Oct 13 17:03:33 CDT 2016


Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
As it seems to be the case for i915 (at least with some Mesa versions).

This is only a problem because the GL implementation also exposes
EXT_texture_sRGB_decode and when that extension is available we always
use the sRGB format.

For bug 41052.

 dlls/wined3d/directx.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 5d324f3..052321a 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -887,6 +887,37 @@ static BOOL match_broken_arb_fog(const struct wined3d_gl_info *gl_info, const ch
     return data[0] != 0x00ff0000 || data[3] != 0x0000ff00;
 }
 
+static BOOL match_no_srgb_fbo_attachments(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
+{
+    GLuint fbo, rb;
+    GLenum status;
+
+    if (wined3d_settings.offscreen_rendering_mode != ORM_FBO)
+        return FALSE;
+    if (!gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
+        return FALSE;
+
+    gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
+    gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+    gl_info->gl_ops.gl.p_glDrawBuffer(GL_COLOR_ATTACHMENT0);
+    gl_info->gl_ops.gl.p_glReadBuffer(GL_COLOR_ATTACHMENT0);
+
+    gl_info->fbo_ops.glGenRenderbuffers(1, &rb);
+    gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, rb);
+    gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, GL_SRGB8_ALPHA8, 16, 16);
+    gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
+
+    status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
+    TRACE("Framebuffer status %s (%#x).\n", debug_fbostatus(status), status);
+
+    gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0);
+    gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
+    gl_info->fbo_ops.glDeleteRenderbuffers(1, &rb);
+
+    return status != GL_FRAMEBUFFER_COMPLETE;
+}
+
 static void quirk_apple_glsl_constants(struct wined3d_gl_info *gl_info)
 {
     /* MacOS needs uniforms for relative addressing offsets. This can accumulate to quite a few uniforms.
@@ -1015,6 +1046,12 @@ static void quirk_broken_arb_fog(struct wined3d_gl_info *gl_info)
     gl_info->quirks |= WINED3D_QUIRK_BROKEN_ARB_FOG;
 }
 
+static void quirk_no_srgb_fbo_attachments(struct wined3d_gl_info *gl_info)
+{
+    TRACE("sRGB FBO attachments not supported, disabling EXT_texture_sRGB_decode codepaths.\n");
+    gl_info->supported[EXT_TEXTURE_SRGB_DECODE] = FALSE;
+}
+
 struct driver_quirk
 {
     BOOL (*match)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
@@ -1105,6 +1142,11 @@ static const struct driver_quirk quirk_table[] =
         quirk_broken_arb_fog,
         "ARBfp fogstart == fogend workaround"
     },
+    {
+        match_no_srgb_fbo_attachments,
+        quirk_no_srgb_fbo_attachments,
+        "sRGB FBO attachments unavailable"
+    },
 };
 
 /* Certain applications (Steam) complain if we report an outdated driver version. In general,
@@ -3836,6 +3878,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter, DWORD
         /* Current wined3d sRGB infrastructure requires EXT_texture_sRGB_decode
          * for GL_ARB_framebuffer_sRGB support (without EXT_texture_sRGB_decode
          * we never render to sRGB surfaces). */
+        TRACE("EXT_texture_sRGB_decode is not supported, disabling ARB_framebuffer_sRGB.\n");
         gl_info->supported[ARB_FRAMEBUFFER_SRGB] = FALSE;
     }
     if (gl_info->supported[ARB_OCCLUSION_QUERY])
-- 
2.7.3




More information about the wine-patches mailing list