[WINED3D 2/5] Replaced USING_GLSL define with a new wined3d_settings option based on the registry

Jason Green jave27 at gmail.com
Thu May 18 23:47:42 CDT 2006


- Change the d3d_caps function to honor this setting
- Change the baseshader to honor this setting

There will be many more of these to come.  Everywhere that currently
checks for GL_SUPPORT(ARB_VERTEX_PROGRAM) should use this instead.

---

 dlls/wined3d/baseshader.c      |    4 ++--
 dlls/wined3d/directx.c         |   24 ++++++++++++++++++------
 dlls/wined3d/wined3d_private.h |   15 ++++++++-------
 3 files changed, 28 insertions(+), 15 deletions(-)

f1f34a9f71f7ef32bd72c83d158bd0b164864a0f
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index 38968e3..7609334 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -574,7 +574,7 @@ void generate_base_shader(
     */

     /* Pre-declare registers */
-    if (USING_GLSL) {
+    if (wined3d_settings.shader_mode == SHADER_GLSL) {
         generate_glsl_declarations(iface, buffer);
         shader_addline(buffer, "void main() {\n");
     } else {
@@ -603,7 +603,7 @@ void generate_base_shader(
             /* Read opcode */
             opcode_token = *pToken++;
             curOpcode = shader_get_opcode(iface, opcode_token);
-            hw_fct = USING_GLSL ? curOpcode->hw_glsl_fct : curOpcode->hw_fct;
+            hw_fct = (wined3d_settings.shader_mode == SHADER_GLSL) ?
curOpcode->hw_glsl_fct : curOpcode->hw_fct;

             /* Unknown opcode and its parameters */
            if (NULL == curOpcode) {
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index c870942..c4d711e 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1677,11 +1677,12 @@ #endif
     *pCaps->MaxStreams          = MAX_STREAMS;
     *pCaps->MaxStreamStride     = 1024;

-    if (wined3d_settings.vs_mode == VS_HW &&
GL_SUPPORT(ARB_SHADING_LANGUAGE_100) &&
-    wined3d_settings.glslRequested && DeviceType != WINED3DDEVTYPE_REF) {
+    if (wined3d_settings.vs_mode == VS_HW &&
wined3d_settings.shader_mode == SHADER_GLSL
+        && DeviceType != WINED3DDEVTYPE_REF) {
         *pCaps->VertexShaderVersion = D3DVS_VERSION(3,0);
         TRACE_(d3d_caps)("Hardware Vertex Shaders versions 2.0+ enabled\n");
-    } else if (wined3d_settings.vs_mode == VS_HW &&
GL_SUPPORT(ARB_VERTEX_PROGRAM) && DeviceType != WINED3DDEVTYPE_REF) {
+    } else if (wined3d_settings.vs_mode == VS_HW &&
wined3d_settings.shader_mode == SHADER_ARB
+               && DeviceType != WINED3DDEVTYPE_REF) {
         *pCaps->VertexShaderVersion = D3DVS_VERSION(1,1);
         TRACE_(d3d_caps)("Hardware Vertex Shader version 1.1 enabled\n");
     } else if (wined3d_settings.vs_mode == VS_SW || DeviceType ==
WINED3DDEVTYPE_REF) {
@@ -1699,13 +1700,14 @@ #endif
         *pCaps->MaxVertexShaderConst = WINED3D_VSHADER_MAX_CONSTANTS;
     }

-    if (wined3d_settings.ps_mode == PS_HW &&
GL_SUPPORT(ARB_SHADING_LANGUAGE_100) &&
-    wined3d_settings.glslRequested && DeviceType != WINED3DDEVTYPE_REF) {
+    if (wined3d_settings.ps_mode == PS_HW &&
wined3d_settings.shader_mode == SHADER_GLSL
+        && DeviceType != WINED3DDEVTYPE_REF) {
         *pCaps->PixelShaderVersion = D3DPS_VERSION(3,0);
         /* FIXME: The following line is card dependant. -1.0 to 1.0
is a safe default clamp range for now */
         *pCaps->PixelShader1xMaxValue = 1.0;
         TRACE_(d3d_caps)("Hardware Pixel Shaders versions 2.0+ enabled\n");
-    } else if (wined3d_settings.ps_mode == PS_HW &&
GL_SUPPORT(ARB_FRAGMENT_PROGRAM) && DeviceType != WINED3DDEVTYPE_REF)
{
+    } else if (wined3d_settings.ps_mode == PS_HW &&
wined3d_settings.shader_mode == SHADER_ARB
+               && DeviceType != WINED3DDEVTYPE_REF) {
         *pCaps->PixelShaderVersion    = D3DPS_VERSION(1,4);
         *pCaps->PixelShader1xMaxValue = 1.0;
         TRACE_(d3d_caps)("Hardware Pixel Shaders version 1.4 enabled\n");
@@ -1828,6 +1830,16 @@ HRESULT  WINAPI  IWineD3DImpl_CreateDevi
     IWineD3DImpl_FillGLCaps(&This->gl_info,
IWineD3DImpl_GetAdapterDisplay(iface, Adapter));
     LEAVE_GL();

+    /* Determine shader model based on GL caps */
+    if (GL_SUPPORT(ARB_SHADING_LANGUAGE_100) &&
wined3d_settings.glslRequested == TRUE
+        && (wined3d_settings.vs_mode == VS_HW ||
wined3d_settings.ps_mode == PS_HW))
+        wined3d_settings.shader_mode = SHADER_GLSL;
+    else if ((GL_SUPPORT(ARB_VERTEX_PROGRAM) &&
wined3d_settings.vs_mode == VS_HW) ||
+             (GL_SUPPORT(ARB_FRAGMENT_PROGRAM) &&
wined3d_settings.ps_mode == PS_HW))
+        wined3d_settings.shader_mode = SHADER_ARB;
+    else
+        wined3d_settings.shader_mode = SHADER_SW;
+
     /* set the state of the device to valid */
     object->state = WINED3D_OK;

diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index af5db01..1ac0f76 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -132,12 +132,20 @@ #define VBO_HW     1
 #define NP2_NONE   0
 #define NP2_REPACK 1

+#define SHADER_SW   0
+#define SHADER_ARB  1
+#define SHADER_GLSL 2
+
 typedef struct wined3d_settings_s {
 /* vertex and pixel shader modes */
   int vs_mode;
   int ps_mode;
   int vbo_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. */
   BOOL glslRequested;
+  int shader_mode;
 /* nonpower 2 function */
   int nonpower2_mode;
 } wined3d_settings_t;
@@ -1266,13 +1274,6 @@ struct SHADER_OPCODE_ARG;
 typedef void (*shader_fct_t)();
 typedef void (*SHADER_HANDLER) (struct SHADER_OPCODE_ARG*);

-
-/* This must be 0 in the main branch until GLSL is at least mostly implemented.
-   Also, think about making it a winecfg option to use GLSL (if the
card supports it)
-   or ARB_vertex_program. Ideally, we want to use GLSL if it's
available, but until
-   everything is implemented, we'll probably have better luck with
the ARB generation */
-#define USING_GLSL 0
-
 #define SHADER_PGMSIZE 65535
 typedef struct SHADER_BUFFER {
     char* buffer;
--
1.3.3



More information about the wine-patches mailing list