[Mesa-dev] [PATCH 2/6] cso: Store pointers to struct cso_sampler in struct sampler_info
Nicolai Hähnle
nhaehnle at gmail.com
Fri Dec 16 11:20:26 UTC 2016
On 16.12.2016 10:52, Michel Dänzer wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> Preparation for following changes, no functional change intended.
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
> src/gallium/auxiliary/cso_cache/cso_context.c | 33 +++++++++++++++------------
> 1 file changed, 18 insertions(+), 15 deletions(-)
>
> diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c
> index 2ee87f9184..f52969d366 100644
> --- a/src/gallium/auxiliary/cso_cache/cso_context.c
> +++ b/src/gallium/auxiliary/cso_cache/cso_context.c
> @@ -55,6 +55,7 @@
> */
> struct sampler_info
> {
> + struct cso_sampler *cso_samplers[PIPE_MAX_SAMPLERS];
> void *samplers[PIPE_MAX_SAMPLERS];
> unsigned nr_samplers;
> };
> @@ -79,9 +80,7 @@ struct cso_context {
> struct pipe_sampler_view *fragment_views_saved[PIPE_MAX_SHADER_SAMPLER_VIEWS];
> unsigned nr_fragment_views_saved;
>
> - void *fragment_samplers_saved[PIPE_MAX_SAMPLERS];
> - unsigned nr_fragment_samplers_saved;
> -
> + struct sampler_info fragment_samplers_saved;
> struct sampler_info samplers[PIPE_SHADER_TYPES];
>
> struct pipe_vertex_buffer aux_vertex_buffer_current;
> @@ -1164,18 +1163,17 @@ enum pipe_error
> cso_single_sampler(struct cso_context *ctx, unsigned shader_stage,
> unsigned idx, const struct pipe_sampler_state *templ)
> {
> - void *handle = NULL;
> -
> if (templ) {
> unsigned key_size = sizeof(struct pipe_sampler_state);
> unsigned hash_key = cso_construct_key((void*)templ, key_size);
> + struct cso_sampler *cso;
> struct cso_hash_iter iter =
> cso_find_state_template(ctx->cache,
> hash_key, CSO_SAMPLER,
> (void *) templ, key_size);
>
> if (cso_hash_iter_is_null(iter)) {
> - struct cso_sampler *cso = MALLOC(sizeof(struct cso_sampler));
> + cso = MALLOC(sizeof(struct cso_sampler));
> if (!cso)
> return PIPE_ERROR_OUT_OF_MEMORY;
>
> @@ -1190,15 +1188,18 @@ cso_single_sampler(struct cso_context *ctx, unsigned shader_stage,
> FREE(cso);
> return PIPE_ERROR_OUT_OF_MEMORY;
> }
> -
> - handle = cso->data;
> }
> else {
> - handle = ((struct cso_sampler *)cso_hash_iter_data(iter))->data;
> + cso = cso_hash_iter_data(iter);
> }
> +
> + ctx->samplers[shader_stage].cso_samplers[idx] = cso;
> + ctx->samplers[shader_stage].samplers[idx] = cso->data;
> + } else {
> + ctx->samplers[shader_stage].cso_samplers[idx] = NULL;
> + ctx->samplers[shader_stage].samplers[idx] = NULL;
> }
>
> - ctx->samplers[shader_stage].samplers[idx] = handle;
> return PIPE_OK;
> }
>
> @@ -1263,10 +1264,11 @@ static void
> cso_save_fragment_samplers(struct cso_context *ctx)
> {
> struct sampler_info *info = &ctx->samplers[PIPE_SHADER_FRAGMENT];
> + struct sampler_info *saved = &ctx->fragment_samplers_saved;
>
> - ctx->nr_fragment_samplers_saved = info->nr_samplers;
> - memcpy(ctx->fragment_samplers_saved, info->samplers,
> - sizeof(info->samplers));
> + saved->nr_samplers = info->nr_samplers;
> + memcpy(saved->cso_samplers, info->cso_samplers, sizeof(info->cso_samplers));
> + memcpy(saved->samplers, info->samplers, sizeof(info->samplers));
I now realize the previous patch is fine. This could just memcpy the
entire structure, though if you want to keep it as-is for analogy with
cso_restore_fragment_samplers, that's fine as well.
Nicolai
> }
>
>
> @@ -1274,9 +1276,10 @@ static void
> cso_restore_fragment_samplers(struct cso_context *ctx)
> {
> struct sampler_info *info = &ctx->samplers[PIPE_SHADER_FRAGMENT];
> + struct sampler_info *saved = &ctx->fragment_samplers_saved;
>
> - memcpy(info->samplers, ctx->fragment_samplers_saved,
> - sizeof(info->samplers));
> + memcpy(info->cso_samplers, saved->cso_samplers, sizeof(info->cso_samplers));
> + memcpy(info->samplers, saved->samplers, sizeof(info->samplers));
> cso_single_sampler_done(ctx, PIPE_SHADER_FRAGMENT);
> }
>
>
More information about the mesa-dev
mailing list