Henri Verbeet : wined3d: Replace "VertexShaderMode" and "PixelShaderMode" with shader model limits.

Alexandre Julliard julliard at winehq.org
Fri Jan 25 13:31:48 CST 2013


Module: wine
Branch: master
Commit: dc214603974132969c9f1bd13b8fe533bbb413dc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=dc214603974132969c9f1bd13b8fe533bbb413dc

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Fri Jan 25 10:57:19 2013 +0100

wined3d: Replace "VertexShaderMode" and "PixelShaderMode" with shader model limits.

---

 dlls/wined3d/arb_program_shader.c |   16 +++++++++-----
 dlls/wined3d/directx.c            |    2 -
 dlls/wined3d/glsl_shader.c        |    6 ++--
 dlls/wined3d/wined3d_main.c       |   38 ++++++++----------------------------
 dlls/wined3d/wined3d_private.h    |   18 ++--------------
 5 files changed, 25 insertions(+), 55 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 2df18cd..31ee94a 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -4989,6 +4989,7 @@ static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct sh
     if (gl_info->supported[ARB_VERTEX_PROGRAM])
     {
         DWORD vs_consts;
+        UINT vs_version;
 
         /* 96 is the minimum allowed value of MAX_PROGRAM_ENV_PARAMETERS_ARB
          * for vertex programs. If the native limit is less than that it's
@@ -5001,20 +5002,21 @@ static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct sh
 
         if (gl_info->supported[NV_VERTEX_PROGRAM3])
         {
-            caps->vs_version = 3;
+            vs_version = 3;
             TRACE("Hardware vertex shader version 3.0 enabled (NV_VERTEX_PROGRAM3)\n");
         }
         else if (vs_consts >= 256)
         {
             /* Shader Model 2.0 requires at least 256 vertex shader constants */
-            caps->vs_version = 2;
+            vs_version = 2;
             TRACE("Hardware vertex shader version 2.0 enabled (ARB_PROGRAM)\n");
         }
         else
         {
-            caps->vs_version = 1;
+            vs_version = 1;
             TRACE("Hardware vertex shader version 1.1 enabled (ARB_PROGRAM)\n");
         }
+        caps->vs_version = min(wined3d_settings.max_sm_vs, vs_version);
         caps->vs_uniform_count = vs_consts;
     }
     else
@@ -5028,6 +5030,7 @@ static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct sh
     if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
     {
         DWORD ps_consts;
+        UINT ps_version;
 
         /* Similar as above for vertex programs, but the minimum for fragment
          * programs is 24. */
@@ -5038,20 +5041,21 @@ static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct sh
 
         if (gl_info->supported[NV_FRAGMENT_PROGRAM2])
         {
-            caps->ps_version = 3;
+            ps_version = 3;
             TRACE("Hardware pixel shader version 3.0 enabled (NV_FRAGMENT_PROGRAM2)\n");
         }
         else if (ps_consts >= 32)
         {
             /* Shader Model 2.0 requires at least 32 pixel shader constants */
-            caps->ps_version = 2;
+            ps_version = 2;
             TRACE("Hardware pixel shader version 2.0 enabled (ARB_PROGRAM)\n");
         }
         else
         {
-            caps->ps_version = 1;
+            ps_version = 1;
             TRACE("Hardware pixel shader version 1.4 enabled (ARB_PROGRAM)\n");
         }
+        caps->ps_version = min(wined3d_settings.max_sm_ps, ps_version);
         caps->ps_uniform_count = ps_consts;
         caps->ps_1x_max_value = 8.0f;
     }
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index d5d1025..b70a44f 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2267,8 +2267,6 @@ static const struct wined3d_shader_backend_ops *select_shader_backend(const stru
 {
     BOOL glsl = wined3d_settings.glslRequested && gl_info->glsl_version >= MAKEDWORD_VERSION(1, 20);
 
-    if (wined3d_settings.vs_mode == VS_NONE && wined3d_settings.ps_mode == PS_NONE)
-        return &none_shader_backend;
     if (glsl && gl_info->supported[ARB_FRAGMENT_SHADER])
         return &glsl_shader_backend;
     if (glsl && gl_info->supported[ARB_VERTEX_SHADER])
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 9b000b6..16b8a83 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -6184,9 +6184,9 @@ static void shader_glsl_get_caps(const struct wined3d_gl_info *gl_info, struct s
         shader_model = 2;
     TRACE("Shader model %u.\n", shader_model);
 
-    caps->vs_version = shader_model;
-    caps->gs_version = shader_model;
-    caps->ps_version = shader_model;
+    caps->vs_version = min(wined3d_settings.max_sm_vs, shader_model);
+    caps->gs_version = min(wined3d_settings.max_sm_gs, shader_model);
+    caps->ps_version = min(wined3d_settings.max_sm_ps, shader_model);
 
     caps->vs_uniform_count = gl_info->limits.glsl_vs_float_constants;
     caps->ps_uniform_count = gl_info->limits.glsl_ps_float_constants;
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 2247e9c..f49e5bc 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -72,8 +72,6 @@ static CRITICAL_SECTION wined3d_wndproc_cs = {&wined3d_wndproc_cs_debug, -1, 0,
  * where appropriate. */
 struct wined3d_settings wined3d_settings =
 {
-    VS_HW,          /* Hardware by default */
-    PS_HW,          /* Hardware by default */
     TRUE,           /* Use of GLSL enabled by default */
     ORM_FBO,        /* Use FBOs to do offscreen rendering */
     RTL_READTEX,    /* Default render target locking method */
@@ -84,6 +82,9 @@ struct wined3d_settings wined3d_settings =
     TRUE,           /* Multisampling enabled by default. */
     FALSE,          /* No strict draw ordering. */
     TRUE,           /* Don't try to render onscreen by default. */
+    ~0U,            /* No VS shader model limit by default. */
+    ~0U,            /* No GS shader model limit by default. */
+    ~0U,            /* No PS shader model limit by default. */
 };
 
 /* Do not call while under the GL lock. */
@@ -196,27 +197,6 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
 
     if (hkey || appkey)
     {
-        if ( !get_config_key( hkey, appkey, "VertexShaderMode", buffer, size) )
-        {
-            if (!strcmp(buffer,"none"))
-            {
-                TRACE("Disable vertex shaders\n");
-                wined3d_settings.vs_mode = VS_NONE;
-            }
-        }
-        if ( !get_config_key( hkey, appkey, "PixelShaderMode", buffer, size) )
-        {
-            if (!strcmp(buffer,"enabled"))
-            {
-                TRACE("Allow pixel shaders\n");
-                wined3d_settings.ps_mode = PS_HW;
-            }
-            if (!strcmp(buffer,"disabled"))
-            {
-                TRACE("Disable pixel shaders\n");
-                wined3d_settings.ps_mode = PS_NONE;
-            }
-        }
         if ( !get_config_key( hkey, appkey, "UseGLSL", buffer, size) )
         {
             if (!strcmp(buffer,"disabled"))
@@ -323,13 +303,13 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
             TRACE("Not always rendering backbuffers offscreen.\n");
             wined3d_settings.always_offscreen = FALSE;
         }
+        if (!get_config_key_dword(hkey, appkey, "MaxShaderModelVS", &wined3d_settings.max_sm_vs))
+            TRACE("Limiting VS shader model to %u.\n", wined3d_settings.max_sm_vs);
+        if (!get_config_key_dword(hkey, appkey, "MaxShaderModelGS", &wined3d_settings.max_sm_gs))
+            TRACE("Limiting GS shader model to %u.\n", wined3d_settings.max_sm_gs);
+        if (!get_config_key_dword(hkey, appkey, "MaxShaderModelPS", &wined3d_settings.max_sm_ps))
+            TRACE("Limiting PS shader model to %u.\n", wined3d_settings.max_sm_ps);
     }
-    if (wined3d_settings.vs_mode == VS_HW)
-        TRACE("Allow HW vertex shaders\n");
-    if (wined3d_settings.ps_mode == PS_NONE)
-        TRACE("Disable pixel shaders\n");
-    if (wined3d_settings.glslRequested)
-        TRACE("If supported by your system, GL Shading Language will be used\n");
 
     if (appkey) RegCloseKey( appkey );
     if (hkey) RegCloseKey( hkey );
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index af24e69..819cb82 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -237,18 +237,6 @@ static inline float float_24_to_32(DWORD in)
     }
 }
 
-/**
- * Settings
- */
-#define VS_NONE    0
-#define VS_HW      1
-
-#define PS_NONE    0
-#define PS_HW      1
-
-#define VBO_NONE   0
-#define VBO_HW     1
-
 #define ORM_BACKBUFFER  0
 #define ORM_FBO         1
 
@@ -262,9 +250,6 @@ static inline float float_24_to_32(DWORD in)
  * values in wined3d_main.c as well. */
 struct wined3d_settings
 {
-    /* vertex and pixel shader modes */
-    int vs_mode;
-    int ps_mode;
     /* Ideally, we don't want the user to have to request GLSL. If the
      * hardware supports GLSL, we should use it. However, until it's fully
      * implemented, we'll leave it as a registry setting for developers. */
@@ -279,6 +264,9 @@ struct wined3d_settings
     int allow_multisampling;
     BOOL strict_draw_ordering;
     BOOL always_offscreen;
+    unsigned int max_sm_vs;
+    unsigned int max_sm_gs;
+    unsigned int max_sm_ps;
 };
 
 extern struct wined3d_settings wined3d_settings DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list