wined3d: Dirtify pixel shader on texture format change.

This commit is contained in:
Matteo Bruni 2014-11-03 22:38:27 +01:00 committed by Alexandre Julliard
parent ea85db2a3f
commit 2dd237e200
2 changed files with 14 additions and 1 deletions

View File

@ -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)

View File

@ -145,6 +145,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;