[PATCH 09/12] wined3d: Fix WINED3D_MCS_COLOR2 handling in wined3d_ffp_get_vs_settings().

Henri Verbeet hverbeet at codeweavers.com
Sat Aug 4 17:17:53 CDT 2018


From: Stefan Dösinger <stefan at codeweavers.com>

WINED3D_MCS_COLOR2 requires specular colour, and does not require diffuse
colour.

Signed-off-by: Stefan Dösinger <stefan at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/wined3d/utils.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index bac52022510..a4181d8572d 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -6077,6 +6077,16 @@ int wined3d_ffp_frag_program_key_compare(const void *key, const struct wine_rb_e
     return memcmp(ka, kb, sizeof(*ka));
 }
 
+static enum wined3d_material_color_source validate_material_colour_source(WORD use_map,
+        enum wined3d_material_color_source source)
+{
+    if (source == WINED3D_MCS_COLOR1 && use_map & (1u << WINED3D_FFP_DIFFUSE))
+        return source;
+    if (source == WINED3D_MCS_COLOR2 && use_map & (1u << WINED3D_FFP_SPECULAR))
+        return source;
+    return WINED3D_MCS_MATERIAL;
+}
+
 void wined3d_ffp_get_vs_settings(const struct wined3d_context *context,
         const struct wined3d_state *state, struct wined3d_ffp_vs_settings *settings)
 {
@@ -6141,12 +6151,16 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_context *context,
     settings->point_size = state->gl_primitive_type == GL_POINTS;
     settings->per_vertex_point_size = !!(si->use_map & 1u << WINED3D_FFP_PSIZE);
 
-    if (state->render_states[WINED3D_RS_COLORVERTEX] && (si->use_map & (1u << WINED3D_FFP_DIFFUSE)))
+    if (state->render_states[WINED3D_RS_COLORVERTEX])
     {
-        settings->diffuse_source = state->render_states[WINED3D_RS_DIFFUSEMATERIALSOURCE];
-        settings->emissive_source = state->render_states[WINED3D_RS_EMISSIVEMATERIALSOURCE];
-        settings->ambient_source = state->render_states[WINED3D_RS_AMBIENTMATERIALSOURCE];
-        settings->specular_source = state->render_states[WINED3D_RS_SPECULARMATERIALSOURCE];
+        settings->diffuse_source = validate_material_colour_source(si->use_map,
+                state->render_states[WINED3D_RS_DIFFUSEMATERIALSOURCE]);
+        settings->emissive_source = validate_material_colour_source(si->use_map,
+                state->render_states[WINED3D_RS_EMISSIVEMATERIALSOURCE]);
+        settings->ambient_source = validate_material_colour_source(si->use_map,
+                state->render_states[WINED3D_RS_AMBIENTMATERIALSOURCE]);
+        settings->specular_source = validate_material_colour_source(si->use_map,
+                state->render_states[WINED3D_RS_SPECULARMATERIALSOURCE]);
     }
     else
     {
-- 
2.11.0




More information about the wine-devel mailing list