[PATCH 3/6] wined3d: Swizzle D3DCOLOR attributes in the GLSL FFP replacement when necessary.

Matteo Bruni mbruni at codeweavers.com
Fri Jul 29 14:01:50 CDT 2016


Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
 dlls/wined3d/buffer.c          | 8 +++-----
 dlls/wined3d/context.c         | 2 +-
 dlls/wined3d/directx.c         | 1 +
 dlls/wined3d/glsl_shader.c     | 5 +++--
 dlls/wined3d/state.c           | 1 +
 dlls/wined3d/utils.c           | 4 ++++
 dlls/wined3d/wined3d_private.h | 4 ++++
 7 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 039b3a1..6cea1d4 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -744,9 +744,9 @@ void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_conte
         const struct wined3d_state *state)
 {
     DWORD flags = buffer->flags & (WINED3D_BUFFER_SYNC | WINED3D_BUFFER_DISCARD);
+    const struct wined3d_gl_info *gl_info = context->gl_info;
     struct wined3d_device *device = buffer->resource.device;
     UINT start, end, len, vertices;
-    const struct wined3d_gl_info *gl_info;
     BOOL decl_changed = FALSE;
     unsigned int i, j;
     BYTE *data;
@@ -783,7 +783,7 @@ void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_conte
 
         if (!use_vs(state))
         {
-            if (!context->gl_info->supported[ARB_VERTEX_ARRAY_BGRA])
+            if (!gl_info->supported[ARB_VERTEX_ARRAY_BGRA] && !context->d3d_info->ffp_d3dcolor_swizzle)
                 fixup_flags |= WINED3D_BUFFER_FIXUP_D3DCOLOR;
             if (!context->d3d_info->xyzrhw)
                 fixup_flags |= WINED3D_BUFFER_FIXUP_XYZRHW;
@@ -873,13 +873,11 @@ void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_conte
             return;
         }
 
-        buffer_direct_upload(buffer, context->gl_info, flags);
+        buffer_direct_upload(buffer, gl_info, flags);
 
         return;
     }
 
-    gl_info = context->gl_info;
-
     if(!(buffer->flags & WINED3D_BUFFER_DOUBLEBUFFER))
     {
         buffer_get_sysmem(buffer, context);
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index a85f3fc..ca06f31 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -3214,7 +3214,7 @@ static void context_update_stream_info(struct wined3d_context *context, const st
     else
     {
         WORD slow_mask = -!d3d_info->ffp_generic_attributes & (1u << WINED3D_FFP_PSIZE);
-        slow_mask |= -!gl_info->supported[ARB_VERTEX_ARRAY_BGRA]
+        slow_mask |= -(!gl_info->supported[ARB_VERTEX_ARRAY_BGRA] && !d3d_info->ffp_d3dcolor_swizzle)
                 & ((1u << WINED3D_FFP_DIFFUSE) | (1u << WINED3D_FFP_SPECULAR) | (1u << WINED3D_FFP_BLENDWEIGHT));
 
         if ((stream_info->position_transformed && !d3d_info->xyzrhw)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index a53fc46..19051b0 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -3861,6 +3861,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter, DWORD
 
     adapter->vertex_pipe->vp_get_caps(gl_info, &vertex_caps);
     adapter->d3d_info.xyzrhw = vertex_caps.xyzrhw;
+    adapter->d3d_info.ffp_d3dcolor_swizzle = vertex_caps.ffp_d3dcolor_swizzle;
     adapter->d3d_info.ffp_generic_attributes = vertex_caps.ffp_generic_attributes;
     adapter->d3d_info.limits.ffp_vertex_blend_matrices = vertex_caps.max_vertex_blend_matrices;
     adapter->d3d_info.emulated_flatshading = vertex_caps.emulated_flatshading;
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index b0de8c6..268b2c3 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -6598,8 +6598,8 @@ static GLuint shader_glsl_generate_ffp_vertex_shader(struct shader_glsl_priv *pr
     for (i = 0; i < ARRAY_SIZE(attrib_info); ++i)
     {
         if (attrib_info[i].name[0])
-            shader_addline(buffer, "%s %s = vs_in%u;\n",
-                    attrib_info[i].type, attrib_info[i].name, i);
+            shader_addline(buffer, "%s %s = vs_in%u%s;\n", attrib_info[i].type, attrib_info[i].name,
+                    i, settings->swizzle_map & (1u << i) ? ".zyxw" : "");
     }
     for (i = 0; i < MAX_TEXTURES; ++i)
     {
@@ -8890,6 +8890,7 @@ static void glsl_vertex_pipe_vp_enable(const struct wined3d_gl_info *gl_info, BO
 static void glsl_vertex_pipe_vp_get_caps(const struct wined3d_gl_info *gl_info, struct wined3d_vertex_caps *caps)
 {
     caps->xyzrhw = TRUE;
+    caps->ffp_d3dcolor_swizzle = TRUE;
     caps->emulated_flatshading = !gl_info->supported[WINED3D_GL_LEGACY_CONTEXT];
     caps->ffp_generic_attributes = TRUE;
     caps->max_active_lights = MAX_ACTIVE_LIGHTS;
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 54ce2ee..b13b055 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -5634,6 +5634,7 @@ static void ffp_free(struct wined3d_device *device) {}
 static void vp_ffp_get_caps(const struct wined3d_gl_info *gl_info, struct wined3d_vertex_caps *caps)
 {
     caps->xyzrhw = FALSE;
+    caps->ffp_d3dcolor_swizzle = FALSE;
     caps->ffp_generic_attributes = FALSE;
     caps->max_active_lights = gl_info->limits.lights;
     caps->max_vertex_blend_matrices = gl_info->limits.blends;
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index b686b09..93b610d 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -5559,6 +5559,8 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_context *context,
         else
             settings->flatshading = FALSE;
 
+        settings->swizzle_map = si->swizzle_map;
+
         return;
     }
 
@@ -5644,6 +5646,8 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_context *context,
     else
         settings->flatshading = FALSE;
 
+    settings->swizzle_map = si->swizzle_map;
+
     settings->padding = 0;
 }
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index e933909..3006b30 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1625,6 +1625,7 @@ struct fragment_pipeline
 struct wined3d_vertex_caps
 {
     BOOL xyzrhw;
+    BOOL ffp_d3dcolor_swizzle;
     BOOL emulated_flatshading;
     BOOL ffp_generic_attributes;
     DWORD max_active_lights;
@@ -2136,6 +2137,7 @@ struct wined3d_d3d_info
     struct wined3d_d3d_limits limits;
     struct wined3d_ffp_attrib_ops ffp_attrib_ops;
     BOOL xyzrhw;
+    BOOL ffp_d3dcolor_swizzle;
     BOOL emulated_flatshading;
     BOOL ffp_generic_attributes;
     BOOL vs_clipping;
@@ -2298,6 +2300,8 @@ struct wined3d_ffp_vs_settings
     DWORD padding         : 10;
 
     DWORD texgen[MAX_TEXTURES];
+
+    WORD swizzle_map; /* MAX_ATTRIBS, 16 */
 };
 
 struct wined3d_ffp_vs_desc
-- 
2.7.3




More information about the wine-patches mailing list