wined3d: Introduce quirk for proper RGBA16 support.

This commit is contained in:
Ričardas Barkauskas 2011-07-08 22:11:29 +03:00 committed by Alexandre Julliard
parent 309914f315
commit 6c5e109af7
2 changed files with 50 additions and 1 deletions

View File

@ -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;

View File

@ -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 */