summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_atom_fs.c12
-rw-r--r--src/mesa/state_tracker/st_atom_vs.c18
-rw-r--r--src/mesa/state_tracker/st_cache.c36
-rw-r--r--src/mesa/state_tracker/st_cache.h12
-rw-r--r--src/mesa/state_tracker/st_cb_clear.c8
-rw-r--r--src/mesa/state_tracker/st_cb_drawpixels.c8
-rw-r--r--src/mesa/state_tracker/st_cb_rasterpos.c3
-rw-r--r--src/mesa/state_tracker/st_context.h4
-rw-r--r--src/mesa/state_tracker/st_draw.c6
-rw-r--r--src/mesa/state_tracker/st_program.h10
10 files changed, 62 insertions, 55 deletions
diff --git a/src/mesa/state_tracker/st_atom_fs.c b/src/mesa/state_tracker/st_atom_fs.c
index 94b69c8..91e58f5 100644
--- a/src/mesa/state_tracker/st_atom_fs.c
+++ b/src/mesa/state_tracker/st_atom_fs.c
@@ -51,14 +51,14 @@
* Translate a Mesa fragment shader into a TGSI shader.
* \return pointer to cached pipe_shader object.
*/
-struct pipe_shader_state *
+const struct cso_fragment_shader *
st_translate_fragment_shader(struct st_context *st,
struct st_fragment_program *stfp)
{
GLuint outputMapping[FRAG_RESULT_MAX];
GLuint inputMapping[PIPE_MAX_SHADER_INPUTS];
struct pipe_shader_state fs;
- struct pipe_shader_state *cached;
+ const struct cso_fragment_shader *cso;
GLuint interpMode[16]; /* XXX size? */
GLuint i;
GLbitfield inputsRead = stfp->Base.Base.InputsRead;
@@ -142,15 +142,15 @@ st_translate_fragment_shader(struct st_context *st,
fs.tokens = &stfp->tokens[0];
- cached = st_cached_fs_state(st, &fs);
- stfp->fs = cached;
+ cso = st_cached_fs_state(st, &fs);
+ stfp->fs = cso;
if (TGSI_DEBUG)
tgsi_dump( stfp->tokens, 0/*TGSI_DUMP_VERBOSE*/ );
stfp->dirty = 0;
- return cached;
+ return cso;
}
@@ -183,7 +183,7 @@ static void update_fs( struct st_context *st )
if (stfp->dirty)
st->state.fs = st_translate_fragment_shader( st, st->fp );
- st->pipe->bind_fs_state(st->pipe, st->state.fs);
+ st->pipe->bind_fs_state(st->pipe, st->state.fs->data);
}
}
diff --git a/src/mesa/state_tracker/st_atom_vs.c b/src/mesa/state_tracker/st_atom_vs.c
index cf9dd81..078c052 100644
--- a/src/mesa/state_tracker/st_atom_vs.c
+++ b/src/mesa/state_tracker/st_atom_vs.c
@@ -53,13 +53,13 @@
* Translate a Mesa vertex shader into a TGSI shader.
* \return pointer to cached pipe_shader object.
*/
-struct pipe_shader_state *
+const struct cso_vertex_shader *
st_translate_vertex_shader(struct st_context *st,
struct st_vertex_program *stvp)
{
GLuint outputMapping[PIPE_MAX_SHADER_INPUTS];
struct pipe_shader_state vs;
- struct pipe_shader_state *cached;
+ const struct cso_vertex_shader *cso;
GLuint i;
memset(&vs, 0, sizeof(vs));
@@ -147,8 +147,8 @@ st_translate_vertex_shader(struct st_context *st,
vs.tokens = &stvp->tokens[0];
- cached = st_cached_vs_state(st, &vs);
- stvp->vs = cached;
+ cso = st_cached_vs_state(st, &vs);
+ stvp->vs = cso;
if (TGSI_DEBUG)
tgsi_dump( stvp->tokens, 0 );
@@ -157,13 +157,13 @@ st_translate_vertex_shader(struct st_context *st,
if (stvp->sse2_program.csr == stvp->sse2_program.store)
tgsi_emit_sse2( stvp->tokens, &stvp->sse2_program );
- if (!cached->executable)
- cached->executable = (void *) x86_get_func( &stvp->sse2_program );
+ if (!cso->state.executable)
+ cso->state.executable = (void *) x86_get_func( &stvp->sse2_program );
#endif
stvp->dirty = 0;
- return cached;
+ return cso;
}
@@ -191,10 +191,10 @@ static void update_vs( struct st_context *st )
/* Bind the vertex program */
st->vp = stvp;
- if (stvp->dirty)
+ if (stvp->dirty)
st->state.vs = st_translate_vertex_shader( st, st->vp );
- st->pipe->bind_vs_state(st->pipe, st->state.vs);
+ st->pipe->bind_vs_state(st->pipe, st->state.vs->data);
}
}
diff --git a/src/mesa/state_tracker/st_cache.c b/src/mesa/state_tracker/st_cache.c
index 0f233ce..e5ba059 100644
--- a/src/mesa/state_tracker/st_cache.c
+++ b/src/mesa/state_tracker/st_cache.c
@@ -115,9 +115,9 @@ const struct cso_rasterizer* st_cached_rasterizer_state(
return (struct cso_rasterizer*)(cso_hash_iter_data(iter));
}
-struct pipe_shader_state * st_cached_fs_state(
- struct st_context *st,
- const struct pipe_shader_state *templ)
+const struct cso_fragment_shader *
+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));
@@ -125,17 +125,19 @@ struct pipe_shader_state * st_cached_fs_state(
hash_key, CSO_FRAGMENT_SHADER,
(void*)templ);
if (cso_hash_iter_is_null(iter)) {
- const struct pipe_shader_state *created_state =
- st->pipe->create_fs_state(st->pipe, templ);
- iter = cso_insert_state(st->cache, hash_key, CSO_FRAGMENT_SHADER,
- (void*)created_state);
+ struct cso_fragment_shader *cso = malloc(sizeof(struct cso_fragment_shader));
+ memcpy(&cso->state, templ, sizeof(struct pipe_shader_state));
+ cso->data = st->pipe->create_fs_state(st->pipe, templ);
+ if (!cso->data)
+ cso->data = &cso->state;
+ iter = cso_insert_state(st->cache, hash_key, CSO_FRAGMENT_SHADER, cso);
}
- return (struct pipe_shader_state*)(cso_hash_iter_data(iter));
+ return (struct cso_fragment_shader*)(cso_hash_iter_data(iter));
}
-struct pipe_shader_state * st_cached_vs_state(
- struct st_context *st,
- const struct pipe_shader_state *templ)
+const struct cso_vertex_shader *
+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));
@@ -143,10 +145,12 @@ struct pipe_shader_state * st_cached_vs_state(
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);
+ struct cso_vertex_shader *cso = malloc(sizeof(struct cso_vertex_shader));
+ memcpy(&cso->state, templ, sizeof(struct pipe_shader_state));
+ cso->data = st->pipe->create_vs_state(st->pipe, templ);
+ if (!cso->data)
+ cso->data = &cso->state;
+ iter = cso_insert_state(st->cache, hash_key, CSO_VERTEX_SHADER, cso);
}
- return (struct pipe_shader_state*)(cso_hash_iter_data(iter));
+ return (struct cso_vertex_shader*)(cso_hash_iter_data(iter));
}
diff --git a/src/mesa/state_tracker/st_cache.h b/src/mesa/state_tracker/st_cache.h
index 5b8c616..356dd98 100644
--- a/src/mesa/state_tracker/st_cache.h
+++ b/src/mesa/state_tracker/st_cache.h
@@ -55,13 +55,13 @@ const struct cso_rasterizer *
st_cached_rasterizer_state(struct st_context *st,
const struct pipe_rasterizer_state *raster);
-struct pipe_shader_state *st_cached_fs_state(
- struct st_context *st,
- const struct pipe_shader_state *templ);
+const struct cso_fragment_shader *
+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);
+const struct cso_vertex_shader *
+st_cached_vs_state(struct st_context *st,
+ const struct pipe_shader_state *templ);
#endif
diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
index ee70ce3..03a8165 100644
--- a/src/mesa/state_tracker/st_cb_clear.c
+++ b/src/mesa/state_tracker/st_cb_clear.c
@@ -348,7 +348,7 @@ clear_with_quad(GLcontext *ctx,
if (!stfp) {
stfp = make_frag_shader(st);
}
- pipe->bind_fs_state(pipe, stfp->fs);
+ pipe->bind_fs_state(pipe, stfp->fs->data);
}
/* vertex shader state: color/position pass-through */
@@ -357,7 +357,7 @@ clear_with_quad(GLcontext *ctx,
if (!stvp) {
stvp = make_vertex_shader(st);
}
- pipe->bind_vs_state(pipe, stvp->vs);
+ pipe->bind_vs_state(pipe, stvp->vs->data);
}
/* viewport state: viewport matching window dims */
@@ -383,8 +383,8 @@ clear_with_quad(GLcontext *ctx,
pipe->set_alpha_test_state(pipe, &st->state.alpha_test);
pipe->bind_blend_state(pipe, st->state.blend->data);
pipe->bind_depth_stencil_state(pipe, st->state.depth_stencil);
- pipe->bind_fs_state(pipe, st->state.fs);
- pipe->bind_vs_state(pipe, st->state.vs);
+ pipe->bind_fs_state(pipe, st->state.fs->data);
+ pipe->bind_vs_state(pipe, st->state.vs->data);
pipe->bind_rasterizer_state(pipe, st->state.rasterizer->data);
pipe->set_viewport_state(pipe, &ctx->st->state.viewport);
/* OR:
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index d4f260e..4e3c243 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -330,7 +330,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
if (!stfp) {
stfp = make_fragment_shader(ctx->st);
}
- pipe->bind_fs_state(pipe, stfp->fs);
+ pipe->bind_fs_state(pipe, stfp->fs->data);
}
/* vertex shader state: position + texcoord pass-through */
@@ -339,7 +339,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
if (!stvp) {
stvp = make_vertex_shader(ctx->st);
}
- pipe->bind_vs_state(pipe, stvp->vs);
+ pipe->bind_vs_state(pipe, stvp->vs->data);
}
/* texture sampling state: */
@@ -393,8 +393,8 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
/* restore GL state */
pipe->bind_rasterizer_state(pipe, ctx->st->state.rasterizer->data);
- pipe->bind_fs_state(pipe, ctx->st->state.fs);
- pipe->bind_vs_state(pipe, ctx->st->state.vs);
+ 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->set_viewport_state(pipe, &ctx->st->state.viewport);
diff --git a/src/mesa/state_tracker/st_cb_rasterpos.c b/src/mesa/state_tracker/st_cb_rasterpos.c
index 5245535..04b2016 100644
--- a/src/mesa/state_tracker/st_cb_rasterpos.c
+++ b/src/mesa/state_tracker/st_cb_rasterpos.c
@@ -35,6 +35,7 @@
#include "st_context.h"
#include "st_atom.h"
+#include "st_cache.h"
#include "st_draw.h"
#include "st_program.h"
#include "st_cb_rasterpos.h"
@@ -88,7 +89,7 @@ static void
setup_feedback(GLcontext *ctx)
{
struct pipe_context *pipe = ctx->st->pipe;
- const struct pipe_shader_state *vs = ctx->st->state.vs;
+ const struct pipe_shader_state *vs = &ctx->st->state.vs->state;
struct pipe_feedback_state feedback;
uint i;
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 93b6425..df97626 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -79,8 +79,8 @@ struct st_context
const struct pipe_sampler_state *sampler[PIPE_MAX_SAMPLERS];
const struct pipe_depth_stencil_state *depth_stencil;
const struct cso_rasterizer *rasterizer;
- const struct pipe_shader_state *fs;
- const struct pipe_shader_state *vs;
+ const struct cso_fragment_shader *fs;
+ const struct cso_vertex_shader *vs;
struct pipe_alpha_test_state alpha_test;
struct pipe_blend_color blend_color;
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
index 238ade0..633e4d9 100644
--- a/src/mesa/state_tracker/st_draw.c
+++ b/src/mesa/state_tracker/st_draw.c
@@ -198,7 +198,7 @@ st_draw_vbo(GLcontext *ctx,
/* must get these after state validation! */
vp = ctx->st->vp;
- vs = ctx->st->state.vs;
+ vs = &ctx->st->state.vs->state;
/* loop over TGSI shader inputs */
for (attr = 0; attr < vs->num_inputs; attr++) {
@@ -405,8 +405,8 @@ st_feedback_draw_vbo(GLcontext *ctx,
assert(draw);
draw_set_viewport_state(draw, &st->state.viewport);
draw_set_clip_state(draw, &st->state.clip);
- draw_set_rasterizer_state(draw, st->state.rasterizer->data);
- draw_set_vertex_shader(draw, st->state.vs);
+ draw_set_rasterizer_state(draw, &st->state.rasterizer->state);
+ draw_set_vertex_shader(draw, &st->state.vs->state);
/* XXX need to set vertex info too */
diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h
index 4945141..4f9ace3 100644
--- a/src/mesa/state_tracker/st_program.h
+++ b/src/mesa/state_tracker/st_program.h
@@ -40,6 +40,8 @@
#define ST_FP_MAX_TOKENS 1024
+struct cso_fragment_shader;
+struct cso_vertex_shader;
struct st_fragment_program
{
@@ -52,7 +54,7 @@ struct st_fragment_program
GLboolean dirty;
/** Pointer to the corresponding cached shader */
- const struct pipe_shader_state *fs;
+ const struct cso_fragment_shader *fs;
GLuint param_state;
};
@@ -83,7 +85,7 @@ struct st_vertex_program
#endif
/** Pointer to the corresponding cached shader */
- const struct pipe_shader_state *vs;
+ const struct cso_vertex_shader *vs;
GLuint param_state;
};
@@ -105,12 +107,12 @@ st_vertex_program( struct gl_vertex_program *vp )
}
-extern struct pipe_shader_state *
+extern const struct cso_fragment_shader *
st_translate_fragment_shader(struct st_context *st,
struct st_fragment_program *fp);
-extern struct pipe_shader_state *
+extern const struct cso_vertex_shader *
st_translate_vertex_shader(struct st_context *st,
struct st_vertex_program *vp);