X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Fcso_cache%2Fcso_cache.c;h=e276fd13907677983f2295c5d71deb5e2420cbb5;hb=a15cbabb8b546fa063cfb6f528dd67ee0037079b;hp=900c64df4b93279ac951a780a63bfb15a0b1b045;hpb=ff20543c815a14fddad1efaaef1610454a1924d4;p=mesa.git diff --git a/src/gallium/auxiliary/cso_cache/cso_cache.c b/src/gallium/auxiliary/cso_cache/cso_cache.c index 900c64df4b9..e276fd13907 100644 --- a/src/gallium/auxiliary/cso_cache/cso_cache.c +++ b/src/gallium/auxiliary/cso_cache/cso_cache.c @@ -37,13 +37,7 @@ struct cso_cache { - struct cso_hash *blend_hash; - struct cso_hash *depth_stencil_hash; - struct cso_hash *fs_hash; - struct cso_hash *vs_hash; - struct cso_hash *rasterizer_hash; - struct cso_hash *sampler_hash; - struct cso_hash *velements_hash; + struct cso_hash *hashes[CSO_CACHE_MAX]; int max_size; cso_sanitize_callback sanitize_cb; @@ -86,34 +80,10 @@ unsigned cso_construct_key(void *item, int item_size) return hash_key((item), item_size); } -static struct cso_hash *_cso_hash_for_type(struct cso_cache *sc, enum cso_cache_type type) +static INLINE struct cso_hash *_cso_hash_for_type(struct cso_cache *sc, enum cso_cache_type type) { - struct cso_hash *hash = 0; - - switch(type) { - case CSO_BLEND: - hash = sc->blend_hash; - break; - case CSO_SAMPLER: - hash = sc->sampler_hash; - break; - case CSO_DEPTH_STENCIL_ALPHA: - hash = sc->depth_stencil_hash; - break; - case CSO_RASTERIZER: - hash = sc->rasterizer_hash; - break; - case CSO_FRAGMENT_SHADER: - hash = sc->fs_hash; - break; - case CSO_VERTEX_SHADER: - hash = sc->vs_hash; - break; - case CSO_VELEMENTS: - hash = sc->velements_hash; - break; - } - + struct cso_hash *hash; + hash = sc->hashes[type]; return hash; } @@ -149,22 +119,6 @@ static void delete_rasterizer_state(void *state, void *data) FREE(state); } -static void delete_fs_state(void *state, void *data) -{ - struct cso_fragment_shader *cso = (struct cso_fragment_shader *)state; - if (cso->delete_state) - cso->delete_state(cso->context, cso->data); - FREE(state); -} - -static void delete_vs_state(void *state, void *data) -{ - struct cso_vertex_shader *cso = (struct cso_vertex_shader *)state; - if (cso->delete_state) - cso->delete_state(cso->context, cso->data); - FREE(state); -} - static void delete_velements(void *state, void *data) { struct cso_velements *cso = (struct cso_velements *)state; @@ -188,12 +142,6 @@ static INLINE void delete_cso(void *state, enum cso_cache_type type) case CSO_RASTERIZER: delete_rasterizer_state(state, 0); break; - case CSO_FRAGMENT_SHADER: - delete_fs_state(state, 0); - break; - case CSO_VERTEX_SHADER: - delete_vs_state(state, 0); - break; case CSO_VELEMENTS: delete_velements(state, 0); break; @@ -298,17 +246,14 @@ void * cso_take_state(struct cso_cache *sc, struct cso_cache *cso_cache_create(void) { struct cso_cache *sc = MALLOC_STRUCT(cso_cache); + int i; if (sc == NULL) return NULL; sc->max_size = 4096; - sc->blend_hash = cso_hash_create(); - sc->sampler_hash = cso_hash_create(); - sc->depth_stencil_hash = cso_hash_create(); - sc->rasterizer_hash = cso_hash_create(); - sc->fs_hash = cso_hash_create(); - sc->vs_hash = cso_hash_create(); - sc->velements_hash = cso_hash_create(); + for (i = 0; i < CSO_CACHE_MAX; i++) + sc->hashes[i] = cso_hash_create(); + sc->sanitize_cb = sanitize_cb; sc->sanitize_data = 0; @@ -318,33 +263,9 @@ struct cso_cache *cso_cache_create(void) void cso_for_each_state(struct cso_cache *sc, enum cso_cache_type type, cso_state_callback func, void *user_data) { - struct cso_hash *hash = 0; + struct cso_hash *hash = _cso_hash_for_type(sc, type); struct cso_hash_iter iter; - switch (type) { - case CSO_BLEND: - hash = sc->blend_hash; - break; - case CSO_SAMPLER: - hash = sc->sampler_hash; - break; - case CSO_DEPTH_STENCIL_ALPHA: - hash = sc->depth_stencil_hash; - break; - case CSO_RASTERIZER: - hash = sc->rasterizer_hash; - break; - case CSO_FRAGMENT_SHADER: - hash = sc->fs_hash; - break; - case CSO_VERTEX_SHADER: - hash = sc->vs_hash; - break; - case CSO_VELEMENTS: - hash = sc->velements_hash; - break; - } - iter = cso_hash_first_node(hash); while (!cso_hash_iter_is_null(iter)) { void *state = cso_hash_iter_data(iter); @@ -357,6 +278,7 @@ void cso_for_each_state(struct cso_cache *sc, enum cso_cache_type type, void cso_cache_delete(struct cso_cache *sc) { + int i; assert(sc); if (!sc) @@ -365,34 +287,24 @@ void cso_cache_delete(struct cso_cache *sc) /* delete driver data */ cso_for_each_state(sc, CSO_BLEND, delete_blend_state, 0); cso_for_each_state(sc, CSO_DEPTH_STENCIL_ALPHA, delete_depth_stencil_state, 0); - cso_for_each_state(sc, CSO_FRAGMENT_SHADER, delete_fs_state, 0); - cso_for_each_state(sc, CSO_VERTEX_SHADER, delete_vs_state, 0); cso_for_each_state(sc, CSO_RASTERIZER, delete_rasterizer_state, 0); cso_for_each_state(sc, CSO_SAMPLER, delete_sampler_state, 0); cso_for_each_state(sc, CSO_VELEMENTS, delete_velements, 0); - cso_hash_delete(sc->blend_hash); - cso_hash_delete(sc->sampler_hash); - cso_hash_delete(sc->depth_stencil_hash); - cso_hash_delete(sc->rasterizer_hash); - cso_hash_delete(sc->fs_hash); - cso_hash_delete(sc->vs_hash); - cso_hash_delete(sc->velements_hash); + for (i = 0; i < CSO_CACHE_MAX; i++) + cso_hash_delete(sc->hashes[i]); + FREE(sc); } void cso_set_maximum_cache_size(struct cso_cache *sc, int number) { + int i; + sc->max_size = number; - sanitize_hash(sc, sc->blend_hash, CSO_BLEND, sc->max_size); - sanitize_hash(sc, sc->depth_stencil_hash, CSO_DEPTH_STENCIL_ALPHA, - sc->max_size); - sanitize_hash(sc, sc->fs_hash, CSO_FRAGMENT_SHADER, sc->max_size); - sanitize_hash(sc, sc->vs_hash, CSO_VERTEX_SHADER, sc->max_size); - sanitize_hash(sc, sc->rasterizer_hash, CSO_RASTERIZER, sc->max_size); - sanitize_hash(sc, sc->sampler_hash, CSO_SAMPLER, sc->max_size); - sanitize_hash(sc, sc->velements_hash, CSO_VELEMENTS, sc->max_size); + for (i = 0; i < CSO_CACHE_MAX; i++) + sanitize_hash(sc, sc->hashes[i], i, sc->max_size); } int cso_maximum_cache_size(const struct cso_cache *sc)