[PATCH 1/1] wined3d: Explicitly use the C locale for generating shaders.

Henri Verbeet hverbeet at codeweavers.com
Mon Jun 10 02:33:13 CDT 2013


Specifically, we always want to use '.' as decimal separator. Reported on IRC.
---
 dlls/wined3d/glsl_shader.c | 58 +++++++++++++++++++++++++++++++---------------
 1 file changed, 39 insertions(+), 19 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 0379729..c5e0fad 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -33,6 +33,7 @@
 #include "wine/port.h"
 
 #include <limits.h>
+#include <locale.h>
 #include <stdio.h>
 
 #include "wined3d_private.h"
@@ -86,7 +87,9 @@ struct constant_heap
 };
 
 /* GLSL shader private data */
-struct shader_glsl_priv {
+struct shader_glsl_priv
+{
+    locale_t locale;
     struct wined3d_shader_buffer shader_buffer;
     struct wine_rb_tree program_lookup;
     struct glsl_shader_prog_link *glsl_program;
@@ -4620,9 +4623,9 @@ static GLhandleARB shader_glsl_generate_geometry_shader(const struct wined3d_con
     return shader_id;
 }
 
-static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
-        struct wined3d_shader_buffer *buffer, struct wined3d_shader *shader,
-        const struct ps_compile_args *args, const struct ps_np2fixup_info **np2fixup_info)
+static GLhandleARB find_glsl_pshader(struct shader_glsl_priv *priv, const struct wined3d_context *context,
+        struct wined3d_shader *shader, const struct ps_compile_args *args,
+        const struct ps_np2fixup_info **np2fixup_info)
 {
     struct glsl_ps_compiled_shader *gl_shaders, *new_array;
     struct glsl_shader_private *shader_data;
@@ -4688,8 +4691,10 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
 
     pixelshader_update_samplers(shader, args->tex_types);
 
-    shader_buffer_clear(buffer);
-    ret = shader_glsl_generate_pshader(context, buffer, shader, args, np2fixup);
+    shader_buffer_clear(&priv->shader_buffer);
+    uselocale(priv->locale);
+    ret = shader_glsl_generate_pshader(context, &priv->shader_buffer, shader, args, np2fixup);
+    uselocale(LC_GLOBAL_LOCALE);
     gl_shaders[shader_data->num_gl_shaders++].prgId = ret;
 
     return ret;
@@ -4702,9 +4707,8 @@ static inline BOOL vs_args_equal(const struct vs_compile_args *stored, const str
     return stored->fog_src == new->fog_src;
 }
 
-static GLhandleARB find_glsl_vshader(const struct wined3d_context *context,
-        struct wined3d_shader_buffer *buffer, struct wined3d_shader *shader,
-        const struct vs_compile_args *args)
+static GLhandleARB find_glsl_vshader(struct shader_glsl_priv *priv, const struct wined3d_context *context,
+        struct wined3d_shader *shader, const struct vs_compile_args *args)
 {
     UINT i;
     DWORD new_size;
@@ -4761,15 +4765,17 @@ static GLhandleARB find_glsl_vshader(const struct wined3d_context *context,
 
     gl_shaders[shader_data->num_gl_shaders].args = *args;
 
-    shader_buffer_clear(buffer);
-    ret = shader_glsl_generate_vshader(context, buffer, shader, args);
+    shader_buffer_clear(&priv->shader_buffer);
+    uselocale(priv->locale);
+    ret = shader_glsl_generate_vshader(context, &priv->shader_buffer, shader, args);
+    uselocale(LC_GLOBAL_LOCALE);
     gl_shaders[shader_data->num_gl_shaders++].prgId = ret;
 
     return ret;
 }
 
-static GLhandleARB find_glsl_geometry_shader(const struct wined3d_context *context,
-        struct wined3d_shader_buffer *buffer, struct wined3d_shader *shader)
+static GLhandleARB find_glsl_geometry_shader(struct shader_glsl_priv *priv, const struct wined3d_context *context,
+        struct wined3d_shader *shader)
 {
     struct glsl_gs_compiled_shader *gl_shaders;
     struct glsl_shader_private *shader_data;
@@ -4799,8 +4805,10 @@ static GLhandleARB find_glsl_geometry_shader(const struct wined3d_context *conte
     shader_data->shader_array_size = 1;
     gl_shaders = shader_data->gl_shaders.gs;
 
-    shader_buffer_clear(buffer);
-    ret = shader_glsl_generate_geometry_shader(context, buffer, shader);
+    shader_buffer_clear(&priv->shader_buffer);
+    uselocale(priv->locale);
+    ret = shader_glsl_generate_geometry_shader(context, &priv->shader_buffer, shader);
+    uselocale(LC_GLOBAL_LOCALE);
     gl_shaders[shader_data->num_gl_shaders++].id = ret;
 
     return ret;
@@ -5649,7 +5657,9 @@ static struct glsl_ffp_vertex_shader *shader_glsl_find_ffp_vertex_shader(struct
         return NULL;
 
     shader->desc.settings = *settings;
+    uselocale(priv->locale);
     shader->id = shader_glsl_generate_ffp_vertex_shader(&priv->shader_buffer, settings, gl_info);
+    uselocale(LC_GLOBAL_LOCALE);
     list_init(&shader->linked_programs);
     if (wine_rb_put(&priv->ffp_vertex_shaders, &shader->desc.settings, &shader->desc.entry) == -1)
         ERR("Failed to insert ffp vertex shader.\n");
@@ -5670,7 +5680,9 @@ static struct glsl_ffp_fragment_shader *shader_glsl_find_ffp_fragment_shader(str
         return NULL;
 
     glsl_desc->entry.settings = *args;
+    uselocale(priv->locale);
     glsl_desc->id = shader_glsl_generate_ffp_fragment_shader(&priv->shader_buffer, args, gl_info);
+    uselocale(LC_GLOBAL_LOCALE);
     list_init(&glsl_desc->linked_programs);
     add_ffp_frag_shader(&priv->ffp_fragment_shaders, &glsl_desc->entry);
 
@@ -5760,11 +5772,11 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const
     {
         vshader = state->vertex_shader;
         find_vs_compile_args(state, vshader, &vs_compile_args);
-        vs_id = find_glsl_vshader(context, &priv->shader_buffer, vshader, &vs_compile_args);
+        vs_id = find_glsl_vshader(priv, context, vshader, &vs_compile_args);
         vs_list = &vshader->linked_programs;
 
         if ((gshader = state->geometry_shader))
-            gs_id = find_glsl_geometry_shader(context, &priv->shader_buffer, gshader);
+            gs_id = find_glsl_geometry_shader(priv, context, gshader);
         else
             gs_id = 0;
     }
@@ -5790,8 +5802,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const
     {
         pshader = state->pixel_shader;
         find_ps_compile_args(state, pshader, &ps_compile_args);
-        ps_id = find_glsl_pshader(context, &priv->shader_buffer,
-                pshader, &ps_compile_args, &np2fixup_info);
+        ps_id = find_glsl_pshader(priv, context, pshader, &ps_compile_args, &np2fixup_info);
         ps_list = &pshader->linked_programs;
     }
     else if (priv->fragment_pipe == &glsl_fragment_pipe)
@@ -6341,6 +6352,12 @@ static HRESULT shader_glsl_alloc(struct wined3d_device *device, const struct win
         return E_FAIL;
     }
 
+    if (!(priv->locale = newlocale(LC_ALL_MASK, "C", NULL)))
+    {
+        ERR("Failed to allocate locale.\n");
+        goto fail;
+    }
+
     if (!shader_buffer_init(&priv->shader_buffer))
     {
         ERR("Failed to initialize shader buffer.\n");
@@ -6389,6 +6406,8 @@ fail:
     constant_heap_free(&priv->vconst_heap);
     HeapFree(GetProcessHeap(), 0, priv->stack);
     shader_buffer_free(&priv->shader_buffer);
+    if (priv->locale)
+        freelocale(priv->locale);
     fragment_pipe->free_private(device);
     vertex_pipe->vp_free(device);
     HeapFree(GetProcessHeap(), 0, priv);
@@ -6419,6 +6438,7 @@ static void shader_glsl_free(struct wined3d_device *device)
     constant_heap_free(&priv->vconst_heap);
     HeapFree(GetProcessHeap(), 0, priv->stack);
     shader_buffer_free(&priv->shader_buffer);
+    freelocale(priv->locale);
     priv->fragment_pipe->free_private(device);
     priv->vertex_pipe->vp_free(device);
 
-- 
1.8.1.5




More information about the wine-patches mailing list