Finish up conversions of shaders to immutable objects.
Create/Delete calls should be split since in create we'll be compiling them so we want to know which one it is (vertex/fragment).
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 * );
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user