From 7ce3cbaacfa0a971b48c74615dd858be44d54642 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Wed, 7 Aug 2013 17:16:46 +0800 Subject: [PATCH] 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. --- src/gallium/drivers/ilo/ilo_state.c | 48 +++++++++++++++++------------ 1 file 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 -- 2.30.2