[PATCH 1/4] wined3d: Fix WINED3D_MCS_COLOR2.

Stefan Dösinger stefan at codeweavers.com
Wed Jul 25 15:00:42 CDT 2018


Don't use it unless we have a specular color in the vertex attributes,
but allow it if there's no diffuse color.

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

diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 937c1bc0df6..ccf5b846efc 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -5854,6 +5854,7 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_context *context,
     const struct wined3d_gl_info *gl_info = context->gl_info;
     const struct wined3d_d3d_info *d3d_info = context->d3d_info;
     unsigned int coord_idx, i;
+    BOOL has_diffuse, has_specular;
 
     memset(settings, 0, sizeof(*settings));
 
@@ -5911,12 +5912,38 @@ 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)))
+    has_diffuse = si->use_map & (1u << WINED3D_FFP_DIFFUSE);
+    has_specular = si->use_map & (1u << WINED3D_FFP_SPECULAR);
+
+    if (state->render_states[WINED3D_RS_COLORVERTEX] && (has_diffuse || has_specular))
     {
-        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];
+        if (state->render_states[WINED3D_RS_DIFFUSEMATERIALSOURCE] == WINED3D_MCS_COLOR1 && has_diffuse)
+            settings->diffuse_source = WINED3D_MCS_COLOR1;
+        else if (state->render_states[WINED3D_RS_DIFFUSEMATERIALSOURCE] == WINED3D_MCS_COLOR2 && has_specular)
+            settings->diffuse_source = WINED3D_MCS_COLOR2;
+        else
+            settings->diffuse_source = WINED3D_MCS_MATERIAL;
+
+        if (state->render_states[WINED3D_RS_EMISSIVEMATERIALSOURCE] == WINED3D_MCS_COLOR1 && has_diffuse)
+            settings->emissive_source = WINED3D_MCS_COLOR1;
+        else if (state->render_states[WINED3D_RS_EMISSIVEMATERIALSOURCE] == WINED3D_MCS_COLOR2 && has_specular)
+            settings->emissive_source = WINED3D_MCS_COLOR2;
+        else
+            settings->emissive_source = WINED3D_MCS_MATERIAL;
+
+        if (state->render_states[WINED3D_RS_AMBIENTMATERIALSOURCE] == WINED3D_MCS_COLOR1 && has_diffuse)
+            settings->ambient_source = WINED3D_MCS_COLOR1;
+        else if (state->render_states[WINED3D_RS_AMBIENTMATERIALSOURCE] == WINED3D_MCS_COLOR2 && has_specular)
+            settings->ambient_source = WINED3D_MCS_COLOR2;
+        else
+            settings->ambient_source = WINED3D_MCS_MATERIAL;
+
+        if (state->render_states[WINED3D_RS_SPECULARMATERIALSOURCE] == WINED3D_MCS_COLOR1 && has_diffuse)
+            settings->specular_source = WINED3D_MCS_COLOR1;
+        else if (state->render_states[WINED3D_RS_SPECULARMATERIALSOURCE] == WINED3D_MCS_COLOR2 && has_specular)
+            settings->specular_source = WINED3D_MCS_COLOR2;
+        else
+            settings->specular_source = WINED3D_MCS_MATERIAL;
     }
     else
     {
-- 
2.16.4




More information about the wine-devel mailing list