From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/glsl_shader.c | 32 +++++++++++++++++++------------- dlls/wined3d/utils.c | 6 +++--- 2 files changed, 22 insertions(+), 16 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 49d8870bb88..5fe9ea8fc0c 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -9189,46 +9189,52 @@ static GLuint shader_glsl_generate_ffp_vertex_shader(struct shader_glsl_priv *pr
for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i) { - BOOL output_legacy_texcoord = legacy_syntax; + struct wined3d_string_buffer *texcoord = string_buffer_get(&priv->string_buffers); + bool output_texcoord = true; + + if (!settings->transformed) + shader_addline(texcoord, "ffp_texture_matrix[%u] * ", i);
switch (settings->texgen[i] & 0xffff0000) { case WINED3DTSS_TCI_PASSTHRU: if (settings->texcoords & (1u << i)) - shader_addline(buffer, "ffp_varying_texcoord[%u] = ffp_texture_matrix[%u] * ffp_attrib_texcoord%u;\n", - i, i, i); + shader_addline(texcoord, "ffp_attrib_texcoord%u", i); else if (shader_glsl_full_ffp_varyings(gl_info)) - shader_addline(buffer, "ffp_varying_texcoord[%u] = vec4(0.0);\n", i); + shader_addline(texcoord, "vec4(0.0)"); else - output_legacy_texcoord = FALSE; + output_texcoord = false; break;
case WINED3DTSS_TCI_CAMERASPACENORMAL: - shader_addline(buffer, "ffp_varying_texcoord[%u] = ffp_texture_matrix[%u] * vec4(normal, 1.0);\n", i, i); + shader_addline(texcoord, "vec4(normal, 1.0)"); break;
case WINED3DTSS_TCI_CAMERASPACEPOSITION: - shader_addline(buffer, "ffp_varying_texcoord[%u] = ffp_texture_matrix[%u] * ec_pos;\n", i, i); + shader_addline(texcoord, "ec_pos"); break;
case WINED3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR: - shader_addline(buffer, "ffp_varying_texcoord[%u] = ffp_texture_matrix[%u]" - " * vec4(reflect(ffp_normalize(ec_pos.xyz), normal), 1.0);\n", i, i); + shader_addline(texcoord, "vec4(reflect(ffp_normalize(ec_pos.xyz), normal), 1.0)"); break;
case WINED3DTSS_TCI_SPHEREMAP: shader_addline(buffer, "r = reflect(ffp_normalize(ec_pos.xyz), normal);\n"); shader_addline(buffer, "m = 2.0 * length(vec3(r.x, r.y, r.z + 1.0));\n"); - shader_addline(buffer, "ffp_varying_texcoord[%u] = ffp_texture_matrix[%u]" - " * vec4(r.x / m + 0.5, r.y / m + 0.5, 0.0, 1.0);\n", i, i); + shader_addline(texcoord, "vec4(r.x / m + 0.5, r.y / m + 0.5, 0.0, 1.0)"); break;
default: ERR("Unhandled texgen %#x.\n", settings->texgen[i]); break; } - if (output_legacy_texcoord) - shader_addline(buffer, "gl_TexCoord[%u] = ffp_varying_texcoord[%u];\n", i, i); + if (output_texcoord) + { + shader_addline(buffer, "ffp_varying_texcoord[%u] = %s;\n", i, texcoord->buffer); + if (legacy_syntax) + shader_addline(buffer, "gl_TexCoord[%u] = ffp_varying_texcoord[%u];\n", i, i); + } + string_buffer_release(&priv->string_buffers, texcoord); }
switch (settings->fog_mode) diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 3ec6ef40508..e31d3d39cfc 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -5687,11 +5687,11 @@ void get_projection_matrix(const struct wined3d_context *context, const struct w
/* Setup this textures matrix according to the texture flags. */ static void compute_texture_matrix(const struct wined3d_matrix *matrix, uint32_t flags, BOOL calculated_coords, - BOOL transformed, enum wined3d_format_id format_id, struct wined3d_matrix *out_matrix) + enum wined3d_format_id format_id, struct wined3d_matrix *out_matrix) { struct wined3d_matrix mat;
- if (flags == WINED3D_TTFF_DISABLE || flags == WINED3D_TTFF_COUNT1 || transformed) + if (flags == WINED3D_TTFF_DISABLE || flags == WINED3D_TTFF_COUNT1) { get_identity_matrix(out_matrix); return; @@ -5762,7 +5762,7 @@ void get_texture_matrix(const struct wined3d_stream_info *si,
compute_texture_matrix(&state->transforms[WINED3D_TS_TEXTURE0 + tex], state->texture_states[tex][WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS], - generated, si->position_transformed, attribute_format, mat); + generated, attribute_format, mat); }
void get_pointsize_minmax(const struct wined3d_context *context, const struct wined3d_state *state,