[PATCH 2/6] wined3d: Dirtify pixel shader on texture format change.
Matteo Bruni
mbruni at codeweavers.com
Mon Nov 3 15:38:27 CST 2014
The following 3Dc test (in its current form) fails without this,
because we fail to update the color fixup between the ATI1N and the
ATI2N texture test.
v2: Only dirtify on color fixup or color / shadow sampler changes.
---
dlls/wined3d/cs.c | 7 ++++++-
dlls/wined3d/wined3d_private.h | 8 ++++++++
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index bdd86c8..b8a32e5 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -636,10 +636,15 @@ static void wined3d_cs_exec_set_texture(struct wined3d_cs *cs, const void *data)
if (op->texture)
{
+ const struct wined3d_format *new_format = op->texture->resource.format;
+ const struct wined3d_format *old_format = prev ? prev->resource.format : NULL;
+
if (InterlockedIncrement(&op->texture->resource.bind_count) == 1)
op->texture->sampler = op->stage;
- if (!prev || op->texture->target != prev->target)
+ if (!prev || op->texture->target != prev->target
+ || !is_same_fixup(new_format->color_fixup, old_format->color_fixup)
+ || (new_format->flags & WINED3DFMT_FLAG_SHADOW) != (old_format->flags & WINED3DFMT_FLAG_SHADOW))
device_invalidate_state(cs->device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL));
if (!prev && op->stage < d3d_info->limits.ffp_blend_stages)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f4ded4f..179fafe 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -141,6 +141,14 @@ static inline BOOL is_complex_fixup(struct color_fixup_desc fixup)
return fixup.x_source == CHANNEL_SOURCE_COMPLEX0 || fixup.x_source == CHANNEL_SOURCE_COMPLEX1;
}
+static inline BOOL is_same_fixup(struct color_fixup_desc f1, struct color_fixup_desc f2)
+{
+ return f1.x_sign_fixup == f2.x_sign_fixup && f1.x_source == f2.x_source
+ && f1.y_sign_fixup == f2.y_sign_fixup && f1.y_source == f2.y_source
+ && f1.z_sign_fixup == f2.z_sign_fixup && f1.z_source == f2.z_source
+ && f1.w_sign_fixup == f2.w_sign_fixup && f1.w_source == f2.w_source;
+}
+
static inline enum complex_fixup get_complex_fixup(struct color_fixup_desc fixup)
{
enum complex_fixup complex_fixup = 0;
--
2.0.4
More information about the wine-patches
mailing list