]> git.rm.cloudns.org Git - xonotic/darkplaces.git/commitdiff
disable shader permutations that fell back to software fragment shader (software...
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 26 Jan 2005 01:40:53 +0000 (01:40 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 26 Jan 2005 01:40:53 +0000 (01:40 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@4966 d7cf8633-e32d-0410-b094-e92efae38249

gl_backend.c
r_shadow.c

index ff102b3edc0b934fadf20132fcab09c4f226d6cf..9d6c66dc1d362c00d0aa766c90524b7343c567b1 100644 (file)
@@ -832,7 +832,17 @@ unsigned int GL_Backend_CompileProgram(int vertexstrings_count, const char **ver
        qglGetObjectParameterivARB(programobject, GL_OBJECT_LINK_STATUS_ARB, &programlinked);
        qglGetInfoLogARB(programobject, sizeof(compilelog), NULL, compilelog);
        if (compilelog[0])
+       {
                Con_Printf("program link log:\n%s\n", compilelog);
+               // software vertex shader is ok but software fragment shader is WAY
+               // too slow, fail program if so.
+               // NOTE: this string might be ATI specific, but that's ok because the
+               // ATI R300 chip (Radeon 9500-9800/X300) is the most likely to use a
+               // software fragment shader due to low instruction and dependent
+               // texture limits.
+               if (!strstr(compilelog, "fragment shader will run in software"))
+                       programlinked = false;
+       }
        CHECKGLERROR
        if (!programlinked)
        {
index 0341dac07cc0f51ba99c97b81181916d052f3882..10829c40863e3cb7b31f6f6409d546ee672b29a5 100644 (file)
@@ -458,6 +458,11 @@ void r_shadow_start(void)
                        vertstrings_list[vertstrings_count++] = vertstring ? vertstring : builtinshader_light_vert;
                        fragstrings_list[fragstrings_count++] = fragstring ? fragstring : builtinshader_light_frag;
                        r_shadow_program_light[i] = GL_Backend_CompileProgram(vertstrings_count, vertstrings_list, fragstrings_count, fragstrings_list);
+                       if (!r_shadow_program_light[i])
+                       {
+                               Con_Printf("permutation %s %s %s %s failed for shader %s, some features may not work properly!\n", i & 1 ? "specular" : "", i & 1 ? "fog" : "", i & 1 ? "cubefilter" : "", i & 1 ? "offsetmapping" : "");
+                               continue;
+                       }
                        qglUseProgramObjectARB(r_shadow_program_light[i]);
                        qglUniform1iARB(qglGetUniformLocationARB(r_shadow_program_light[i], "Texture_Normal"), 0);CHECKGLERROR
                        qglUniform1iARB(qglGetUniformLocationARB(r_shadow_program_light[i], "Texture_Color"), 1);CHECKGLERROR
@@ -1623,16 +1628,19 @@ void R_Shadow_RenderLighting(int numverts, int numtriangles, const int *elements
                GL_ColorMask(r_refdef.colormask[0], r_refdef.colormask[1], r_refdef.colormask[2], 0);
                CHECKGLERROR
                perm = 0;
-               if (specularscale)
+               // only add a feature to the permutation if that permutation exists
+               // (otherwise it might end up not using a shader at all, which looks
+               // worse than using less features)
+               if (specularscale && r_shadow_program_light[perm | SHADERPERMUTATION_SPECULAR])
                        perm |= SHADERPERMUTATION_SPECULAR;
-               //if (fog)
+               //if (fog && r_shadow_program_light[perm | SHADERPERMUTATION_FOG])
                //      perm |= SHADERPERMUTATION_FOG;
-               if (lightcubemap)
+               if (lightcubemap && r_shadow_program_light[perm | SHADERPERMUTATION_CUBEFILTER])
                        perm |= SHADERPERMUTATION_CUBEFILTER;
-               if (r_shadow_glsl_offsetmapping.integer)
+               if (r_shadow_glsl_offsetmapping.integer && r_shadow_program_light[perm | SHADERPERMUTATION_OFFSETMAPPING])
                        perm |= SHADERPERMUTATION_OFFSETMAPPING;
                prog = r_shadow_program_light[perm];
-               qglUseProgramObjectARB(r_shadow_program_light[perm]);CHECKGLERROR
+               qglUseProgramObjectARB(prog);CHECKGLERROR
                // TODO: support fog (after renderer is converted to texture fog)
                if (perm & SHADERPERMUTATION_FOG)
                {