Henri Verbeet : wined3d: Take the data type of registers into account in the GLSL shader backend.

Alexandre Julliard julliard at winehq.org
Tue Sep 25 15:13:37 CDT 2012


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Sep 25 10:34:44 2012 +0200

wined3d: Take the data type of registers into account in the GLSL shader backend.

---

 dlls/wined3d/directx.c     |    1 +
 dlls/wined3d/glsl_shader.c |   77 ++++++++++++++++++++++++++++++++++++--------
 dlls/wined3d/wined3d_gl.h  |    1 +
 3 files changed, 65 insertions(+), 14 deletions(-)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 0354b0a..48a6ef4 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -113,6 +113,7 @@ static const struct wined3d_extension_map gl_extension_map[] =
     {"GL_ARB_point_parameters",             ARB_POINT_PARAMETERS          },
     {"GL_ARB_point_sprite",                 ARB_POINT_SPRITE              },
     {"GL_ARB_provoking_vertex",             ARB_PROVOKING_VERTEX          },
+    {"GL_ARB_shader_bit_encoding",          ARB_SHADER_BIT_ENCODING       },
     {"GL_ARB_shader_objects",               ARB_SHADER_OBJECTS            },
     {"GL_ARB_shader_texture_lod",           ARB_SHADER_TEXTURE_LOD        },
     {"GL_ARB_shading_language_100",         ARB_SHADING_LANGUAGE_100      },
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 14d165b..e10e207 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -1615,7 +1615,36 @@ static void shader_glsl_add_src_param(const struct wined3d_shader_instruction *i
 
     shader_glsl_get_register_name(&wined3d_src->reg, glsl_src->reg_name, &is_color, ins);
     shader_glsl_get_swizzle(wined3d_src, is_color, mask, swizzle_str);
-    shader_glsl_gen_modifier(wined3d_src->modifiers, glsl_src->reg_name, swizzle_str, glsl_src->param_str);
+
+    if (wined3d_src->reg.type == WINED3DSPR_IMMCONST)
+    {
+        shader_glsl_gen_modifier(wined3d_src->modifiers, glsl_src->reg_name, swizzle_str, glsl_src->param_str);
+    }
+    else
+    {
+        char param_str[200];
+
+        shader_glsl_gen_modifier(wined3d_src->modifiers, glsl_src->reg_name, swizzle_str, param_str);
+
+        switch (wined3d_src->reg.data_type)
+        {
+            case WINED3D_DATA_FLOAT:
+                sprintf(glsl_src->param_str, "%s", param_str);
+                break;
+            case WINED3D_DATA_INT:
+                sprintf(glsl_src->param_str, "floatBitsToInt(%s)", param_str);
+                break;
+            case WINED3D_DATA_RESOURCE:
+            case WINED3D_DATA_SAMPLER:
+            case WINED3D_DATA_UINT:
+                sprintf(glsl_src->param_str, "floatBitsToUint(%s)", param_str);
+                break;
+            default:
+                FIXME("Unhandled data type %#x.\n", wined3d_src->reg.data_type);
+                sprintf(glsl_src->param_str, "%s", param_str);
+                break;
+        }
+    }
 }
 
 /* From a given parameter token, generate the corresponding GLSL string.
@@ -1640,8 +1669,31 @@ static DWORD shader_glsl_append_dst_ext(struct wined3d_shader_buffer *buffer,
     struct glsl_dst_param glsl_dst;
     DWORD mask;
 
-    mask = shader_glsl_add_dst_param(ins, dst, &glsl_dst);
-    if (mask) shader_addline(buffer, "%s%s = %s(", glsl_dst.reg_name, glsl_dst.mask_str, shift_glsl_tab[dst->shift]);
+    if ((mask = shader_glsl_add_dst_param(ins, dst, &glsl_dst)))
+    {
+        switch (dst->reg.data_type)
+        {
+            case WINED3D_DATA_FLOAT:
+                shader_addline(buffer, "%s%s = %s(",
+                        glsl_dst.reg_name, glsl_dst.mask_str, shift_glsl_tab[dst->shift]);
+                break;
+            case WINED3D_DATA_INT:
+                shader_addline(buffer, "%s%s = %sintBitsToFloat(",
+                        glsl_dst.reg_name, glsl_dst.mask_str, shift_glsl_tab[dst->shift]);
+                break;
+            case WINED3D_DATA_RESOURCE:
+            case WINED3D_DATA_SAMPLER:
+            case WINED3D_DATA_UINT:
+                shader_addline(buffer, "%s%s = %suintBitsToFloat(",
+                        glsl_dst.reg_name, glsl_dst.mask_str, shift_glsl_tab[dst->shift]);
+                break;
+            default:
+                FIXME("Unhandled data type %#x.\n", dst->reg.data_type);
+                shader_addline(buffer, "%s%s = %s(",
+                        glsl_dst.reg_name, glsl_dst.mask_str, shift_glsl_tab[dst->shift]);
+                break;
+        }
+    }
 
     return mask;
 }
@@ -4069,21 +4121,16 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context
 
     shader_addline(buffer, "#version 120\n");
 
+    if (gl_info->supported[ARB_SHADER_BIT_ENCODING])
+        shader_addline(buffer, "#extension GL_ARB_shader_bit_encoding : enable\n");
     if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
-    {
         shader_addline(buffer, "#extension GL_ARB_shader_texture_lod : enable\n");
-    }
+    /* The spec says that it doesn't have to be explicitly enabled, but the
+     * nvidia drivers write a warning if we don't do so. */
     if (gl_info->supported[ARB_TEXTURE_RECTANGLE])
-    {
-        /* The spec says that it doesn't have to be explicitly enabled, but the nvidia
-         * drivers write a warning if we don't do so
-         */
         shader_addline(buffer, "#extension GL_ARB_texture_rectangle : enable\n");
-    }
     if (gl_info->supported[EXT_GPU_SHADER4])
-    {
         shader_addline(buffer, "#extension GL_EXT_gpu_shader4 : enable\n");
-    }
 
     /* Base Declarations */
     shader_generate_glsl_declarations(context, buffer, shader, reg_maps, &priv_ctx);
@@ -4166,6 +4213,8 @@ static GLuint shader_glsl_generate_vshader(const struct wined3d_context *context
 
     shader_addline(buffer, "#version 120\n");
 
+    if (gl_info->supported[ARB_SHADER_BIT_ENCODING])
+        shader_addline(buffer, "#extension GL_ARB_shader_bit_encoding : enable\n");
     if (gl_info->supported[EXT_GPU_SHADER4])
         shader_addline(buffer, "#extension GL_EXT_gpu_shader4 : enable\n");
 
@@ -4996,8 +5045,8 @@ static void shader_glsl_get_caps(const struct wined3d_gl_info *gl_info, struct s
 {
     UINT shader_model;
 
-    if (gl_info->supported[EXT_GPU_SHADER4] && gl_info->supported[ARB_GEOMETRY_SHADER4]
-            && gl_info->glsl_version >= MAKEDWORD_VERSION(1, 50))
+    if (gl_info->supported[EXT_GPU_SHADER4] && gl_info->supported[ARB_SHADER_BIT_ENCODING]
+            && gl_info->supported[ARB_GEOMETRY_SHADER4] && gl_info->glsl_version >= MAKEDWORD_VERSION(1, 50))
         shader_model = 4;
     /* ARB_shader_texture_lod or EXT_gpu_shader4 is required for the SM3
      * texldd and texldl instructions. */
diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h
index 128937a..0730406 100644
--- a/dlls/wined3d/wined3d_gl.h
+++ b/dlls/wined3d/wined3d_gl.h
@@ -946,6 +946,7 @@ enum wined3d_gl_extension
     ARB_POINT_PARAMETERS,
     ARB_POINT_SPRITE,
     ARB_PROVOKING_VERTEX,
+    ARB_SHADER_BIT_ENCODING,
     ARB_SHADER_OBJECTS,
     ARB_SHADER_TEXTURE_LOD,
     ARB_SHADING_LANGUAGE_100,




More information about the wine-cvs mailing list