Matteo Bruni : wined3d: Swizzle D3DCOLOR attributes in the GLSL FFP replacement when necessary.
Alexandre Julliard
julliard at winehq.org
Tue Feb 28 03:45:55 CST 2017
Module: wine
Branch: oldstable
Commit: 50909566f3be7bdc78d8331b5b14d75bac264765
URL: http://source.winehq.org/git/wine.git/?a=commit;h=50909566f3be7bdc78d8331b5b14d75bac264765
Author: Matteo Bruni <mbruni at codeweavers.com>
Date: Sat Jul 30 19:56:55 2016 +0200
wined3d: Swizzle D3DCOLOR attributes in the GLSL FFP replacement when necessary.
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit b62f4139eda58e8e25cbc58864fcea2599a20e97)
Conflicts:
dlls/wined3d/buffer.c
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
dlls/wined3d/buffer.c | 8 +++-----
dlls/wined3d/context.c | 2 +-
dlls/wined3d/glsl_shader.c | 4 ++--
dlls/wined3d/utils.c | 4 ++++
dlls/wined3d/wined3d_private.h | 2 ++
5 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 9b7f1c5..6e50458 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -721,9 +721,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 = 0, end = 0, len = 0, vertices;
- const struct wined3d_gl_info *gl_info;
BOOL decl_changed = FALSE;
unsigned int i, j;
BYTE *data;
@@ -761,7 +761,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_generic_attributes)
fixup_flags |= WINED3D_BUFFER_FIXUP_D3DCOLOR;
if (!context->d3d_info->xyzrhw)
fixup_flags |= WINED3D_BUFFER_FIXUP_XYZRHW;
@@ -863,13 +863,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 f6b16a5..414c1e2 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -2983,7 +2983,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_generic_attributes)
& ((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/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index a980c5b..abe12b1 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -5862,8 +5862,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)
{
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 47ad93c..7159f96 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -4804,6 +4804,8 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_context *context,
else
settings->flatshading = FALSE;
+ settings->swizzle_map = si->swizzle_map;
+
return;
}
@@ -4889,6 +4891,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 a8b2aff..316b6ea 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2010,6 +2010,8 @@ struct wined3d_ffp_vs_settings
DWORD padding : 10;
DWORD texgen[MAX_TEXTURES];
+
+ WORD swizzle_map; /* MAX_ATTRIBS, 16 */
};
struct wined3d_ffp_vs_desc
More information about the wine-cvs
mailing list