summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorAxel Davy <[email protected]>2015-01-07 16:34:12 +0100
committerAxel Davy <[email protected]>2015-02-06 00:07:18 +0100
commit65ce2b2848eafe0d51375edca15fbb91956668e4 (patch)
tree7025eaea3fa9553f506e5cc8d608fe07fc24ae1b /src/gallium
parent2d2286d17c78af95c4bb5f56ef1b58a09eef7260 (diff)
st/nine: Commit sampler views again if srgb state changed.
This fixes a wine test and some minor visual issues on some games. The patch is not optimal, there is probably a more efficient way to fix this issue, but the code there already has some innefficiencies. There is plans to rewrite that part of the code to make it more efficient. Reviewed-by: Tiziano Bacocco <[email protected]> Signed-off-by: Axel Davy <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/state_trackers/nine/device9.c3
-rw-r--r--src/gallium/state_trackers/nine/nine_state.c5
-rw-r--r--src/gallium/state_trackers/nine/nine_state.h1
3 files changed, 7 insertions, 2 deletions
diff --git a/src/gallium/state_trackers/nine/device9.c b/src/gallium/state_trackers/nine/device9.c
index 656f48860fd..b7e83a4bab9 100644
--- a/src/gallium/state_trackers/nine/device9.c
+++ b/src/gallium/state_trackers/nine/device9.c
@@ -2327,6 +2327,9 @@ NineDevice9_SetSamplerState( struct NineDevice9 *This,
state->changed.group |= NINE_STATE_SAMPLER;
state->changed.sampler[Sampler] |= 1 << Type;
+ if (Type == D3DSAMP_SRGBTEXTURE)
+ state->changed.srgb = TRUE;
+
return D3D_OK;
}
diff --git a/src/gallium/state_trackers/nine/nine_state.c b/src/gallium/state_trackers/nine/nine_state.c
index dad665133ac..972ed1f40be 100644
--- a/src/gallium/state_trackers/nine/nine_state.c
+++ b/src/gallium/state_trackers/nine/nine_state.c
@@ -678,7 +678,7 @@ update_textures_and_samplers(struct NineDevice9 *device)
nine_convert_sampler_state(device->cso, s, state->samp[s]);
}
}
- if (state->changed.texture & NINE_PS_SAMPLERS_MASK)
+ if (state->changed.texture & NINE_PS_SAMPLERS_MASK || state->changed.srgb)
pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
num_textures, view);
@@ -708,13 +708,14 @@ update_textures_and_samplers(struct NineDevice9 *device)
nine_convert_sampler_state(device->cso, s, state->samp[s]);
}
}
- if (state->changed.texture & NINE_VS_SAMPLERS_MASK)
+ if (state->changed.texture & NINE_VS_SAMPLERS_MASK || state->changed.srgb)
pipe->set_sampler_views(pipe, PIPE_SHADER_VERTEX, 0,
num_textures, view);
if (commit_samplers)
cso_single_sampler_done(device->cso, PIPE_SHADER_VERTEX);
+ state->changed.srgb = FALSE;
state->changed.texture = 0;
}
diff --git a/src/gallium/state_trackers/nine/nine_state.h b/src/gallium/state_trackers/nine/nine_state.h
index 028e57df264..6e94e68ef1e 100644
--- a/src/gallium/state_trackers/nine/nine_state.h
+++ b/src/gallium/state_trackers/nine/nine_state.h
@@ -123,6 +123,7 @@ struct nine_state
uint16_t vs_const_b; /* NINE_MAX_CONST_B == 16 */
uint16_t ps_const_b;
uint8_t ucp;
+ boolean srgb;
} changed;
struct NineSurface9 *rt[NINE_MAX_SIMULTANEOUS_RENDERTARGETS];