Nice one :) Reviewed-by: Eduardo Lima Mitev <el...@igalia.com>
On 01/17/2017 08:14 AM, Kenneth Graunke wrote: > We had five copies of the same "walk the cache and look for an > existing shader variant for this program" code. Now we have one > helper function that returns the key. > > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> > --- > src/mesa/drivers/dri/i965/brw_gs.c | 22 ++++------------ > src/mesa/drivers/dri/i965/brw_program_cache.c | 38 > +++++++++++++++++++++++++++ > src/mesa/drivers/dri/i965/brw_state.h | 5 ++++ > src/mesa/drivers/dri/i965/brw_tcs.c | 22 ++++------------ > src/mesa/drivers/dri/i965/brw_tes.c | 22 ++++------------ > src/mesa/drivers/dri/i965/brw_vs.c | 22 ++++------------ > src/mesa/drivers/dri/i965/brw_wm.c | 22 ++++------------ > 7 files changed, 68 insertions(+), 85 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_gs.c > b/src/mesa/drivers/dri/i965/brw_gs.c > index b7fb9f9c1ea..299620311a5 100644 > --- a/src/mesa/drivers/dri/i965/brw_gs.c > +++ b/src/mesa/drivers/dri/i965/brw_gs.c > @@ -40,26 +40,14 @@ static void > brw_gs_debug_recompile(struct brw_context *brw, struct gl_program *prog, > const struct brw_gs_prog_key *key) > { > - struct brw_cache_item *c = NULL; > - const struct brw_gs_prog_key *old_key = NULL; > - bool found = false; > - > perf_debug("Recompiling geometry shader for program %d\n", prog->Id); > > - for (unsigned int i = 0; i < brw->cache.size; i++) { > - for (c = brw->cache.items[i]; c; c = c->next) { > - if (c->cache_id == BRW_CACHE_GS_PROG) { > - old_key = c->key; > - > - if (old_key->program_string_id == key->program_string_id) > - break; > - } > - } > - if (c) > - break; > - } > + bool found = false; > + const struct brw_gs_prog_key *old_key = > + brw_find_previous_compile(&brw->cache, BRW_CACHE_GS_PROG, > + key->program_string_id); > > - if (!c) { > + if (!old_key) { > perf_debug(" Didn't find previous compile in the shader cache for " > "debug\n"); > return; > diff --git a/src/mesa/drivers/dri/i965/brw_program_cache.c > b/src/mesa/drivers/dri/i965/brw_program_cache.c > index 3947904ac50..3d95372bc0e 100644 > --- a/src/mesa/drivers/dri/i965/brw_program_cache.c > +++ b/src/mesa/drivers/dri/i965/brw_program_cache.c > @@ -55,6 +55,27 @@ > > #define FILE_DEBUG_FLAG DEBUG_STATE > > +static unsigned > +get_program_string_id(enum brw_cache_id cache_id, const void *key) > +{ > + switch (cache_id) { > + case BRW_CACHE_VS_PROG: > + return ((struct brw_vs_prog_key *) key)->program_string_id; > + case BRW_CACHE_TCS_PROG: > + return ((struct brw_tcs_prog_key *) key)->program_string_id; > + case BRW_CACHE_TES_PROG: > + return ((struct brw_tes_prog_key *) key)->program_string_id; > + case BRW_CACHE_GS_PROG: > + return ((struct brw_gs_prog_key *) key)->program_string_id; > + case BRW_CACHE_CS_PROG: > + return ((struct brw_cs_prog_key *) key)->program_string_id; > + case BRW_CACHE_FS_PROG: > + return ((struct brw_wm_prog_key *) key)->program_string_id; > + default: > + unreachable("no program string id for this kind of program"); > + } > +} > + > static GLuint > hash_key(struct brw_cache_item *item) > { > @@ -268,6 +289,23 @@ brw_alloc_item_data(struct brw_cache *cache, uint32_t > size) > return offset; > } > > +const void * > +brw_find_previous_compile(struct brw_cache *cache, > + enum brw_cache_id cache_id, > + unsigned program_string_id) > +{ > + for (unsigned i = 0; i < cache->size; i++) { > + for (struct brw_cache_item *c = cache->items[i]; c; c = c->next) { > + if (c->cache_id == cache_id && > + get_program_string_id(cache_id, c->key) == program_string_id) { > + return c->key; > + } > + } > + } > + > + return NULL; > +} > + > void > brw_upload_cache(struct brw_cache *cache, > enum brw_cache_id cache_id, > diff --git a/src/mesa/drivers/dri/i965/brw_state.h > b/src/mesa/drivers/dri/i965/brw_state.h > index 176557b7c45..bd82212be4d 100644 > --- a/src/mesa/drivers/dri/i965/brw_state.h > +++ b/src/mesa/drivers/dri/i965/brw_state.h > @@ -235,6 +235,11 @@ bool brw_search_cache(struct brw_cache *cache, > const void *key, > GLuint key_size, > uint32_t *inout_offset, void *inout_aux); > + > +const void *brw_find_previous_compile(struct brw_cache *cache, > + enum brw_cache_id cache_id, > + unsigned program_string_id); > + > void brw_program_cache_check_size(struct brw_context *brw); > > void brw_init_caches( struct brw_context *brw ); > diff --git a/src/mesa/drivers/dri/i965/brw_tcs.c > b/src/mesa/drivers/dri/i965/brw_tcs.c > index 78ad257e3b9..bbba7496fa6 100644 > --- a/src/mesa/drivers/dri/i965/brw_tcs.c > +++ b/src/mesa/drivers/dri/i965/brw_tcs.c > @@ -120,27 +120,15 @@ static void > brw_tcs_debug_recompile(struct brw_context *brw, struct gl_program *prog, > const struct brw_tcs_prog_key *key) > { > - struct brw_cache_item *c = NULL; > - const struct brw_tcs_prog_key *old_key = NULL; > - bool found = false; > - > perf_debug("Recompiling tessellation control shader for program %d\n", > prog->Id); > > - for (unsigned int i = 0; i < brw->cache.size; i++) { > - for (c = brw->cache.items[i]; c; c = c->next) { > - if (c->cache_id == BRW_CACHE_TCS_PROG) { > - old_key = c->key; > - > - if (old_key->program_string_id == key->program_string_id) > - break; > - } > - } > - if (c) > - break; > - } > + bool found = false; > + const struct brw_tcs_prog_key *old_key = > + brw_find_previous_compile(&brw->cache, BRW_CACHE_TCS_PROG, > + key->program_string_id); > > - if (!c) { > + if (!old_key) { > perf_debug(" Didn't find previous compile in the shader cache for " > "debug\n"); > return; > diff --git a/src/mesa/drivers/dri/i965/brw_tes.c > b/src/mesa/drivers/dri/i965/brw_tes.c > index 57dcda7140a..cb12b9c5a69 100644 > --- a/src/mesa/drivers/dri/i965/brw_tes.c > +++ b/src/mesa/drivers/dri/i965/brw_tes.c > @@ -38,27 +38,15 @@ static void > brw_tes_debug_recompile(struct brw_context *brw, struct gl_program *prog, > const struct brw_tes_prog_key *key) > { > - struct brw_cache_item *c = NULL; > - const struct brw_tes_prog_key *old_key = NULL; > - bool found = false; > - > perf_debug("Recompiling tessellation evaluation shader for program %d\n", > prog->Id); > > - for (unsigned int i = 0; i < brw->cache.size; i++) { > - for (c = brw->cache.items[i]; c; c = c->next) { > - if (c->cache_id == BRW_CACHE_TES_PROG) { > - old_key = c->key; > - > - if (old_key->program_string_id == key->program_string_id) > - break; > - } > - } > - if (c) > - break; > - } > + bool found = false; > + const struct brw_tes_prog_key *old_key = > + brw_find_previous_compile(&brw->cache, BRW_CACHE_TES_PROG, > + key->program_string_id); > > - if (!c) { > + if (!old_key) { > perf_debug(" Didn't find previous compile in the shader cache for " > "debug\n"); > return; > diff --git a/src/mesa/drivers/dri/i965/brw_vs.c > b/src/mesa/drivers/dri/i965/brw_vs.c > index afb1f203308..5d199393181 100644 > --- a/src/mesa/drivers/dri/i965/brw_vs.c > +++ b/src/mesa/drivers/dri/i965/brw_vs.c > @@ -88,26 +88,14 @@ static void > brw_vs_debug_recompile(struct brw_context *brw, struct gl_program *prog, > const struct brw_vs_prog_key *key) > { > - struct brw_cache_item *c = NULL; > - const struct brw_vs_prog_key *old_key = NULL; > - bool found = false; > - > perf_debug("Recompiling vertex shader for program %d\n", prog->Id); > > - for (unsigned int i = 0; i < brw->cache.size; i++) { > - for (c = brw->cache.items[i]; c; c = c->next) { > - if (c->cache_id == BRW_CACHE_VS_PROG) { > - old_key = c->key; > - > - if (old_key->program_string_id == key->program_string_id) > - break; > - } > - } > - if (c) > - break; > - } > + bool found = false; > + const struct brw_vs_prog_key *old_key = > + brw_find_previous_compile(&brw->cache, BRW_CACHE_VS_PROG, > + key->program_string_id); > > - if (!c) { > + if (!old_key) { > perf_debug(" Didn't find previous compile in the shader cache for " > "debug\n"); > return; > diff --git a/src/mesa/drivers/dri/i965/brw_wm.c > b/src/mesa/drivers/dri/i965/brw_wm.c > index bd2b24a3bfa..a774720202a 100644 > --- a/src/mesa/drivers/dri/i965/brw_wm.c > +++ b/src/mesa/drivers/dri/i965/brw_wm.c > @@ -70,26 +70,14 @@ static void > brw_wm_debug_recompile(struct brw_context *brw, struct gl_program *prog, > const struct brw_wm_prog_key *key) > { > - struct brw_cache_item *c = NULL; > - const struct brw_wm_prog_key *old_key = NULL; > - bool found = false; > - > perf_debug("Recompiling fragment shader for program %d\n", prog->Id); > > - for (unsigned int i = 0; i < brw->cache.size; i++) { > - for (c = brw->cache.items[i]; c; c = c->next) { > - if (c->cache_id == BRW_CACHE_FS_PROG) { > - old_key = c->key; > - > - if (old_key->program_string_id == key->program_string_id) > - break; > - } > - } > - if (c) > - break; > - } > + bool found = false; > + const struct brw_wm_prog_key *old_key = > + brw_find_previous_compile(&brw->cache, BRW_CACHE_FS_PROG, > + key->program_string_id); > > - if (!c) { > + if (!old_key) { > perf_debug(" Didn't find previous compile in the shader cache for > debug\n"); > return; > } > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev