WINED3D: Split the GLSL check in a check for GLSL vertex shaders and one for GLSL fragment shaders

H. Verbeet hverbeet at gmail.com
Sun Jul 30 16:28:10 CDT 2006


The current extension checking code assumes that support for
ARB_shading_language_100 implies support for both GLSL vertex and
fragment shaders. However, some older cards support GLSL, but don't
support fragment shaders. On these cards, querying the value of
MAX_FRAGMENT_UNIFORM_COMPONENTS generates an error. This patch splits
the check for GLSL vertex shaders and GLSL fragment shaders.

Changelog:
  - Split the GLSL check in a check for GLSL vertex shaders and one
for GLSL fragment shaders
  - Initialize the number of supported constants to 0
-------------- next part --------------
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index faaff47..1fa4a5e 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -216,7 +216,7 @@ static void select_shader_mode(
         *vs_selected = SHADER_NONE;
     } else if (DeviceType == WINED3DDEVTYPE_REF || wined3d_settings.vs_mode == VS_SW) {
         *vs_selected = SHADER_SW;
-    } else if (gl_info->supported[ARB_SHADING_LANGUAGE_100] && wined3d_settings.glslRequested) {
+    } else if (gl_info->supported[ARB_VERTEX_SHADER] && wined3d_settings.glslRequested) {
         *vs_selected = SHADER_GLSL;
     } else if (gl_info->supported[ARB_VERTEX_PROGRAM]) {
         *vs_selected = SHADER_ARB;
@@ -229,7 +229,7 @@ static void select_shader_mode(
         *ps_selected = SHADER_NONE;
     } else if (DeviceType == WINED3DDEVTYPE_REF) {
         *ps_selected = SHADER_NONE;
-    } else if (gl_info->supported[ARB_SHADING_LANGUAGE_100] && wined3d_settings.glslRequested) {
+    } else if (gl_info->supported[ARB_FRAGMENT_SHADER] && wined3d_settings.glslRequested) {
         *ps_selected = SHADER_GLSL;
     } else if (gl_info->supported[ARB_FRAGMENT_PROGRAM]) {
         *ps_selected = SHADER_ARB;
@@ -521,6 +521,10 @@ BOOL IWineD3DImpl_FillGLCaps(IWineD3D *i
     gl_info->vs_arb_version = VS_VERSION_NOT_SUPPORTED;
     gl_info->vs_nv_version  = VS_VERSION_NOT_SUPPORTED;
     gl_info->vs_ati_version = VS_VERSION_NOT_SUPPORTED;
+    gl_info->vs_glsl_constantsF = 0;
+    gl_info->ps_glsl_constantsF = 0;
+    gl_info->vs_arb_constantsF = 0;
+    gl_info->ps_arb_constantsF = 0;
 
     /* Now work out what GL support this card really has */
 #define USE_GL_FUNC(type, pfn) gl_info->pfn = (type) glXGetProcAddressARB( (const GLubyte *) #pfn);
@@ -576,18 +580,14 @@ #undef USE_GL_FUNC
                 GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &gl_max));
                 TRACE_(d3d_caps)(" FOUND: ARB Pixel Shader support - max float constants=%u\n", gl_max);
                 gl_info->ps_arb_constantsF = gl_max;
+            } else if (strcmp(ThisExtn, "GL_ARB_fragment_shader") == 0) {
+                gl_info->supported[ARB_FRAGMENT_SHADER] = TRUE;
+                glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, &gl_max);
+                TRACE_(d3d_caps)(" FOUND: ARB_fragment_shader (GLSL) support - max float ps constants=%u\n", gl_max);
+                gl_info->ps_glsl_constantsF = gl_max;
             } else if (strcmp(ThisExtn, "GL_ARB_imaging") == 0) {
                 TRACE_(d3d_caps)(" FOUND: ARB imaging support\n");
                 gl_info->supported[ARB_IMAGING] = TRUE;
-            } else if (strcmp(ThisExtn, "GL_ARB_shading_language_100") == 0) {
-                TRACE_(d3d_caps)(" FOUND: GL Shading Language v100 support\n");
-                gl_info->supported[ARB_SHADING_LANGUAGE_100] = TRUE;
-                glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &gl_max);
-                TRACE_(d3d_caps)(" FOUND: GL Shading Language support - max float vs constants=%u\n", gl_max);
-                gl_info->vs_glsl_constantsF = gl_max;
-                glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, &gl_max);
-                TRACE_(d3d_caps)(" FOUND: GL Shading Language support - max float ps constants=%u\n", gl_max);
-                gl_info->ps_glsl_constantsF = gl_max;
             } else if (strcmp(ThisExtn, "GL_ARB_multisample") == 0) {
                 TRACE_(d3d_caps)(" FOUND: ARB Multisample support\n");
                 gl_info->supported[ARB_MULTISAMPLE] = TRUE;
@@ -637,6 +637,11 @@ #undef USE_GL_FUNC
                 GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &gl_max));
                 TRACE_(d3d_caps)(" FOUND: ARB Vertex Shader support - max float constants=%u\n", gl_max);
                 gl_info->vs_arb_constantsF = gl_max;
+            } else if (strcmp(ThisExtn, "GL_ARB_vertex_shader") == 0) {
+                gl_info->supported[ARB_VERTEX_SHADER] = TRUE;
+                glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &gl_max);
+                TRACE_(d3d_caps)(" FOUND: ARB_vertex_shader (GLSL) support - max float vs constants=%u\n", gl_max);
+                gl_info->vs_glsl_constantsF = gl_max;
             } else if (strcmp(ThisExtn, "GL_ARB_vertex_blend") == 0) {
                 glGetIntegerv(GL_MAX_VERTEX_UNITS_ARB, &gl_max);
                 TRACE_(d3d_caps)(" FOUND: ARB Vertex Blend support GL_MAX_VERTEX_UNITS_ARB %d\n", gl_max);
@@ -766,6 +771,8 @@ #undef USE_GL_FUNC
             if (*GL_Extensions == ' ') GL_Extensions++;
         }
     }
+    checkGLcall("extension detection\n");
+
     gl_info->max_sampler_stages = max(gl_info->max_samplers, gl_info->max_texture_stages);
 
     /* Load all the lookup tables
diff --git a/include/wine/wined3d_gl.h b/include/wine/wined3d_gl.h
index a0b96d6..d9b075c 100644
--- a/include/wine/wined3d_gl.h
+++ b/include/wine/wined3d_gl.h
@@ -1345,6 +1345,7 @@ #define MAKEDWORD_VERSION(maj, min)  ((m
 typedef enum _GL_SupportedExt {
   /* ARB */
   ARB_FRAGMENT_PROGRAM,
+  ARB_FRAGMENT_SHADER,
   ARB_IMAGING,
   ARB_MULTISAMPLE,
   ARB_MULTITEXTURE,
@@ -1362,7 +1363,7 @@ typedef enum _GL_SupportedExt {
   ARB_VERTEX_PROGRAM,
   ARB_VERTEX_BLEND,
   ARB_VERTEX_BUFFER_OBJECT,
-  ARB_SHADING_LANGUAGE_100,
+  ARB_VERTEX_SHADER,
   /* EXT */
   EXT_FOG_COORD,
   EXT_FRAMEBUFFER_OBJECT,


More information about the wine-patches mailing list