[PATCH 4/5] wined3d: Properly set WINED3DFMT_FLAG_SRGB_WRITE in init_format_texture_info().
Henri Verbeet
hverbeet at codeweavers.com
Tue Jan 22 04:34:08 CST 2013
---
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;
--
1.7.12.4
More information about the wine-patches
mailing list