From: Elizabeth Figura <zfigura(a)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, -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/6111