Ričardas Barkauskas : wined3d: Introduce quirk for proper RGBA16 support.
Alexandre Julliard
julliard at winehq.org
Mon Jul 11 13:17:45 CDT 2011
Module: wine
Branch: master
Commit: 6c5e109af7184ee557aa24c676cc78f3e92e6782
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6c5e109af7184ee557aa24c676cc78f3e92e6782
Author: Ričardas Barkauskas <rbarkauskas at codeweavers.com>
Date: Fri Jul 8 22:11:29 2011 +0300
wined3d: Introduce quirk for proper RGBA16 support.
---
dlls/wined3d/directx.c | 50 +++++++++++++++++++++++++++++++++++++++-
dlls/wined3d/wined3d_private.h | 1 +
2 files changed, 50 insertions(+), 1 deletions(-)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 8453af1..1430444 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -753,6 +753,36 @@ static BOOL match_fbo_tex_update(const struct wined3d_gl_info *gl_info, const ch
return *(DWORD *)data == 0x11111111;
}
+/* Context activation is done by the caller. */
+static BOOL match_broken_rgba16(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)
+{
+ /* GL_RGBA16 uses GL_RGBA8 internally on Geforce 7 and older cards.
+ * This leads to graphical bugs in Half Life 2 and Unreal engine games. */
+ GLuint tex;
+ GLint size;
+
+ ENTER_GL();
+
+ glGenTextures(1, &tex);
+ glBindTexture(GL_TEXTURE_2D, tex);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT, NULL);
+ checkGLcall("glTexImage2D");
+
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_RED_SIZE, &size);
+ checkGLcall("glGetTexLevelParameteriv");
+ TRACE("Real color depth is %d\n", size);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ checkGLcall("glBindTexture");
+ glDeleteTextures(1, &tex);
+ checkGLcall("glDeleteTextures");
+
+ LEAVE_GL();
+
+ return size < 16;
+}
+
static void quirk_arb_constants(struct wined3d_gl_info *gl_info)
{
TRACE_(d3d_caps)("Using ARB vs constant limit(=%u) for GLSL.\n", gl_info->limits.arb_vs_native_constants);
@@ -886,6 +916,11 @@ static void quirk_fbo_tex_update(struct wined3d_gl_info *gl_info)
gl_info->quirks |= WINED3D_QUIRK_FBO_TEX_UPDATE;
}
+static void quirk_broken_rgba16(struct wined3d_gl_info *gl_info)
+{
+ gl_info->quirks |= WINED3D_QUIRK_BROKEN_RGBA16;
+}
+
struct driver_quirk
{
BOOL (*match)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
@@ -970,6 +1005,11 @@ static const struct driver_quirk quirk_table[] =
quirk_fbo_tex_update,
"FBO rebind for attachment updates"
},
+ {
+ match_broken_rgba16,
+ quirk_broken_rgba16,
+ "True RGBA16 is not available"
+ },
};
/* Certain applications (Steam) complain if we report an outdated driver version. In general,
@@ -3504,8 +3544,16 @@ static BOOL CheckTextureCapability(const struct wined3d_adapter *adapter, const
TRACE_(d3d_caps)("[FAILED]\n");
return FALSE;
- /* Not supported */
case WINED3DFMT_R16G16B16A16_UNORM:
+ if (gl_info->quirks & WINED3D_QUIRK_BROKEN_RGBA16)
+ {
+ TRACE_(d3d_caps)("[FAILED]\n");
+ return FALSE;
+ }
+ TRACE_(d3d_caps)("[OK]\n");
+ return TRUE;
+
+ /* Not supported */
case WINED3DFMT_B2G3R3A8_UNORM:
TRACE_(d3d_caps)("[FAILED]\n"); /* Enable when implemented */
return FALSE;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 374c631..c2cb075 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -51,6 +51,7 @@
#define WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA 0x00000008
#define WINED3D_QUIRK_NV_CLIP_BROKEN 0x00000010
#define WINED3D_QUIRK_FBO_TEX_UPDATE 0x00000020
+#define WINED3D_QUIRK_BROKEN_RGBA16 0x00000040
/* Texture format fixups */
More information about the wine-cvs
mailing list