=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: wined3d: Reserve one vs constant on r200.
Alexandre Julliard
julliard at winehq.org
Mon Feb 11 13:06:30 CST 2013
Module: wine
Branch: master
Commit: 3221e7fdd0133ce2096278acf2ce47836e99cac4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3221e7fdd0133ce2096278acf2ce47836e99cac4
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Fri Feb 8 23:19:47 2013 +0100
wined3d: Reserve one vs constant on r200.
---
dlls/wined3d/arb_program_shader.c | 1 +
dlls/wined3d/directx.c | 26 ++++++++++++++++++++++++++
dlls/wined3d/wined3d_private.h | 2 +-
3 files changed, 28 insertions(+), 1 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 2fd5108..e8da805 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -821,6 +821,7 @@ static DWORD shader_generate_arb_declarations(const struct wined3d_shader *shade
max_constantsF -= reserved_vs_const(shader_data, reg_maps, gl_info);
max_constantsF -= count_bits(reg_maps->integer_constants);
+ max_constantsF -= gl_info->reserved_arb_constants;
for (i = 0; i < shader->limits.constant_float; ++i)
{
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index f42299e..acdcc57 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -751,6 +751,14 @@ static BOOL match_fglrx(const struct wined3d_gl_info *gl_info, const char *gl_re
return gl_vendor == GL_VENDOR_FGLRX;
}
+static BOOL match_r200(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)
+{
+ if (card_vendor != HW_VENDOR_AMD) return FALSE;
+ if (device == CARD_AMD_RADEON_8500) return TRUE;
+ return FALSE;
+}
+
static void quirk_apple_glsl_constants(struct wined3d_gl_info *gl_info)
{
/* MacOS needs uniforms for relative addressing offsets. This can accumulate to quite a few uniforms.
@@ -861,6 +869,19 @@ static void quirk_limited_tex_filtering(struct wined3d_gl_info *gl_info)
gl_info->quirks |= WINED3D_QUIRK_LIMITED_TEX_FILTERING;
}
+static void quirk_r200_constants(struct wined3d_gl_info *gl_info)
+{
+ /* The Mesa r200 driver (and there is no other driver for this GPU Wine would run on)
+ * loads some fog parameters (start, end, exponent, but not the color) into the
+ * program.
+ *
+ * Apparently the fog hardware is only able to handle linear fog with a range of 0.0;1.0,
+ * and it is the responsibility of the vertex pipeline to handle non-linear fog and
+ * linear fog with start and end other than 0.0 and 1.0. */
+ TRACE("Reserving 1 ARB constant for compiler private use.\n");
+ gl_info->reserved_arb_constants = max(gl_info->reserved_arb_constants, 1);
+}
+
struct driver_quirk
{
BOOL (*match)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
@@ -941,6 +962,11 @@ static const struct driver_quirk quirk_table[] =
quirk_limited_tex_filtering,
"Texture filtering, blending and VTF support is limited"
},
+ {
+ match_r200,
+ quirk_r200_constants,
+ "r200 vertex shader constants"
+ },
};
/* Certain applications (Steam) complain if we report an outdated driver version. In general,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 0ce0c65..45f6b29 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1532,7 +1532,7 @@ struct wined3d_gl_info
{
DWORD glsl_version;
struct wined3d_gl_limits limits;
- DWORD reserved_glsl_constants;
+ DWORD reserved_glsl_constants, reserved_arb_constants;
DWORD quirks;
BOOL supported[WINED3D_GL_EXT_COUNT];
GLint wrap_lookup[WINED3D_TADDRESS_MIRROR_ONCE - WINED3D_TADDRESS_WRAP + 1];
More information about the wine-cvs
mailing list