Module: wine Branch: master Commit: 9307327ede0107458ba030bf6d0a284ac2b637e0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9307327ede0107458ba030bf6d...
Author: Henri Verbeet hverbeet@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;