implement deleting of driver side cached state in cso's
authorZack Rusin <zack@tungstengraphics.com>
Tue, 26 Feb 2008 03:03:58 +0000 (22:03 -0500)
committerZack Rusin <zack@tungstengraphics.com>
Tue, 26 Feb 2008 06:51:46 +0000 (01:51 -0500)
src/gallium/auxiliary/cso_cache/cso_cache.c
src/gallium/auxiliary/cso_cache/cso_cache.h
src/gallium/auxiliary/cso_cache/cso_hash.h
src/mesa/state_tracker/st_cache.c

index 9c32e94124c41591fd3929d24a99e67d3a6f63dc..9aa1a6427235bb8ef8d631ad202efb5466ca772b 100644 (file)
@@ -190,9 +190,96 @@ struct cso_cache *cso_cache_create(void)
    return sc;
 }
 
+void cso_for_each_state(struct cso_cache *sc, enum cso_cache_type type,
+                        void (*func)(void *state, void *user_data), void *user_data)
+{
+   struct cso_hash *hash = 0;
+   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;
+   }
+
+   iter = cso_hash_first_node(hash);
+   while (!cso_hash_iter_is_null(iter)) {
+      void *state = cso_hash_iter_data(iter);
+      if (state) {
+         func(state, user_data);
+      }
+      iter = cso_hash_iter_next(iter);
+   }
+}
+
+static void delete_blend_state(void *state, void *user_data)
+{
+   struct cso_blend *cso = (struct cso_blend *)state;
+   if (cso->delete_state && cso->data != &cso->state)
+      cso->delete_state(cso->context, cso->data);
+}
+
+static void delete_depth_stencil_state(void *state, void *pipe)
+{
+   struct cso_depth_stencil_alpha *cso = (struct cso_depth_stencil_alpha *)state;
+   if (cso->delete_state && cso->data != &cso->state)
+      cso->delete_state(cso->context, cso->data);
+}
+
+static void delete_sampler_state(void *state, void *pipe)
+{
+   struct cso_sampler *cso = (struct cso_sampler *)state;
+   if (cso->delete_state && cso->data != &cso->state)
+      cso->delete_state(cso->context, cso->data);
+}
+
+static void delete_rasterizer_state(void *state, void *pipe)
+{
+   struct cso_rasterizer *cso = (struct cso_rasterizer *)state;
+   if (cso->delete_state && cso->data != &cso->state)
+      cso->delete_state(cso->context, cso->data);
+}
+
+static void delete_fs_state(void *state, void *pipe)
+{
+   struct cso_fragment_shader *cso = (struct cso_fragment_shader *)state;
+   if (cso->delete_state && cso->data != &cso->state)
+      cso->delete_state(cso->context, cso->data);
+}
+
+static void delete_vs_state(void *state, void *pipe)
+{
+   struct cso_vertex_shader *cso = (struct cso_vertex_shader *)state;
+   if (cso->delete_state && cso->data != &cso->state)
+      cso->delete_state(cso->context, cso->data);
+}
+
 void cso_cache_delete(struct cso_cache *sc)
 {
    assert(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_hash_delete(sc->blend_hash);
    cso_hash_delete(sc->sampler_hash);
    cso_hash_delete(sc->depth_stencil_hash);
@@ -201,3 +288,4 @@ void cso_cache_delete(struct cso_cache *sc)
    cso_hash_delete(sc->vs_hash);
    FREE(sc);
 }
+
index 3a005a376e5f8e03ecbe6185e3433021e0e90e9f..f3bd4623c9390f71f4cabe45c766355ceeaad9f2 100644 (file)
@@ -97,31 +97,43 @@ struct cso_cache {
 struct cso_blend {
    struct pipe_blend_state state;
    void   *data;
+   void   (*delete_state)(void *, void  *);
+   void   *context;
 };
 
 struct cso_depth_stencil_alpha {
    struct pipe_depth_stencil_alpha_state state;
    void *data;
+   void   (*delete_state)(void *, void  *);
+   void   *context;
 };
 
 struct cso_rasterizer {
    struct pipe_rasterizer_state state;
    void *data;
+   void   (*delete_state)(void *, void  *);
+   void   *context;
 };
 
 struct cso_fragment_shader {
    struct pipe_shader_state state;
    void *data;
+   void   (*delete_state)(void *, void  *);
+   void   *context;
 };
 
 struct cso_vertex_shader {
    struct pipe_shader_state state;
    void *data;
+   void   (*delete_state)(void *, void  *);
+   void   *context;
 };
 
 struct cso_sampler {
    struct pipe_sampler_state state;
    void *data;
+   void   (*delete_state)(void *, void  *);
+   void   *context;
 };
 
 
@@ -147,6 +159,8 @@ struct cso_hash_iter cso_find_state(struct cso_cache *sc,
 struct cso_hash_iter cso_find_state_template(struct cso_cache *sc,
                                              unsigned hash_key, enum cso_cache_type type,
                                              void *templ);
+void cso_for_each_state(struct cso_cache *sc, enum cso_cache_type type,
+                        void (*func)(void *state, void *user_data), void *user_data);
 void * cso_take_state(struct cso_cache *sc, unsigned hash_key,
                       enum cso_cache_type type);
 
index 2e8b69675cb158887ab50181819c82b734df4183..86c62c027a0d275cc12ef984d995bbdd81dc2d90 100644 (file)
@@ -38,7 +38,6 @@
 extern "C" {
 #endif
 
-   
 struct cso_hash;
 struct cso_node;
 
index 2979e7fae540d1bb74899dfcbb8acd9588d81ed5..78f282302eb02e95759f0ebdd2ff5b26c9635802 100644 (file)
@@ -63,6 +63,8 @@ const struct cso_blend * st_cached_blend_state(struct st_context *st,
       cso->data = st->pipe->create_blend_state(st->pipe, &cso->state);
       if (!cso->data)
          cso->data = &cso->state;
+      cso->delete_state = st->pipe->delete_blend_state;
+      cso->context = st->pipe;
       iter = cso_insert_state(st->cache, hash_key, CSO_BLEND, cso);
    }
    return ((struct cso_blend *)cso_hash_iter_data(iter));
@@ -82,6 +84,8 @@ st_cached_sampler_state(struct st_context *st,
       cso->data = st->pipe->create_sampler_state(st->pipe, &cso->state);
       if (!cso->data)
          cso->data = &cso->state;
+      cso->delete_state = st->pipe->delete_sampler_state;
+      cso->context = st->pipe;
       iter = cso_insert_state(st->cache, hash_key, CSO_SAMPLER, cso);
    }
    return (struct cso_sampler*)(cso_hash_iter_data(iter));
@@ -103,6 +107,8 @@ st_cached_depth_stencil_alpha_state(struct st_context *st,
       cso->data = st->pipe->create_depth_stencil_alpha_state(st->pipe, &cso->state);
       if (!cso->data)
          cso->data = &cso->state;
+      cso->delete_state = st->pipe->delete_depth_stencil_alpha_state;
+      cso->context = st->pipe;
       iter = cso_insert_state(st->cache, hash_key, CSO_DEPTH_STENCIL_ALPHA, cso);
    }
    return (struct cso_depth_stencil_alpha*)(cso_hash_iter_data(iter));
@@ -123,6 +129,8 @@ const struct cso_rasterizer* st_cached_rasterizer_state(
       cso->data = st->pipe->create_rasterizer_state(st->pipe, &cso->state);
       if (!cso->data)
          cso->data = &cso->state;
+      cso->delete_state = st->pipe->delete_rasterizer_state;
+      cso->context = st->pipe;
       iter = cso_insert_state(st->cache, hash_key, CSO_RASTERIZER, cso);
    }
    return (struct cso_rasterizer*)(cso_hash_iter_data(iter));
@@ -143,6 +151,8 @@ st_cached_fs_state(struct st_context *st,
       cso->data = st->pipe->create_fs_state(st->pipe, &cso->state);
       if (!cso->data)
          cso->data = &cso->state;
+      cso->delete_state = st->pipe->delete_fs_state;
+      cso->context = st->pipe;
       iter = cso_insert_state(st->cache, hash_key, CSO_FRAGMENT_SHADER, cso);
    }
    return (struct cso_fragment_shader*)(cso_hash_iter_data(iter));
@@ -163,8 +173,9 @@ st_cached_vs_state(struct st_context *st,
       cso->data = st->pipe->create_vs_state(st->pipe, &cso->state);
       if (!cso->data)
          cso->data = &cso->state;
+      cso->delete_state = st->pipe->delete_vs_state;
+      cso->context = st->pipe;
       iter = cso_insert_state(st->cache, hash_key, CSO_VERTEX_SHADER, cso);
    }
    return (struct cso_vertex_shader*)(cso_hash_iter_data(iter));
 }
-