[Mesa-dev] [PATCH 3/3] gallium/cso: kill off non-functional shader caching
Jose Fonseca
jfonseca at vmware.com
Fri Feb 17 04:14:25 PST 2012
----- Original Message -----
> Suggested by José.
> ---
> src/gallium/auxiliary/cso_cache/cso_cache.c | 24 -----
> src/gallium/auxiliary/cso_cache/cso_cache.h | 16 ----
> src/gallium/auxiliary/cso_cache/cso_context.c | 118
> -------------------------
> src/gallium/auxiliary/cso_cache/cso_context.h | 13 ---
> 4 files changed, 0 insertions(+), 171 deletions(-)
>
> diff --git a/src/gallium/auxiliary/cso_cache/cso_cache.c
> b/src/gallium/auxiliary/cso_cache/cso_cache.c
> index c606992..e276fd1 100644
> --- a/src/gallium/auxiliary/cso_cache/cso_cache.c
> +++ b/src/gallium/auxiliary/cso_cache/cso_cache.c
> @@ -119,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;
> @@ -158,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;
> @@ -309,8 +287,6 @@ 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);
> diff --git a/src/gallium/auxiliary/cso_cache/cso_cache.h
> b/src/gallium/auxiliary/cso_cache/cso_cache.h
> index 1b17423..cc1f1c0 100644
> --- a/src/gallium/auxiliary/cso_cache/cso_cache.h
> +++ b/src/gallium/auxiliary/cso_cache/cso_cache.h
> @@ -89,8 +89,6 @@ enum cso_cache_type {
> CSO_RASTERIZER,
> CSO_BLEND,
> CSO_DEPTH_STENCIL_ALPHA,
> - CSO_FRAGMENT_SHADER,
> - CSO_VERTEX_SHADER,
> CSO_SAMPLER,
> CSO_VELEMENTS,
> CSO_CACHE_MAX,
> @@ -126,20 +124,6 @@ struct cso_rasterizer {
> struct pipe_context *context;
> };
>
> -struct cso_fragment_shader {
> - struct pipe_shader_state state;
> - void *data;
> - cso_state_callback delete_state;
> - struct pipe_context *context;
> -};
> -
> -struct cso_vertex_shader {
> - struct pipe_shader_state state;
> - void *data;
> - cso_state_callback delete_state;
> - struct pipe_context *context;
> -};
> -
> struct cso_sampler {
> struct pipe_sampler_state state;
> void *data;
> diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c
> b/src/gallium/auxiliary/cso_cache/cso_context.c
> index c95a1ba..60a6e02 100644
> --- a/src/gallium/auxiliary/cso_cache/cso_context.c
> +++ b/src/gallium/auxiliary/cso_cache/cso_context.c
> @@ -165,28 +165,6 @@ static boolean delete_rasterizer_state(struct
> cso_context *ctx, void *state)
> return TRUE;
> }
>
> -static boolean delete_fs_state(struct cso_context *ctx, void *state)
> -{
> - struct cso_fragment_shader *cso = (struct cso_fragment_shader
> *)state;
> - if (ctx->fragment_shader == cso->data)
> - return FALSE;
> - if (cso->delete_state)
> - cso->delete_state(cso->context, cso->data);
> - FREE(state);
> - return TRUE;
> -}
> -
> -static boolean delete_vs_state(struct cso_context *ctx, void *state)
> -{
> - struct cso_vertex_shader *cso = (struct cso_vertex_shader
> *)state;
> - if (ctx->vertex_shader == cso->data)
> - return TRUE;
> - if (cso->delete_state)
> - cso->delete_state(cso->context, cso->data);
> - FREE(state);
> - return FALSE;
> -}
> -
> static boolean delete_vertex_elements(struct cso_context *ctx,
> void *state)
> {
> @@ -218,12 +196,6 @@ static INLINE boolean delete_cso(struct
> cso_context *ctx,
> case CSO_RASTERIZER:
> return delete_rasterizer_state(ctx, state);
> break;
> - case CSO_FRAGMENT_SHADER:
> - return delete_fs_state(ctx, state);
> - break;
> - case CSO_VERTEX_SHADER:
> - return delete_vs_state(ctx, state);
> - break;
> case CSO_VELEMENTS:
> return delete_vertex_elements(ctx, state);
> break;
> @@ -571,52 +543,6 @@ void cso_delete_fragment_shader(struct
> cso_context *ctx, void *handle )
> ctx->pipe->delete_fs_state(ctx->pipe, handle);
> }
>
> -/* Not really working:
> - */
> -#if 0
> -enum pipe_error cso_set_fragment_shader(struct cso_context *ctx,
> - const struct
> pipe_shader_state *templ)
> -{
> - const struct tgsi_token *tokens = templ->tokens;
> - unsigned num_tokens = tgsi_num_tokens(tokens);
> - size_t tokens_size = num_tokens*sizeof(struct tgsi_token);
> - unsigned hash_key = cso_construct_key((void*)tokens,
> tokens_size);
> - struct cso_hash_iter iter = cso_find_state_template(ctx->cache,
> - hash_key,
> -
> CSO_FRAGMENT_SHADER,
> -
> (void*)tokens,
> -
> sizeof(*templ));
> /* XXX correct? tokens_size? */
> - void *handle = NULL;
> -
> - if (cso_hash_iter_is_null(iter)) {
> - struct cso_fragment_shader *cso = MALLOC(sizeof(struct
> cso_fragment_shader) + tokens_size);
> - struct tgsi_token *cso_tokens = (struct tgsi_token *)((char
> *)cso + sizeof(*cso));
> -
> - if (!cso)
> - return PIPE_ERROR_OUT_OF_MEMORY;
> -
> - memcpy(cso_tokens, tokens, tokens_size);
> - cso->state.tokens = cso_tokens;
> - cso->data = ctx->pipe->create_fs_state(ctx->pipe,
> &cso->state);
> - cso->delete_state =
> (cso_state_callback)ctx->pipe->delete_fs_state;
> - cso->context = ctx->pipe;
> -
> - iter = cso_insert_state(ctx->cache, hash_key,
> CSO_FRAGMENT_SHADER, cso);
> - if (cso_hash_iter_is_null(iter)) {
> - FREE(cso);
> - return PIPE_ERROR_OUT_OF_MEMORY;
> - }
> -
> - handle = cso->data;
> - }
> - else {
> - handle = ((struct cso_fragment_shader
> *)cso_hash_iter_data(iter))->data;
> - }
> -
> - return cso_set_fragment_shader_handle( ctx, handle );
> -}
> -#endif
> -
> void cso_save_fragment_shader(struct cso_context *ctx)
> {
> assert(!ctx->fragment_shader_saved);
> @@ -653,50 +579,6 @@ void cso_delete_vertex_shader(struct cso_context
> *ctx, void *handle )
> ctx->pipe->delete_vs_state(ctx->pipe, handle);
> }
>
> -
> -/* Not really working:
> - */
> -#if 0
> -enum pipe_error cso_set_vertex_shader(struct cso_context *ctx,
> - const struct pipe_shader_state
> *templ)
> -{
> - unsigned hash_key = cso_construct_key((void*)templ,
> - sizeof(struct
> pipe_shader_state));
> - struct cso_hash_iter iter = cso_find_state_template(ctx->cache,
> - hash_key,
> CSO_VERTEX_SHADER,
> - (void*)templ,
> -
> sizeof(*templ));
> - void *handle = NULL;
> -
> - if (cso_hash_iter_is_null(iter)) {
> - struct cso_vertex_shader *cso = MALLOC(sizeof(struct
> cso_vertex_shader));
> -
> - if (!cso)
> - return PIPE_ERROR_OUT_OF_MEMORY;
> -
> - memcpy(cso->state, templ, sizeof(*templ));
> - cso->data = ctx->pipe->create_vs_state(ctx->pipe,
> &cso->state);
> - cso->delete_state =
> (cso_state_callback)ctx->pipe->delete_vs_state;
> - cso->context = ctx->pipe;
> -
> - iter = cso_insert_state(ctx->cache, hash_key,
> CSO_VERTEX_SHADER, cso);
> - if (cso_hash_iter_is_null(iter)) {
> - FREE(cso);
> - return PIPE_ERROR_OUT_OF_MEMORY;
> - }
> -
> - handle = cso->data;
> - }
> - else {
> - handle = ((struct cso_vertex_shader
> *)cso_hash_iter_data(iter))->data;
> - }
> -
> - return cso_set_vertex_shader_handle( ctx, handle );
> -}
> -#endif
> -
> -
> -
> void cso_save_vertex_shader(struct cso_context *ctx)
> {
> assert(!ctx->vertex_shader_saved);
> diff --git a/src/gallium/auxiliary/cso_cache/cso_context.h
> b/src/gallium/auxiliary/cso_cache/cso_context.h
> index 5102d70..aabf70c 100644
> --- a/src/gallium/auxiliary/cso_cache/cso_context.h
> +++ b/src/gallium/auxiliary/cso_cache/cso_context.h
> @@ -125,18 +125,9 @@ void cso_save_stream_outputs(struct cso_context
> *ctx);
> void cso_restore_stream_outputs(struct cso_context *ctx);
>
>
> -/* These aren't really sensible -- most of the time the api provides
> - * object semantics for shaders anyway, and the cases where it
> doesn't
> - * (eg mesa's internall-generated texenv programs), it will be up to
> - * the state tracker to implement their own specialized caching.
> - */
The series looks good. Thanks for the cleanup!
But I'd keep this comment and rephrase it for future reference:
We don't provide shader caching in CSO. Most of the time the api provides
object semantics for shaders anyway, and the cases where it doesn't
(eg mesa's internall-generated texenv programs), it will be up to
the state tracker to implement their own specialized caching.
Jose
More information about the mesa-dev
mailing list