diff options
author | Chia-I Wu <[email protected]> | 2013-08-07 17:16:46 +0800 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2013-08-07 23:13:44 +0800 |
commit | 7ce3cbaacfa0a971b48c74615dd858be44d54642 (patch) | |
tree | 9a4fbfbea3953e4d7f475582e401070613033b55 /src/gallium/drivers | |
parent | 2811dba1d0a5a0a7cd57fa06c6cb1829ac5ac4ba (diff) |
ilo: skip state emission when reducing sampler count
When the number of sampler states bound is reduced, we are good to keep
referencing the old SAMPLER_STATE array and skip emitting a new one.
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/ilo/ilo_state.c | 48 |
1 files changed, 29 insertions, 19 deletions
diff --git a/src/gallium/drivers/ilo/ilo_state.c b/src/gallium/drivers/ilo/ilo_state.c index b92ddee2ce2..86470a784f8 100644 --- a/src/gallium/drivers/ilo/ilo_state.c +++ b/src/gallium/drivers/ilo/ilo_state.c @@ -240,19 +240,31 @@ ilo_create_sampler_state(struct pipe_context *pipe, return sampler; } -static void +static bool ilo_bind_sampler_states(struct pipe_context *pipe, unsigned shader, unsigned start, unsigned count, void **samplers) { struct ilo_context *ilo = ilo_context(pipe); struct ilo_sampler_state *dst = &ilo->sampler[shader]; + bool changed = false; unsigned i; assert(start + count <= Elements(dst->cso)); if (samplers) { - for (i = 0; i < count; i++) - dst->cso[start + i] = samplers[i]; + for (i = 0; i < count; i++) { + if (dst->cso[start + i] != samplers[i]) { + dst->cso[start + i] = samplers[i]; + + /* + * This function is sometimes called to reduce the number of bound + * samplers. Do not consider that as a state change (and create a + * new array of SAMPLER_STATE). + */ + if (samplers[i]) + changed = true; + } + } } else { for (i = 0; i < count; i++) @@ -270,6 +282,8 @@ ilo_bind_sampler_states(struct pipe_context *pipe, unsigned shader, dst->count = count; } + + return changed; } static void @@ -279,15 +293,14 @@ ilo_bind_fragment_sampler_states(struct pipe_context *pipe, { struct ilo_context *ilo = ilo_context(pipe); - ilo_bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT, - 0, num_samplers, samplers); + if (ilo_bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT, + 0, num_samplers, samplers)) + ilo->dirty |= ILO_DIRTY_SAMPLER_FS; if (ilo->sampler[PIPE_SHADER_FRAGMENT].count > num_samplers) { ilo_bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT, num_samplers, ilo->sampler[PIPE_SHADER_FRAGMENT].count - num_samplers, NULL); } - - ilo->dirty |= ILO_DIRTY_SAMPLER_FS; } static void @@ -297,15 +310,14 @@ ilo_bind_vertex_sampler_states(struct pipe_context *pipe, { struct ilo_context *ilo = ilo_context(pipe); - ilo_bind_sampler_states(pipe, PIPE_SHADER_VERTEX, - 0, num_samplers, samplers); + if (ilo_bind_sampler_states(pipe, PIPE_SHADER_VERTEX, + 0, num_samplers, samplers)) + ilo->dirty |= ILO_DIRTY_SAMPLER_VS; if (ilo->sampler[PIPE_SHADER_VERTEX].count > num_samplers) { ilo_bind_sampler_states(pipe, PIPE_SHADER_VERTEX, num_samplers, ilo->sampler[PIPE_SHADER_VERTEX].count - num_samplers, NULL); } - - ilo->dirty |= ILO_DIRTY_SAMPLER_VS; } static void @@ -315,15 +327,14 @@ ilo_bind_geometry_sampler_states(struct pipe_context *pipe, { struct ilo_context *ilo = ilo_context(pipe); - ilo_bind_sampler_states(pipe, PIPE_SHADER_GEOMETRY, - 0, num_samplers, samplers); + if (ilo_bind_sampler_states(pipe, PIPE_SHADER_GEOMETRY, + 0, num_samplers, samplers)) + ilo->dirty |= ILO_DIRTY_SAMPLER_GS; if (ilo->sampler[PIPE_SHADER_GEOMETRY].count > num_samplers) { ilo_bind_sampler_states(pipe, PIPE_SHADER_GEOMETRY, num_samplers, ilo->sampler[PIPE_SHADER_GEOMETRY].count - num_samplers, NULL); } - - ilo->dirty |= ILO_DIRTY_SAMPLER_GS; } static void @@ -334,10 +345,9 @@ ilo_bind_compute_sampler_states(struct pipe_context *pipe, { struct ilo_context *ilo = ilo_context(pipe); - ilo_bind_sampler_states(pipe, PIPE_SHADER_COMPUTE, - start_slot, num_samplers, samplers); - - ilo->dirty |= ILO_DIRTY_SAMPLER_CS; + if (ilo_bind_sampler_states(pipe, PIPE_SHADER_COMPUTE, + start_slot, num_samplers, samplers)) + ilo->dirty |= ILO_DIRTY_SAMPLER_CS; } static void |