Matteo Bruni : wined3d: Initialize unwritten texcoord varyings in the FFP replacement vertex shader.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Oct 6 09:43:59 CDT 2015
Module: wine
Branch: master
Commit: 47bf62962a316ec99ec3e6f6cdb7a37c7eb7da19
URL: http://source.winehq.org/git/wine.git/?a=commit;h=47bf62962a316ec99ec3e6f6cdb7a37c7eb7da19
Author: Matteo Bruni <mbruni at codeweavers.com>
Date: Fri Oct 2 14:54:46 2015 +0200
wined3d: Initialize unwritten texcoord varyings in the FFP replacement vertex shader.
Only when the GPU supports enough varyings.
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
dlls/wined3d/glsl_shader.c | 2 ++
dlls/wined3d/utils.c | 7 +++++++
dlls/wined3d/wined3d_private.h | 1 +
3 files changed, 10 insertions(+)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index af44989..9fd48c4 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -5802,6 +5802,8 @@ static GLuint shader_glsl_generate_ffp_vertex_shader(struct wined3d_string_buffe
if (settings->texcoords & (1u << i))
shader_addline(buffer, "gl_TexCoord[%u] = ffp_texture_matrix[%u] * ffp_attrib_texcoord%u;\n",
i, i, i);
+ else if (gl_info->limits.glsl_varyings >= wined3d_max_compat_varyings(gl_info))
+ shader_addline(buffer, "gl_TexCoord[%u] = vec4(0.0);\n", i);
break;
case WINED3DTSS_TCI_CAMERASPACENORMAL:
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index aa6eb62..8265b9c 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -4343,6 +4343,13 @@ DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) {
return size;
}
+unsigned int wined3d_max_compat_varyings(const struct wined3d_gl_info *gl_info)
+{
+ /* On core profile we have to also count diffuse and specular colors and the
+ * fog coordinate. */
+ return gl_info->supported[WINED3D_GL_LEGACY_CONTEXT] ? MAX_TEXTURES * 4 : (MAX_TEXTURES + 2) * 4 + 1;
+}
+
void gen_ffp_frag_op(const struct wined3d_context *context, const struct wined3d_state *state,
struct ffp_frag_settings *settings, BOOL ignore_textype)
{
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 758af54..d3c362b 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1877,6 +1877,7 @@ extern const struct wine_rb_functions wined3d_ffp_frag_program_rb_functions DECL
extern const struct wine_rb_functions wined3d_ffp_vertex_program_rb_functions DECLSPEC_HIDDEN;
extern const struct wined3d_parent_ops wined3d_null_parent_ops DECLSPEC_HIDDEN;
+unsigned int wined3d_max_compat_varyings(const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
void gen_ffp_frag_op(const struct wined3d_context *context, const struct wined3d_state *state,
struct ffp_frag_settings *settings, BOOL ignore_textype) DECLSPEC_HIDDEN;
const struct ffp_frag_desc *find_ffp_frag_shader(const struct wine_rb_tree *fragment_shaders,
More information about the wine-cvs
mailing list