[PATCH 5/5] wined3d: Introduce a separate function to retrieve the GLSL variable prefix.

Henri Verbeet hverbeet at codeweavers.com
Wed Sep 26 15:34:04 CDT 2012


---
 dlls/wined3d/glsl_shader.c |  153 ++++++++++++++++++++++---------------------
 1 files changed, 78 insertions(+), 75 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index e10e207..8a072c9 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -174,6 +174,25 @@ static const char *debug_gl_shader_type(GLenum type)
     }
 }
 
+static const char *shader_glsl_get_prefix(enum wined3d_shader_type type)
+{
+    switch (type)
+    {
+        case WINED3D_SHADER_TYPE_VERTEX:
+            return "vs";
+
+        case WINED3D_SHADER_TYPE_GEOMETRY:
+            return "gs";
+
+        case WINED3D_SHADER_TYPE_PIXEL:
+            return "ps";
+
+        default:
+            FIXME("Unhandled shader type %#x.\n", type);
+            return "unknown";
+    }
+}
+
 /* Extract a line from the info log.
  * Note that this modifies the source string. */
 static char *get_info_log_line(char **ptr)
@@ -330,11 +349,12 @@ static void shader_glsl_load_psamplers(const struct wined3d_gl_info *gl_info,
         const DWORD *tex_unit_map, GLhandleARB programId)
 {
     GLint name_loc;
-    int i;
     char sampler_name[20];
+    unsigned int i;
 
-    for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i) {
-        snprintf(sampler_name, sizeof(sampler_name), "Psampler%d", i);
+    for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i)
+    {
+        snprintf(sampler_name, sizeof(sampler_name), "ps_sampler%u", i);
         name_loc = GL_EXTCALL(glGetUniformLocationARB(programId, sampler_name));
         if (name_loc != -1) {
             DWORD mapped_unit = tex_unit_map[i];
@@ -356,10 +376,11 @@ static void shader_glsl_load_vsamplers(const struct wined3d_gl_info *gl_info,
 {
     GLint name_loc;
     char sampler_name[20];
-    int i;
+    unsigned int i;
 
-    for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i) {
-        snprintf(sampler_name, sizeof(sampler_name), "Vsampler%d", i);
+    for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i)
+    {
+        snprintf(sampler_name, sizeof(sampler_name), "vs_sampler%u", i);
         name_loc = GL_EXTCALL(glGetUniformLocationARB(programId, sampler_name));
         if (name_loc != -1) {
             DWORD mapped_unit = tex_unit_map[MAX_FRAGMENT_SAMPLERS + i];
@@ -584,30 +605,11 @@ static void shader_glsl_load_constantsB(const struct wined3d_shader *shader, con
 {
     GLint tmp_loc;
     unsigned int i;
-    char tmp_name[8];
+    char tmp_name[10];
     const char *prefix;
     struct list* ptr;
 
-    switch (shader->reg_maps.shader_version.type)
-    {
-        case WINED3D_SHADER_TYPE_VERTEX:
-            prefix = "VB";
-            break;
-
-        case WINED3D_SHADER_TYPE_GEOMETRY:
-            prefix = "GB";
-            break;
-
-        case WINED3D_SHADER_TYPE_PIXEL:
-            prefix = "PB";
-            break;
-
-        default:
-            FIXME("Unknown shader type %#x.\n",
-                    shader->reg_maps.shader_version.type);
-            prefix = "UB";
-            break;
-    }
+    prefix = shader_glsl_get_prefix(shader->reg_maps.shader_version.type);
 
     /* TODO: Benchmark and see if it would be beneficial to store the
      * locations of the constants to avoid looking up each time */
@@ -619,7 +621,7 @@ static void shader_glsl_load_constantsB(const struct wined3d_shader *shader, con
 
         /* TODO: Benchmark and see if it would be beneficial to store the
          * locations of the constants to avoid looking up each time */
-        snprintf(tmp_name, sizeof(tmp_name), "%s[%i]", prefix, i);
+        snprintf(tmp_name, sizeof(tmp_name), "%s_b[%i]", prefix, i);
         tmp_loc = GL_EXTCALL(glGetUniformLocationARB(programId, tmp_name));
         if (tmp_loc != -1)
         {
@@ -639,7 +641,7 @@ static void shader_glsl_load_constantsB(const struct wined3d_shader *shader, con
 
         TRACE_(d3d_constants)("Loading local constants %i: %i\n", idx, values[0]);
 
-        snprintf(tmp_name, sizeof(tmp_name), "%s[%i]", prefix, idx);
+        snprintf(tmp_name, sizeof(tmp_name), "%s_b[%i]", prefix, idx);
         tmp_loc = GL_EXTCALL(glGetUniformLocationARB(programId, tmp_name));
         if (tmp_loc != -1) {
             /* We found this uniform name in the program - go ahead and send the data */
@@ -900,11 +902,12 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
     const struct wined3d_fb_state *fb = &shader->device->fb;
     unsigned int i, extra_constants_needed = 0;
     const struct wined3d_shader_lconst *lconst;
+    const char *prefix;
     DWORD map;
 
     /* There are some minor differences between pixel and vertex shaders */
     char pshader = shader_is_pshader_version(reg_maps->shader_version.type);
-    char prefix = pshader ? 'P' : 'V';
+    prefix = shader_glsl_get_prefix(reg_maps->shader_version.type);
 
     /* Prototype the subroutines */
     for (i = 0, map = reg_maps->labels; map; map >>= 1, ++i)
@@ -979,17 +982,17 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
             }
         }
         max_constantsF = min(shader->limits.constant_float, max_constantsF);
-        shader_addline(buffer, "uniform vec4 %cC[%u];\n", prefix, max_constantsF);
+        shader_addline(buffer, "uniform vec4 %s_c[%u];\n", prefix, max_constantsF);
     }
 
     /* Always declare the full set of constants, the compiler can remove the
      * unused ones because d3d doesn't (yet) support indirect int and bool
      * constant addressing. This avoids problems if the app uses e.g. i0 and i9. */
     if (shader->limits.constant_int > 0 && reg_maps->integer_constants)
-        shader_addline(buffer, "uniform ivec4 %cI[%u];\n", prefix, shader->limits.constant_int);
+        shader_addline(buffer, "uniform ivec4 %s_i[%u];\n", prefix, shader->limits.constant_int);
 
     if (shader->limits.constant_bool > 0 && reg_maps->boolean_constants)
-        shader_addline(buffer, "uniform bool %cB[%u];\n", prefix, shader->limits.constant_bool);
+        shader_addline(buffer, "uniform bool %s_b[%u];\n", prefix, shader->limits.constant_bool);
 
     if (!pshader)
     {
@@ -1054,37 +1057,37 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
             {
                 case WINED3DSTT_1D:
                     if (pshader && ps_args->shadow & (1 << i))
-                        shader_addline(buffer, "uniform sampler1DShadow %csampler%u;\n", prefix, i);
+                        shader_addline(buffer, "uniform sampler1DShadow %s_sampler%u;\n", prefix, i);
                     else
-                        shader_addline(buffer, "uniform sampler1D %csampler%u;\n", prefix, i);
+                        shader_addline(buffer, "uniform sampler1D %s_sampler%u;\n", prefix, i);
                     break;
                 case WINED3DSTT_2D:
                     texture = state->textures[i];
                     if (pshader && ps_args->shadow & (1 << i))
                     {
                         if (texture && texture->target == GL_TEXTURE_RECTANGLE_ARB)
-                            shader_addline(buffer, "uniform sampler2DRectShadow %csampler%u;\n", prefix, i);
+                            shader_addline(buffer, "uniform sampler2DRectShadow %s_sampler%u;\n", prefix, i);
                         else
-                            shader_addline(buffer, "uniform sampler2DShadow %csampler%u;\n", prefix, i);
+                            shader_addline(buffer, "uniform sampler2DShadow %s_sampler%u;\n", prefix, i);
                     }
                     else
                     {
                         if (texture && texture->target == GL_TEXTURE_RECTANGLE_ARB)
-                            shader_addline(buffer, "uniform sampler2DRect %csampler%u;\n", prefix, i);
+                            shader_addline(buffer, "uniform sampler2DRect %s_sampler%u;\n", prefix, i);
                         else
-                            shader_addline(buffer, "uniform sampler2D %csampler%u;\n", prefix, i);
+                            shader_addline(buffer, "uniform sampler2D %s_sampler%u;\n", prefix, i);
                     }
                     break;
                 case WINED3DSTT_CUBE:
                     if (pshader && ps_args->shadow & (1 << i)) FIXME("Unsupported Cube shadow sampler.\n");
-                    shader_addline(buffer, "uniform samplerCube %csampler%u;\n", prefix, i);
+                    shader_addline(buffer, "uniform samplerCube %s_sampler%u;\n", prefix, i);
                     break;
                 case WINED3DSTT_VOLUME:
                     if (pshader && ps_args->shadow & (1 << i)) FIXME("Unsupported 3D shadow sampler.\n");
-                    shader_addline(buffer, "uniform sampler3D %csampler%u;\n", prefix, i);
+                    shader_addline(buffer, "uniform sampler3D %s_sampler%u;\n", prefix, i);
                     break;
                 default:
-                    shader_addline(buffer, "uniform unsupported_sampler %csampler%u;\n", prefix, i);
+                    shader_addline(buffer, "uniform unsupported_sampler %s_sampler%u;\n", prefix, i);
                     FIXME("Unrecognized sampler type: %#x\n", reg_maps->sampler_type[i]);
                     break;
             }
@@ -1121,7 +1124,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
         }
 
         fixup->num_consts = (cur + 1) >> 1;
-        shader_addline(buffer, "uniform vec4 %csamplerNP2Fixup[%u];\n", prefix, fixup->num_consts);
+        shader_addline(buffer, "uniform vec4 %s_samplerNP2Fixup[%u];\n", prefix, fixup->num_consts);
     }
 
     /* Declare address variables */
@@ -1189,7 +1192,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
     {
         LIST_FOR_EACH_ENTRY(lconst, &shader->constantsF, struct wined3d_shader_lconst, entry)
         {
-            shader_addline(buffer, "uniform vec4 %cLC%u;\n", prefix, lconst->idx);
+            shader_addline(buffer, "uniform vec4 %s_lc%u;\n", prefix, lconst->idx);
         }
     }
 
@@ -1308,6 +1311,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
     const struct wined3d_shader_reg_maps *reg_maps = ins->ctx->reg_maps;
     const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     char pshader = shader_is_pshader_version(reg_maps->shader_version.type);
+    const char *prefix = shader_glsl_get_prefix(reg_maps->shader_version.type);
 
     *is_color = FALSE;
 
@@ -1386,34 +1390,32 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
 
         case WINED3DSPR_CONST:
             {
-                const char prefix = pshader ? 'P' : 'V';
-
                 /* Relative addressing */
                 if (reg->rel_addr)
                 {
                     struct glsl_src_param rel_param;
                     shader_glsl_add_src_param(ins, reg->rel_addr, WINED3DSP_WRITEMASK_0, &rel_param);
-                    if (reg->idx) sprintf(register_name, "%cC[%s + %u]", prefix, rel_param.param_str, reg->idx);
-                    else sprintf(register_name, "%cC[%s]", prefix, rel_param.param_str);
+                    if (reg->idx)
+                        sprintf(register_name, "%s_c[%s + %u]", prefix, rel_param.param_str, reg->idx);
+                    else
+                        sprintf(register_name, "%s_c[%s]", prefix, rel_param.param_str);
                 }
                 else
                 {
                     if (shader_constant_is_local(shader, reg->idx))
-                        sprintf(register_name, "%cLC%u", prefix, reg->idx);
+                        sprintf(register_name, "%s_lc%u", prefix, reg->idx);
                     else
-                        sprintf(register_name, "%cC[%u]", prefix, reg->idx);
+                        sprintf(register_name, "%s_c[%u]", prefix, reg->idx);
                 }
             }
             break;
 
         case WINED3DSPR_CONSTINT:
-            if (pshader) sprintf(register_name, "PI[%u]", reg->idx);
-            else sprintf(register_name, "VI[%u]", reg->idx);
+            sprintf(register_name, "%s_i[%u]", prefix, reg->idx);
             break;
 
         case WINED3DSPR_CONSTBOOL:
-            if (pshader) sprintf(register_name, "PB[%u]", reg->idx);
-            else sprintf(register_name, "VB[%u]", reg->idx);
+            sprintf(register_name, "%s_b[%u]", prefix, reg->idx);
             break;
 
         case WINED3DSPR_TEXTURE: /* case WINED3DSPR_ADDR: */
@@ -1426,8 +1428,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
             break;
 
         case WINED3DSPR_SAMPLER:
-            if (pshader) sprintf(register_name, "Psampler%u", reg->idx);
-            else sprintf(register_name, "Vsampler%u", reg->idx);
+            sprintf(register_name, "%s_sampler%u", prefix, reg->idx);
             break;
 
         case WINED3DSPR_COLOROUT:
@@ -2115,7 +2116,7 @@ static void PRINTF_ATTR(8, 9) shader_glsl_gen_sample_code(const struct wined3d_s
     {
         const struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data;
         fixup = priv->cur_ps_args->color_fixup[sampler];
-        sampler_base = "Psampler";
+        sampler_base = "ps_sampler";
 
         if(priv->cur_ps_args->np2_fixup & (1 << sampler)) {
             if(bias) {
@@ -2124,8 +2125,10 @@ static void PRINTF_ATTR(8, 9) shader_glsl_gen_sample_code(const struct wined3d_s
                 np2_fixup = TRUE;
             }
         }
-    } else {
-        sampler_base = "Vsampler";
+    }
+    else
+    {
+        sampler_base = "vs_sampler";
         fixup = COLOR_FIXUP_IDENTITY; /* FIXME: Vshader color fixup */
     }
 
@@ -2144,7 +2147,7 @@ static void PRINTF_ATTR(8, 9) shader_glsl_gen_sample_code(const struct wined3d_s
             const struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data;
             const unsigned char idx = priv->cur_np2fixup_info->idx[sampler];
 
-            shader_addline(ins->ctx->buffer, " * PsamplerNP2Fixup[%u].%s)%s);\n", idx >> 1,
+            shader_addline(ins->ctx->buffer, " * ps_samplerNP2Fixup[%u].%s)%s);\n", idx >> 1,
                            (idx % 2) ? "zw" : "xy", dst_swizzle);
         } else if(dx && dy) {
             shader_addline(ins->ctx->buffer, ", %s, %s)%s);\n", dx, dy, dst_swizzle);
@@ -4085,17 +4088,17 @@ static GLhandleARB generate_param_reorder_function(struct wined3d_shader_buffer
 
 /* GL locking is done by the caller */
 static void hardcode_local_constants(const struct wined3d_shader *shader,
-        const struct wined3d_gl_info *gl_info, GLhandleARB programId, char prefix)
+        const struct wined3d_gl_info *gl_info, GLhandleARB programId, const char *prefix)
 {
     const struct wined3d_shader_lconst *lconst;
     GLint tmp_loc;
     const float *value;
-    char glsl_name[8];
+    char glsl_name[10];
 
     LIST_FOR_EACH_ENTRY(lconst, &shader->constantsF, struct wined3d_shader_lconst, entry)
     {
         value = (const float *)lconst->value;
-        snprintf(glsl_name, sizeof(glsl_name), "%cLC%u", prefix, lconst->idx);
+        snprintf(glsl_name, sizeof(glsl_name), "%s_lc%u", prefix, lconst->idx);
         tmp_loc = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
         GL_EXTCALL(glUniform4fvARB(tmp_loc, 1, value));
     }
@@ -4441,7 +4444,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
     GLhandleARB programId                  = 0;
     GLhandleARB reorder_shader_id          = 0;
     unsigned int i;
-    char glsl_name[8];
+    char glsl_name[10];
     struct ps_compile_args ps_compile_args;
     struct vs_compile_args vs_compile_args;
 
@@ -4536,24 +4539,24 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
             sizeof(GLhandleARB) * gl_info->limits.glsl_vs_float_constants);
     for (i = 0; i < gl_info->limits.glsl_vs_float_constants; ++i)
     {
-        snprintf(glsl_name, sizeof(glsl_name), "VC[%i]", i);
+        snprintf(glsl_name, sizeof(glsl_name), "vs_c[%u]", i);
         entry->vuniformF_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
     }
     for (i = 0; i < MAX_CONST_I; ++i)
     {
-        snprintf(glsl_name, sizeof(glsl_name), "VI[%i]", i);
+        snprintf(glsl_name, sizeof(glsl_name), "vs_i[%u]", i);
         entry->vuniformI_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
     }
     entry->puniformF_locations = HeapAlloc(GetProcessHeap(), 0,
             sizeof(GLhandleARB) * gl_info->limits.glsl_ps_float_constants);
     for (i = 0; i < gl_info->limits.glsl_ps_float_constants; ++i)
     {
-        snprintf(glsl_name, sizeof(glsl_name), "PC[%i]", i);
+        snprintf(glsl_name, sizeof(glsl_name), "ps_c[%u]", i);
         entry->puniformF_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
     }
     for (i = 0; i < MAX_CONST_I; ++i)
     {
-        snprintf(glsl_name, sizeof(glsl_name), "PI[%i]", i);
+        snprintf(glsl_name, sizeof(glsl_name), "ps_i[%u]", i);
         entry->puniformI_locations[i] = GL_EXTCALL(glGetUniformLocationARB(programId, glsl_name));
     }
 
@@ -4569,12 +4572,12 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
             entry->luminanceoffset_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name));
         }
 
-        if (ps_compile_args.np2_fixup) {
-            if (entry->np2Fixup_info) {
-                entry->np2Fixup_location = GL_EXTCALL(glGetUniformLocationARB(programId, "PsamplerNP2Fixup"));
-            } else {
+        if (ps_compile_args.np2_fixup)
+        {
+            if (entry->np2Fixup_info)
+                entry->np2Fixup_location = GL_EXTCALL(glGetUniformLocationARB(programId, "ps_samplerNP2Fixup"));
+            else
                 FIXME("NP2 texcoord fixup needed for this pixelshader, but no fixup uniform found.\n");
-            }
         }
     }
 
@@ -4611,9 +4614,9 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
      * later
      */
     if (pshader && !pshader->load_local_constsF)
-        hardcode_local_constants(pshader, gl_info, programId, 'P');
+        hardcode_local_constants(pshader, gl_info, programId, "ps");
     if (vshader && !vshader->load_local_constsF)
-        hardcode_local_constants(vshader, gl_info, programId, 'V');
+        hardcode_local_constants(vshader, gl_info, programId, "vs");
 }
 
 /* GL locking is done by the caller */
-- 
1.7.8.6




More information about the wine-patches mailing list