diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/auxiliary/cso_cache/cso_cache.c | 23 | ||||
| -rw-r--r-- | src/gallium/auxiliary/cso_cache/cso_cache.h | 2 | ||||
| -rw-r--r-- | src/gallium/auxiliary/cso_cache/cso_context.c | 32 | 
3 files changed, 20 insertions, 37 deletions
| diff --git a/src/gallium/auxiliary/cso_cache/cso_cache.c b/src/gallium/auxiliary/cso_cache/cso_cache.c index e6dce3f0e5..a6a07e72c2 100644 --- a/src/gallium/auxiliary/cso_cache/cso_cache.c +++ b/src/gallium/auxiliary/cso_cache/cso_cache.c @@ -113,26 +113,6 @@ static struct cso_hash *_cso_hash_for_type(struct cso_cache *sc, enum cso_cache_     return hash;  } -static int _cso_size_for_type(enum cso_cache_type type) -{ -   switch(type) { -   case CSO_BLEND: -      return sizeof(struct pipe_blend_state); -   case CSO_SAMPLER: -      return sizeof(struct pipe_sampler_state); -   case CSO_DEPTH_STENCIL_ALPHA: -      return sizeof(struct pipe_depth_stencil_alpha_state); -   case CSO_RASTERIZER: -      return sizeof(struct pipe_rasterizer_state); -   case CSO_FRAGMENT_SHADER: -      return sizeof(struct pipe_shader_state); -   case CSO_VERTEX_SHADER: -      return sizeof(struct pipe_shader_state); -   } -   return 0; -} - -  static void delete_blend_state(void *state, void *data)  {     struct cso_blend *cso = (struct cso_blend *)state; @@ -282,10 +262,9 @@ void *cso_hash_find_data_from_template( struct cso_hash *hash,  struct cso_hash_iter cso_find_state_template(struct cso_cache *sc,                                               unsigned hash_key, enum cso_cache_type type, -                                             void *templ) +                                             void *templ, unsigned size)  {     struct cso_hash_iter iter = cso_find_state(sc, hash_key, type); -   int size = _cso_size_for_type(type);     while (!cso_hash_iter_is_null(iter)) {        void *iter_data = cso_hash_iter_data(iter);        if (!memcmp(iter_data, templ, size)) diff --git a/src/gallium/auxiliary/cso_cache/cso_cache.h b/src/gallium/auxiliary/cso_cache/cso_cache.h index 6b5c230e8f..eea60b940b 100644 --- a/src/gallium/auxiliary/cso_cache/cso_cache.h +++ b/src/gallium/auxiliary/cso_cache/cso_cache.h @@ -160,7 +160,7 @@ struct cso_hash_iter cso_find_state(struct cso_cache *sc,                                      unsigned hash_key, enum cso_cache_type type);  struct cso_hash_iter cso_find_state_template(struct cso_cache *sc,                                               unsigned hash_key, enum cso_cache_type type, -                                             void *templ); +                                             void *templ, unsigned size);  void cso_for_each_state(struct cso_cache *sc, enum cso_cache_type type,                          cso_state_callback func, void *user_data);  void * cso_take_state(struct cso_cache *sc, unsigned hash_key, diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c index c479c36064..dec830ba93 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.c +++ b/src/gallium/auxiliary/cso_cache/cso_context.c @@ -317,7 +317,7 @@ enum pipe_error cso_set_blend(struct cso_context *ctx,     key_size = templ->independent_blend_enable ? sizeof(struct pipe_blend_state) :                (char *)&(templ->rt[1]) - (char *)templ;     hash_key = cso_construct_key((void*)templ, key_size); -   iter = cso_find_state_template(ctx->cache, hash_key, CSO_BLEND, (void*)templ); +   iter = cso_find_state_template(ctx->cache, hash_key, CSO_BLEND, (void*)templ, key_size);     if (cso_hash_iter_is_null(iter)) {        struct cso_blend *cso = MALLOC(sizeof(struct cso_blend)); @@ -372,10 +372,11 @@ enum pipe_error cso_single_sampler(struct cso_context *ctx,     void *handle = NULL;     if (templ != NULL) { -      unsigned hash_key = cso_construct_key((void*)templ, sizeof(struct pipe_sampler_state)); +      unsigned key_size = sizeof(struct pipe_sampler_state); +      unsigned hash_key = cso_construct_key((void*)templ, key_size);        struct cso_hash_iter iter = cso_find_state_template(ctx->cache,                                                            hash_key, CSO_SAMPLER, -                                                          (void*)templ); +                                                          (void*)templ, key_size);        if (cso_hash_iter_is_null(iter)) {           struct cso_sampler *cso = MALLOC(sizeof(struct cso_sampler)); @@ -412,10 +413,11 @@ cso_single_vertex_sampler(struct cso_context *ctx,     void *handle = NULL;     if (templ != NULL) { -      unsigned hash_key = cso_construct_key((void*)templ, sizeof(struct pipe_sampler_state)); +      unsigned key_size = sizeof(struct pipe_sampler_state); +      unsigned hash_key = cso_construct_key((void*)templ, key_size);        struct cso_hash_iter iter = cso_find_state_template(ctx->cache,                                                            hash_key, CSO_SAMPLER, -                                                          (void*)templ); +                                                          (void*)templ, key_size);        if (cso_hash_iter_is_null(iter)) {           struct cso_sampler *cso = MALLOC(sizeof(struct cso_sampler)); @@ -701,12 +703,12 @@ cso_restore_vertex_sampler_textures(struct cso_context *ctx)  enum pipe_error cso_set_depth_stencil_alpha(struct cso_context *ctx,                                              const struct pipe_depth_stencil_alpha_state *templ)  { -   unsigned hash_key = cso_construct_key((void*)templ, -                                         sizeof(struct pipe_depth_stencil_alpha_state)); +   unsigned key_size = sizeof(struct pipe_depth_stencil_alpha_state); +   unsigned hash_key = cso_construct_key((void*)templ, key_size);     struct cso_hash_iter iter = cso_find_state_template(ctx->cache,                                                         hash_key,  -						       CSO_DEPTH_STENCIL_ALPHA, -                                                       (void*)templ); +                                                       CSO_DEPTH_STENCIL_ALPHA, +                                                       (void*)templ, key_size);     void *handle;     if (cso_hash_iter_is_null(iter)) { @@ -758,11 +760,11 @@ void cso_restore_depth_stencil_alpha(struct cso_context *ctx)  enum pipe_error cso_set_rasterizer(struct cso_context *ctx,                                     const struct pipe_rasterizer_state *templ)  { -   unsigned hash_key = cso_construct_key((void*)templ, -                                         sizeof(struct pipe_rasterizer_state)); +   unsigned key_size = sizeof(struct pipe_rasterizer_state); +   unsigned hash_key = cso_construct_key((void*)templ, key_size);     struct cso_hash_iter iter = cso_find_state_template(ctx->cache,                                                         hash_key, CSO_RASTERIZER, -                                                       (void*)templ); +                                                       (void*)templ, key_size);     void *handle = NULL;     if (cso_hash_iter_is_null(iter)) { @@ -844,7 +846,8 @@ enum pipe_error cso_set_fragment_shader(struct cso_context *ctx,     struct cso_hash_iter iter = cso_find_state_template(ctx->cache,                                                         hash_key,                                                          CSO_FRAGMENT_SHADER, -                                                       (void*)tokens); +                                                       (void*)tokens, +                                                       sizeof(*templ)); /* XXX correct? tokens_size? */     void *handle = NULL;     if (cso_hash_iter_is_null(iter)) { @@ -923,7 +926,8 @@ enum pipe_error cso_set_vertex_shader(struct cso_context *ctx,                                           sizeof(struct pipe_shader_state));     struct cso_hash_iter iter = cso_find_state_template(ctx->cache,                                                         hash_key, CSO_VERTEX_SHADER, -                                                       (void*)templ); +                                                       (void*)templ, +                                                       sizeof(*templ));     void *handle = NULL;     if (cso_hash_iter_is_null(iter)) { | 
