diff options
| -rw-r--r-- | src/mesa/pipe/cso_cache/cso_cache.c | 16 | ||||
| -rw-r--r-- | src/mesa/pipe/cso_cache/cso_cache.h | 6 | ||||
| -rw-r--r-- | src/mesa/pipe/i915simple/i915_state.c | 6 | ||||
| -rw-r--r-- | src/mesa/pipe/p_context.h | 11 | ||||
| -rw-r--r-- | src/mesa/pipe/softpipe/sp_context.c | 10 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_atom_fs.c | 2 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_atom_vs.c | 2 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cache.c | 26 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cache.h | 7 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_clear.c | 4 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_drawpixels.c | 4 | 
11 files changed, 67 insertions, 27 deletions
diff --git a/src/mesa/pipe/cso_cache/cso_cache.c b/src/mesa/pipe/cso_cache/cso_cache.c index be653d9494..e87733c7ab 100644 --- a/src/mesa/pipe/cso_cache/cso_cache.c +++ b/src/mesa/pipe/cso_cache/cso_cache.c @@ -80,8 +80,10 @@ static struct cso_hash *_cso_hash_for_type(struct cso_cache *sc, enum cso_cache_        hash = sc->depth_stencil_hash;     case CSO_RASTERIZER:        hash = sc->rasterizer_hash; -   case CSO_SHADER: -      hash = sc->shader_hash; +   case CSO_FRAGMENT_SHADER: +      hash = sc->fs_hash; +   case CSO_VERTEX_SHADER: +      hash = sc->vs_hash;     }     return hash; @@ -98,7 +100,9 @@ static int _cso_size_for_type(enum cso_cache_type type)        return sizeof(struct pipe_depth_stencil_state);     case CSO_RASTERIZER:        return sizeof(struct pipe_rasterizer_state); -   case CSO_SHADER: +   case CSO_FRAGMENT_SHADER: +      return sizeof(struct pipe_shader_state); +   case CSO_VERTEX_SHADER:        return sizeof(struct pipe_shader_state);     }     return 0; @@ -152,7 +156,8 @@ struct cso_cache *cso_cache_create(void)     sc->sampler_hash       = cso_hash_create();     sc->depth_stencil_hash = cso_hash_create();     sc->rasterizer_hash    = cso_hash_create(); -   sc->shader_hash        = cso_hash_create(); +   sc->fs_hash            = cso_hash_create(); +   sc->vs_hash            = cso_hash_create();     return sc;  } @@ -164,6 +169,7 @@ void cso_cache_delete(struct cso_cache *sc)     cso_hash_delete(sc->sampler_hash);     cso_hash_delete(sc->depth_stencil_hash);     cso_hash_delete(sc->rasterizer_hash); -   cso_hash_delete(sc->shader_hash); +   cso_hash_delete(sc->fs_hash); +   cso_hash_delete(sc->vs_hash);     free(sc);  } diff --git a/src/mesa/pipe/cso_cache/cso_cache.h b/src/mesa/pipe/cso_cache/cso_cache.h index d9793ca855..352e1a6a59 100644 --- a/src/mesa/pipe/cso_cache/cso_cache.h +++ b/src/mesa/pipe/cso_cache/cso_cache.h @@ -44,7 +44,8 @@ struct cso_cache {     struct cso_hash *sampler_hash;     struct cso_hash *depth_stencil_hash;     struct cso_hash *rasterizer_hash; -   struct cso_hash *shader_hash; +   struct cso_hash *fs_hash; +   struct cso_hash *vs_hash;  };  enum cso_cache_type { @@ -52,7 +53,8 @@ enum cso_cache_type {     CSO_SAMPLER,     CSO_DEPTH_STENCIL,     CSO_RASTERIZER, -   CSO_SHADER +   CSO_FRAGMENT_SHADER, +   CSO_VERTEX_SHADER  };  unsigned cso_construct_key(void *item, int item_size); diff --git a/src/mesa/pipe/i915simple/i915_state.c b/src/mesa/pipe/i915simple/i915_state.c index fe835643e0..aaf2ccf499 100644 --- a/src/mesa/pipe/i915simple/i915_state.c +++ b/src/mesa/pipe/i915simple/i915_state.c @@ -373,10 +373,12 @@ i915_init_state_functions( struct i915_context *i915 )     i915->pipe.create_rasterizer_state = i915_create_rasterizer_state;     i915->pipe.bind_rasterizer_state = i915_bind_rasterizer_state;     i915->pipe.delete_rasterizer_state = i915_delete_rasterizer_state; -   i915->pipe.create_shader_state = i915_create_shader_state; +   i915->pipe.create_fs_state = i915_create_shader_state;     i915->pipe.bind_fs_state = i915_bind_fs_state; +   i915->pipe.delete_fs_state = i915_delete_shader_state; +   i915->pipe.create_vs_state = i915_create_shader_state;     i915->pipe.bind_vs_state = i915_bind_vs_state; -   i915->pipe.delete_shader_state = i915_delete_shader_state; +   i915->pipe.delete_vs_state = i915_delete_shader_state;     i915->pipe.set_alpha_test_state = i915_set_alpha_test_state;     i915->pipe.set_blend_color = i915_set_blend_color; diff --git a/src/mesa/pipe/p_context.h b/src/mesa/pipe/p_context.h index c405051bce..5766b2b7df 100644 --- a/src/mesa/pipe/p_context.h +++ b/src/mesa/pipe/p_context.h @@ -117,15 +117,20 @@ struct pipe_context {     void (*delete_depth_stencil_state)(struct pipe_context *,                                        const struct pipe_depth_stencil_state *); -   const struct pipe_shader_state * (*create_shader_state)( +   const struct pipe_shader_state * (*create_fs_state)(        struct pipe_context *,        const struct pipe_shader_state *);     void (*bind_fs_state)(struct pipe_context *,                           const struct pipe_shader_state *); +   void (*delete_fs_state)(struct pipe_context *, +                           const struct pipe_shader_state *); +   const struct pipe_shader_state * (*create_vs_state)( +      struct pipe_context *, +      const struct pipe_shader_state *);     void (*bind_vs_state)(struct pipe_context *,                           const struct pipe_shader_state *); -   void (*delete_shader_state)(struct pipe_context *, -                               const struct pipe_shader_state *); +   void (*delete_vs_state)(struct pipe_context *, +                           const struct pipe_shader_state *);     void (*set_alpha_test_state)( struct pipe_context *,                                   const struct pipe_alpha_test_state * ); diff --git a/src/mesa/pipe/softpipe/sp_context.c b/src/mesa/pipe/softpipe/sp_context.c index 25cb9d8745..a56793d683 100644 --- a/src/mesa/pipe/softpipe/sp_context.c +++ b/src/mesa/pipe/softpipe/sp_context.c @@ -262,10 +262,12 @@ struct pipe_context *softpipe_create( struct pipe_winsys *pipe_winsys,     softpipe->pipe.create_rasterizer_state = softpipe_create_rasterizer_state;     softpipe->pipe.bind_rasterizer_state   = softpipe_bind_rasterizer_state;     softpipe->pipe.delete_rasterizer_state = softpipe_delete_rasterizer_state; -   softpipe->pipe.create_shader_state = softpipe_create_shader_state; -   softpipe->pipe.bind_fs_state       = softpipe_bind_fs_state; -   softpipe->pipe.bind_vs_state       = softpipe_bind_vs_state; -   softpipe->pipe.delete_shader_state = softpipe_delete_shader_state; +   softpipe->pipe.create_fs_state = softpipe_create_shader_state; +   softpipe->pipe.bind_fs_state   = softpipe_bind_fs_state; +   softpipe->pipe.delete_fs_state = softpipe_delete_shader_state; +   softpipe->pipe.create_vs_state = softpipe_create_shader_state; +   softpipe->pipe.bind_vs_state   = softpipe_bind_vs_state; +   softpipe->pipe.delete_vs_state = softpipe_delete_shader_state;     softpipe->pipe.set_alpha_test_state = softpipe_set_alpha_test_state;     softpipe->pipe.set_blend_color = softpipe_set_blend_color; diff --git a/src/mesa/state_tracker/st_atom_fs.c b/src/mesa/state_tracker/st_atom_fs.c index 3df2c6750a..6dd576a57c 100644 --- a/src/mesa/state_tracker/st_atom_fs.c +++ b/src/mesa/state_tracker/st_atom_fs.c @@ -77,7 +77,7 @@ static void compile_fs( struct st_context *st )     fs.outputs_written        = tgsi_mesa_translate_fragment_output_mask(fp->Base.Base.OutputsWritten);     fs.tokens = &fp->tokens[0]; -   cached = st_cached_shader_state(st, &fs); +   cached = st_cached_fs_state(st, &fs);     fp->fsx = cached;     if (TGSI_DEBUG) diff --git a/src/mesa/state_tracker/st_atom_vs.c b/src/mesa/state_tracker/st_atom_vs.c index 8de19e41ee..166dc70b08 100644 --- a/src/mesa/state_tracker/st_atom_vs.c +++ b/src/mesa/state_tracker/st_atom_vs.c @@ -104,7 +104,7 @@ static void compile_vs( struct st_context *st )     vs.tokens = &vp->tokens[0]; -   cached = st_cached_shader_state(st, &vs); +   cached = st_cached_vs_state(st, &vs);     vp->vs = cached; diff --git a/src/mesa/state_tracker/st_cache.c b/src/mesa/state_tracker/st_cache.c index 7b851e3901..d84a396e18 100644 --- a/src/mesa/state_tracker/st_cache.c +++ b/src/mesa/state_tracker/st_cache.c @@ -112,19 +112,37 @@ struct pipe_rasterizer_state * st_cached_rasterizer_state(     return (struct pipe_rasterizer_state*)(cso_hash_iter_data(iter));  } -struct pipe_shader_state * st_cached_shader_state( +struct pipe_shader_state * st_cached_fs_state(     struct st_context *st,     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(st->cache, -                                                       hash_key, CSO_SHADER, +                                                       hash_key, CSO_FRAGMENT_SHADER,                                                         (void*)templ);     if (cso_hash_iter_is_null(iter)) {        const struct pipe_shader_state *created_state = -         st->pipe->create_shader_state(st->pipe, templ); -      iter = cso_insert_state(st->cache, hash_key, CSO_SHADER, +         st->pipe->create_fs_state(st->pipe, templ); +      iter = cso_insert_state(st->cache, hash_key, CSO_FRAGMENT_SHADER, +                              (void*)created_state); +   } +   return (struct pipe_shader_state*)(cso_hash_iter_data(iter)); +} + +struct pipe_shader_state * st_cached_vs_state( +   struct st_context *st, +   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(st->cache, +                                                       hash_key, CSO_VERTEX_SHADER, +                                                       (void*)templ); +   if (cso_hash_iter_is_null(iter)) { +      const struct pipe_shader_state *created_state = +         st->pipe->create_vs_state(st->pipe, templ); +      iter = cso_insert_state(st->cache, hash_key, CSO_VERTEX_SHADER,                                (void*)created_state);     }     return (struct pipe_shader_state*)(cso_hash_iter_data(iter)); diff --git a/src/mesa/state_tracker/st_cache.h b/src/mesa/state_tracker/st_cache.h index 6a897a9993..bcbe19b823 100644 --- a/src/mesa/state_tracker/st_cache.h +++ b/src/mesa/state_tracker/st_cache.h @@ -53,7 +53,12 @@ struct pipe_rasterizer_state *st_cached_rasterizer_state(     struct st_context *st,     const struct pipe_rasterizer_state *raster); -struct pipe_shader_state *st_cached_shader_state( +struct pipe_shader_state *st_cached_fs_state( +   struct st_context *st, +   const struct pipe_shader_state *templ); + + +struct pipe_shader_state *st_cached_vs_state(     struct st_context *st,     const struct pipe_shader_state *templ); diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c index 65cac9dbde..7c669ab457 100644 --- a/src/mesa/state_tracker/st_cb_clear.c +++ b/src/mesa/state_tracker/st_cb_clear.c @@ -370,7 +370,7 @@ clear_with_quad(GLcontext *ctx,        fs.inputs_read = tgsi_mesa_translate_fragment_input_mask(stfp->Base.Base.InputsRead);        fs.outputs_written = tgsi_mesa_translate_fragment_output_mask(stfp->Base.Base.OutputsWritten);        fs.tokens = &stfp->tokens[0]; -      cached = st_cached_shader_state(st, &fs); +      cached = st_cached_fs_state(st, &fs);        pipe->bind_fs_state(pipe, cached);     } @@ -386,7 +386,7 @@ clear_with_quad(GLcontext *ctx,        vs.inputs_read = stvp->Base.Base.InputsRead;        vs.outputs_written = stvp->Base.Base.OutputsWritten;        vs.tokens = &stvp->tokens[0]; -      cached = st_cached_shader_state(st, &vs); +      cached = st_cached_vs_state(st, &vs);        pipe->bind_vs_state(pipe, cached);     } diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c index 731c060c11..67de781c83 100644 --- a/src/mesa/state_tracker/st_cb_drawpixels.c +++ b/src/mesa/state_tracker/st_cb_drawpixels.c @@ -347,7 +347,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,        memset(&fs, 0, sizeof(fs));        fs.inputs_read = stfp->Base.Base.InputsRead;        fs.tokens = &stfp->tokens[0]; -      cached = st_cached_shader_state(ctx->st, &fs); +      cached = st_cached_fs_state(ctx->st, &fs);        pipe->bind_fs_state(pipe, cached);     } @@ -363,7 +363,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,        vs.inputs_read = stvp->Base.Base.InputsRead;        vs.outputs_written = stvp->Base.Base.OutputsWritten;        vs.tokens = &stvp->tokens[0]; -      cached = st_cached_shader_state(ctx->st, &vs); +      cached = st_cached_vs_state(ctx->st, &vs);        pipe->bind_vs_state(pipe, cached);     }  | 
