Fix failover state binding and convert the sampler to use the new
authorZack Rusin <zack@tungstengraphics.com>
Thu, 20 Sep 2007 14:07:10 +0000 (10:07 -0400)
committerZack Rusin <zack@tungstengraphics.com>
Thu, 20 Sep 2007 14:07:10 +0000 (10:07 -0400)
state constant state object semantics.

13 files changed:
src/mesa/pipe/cso_cache/cso_cache.h
src/mesa/pipe/failover/fo_context.h
src/mesa/pipe/failover/fo_state.c
src/mesa/pipe/failover/fo_state_emit.c
src/mesa/pipe/i915simple/i915_state.c
src/mesa/pipe/p_context.h
src/mesa/pipe/softpipe/sp_state.h
src/mesa/pipe/softpipe/sp_state_sampler.c
src/mesa/state_tracker/st_atom_sampler.c
src/mesa/state_tracker/st_cache.c
src/mesa/state_tracker/st_cache.h
src/mesa/state_tracker/st_cb_drawpixels.c
src/mesa/state_tracker/st_context.h

index 291759d5d1e6c48d4d050039b805a5b0e2bc7156..2acb58c66b66073720b7b9bc7e30448cca752c35 100644 (file)
@@ -73,6 +73,11 @@ struct cso_vertex_shader {
    void *data;
 };
 
+struct cso_sampler {
+   struct pipe_sampler_state state;
+   void *data;
+};
+
 enum cso_cache_type {
    CSO_BLEND,
    CSO_SAMPLER,
index 7371ad4392b8f7724c48d073aeac1771b3cbaa4a..8a2fbe2be9b1e86c723029252e158572ee095b92 100644 (file)
@@ -70,12 +70,12 @@ struct failover_context {
 
    /* The most recent drawing state as set by the driver:
     */
-   const struct fo_state                 *blend;
-   const struct pipe_sampler_state       *sampler[PIPE_MAX_SAMPLERS];
-   const struct fo_state                 *depth_stencil;
-   const struct fo_state                 *rasterizer;
-   const struct fo_state                 *fragment_shader;
-   const struct fo_state                 *vertex_shader;
+   const struct fo_state     *blend;
+   const struct fo_state     *sampler[PIPE_MAX_SAMPLERS];
+   const struct fo_state     *depth_stencil;
+   const struct fo_state     *rasterizer;
+   const struct fo_state     *fragment_shader;
+   const struct fo_state     *vertex_shader;
 
    struct pipe_alpha_test_state alpha_test;
    struct pipe_blend_color blend_color;
index 3379f4535574baf0029f1dd722a1debcf064a120..ce3f0ca63582612240aaa626c5bfa9f423b12a07 100644 (file)
@@ -75,10 +75,10 @@ failover_bind_blend_state( struct pipe_context *pipe,
                            void *blend )
 {
    struct failover_context *failover = failover_context(pipe);
-
-   failover->blend = (struct fo_state *)blend;
+   struct fo_state *state = (struct fo_state *)blend;
+   failover->blend = state;
    failover->dirty |= FO_NEW_BLEND;
-   failover->hw->bind_blend_state( failover->hw, blend );
+   failover->hw->bind_blend_state( failover->hw, state->hw_state );
 }
 
 static void
@@ -146,10 +146,10 @@ failover_bind_depth_stencil_state(struct pipe_context *pipe,
                                   void *depth_stencil)
 {
    struct failover_context *failover = failover_context(pipe);
-
-   failover->depth_stencil = (struct fo_state *)depth_stencil;
+   struct fo_state *state = (struct fo_state *)depth_stencil;
+   failover->depth_stencil = state;
    failover->dirty |= FO_NEW_DEPTH_STENCIL;
-   failover->hw->bind_depth_stencil_state( failover->hw, depth_stencil );
+   failover->hw->bind_depth_stencil_state(failover->hw, state->hw_state);
 }
 
 static void
@@ -192,14 +192,13 @@ failover_create_fs_state(struct pipe_context *pipe,
 }
 
 static void
-failover_bind_fs_state(struct pipe_context *pipe,
-                       void *fs)
+failover_bind_fs_state(struct pipe_context *pipe, void *fs)
 {
    struct failover_context *failover = failover_context(pipe);
-
-   failover->fragment_shader = (struct fo_state *)fs;
+   struct fo_state *state = (struct fo_state*)fs;
+   failover->fragment_shader = state;
    failover->dirty |= FO_NEW_FRAGMENT_SHADER;
-   failover->hw->bind_fs_state(failover->hw, (struct pipe_shader_state *)fs);
+   failover->hw->bind_fs_state(failover->hw, state->hw_state);
 }
 
 static void
@@ -235,9 +234,10 @@ failover_bind_vs_state(struct pipe_context *pipe,
 {
    struct failover_context *failover = failover_context(pipe);
 
-   failover->vertex_shader = (struct fo_state*)vs;
+   struct fo_state *state = (struct fo_state*)vs;
+   failover->vertex_shader = state;
    failover->dirty |= FO_NEW_VERTEX_SHADER;
-   failover->hw->bind_vs_state(failover->hw, vs);
+   failover->hw->bind_vs_state(failover->hw, state->hw_state);
 }
 
 static void
@@ -284,9 +284,10 @@ failover_bind_rasterizer_state(struct pipe_context *pipe,
 {
    struct failover_context *failover = failover_context(pipe);
 
-   failover->rasterizer = (struct fo_state *)raster;
+   struct fo_state *state = (struct fo_state*)raster;
+   failover->rasterizer = state;
    failover->dirty |= FO_NEW_RASTERIZER;
-   failover->hw->bind_rasterizer_state( failover->hw, raster );
+   failover->hw->bind_rasterizer_state(failover->hw, state->hw_state);
 }
 
 static void
@@ -315,17 +316,44 @@ failover_set_scissor_state( struct pipe_context *pipe,
    failover->hw->set_scissor_state( failover->hw, scissor );
 }
 
+
+static void *
+failover_create_sampler_state(struct pipe_context *pipe,
+                              const struct pipe_sampler_state *templ)
+{
+   struct fo_state *state = malloc(sizeof(struct fo_state));
+   struct failover_context *failover = failover_context(pipe);
+
+   state->sw_state = failover->sw->create_sampler_state(pipe, templ);
+   state->hw_state = failover->hw->create_sampler_state(pipe, templ);
+
+   return state;
+}
+
 static void
 failover_bind_sampler_state(struct pipe_context *pipe,
-                          unsigned unit,
-                           const struct pipe_sampler_state *sampler)
+                          unsigned unit, void *sampler)
 {
    struct failover_context *failover = failover_context(pipe);
-
-   failover->sampler[unit] = sampler;
+   struct fo_state *state = (struct fo_state*)sampler;
+   failover->sampler[unit] = state;
    failover->dirty |= FO_NEW_SAMPLER;
    failover->dirty_sampler |= (1<<unit);
-   failover->hw->bind_sampler_state( failover->hw, unit, sampler );
+   failover->hw->bind_sampler_state(failover->hw, unit,
+                                    state->hw_state);
+}
+
+static void
+failover_delete_sampler_state(struct pipe_context *pipe, void *sampler)
+{
+   struct fo_state *state = (struct fo_state*)sampler;
+   struct failover_context *failover = failover_context(pipe);
+
+   failover->sw->delete_sampler_state(pipe, state->sw_state);
+   failover->hw->delete_sampler_state(pipe, state->hw_state);
+   state->sw_state = 0;
+   state->hw_state = 0;
+   free(state);
 }
 
 
@@ -389,7 +417,9 @@ failover_init_state_functions( struct failover_context *failover )
    failover->pipe.create_blend_state = failover_create_blend_state;
    failover->pipe.bind_blend_state = failover_bind_blend_state;
    failover->pipe.delete_blend_state = failover_delete_blend_state;
-   failover->pipe.bind_sampler_state = failover_bind_sampler_state;
+   failover->pipe.create_sampler_state = failover_create_sampler_state;
+   failover->pipe.bind_sampler_state   = failover_bind_sampler_state;
+   failover->pipe.delete_sampler_state = failover_delete_sampler_state;
    failover->pipe.create_depth_stencil_state = failover_create_depth_stencil_state;
    failover->pipe.bind_depth_stencil_state   = failover_bind_depth_stencil_state;
    failover->pipe.delete_depth_stencil_state = failover_delete_depth_stencil_state;
index da12b4e25ce58e388140e12235f4a0d76dcc2e5c..c0ea6810246fee1f7a6a25ea3c19ab2b898c251d 100644 (file)
@@ -103,7 +103,7 @@ failover_state_emit( struct failover_context *failover )
       for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
         if (failover->dirty_sampler & (1<<i)) {
            failover->sw->bind_sampler_state( failover->sw, i,
-                                              failover->sampler[i] );
+                                              failover->sampler[i]->sw_state );
         }
       }
    }
index be549ed6fdb551edcfbf9a70e75a39fc608d27d9..0fb41e17ab319c7ed7ac62cd8180545baf508b68 100644 (file)
@@ -142,32 +142,27 @@ static void i915_set_blend_color( struct pipe_context *pipe,
    i915->dirty |= I915_NEW_BLEND;
 }
 
-static const struct pipe_sampler_state *
+static void *
 i915_create_sampler_state(struct pipe_context *pipe,
                           const struct pipe_sampler_state *sampler)
 {
-   struct pipe_sampler_state *new_sampler = malloc(sizeof(struct pipe_sampler_state));
-   memcpy(new_sampler, sampler, sizeof(struct pipe_sampler_state));
-
-   return new_sampler;
+   return 0;
 }
 
 static void i915_bind_sampler_state(struct pipe_context *pipe,
-                                    unsigned unit,
-                                    const struct pipe_sampler_state *sampler)
+                                    unsigned unit, void *sampler)
 {
    struct i915_context *i915 = i915_context(pipe);
 
    assert(unit < PIPE_MAX_SAMPLERS);
-   i915->sampler[unit] = sampler;
+   i915->sampler[unit] = (const struct pipe_sampler_state *)sampler;
 
    i915->dirty |= I915_NEW_SAMPLER;
 }
 
 static void i915_delete_sampler_state(struct pipe_context *pipe,
-                                      const struct pipe_sampler_state *sampler)
+                                      void *sampler)
 {
-   free((struct pipe_sampler_state*)sampler);
 }
 
 
index 84aca20c58afd80247477c2ef33628931b8875a1..07ee01988077eeceb228f98c2347113de4605a06 100644 (file)
@@ -91,14 +91,11 @@ struct pipe_context {
    void (*bind_blend_state)(struct pipe_context *, void *);
    void (*delete_blend_state)(struct pipe_context *, void  *);
 
-   const struct pipe_sampler_state * (*create_sampler_state)(
-      struct pipe_context *,
-      const struct pipe_sampler_state *);
-   void (*bind_sampler_state)(struct pipe_context *,
-                              unsigned unit,
-                              const struct pipe_sampler_state *);
-   void (*delete_sampler_state)(struct pipe_context *,
-                                const struct pipe_sampler_state *);
+   void * (*create_sampler_state)(struct pipe_context *,
+                                  const struct pipe_sampler_state *);
+   void (*bind_sampler_state)(struct pipe_context *, unsigned unit,
+                              void *);
+   void (*delete_sampler_state)(struct pipe_context *, void *);
 
    void *(*create_rasterizer_state)(struct pipe_context *,
                                     const struct pipe_rasterizer_state *);
index 08dfe208fbd1b04ca9bad70063e6e254e753f926..62323c41c3b7dc3b92ed74036ee63c480b37a143 100644 (file)
@@ -41,14 +41,11 @@ void softpipe_bind_blend_state(struct pipe_context *,
 void softpipe_delete_blend_state(struct pipe_context *,
                                  void *);
 
-const struct pipe_sampler_state *
+void *
 softpipe_create_sampler_state(struct pipe_context *,
                               const struct pipe_sampler_state *);
-void softpipe_bind_sampler_state(struct pipe_context *,
-                                 unsigned,
-                                 const struct pipe_sampler_state *);
-void softpipe_delete_sampler_state(struct pipe_context *,
-                                   const struct pipe_sampler_state *);
+void softpipe_bind_sampler_state(struct pipe_context *, unsigned, void *);
+void softpipe_delete_sampler_state(struct pipe_context *, void *);
 
 void *
 softpipe_create_depth_stencil_state(struct pipe_context *,
index 09898eb579075bdfefb3889b9a61bfe9c52d3bca..ad98375735b54c8bc686afa3375ddd36f51522ac 100644 (file)
 #include "sp_context.h"
 #include "sp_state.h"
 
-
-
-const struct pipe_sampler_state *
+void *
 softpipe_create_sampler_state(struct pipe_context *pipe,
                               const struct pipe_sampler_state *sampler)
 {
-   struct pipe_sampler_state *new_sampler = malloc(sizeof(struct pipe_sampler_state));
-   memcpy(new_sampler, sampler, sizeof(struct pipe_sampler_state));
-
-   return new_sampler;
+   return 0;
 }
 
 void
 softpipe_bind_sampler_state(struct pipe_context *pipe,
-                            unsigned unit,
-                            const struct pipe_sampler_state *sampler)
+                            unsigned unit, void *sampler)
 {
    struct softpipe_context *softpipe = softpipe_context(pipe);
 
    assert(unit < PIPE_MAX_SAMPLERS);
-   softpipe->sampler[unit] = sampler;
+   softpipe->sampler[unit] = (struct pipe_sampler_state *)sampler;
 
    softpipe->dirty |= SP_NEW_SAMPLER;
 }
@@ -60,9 +54,9 @@ softpipe_bind_sampler_state(struct pipe_context *pipe,
 
 void
 softpipe_delete_sampler_state(struct pipe_context *pipe,
-                              const struct pipe_sampler_state *sampler)
+                              void *sampler)
 {
-   free((struct pipe_sampler_state*)sampler);
+   /* do nothing */
 }
 
 
index 994d3691d8b2bc592428b307ba18ec41db3294ed..23ccd55a057f88d85b08f4740d7e49108092881c 100644 (file)
@@ -123,6 +123,7 @@ update_samplers(struct st_context *st)
       const struct gl_texture_object *texobj
          = st->ctx->Texture.Unit[u]._Current;
       struct pipe_sampler_state sampler;
+      const struct cso_sampler *cso;
 
       memset(&sampler, 0, sizeof(sampler));
 
@@ -143,13 +144,12 @@ update_samplers(struct st_context *st)
          /* XXX more sampler state here */
       }
 
-      const struct pipe_sampler_state *cached_sampler =
-         st_cached_sampler_state(st, &sampler);
+      cso = st_cached_sampler_state(st, &sampler);
 
-      if (cached_sampler != st->state.sampler[u]) {
+      if (cso != st->state.sampler[u]) {
          /* state has changed */
-         st->state.sampler[u] = cached_sampler;
-         st->pipe->bind_sampler_state(st->pipe, u, cached_sampler);
+         st->state.sampler[u] = cso;
+         st->pipe->bind_sampler_state(st->pipe, u, cso->data);
       }
    }
 }
index c1ec130b32190d3992051438e011ba4e16315815..007a2311e98d7c0af827d65d2bc606cfe381635b 100644 (file)
@@ -61,21 +61,23 @@ const struct cso_blend * st_cached_blend_state(struct st_context *st,
    return ((struct cso_blend *)cso_hash_iter_data(iter));
 }
 
-struct pipe_sampler_state * st_cached_sampler_state(
-   struct st_context *st,
-   const struct pipe_sampler_state *sampler)
+const struct cso_sampler *
+st_cached_sampler_state(struct st_context *st,
+                        const struct pipe_sampler_state *templ)
 {
-   unsigned hash_key = cso_construct_key((void*)sampler, sizeof(struct pipe_sampler_state));
+   unsigned hash_key = cso_construct_key((void*)templ, sizeof(struct pipe_sampler_state));
    struct cso_hash_iter iter = cso_find_state_template(st->cache,
                                                        hash_key, CSO_SAMPLER,
-                                                       (void*)sampler);
+                                                       (void*)templ);
    if (cso_hash_iter_is_null(iter)) {
-      const struct pipe_sampler_state *created_state = st->pipe->create_sampler_state(
-         st->pipe, sampler);
-      iter = cso_insert_state(st->cache, hash_key, CSO_SAMPLER,
-                              (void*)created_state);
+      struct cso_sampler *cso = malloc(sizeof(struct cso_sampler));
+      memcpy(&cso->state, templ, sizeof(struct pipe_sampler_state));
+      cso->data = st->pipe->create_sampler_state(st->pipe, templ);
+      if (!cso->data)
+         cso->data = &cso->state;
+      iter = cso_insert_state(st->cache, hash_key, CSO_SAMPLER, cso);
    }
-   return (struct pipe_sampler_state*)(cso_hash_iter_data(iter));
+   return (struct cso_sampler*)(cso_hash_iter_data(iter));
 }
 
 const struct cso_depth_stencil *
index 167d9ec11a7ea0bb9b577785b5e7b76d1e36abec..483af6fdb43fdeaf3cc7cfce414038cf2f7a8cb6 100644 (file)
@@ -43,7 +43,7 @@ const struct cso_blend *
 st_cached_blend_state(struct st_context *st,
                       const struct pipe_blend_state *blend);
 
-struct pipe_sampler_state *
+const struct cso_sampler *
 st_cached_sampler_state(struct st_context *st,
                         const struct pipe_sampler_state *sampler);
 
index 95810b7baf12e5fc968c17dad2a6ccc62e424c95..d814e34157552971a83fa460721e86420fbba7fa 100644 (file)
@@ -345,6 +345,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
    /* texture sampling state: */
    {
       struct pipe_sampler_state sampler;
+      const struct cso_sampler *cso;
       memset(&sampler, 0, sizeof(sampler));
       sampler.wrap_s = PIPE_TEX_WRAP_REPEAT;
       sampler.wrap_t = PIPE_TEX_WRAP_REPEAT;
@@ -352,8 +353,8 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
       sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
       sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
       sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
-      const struct pipe_sampler_state *state = st_cached_sampler_state(ctx->st, &sampler);
-      pipe->bind_sampler_state(pipe, unit, state);
+      cso = st_cached_sampler_state(ctx->st, &sampler);
+      pipe->bind_sampler_state(pipe, unit, cso->data);
    }
 
    /* viewport state: viewport matching window dims */
@@ -396,7 +397,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
    pipe->bind_fs_state(pipe, ctx->st->state.fs->data);
    pipe->bind_vs_state(pipe, ctx->st->state.vs->data);
    pipe->set_texture_state(pipe, unit, ctx->st->state.texture[unit]);
-   pipe->bind_sampler_state(pipe, unit, ctx->st->state.sampler[unit]);
+   pipe->bind_sampler_state(pipe, unit, ctx->st->state.sampler[unit]->data);
    pipe->set_viewport_state(pipe, &ctx->st->state.viewport);
 
    free_mipmap_tree(pipe, mt);
index b82cf242731a1f7f360fa9cadaf68a35fa5cb2f2..8a57227c84f968ec7b214aeec47ba84c947ecdcf 100644 (file)
@@ -76,7 +76,7 @@ struct st_context
     */
    struct {
       const struct cso_blend *blend;
-      const struct pipe_sampler_state *sampler[PIPE_MAX_SAMPLERS];
+      const struct cso_sampler *sampler[PIPE_MAX_SAMPLERS];
       const struct cso_depth_stencil *depth_stencil;
       const struct cso_rasterizer  *rasterizer;
       const struct cso_fragment_shader *fs;