=?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