Henri Verbeet : wined3d: Properly set WINED3DFMT_FLAG_SRGB_WRITE in init_format_texture_info().

Alexandre Julliard julliard at winehq.org
Tue Jan 22 14:52:21 CST 2013


Module: wine
Branch: master
Commit: 9307327ede0107458ba030bf6d0a284ac2b637e0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9307327ede0107458ba030bf6d0a284ac2b637e0

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Jan 22 11:34:08 2013 +0100

wined3d: Properly set WINED3DFMT_FLAG_SRGB_WRITE in init_format_texture_info().

---

 dlls/wined3d/directx.c         |   33 ++++-----------------------------
 dlls/wined3d/utils.c           |   21 +++++++++++++++++----
 dlls/wined3d/wined3d_private.h |    2 +-
 3 files changed, 22 insertions(+), 34 deletions(-)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 18ea67d..f763c12 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -3532,31 +3532,6 @@ static BOOL CheckSrgbReadCapability(const struct wined3d_adapter *adapter, const
     return format->flags & WINED3DFMT_FLAG_SRGB_READ;
 }
 
-static BOOL CheckSrgbWriteCapability(const struct wined3d_adapter *adapter, const struct wined3d_format *format)
-{
-    /* Only offer SRGB writing on X8R8G8B8/A8R8G8B8 when we use ARB or GLSL shaders as we are
-     * doing the color fixup in shaders.
-     * Note Windows drivers (at least on the Geforce 8800) also offer this on R5G6B5. */
-    if (format->flags & WINED3DFMT_FLAG_SRGB_WRITE)
-    {
-        struct fragment_caps fragment_caps;
-        struct shader_caps shader_caps;
-
-        adapter->fragment_pipe->get_caps(&adapter->gl_info, &fragment_caps);
-        adapter->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
-
-        if ((fragment_caps.wined3d_caps & WINED3D_FRAGMENT_CAP_SRGB_WRITE)
-                && (shader_caps.wined3d_caps & WINED3D_SHADER_CAP_SRGB_WRITE))
-        {
-            TRACE("[OK]\n");
-            return TRUE;
-        }
-    }
-
-    TRACE("[FAILED] - sRGB writes not supported by format %s.\n", debug_d3dformat(format->id));
-    return FALSE;
-}
-
 /* Check if a format support blending in combination with pixel shaders */
 static BOOL CheckPostPixelShaderBlendingCapability(const struct wined3d_adapter *adapter,
         const struct wined3d_format *format)
@@ -4033,7 +4008,7 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
 
             if (usage & WINED3DUSAGE_QUERY_SRGBWRITE)
             {
-                if (!CheckSrgbWriteCapability(adapter, format))
+                if (!(format->flags & WINED3DFMT_FLAG_SRGB_WRITE))
                 {
                     TRACE("[FAILED] - No sRGB write support.\n");
                     return WINED3DERR_NOTAVAILABLE;
@@ -4199,7 +4174,7 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
 
             if (usage & WINED3DUSAGE_QUERY_SRGBWRITE)
             {
-                if (!CheckSrgbWriteCapability(adapter, format))
+                if (!(format->flags & WINED3DFMT_FLAG_SRGB_WRITE))
                 {
                     TRACE("[FAILED] - No sRGB write support.\n");
                     return WINED3DERR_NOTAVAILABLE;
@@ -4367,7 +4342,7 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
 
             if (usage & WINED3DUSAGE_QUERY_SRGBWRITE)
             {
-                if (!CheckSrgbWriteCapability(adapter, format))
+                if (!(format->flags & WINED3DFMT_FLAG_SRGB_WRITE))
                 {
                     TRACE("[FAILED] - No sRGB write support.\n");
                     return WINED3DERR_NOTAVAILABLE;
@@ -5546,7 +5521,7 @@ static BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, UINT ordinal)
         return FALSE;
     }
 
-    if (!initPixelFormats(&adapter->gl_info, adapter->driver_info.vendor))
+    if (!wined3d_adapter_init_format_info(adapter))
     {
         ERR("Failed to initialize GL format info.\n");
         WineD3D_ReleaseFakeGLContext(&fake_gl_ctx);
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 95a826e..6caeee6 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -1243,10 +1243,18 @@ static void init_format_fbo_compat_info(struct wined3d_gl_info *gl_info)
         gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
 }
 
-static BOOL init_format_texture_info(struct wined3d_gl_info *gl_info)
+static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info)
 {
+    struct fragment_caps fragment_caps;
+    struct shader_caps shader_caps;
+    BOOL srgb_write;
     unsigned int i;
 
+    adapter->fragment_pipe->get_caps(gl_info, &fragment_caps);
+    adapter->shader_backend->shader_get_caps(gl_info, &shader_caps);
+    srgb_write = (fragment_caps.wined3d_caps & WINED3D_FRAGMENT_CAP_SRGB_WRITE)
+            && (shader_caps.wined3d_caps & WINED3D_SHADER_CAP_SRGB_WRITE);
+
     for (i = 0; i < sizeof(format_texture_info) / sizeof(*format_texture_info); ++i)
     {
         int fmt_idx = getFmtIdx(format_texture_info[i].id);
@@ -1293,6 +1301,9 @@ static BOOL init_format_texture_info(struct wined3d_gl_info *gl_info)
             }
         }
 
+        if ((format->flags & WINED3DFMT_FLAG_SRGB_WRITE) && !srgb_write)
+            format->flags &= ~WINED3DFMT_FLAG_SRGB_WRITE;
+
         /* Texture conversion stuff */
         format->convert = format_texture_info[i].convert;
         format->conv_byte_count = format_texture_info[i].conv_byte_count;
@@ -1645,17 +1656,19 @@ BOOL initPixelFormatsNoGL(struct wined3d_gl_info *gl_info)
 }
 
 /* Context activation is done by the caller. */
-BOOL initPixelFormats(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor vendor)
+BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter)
 {
+    struct wined3d_gl_info *gl_info = &adapter->gl_info;
+
     if (!init_format_base_info(gl_info)) return FALSE;
 
     if (!init_format_block_info(gl_info)) goto fail;
-    if (!init_format_texture_info(gl_info)) goto fail;
+    if (!init_format_texture_info(adapter, gl_info)) goto fail;
     if (!init_format_vertex_info(gl_info)) goto fail;
 
     apply_format_fixups(gl_info);
     init_format_fbo_compat_info(gl_info);
-    init_format_filter_info(gl_info, vendor);
+    init_format_filter_info(gl_info, adapter->driver_info.vendor);
 
     return TRUE;
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index c66374a..b6ecfa9 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1592,9 +1592,9 @@ struct wined3d_adapter
     const struct blit_shader *blitter;
 };
 
+BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter) DECLSPEC_HIDDEN;
 unsigned int adapter_adjust_memory(struct wined3d_adapter *adapter, int amount) DECLSPEC_HIDDEN;
 
-BOOL initPixelFormats(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor vendor) DECLSPEC_HIDDEN;
 BOOL initPixelFormatsNoGL(struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
 extern void add_gl_compat_wrappers(struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
 




More information about the wine-cvs mailing list