summaryrefslogtreecommitdiff
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.c1
-rw-r--r--src/mesa/state_tracker/st_atom.h1
-rw-r--r--src/mesa/state_tracker/st_atom_alphatest.c15
-rw-r--r--src/mesa/state_tracker/st_cache.c20
-rw-r--r--src/mesa/state_tracker/st_cache.h4
-rw-r--r--src/mesa/state_tracker/st_cb_clear.c6
-rw-r--r--src/mesa/state_tracker/st_cb_drawpixels.c2
-rw-r--r--src/mesa/state_tracker/st_context.h10
8 files changed, 42 insertions, 17 deletions
diff --git a/src/mesa/state_tracker/st_atom.c b/src/mesa/state_tracker/st_atom.c
index a4af3aeb20..fc339b91ed 100644
--- a/src/mesa/state_tracker/st_atom.c
+++ b/src/mesa/state_tracker/st_atom.c
@@ -62,6 +62,7 @@ static const struct st_tracked_state *atoms[] =
&st_update_texture,
&st_update_vs_constants,
&st_update_fs_constants,
+ &st_update_alpha_test
};
diff --git a/src/mesa/state_tracker/st_atom.h b/src/mesa/state_tracker/st_atom.h
index 26f6514698..6710c1a269 100644
--- a/src/mesa/state_tracker/st_atom.h
+++ b/src/mesa/state_tracker/st_atom.h
@@ -60,6 +60,7 @@ const struct st_tracked_state st_update_sampler;
const struct st_tracked_state st_update_texture;
const struct st_tracked_state st_update_fs_constants;
const struct st_tracked_state st_update_vs_constants;
+const struct st_tracked_state st_update_alpha_test;
#endif
diff --git a/src/mesa/state_tracker/st_atom_alphatest.c b/src/mesa/state_tracker/st_atom_alphatest.c
index 4378154053..873520ab02 100644
--- a/src/mesa/state_tracker/st_atom_alphatest.c
+++ b/src/mesa/state_tracker/st_atom_alphatest.c
@@ -33,6 +33,7 @@
#include "st_context.h"
+#include "st_cache.h"
#include "st_atom.h"
#include "pipe/p_context.h"
#include "pipe/p_defines.h"
@@ -63,6 +64,7 @@ static void
update_alpha_test( struct st_context *st )
{
struct pipe_alpha_test_state alpha;
+ const struct cso_alpha_test *cso;
memset(&alpha, 0, sizeof(alpha));
@@ -71,11 +73,11 @@ update_alpha_test( struct st_context *st )
alpha.func = gl_alpha_func_to_sp(st->ctx->Color.AlphaFunc);
alpha.ref = st->ctx->Color.AlphaRef;
}
-
- if (memcmp(&alpha, &st->state.alpha_test, sizeof(alpha)) != 0) {
+ cso = st_cached_alpha_test_state(st, &alpha);
+ if (st->state.alpha_test != cso) {
/* state has changed */
- st->state.alpha_test = alpha; /* struct copy */
- st->pipe->set_alpha_test_state(st->pipe, &alpha); /* set new state */
+ st->state.alpha_test = cso;
+ st->pipe->bind_alpha_test_state(st->pipe, cso->data); /* bind new state */
}
}
@@ -88,8 +90,3 @@ const struct st_tracked_state st_update_alpha_test = {
},
.update = update_alpha_test
};
-
-
-
-
-
diff --git a/src/mesa/state_tracker/st_cache.c b/src/mesa/state_tracker/st_cache.c
index 01d1934232..1686721990 100644
--- a/src/mesa/state_tracker/st_cache.c
+++ b/src/mesa/state_tracker/st_cache.c
@@ -159,3 +159,23 @@ st_cached_vs_state(struct st_context *st,
}
return (struct cso_vertex_shader*)(cso_hash_iter_data(iter));
}
+
+const struct cso_alpha_test *
+st_cached_alpha_test_state(struct st_context *st,
+ const struct pipe_alpha_test_state *templ)
+{
+ unsigned hash_key = cso_construct_key((void*)templ,
+ sizeof(struct pipe_alpha_test_state));
+ struct cso_hash_iter iter = cso_find_state_template(st->cache,
+ hash_key, CSO_ALPHA_TEST,
+ (void*)templ);
+ if (cso_hash_iter_is_null(iter)) {
+ struct cso_alpha_test *cso = malloc(sizeof(struct cso_alpha_test));
+ memcpy(&cso->state, templ, sizeof(struct pipe_alpha_test_state));
+ cso->data = st->pipe->create_alpha_test_state(st->pipe, &cso->state);
+ if (!cso->data)
+ cso->data = &cso->state;
+ iter = cso_insert_state(st->cache, hash_key, CSO_ALPHA_TEST, cso);
+ }
+ return ((struct cso_alpha_test *)cso_hash_iter_data(iter));
+}
diff --git a/src/mesa/state_tracker/st_cache.h b/src/mesa/state_tracker/st_cache.h
index 483af6fdb4..422f668c56 100644
--- a/src/mesa/state_tracker/st_cache.h
+++ b/src/mesa/state_tracker/st_cache.h
@@ -39,6 +39,10 @@ struct pipe_blend_state;
struct pipe_sampler_state;
struct st_context;
+const struct cso_alpha_test *
+st_cached_alpha_test_state(struct st_context *st,
+ const struct pipe_alpha_test_state *alpha);
+
const struct cso_blend *
st_cached_blend_state(struct st_context *st,
const struct pipe_blend_state *blend);
diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
index 5e63205088..c53446d588 100644
--- a/src/mesa/state_tracker/st_cb_clear.c
+++ b/src/mesa/state_tracker/st_cb_clear.c
@@ -275,8 +275,10 @@ clear_with_quad(GLcontext *ctx,
/* alpha state: disabled */
{
struct pipe_alpha_test_state alpha_test;
+ const struct cso_alpha_test *cso;
memset(&alpha_test, 0, sizeof(alpha_test));
- pipe->set_alpha_test_state(pipe, &alpha_test);
+ cso = st_cached_alpha_test_state(st, &alpha_test);
+ pipe->bind_alpha_test_state(pipe, cso->data);
}
/* blend state: RGBA masking */
@@ -379,7 +381,7 @@ clear_with_quad(GLcontext *ctx,
draw_quad(ctx, x0, y0, x1, y1, ctx->Depth.Clear, ctx->Color.ClearColor);
/* Restore pipe state */
- pipe->set_alpha_test_state(pipe, &st->state.alpha_test);
+ pipe->bind_alpha_test_state(pipe, st->state.alpha_test->data);
pipe->bind_blend_state(pipe, st->state.blend->data);
pipe->bind_depth_stencil_state(pipe, st->state.depth_stencil->data);
pipe->bind_fs_state(pipe, st->state.fs->data);
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index d814e34157..65c5465546 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -468,7 +468,7 @@ compatible_formats(GLenum format, GLenum type, GLuint pipeFormat)
static GLboolean
any_fragment_ops(const struct st_context *st)
{
- if (st->state.alpha_test.enabled ||
+ if (st->state.alpha_test->state.enabled ||
st->state.blend->state.blend_enable ||
st->state.blend->state.logicop_enable ||
st->state.depth_stencil->state.depth.enabled)
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 55a857f46d..3713328eb1 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -75,14 +75,14 @@ struct st_context
* though, we just shove random objects across the interface.
*/
struct {
- const struct cso_blend *blend;
- const struct cso_sampler *sampler[PIPE_MAX_SAMPLERS];
- const struct cso_depth_stencil *depth_stencil;
- const struct cso_rasterizer *rasterizer;
+ const struct cso_alpha_test *alpha_test;
+ const struct cso_blend *blend;
+ 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;
const struct cso_vertex_shader *vs;
- struct pipe_alpha_test_state alpha_test;
struct pipe_blend_color blend_color;
struct pipe_clear_color_state clear_color;
struct pipe_clip_state clip;