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