[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