summaryrefslogtreecommitdiff
path: root/src/mesa/pipe/failover
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/pipe/failover')
-rw-r--r--src/mesa/pipe/failover/fo_context.h4
-rw-r--r--src/mesa/pipe/failover/fo_state.c45
-rw-r--r--src/mesa/pipe/failover/fo_state_emit.c3
3 files changed, 42 insertions, 10 deletions
diff --git a/src/mesa/pipe/failover/fo_context.h b/src/mesa/pipe/failover/fo_context.h
index 8a2fbe2be9..7a597013ab 100644
--- a/src/mesa/pipe/failover/fo_context.h
+++ b/src/mesa/pipe/failover/fo_context.h
@@ -64,12 +64,13 @@ struct fo_state {
void *sw_state;
void *hw_state;
};
-struct failover_context {
+struct failover_context {
struct pipe_context pipe; /**< base class */
/* The most recent drawing state as set by the driver:
*/
+ const struct fo_state *alpha_test;
const struct fo_state *blend;
const struct fo_state *sampler[PIPE_MAX_SAMPLERS];
const struct fo_state *depth_stencil;
@@ -77,7 +78,6 @@ struct failover_context {
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;
struct pipe_clear_color_state clear_color;
struct pipe_clip_state clip;
diff --git a/src/mesa/pipe/failover/fo_state.c b/src/mesa/pipe/failover/fo_state.c
index ce3f0ca635..f63137f591 100644
--- a/src/mesa/pipe/failover/fo_state.c
+++ b/src/mesa/pipe/failover/fo_state.c
@@ -45,15 +45,44 @@
* lower overheads.
*/
+static void *
+failover_create_alpha_test_state(struct pipe_context *pipe,
+ const struct pipe_alpha_test_state *templ)
+{
+ struct fo_state *state = malloc(sizeof(struct fo_state));
+ struct failover_context *failover = failover_context(pipe);
+
+ state->sw_state = failover->sw->create_alpha_test_state(pipe, templ);
+ state->hw_state = failover->hw->create_alpha_test_state(pipe, templ);
+
+ return state;
+}
+
static void
-failover_set_alpha_test_state(struct pipe_context *pipe,
- const struct pipe_alpha_test_state *alpha)
+failover_bind_alpha_test_state(struct pipe_context *pipe,
+ void *alpha)
{
struct failover_context *failover = failover_context(pipe);
+ struct fo_state *state = (struct fo_state *)alpha;
- failover->alpha_test = *alpha;
+ failover->alpha_test = state;
failover->dirty |= FO_NEW_ALPHA_TEST;
- failover->hw->set_alpha_test_state( failover->hw, alpha );
+ failover->hw->bind_alpha_test_state(failover->hw,
+ state->hw_state);
+}
+
+static void
+failover_delete_alpha_test_state(struct pipe_context *pipe,
+ void *alpha)
+{
+ struct fo_state *state = (struct fo_state*)alpha;
+ struct failover_context *failover = failover_context(pipe);
+
+ failover->sw->delete_alpha_test_state(pipe, state->sw_state);
+ failover->hw->delete_alpha_test_state(pipe, state->hw_state);
+ state->sw_state = 0;
+ state->hw_state = 0;
+ free(state);
}
@@ -95,7 +124,7 @@ failover_delete_blend_state( struct pipe_context *pipe,
free(state);
}
-static void
+static void
failover_set_blend_color( struct pipe_context *pipe,
const struct pipe_blend_color *blend_color )
{
@@ -414,8 +443,11 @@ failover_set_vertex_element(struct pipe_context *pipe,
void
failover_init_state_functions( struct failover_context *failover )
{
+ failover->pipe.create_alpha_test_state = failover_create_alpha_test_state;
+ failover->pipe.bind_alpha_test_state = failover_bind_alpha_test_state;
+ failover->pipe.delete_alpha_test_state = failover_delete_alpha_test_state;
failover->pipe.create_blend_state = failover_create_blend_state;
- failover->pipe.bind_blend_state = failover_bind_blend_state;
+ failover->pipe.bind_blend_state = failover_bind_blend_state;
failover->pipe.delete_blend_state = failover_delete_blend_state;
failover->pipe.create_sampler_state = failover_create_sampler_state;
failover->pipe.bind_sampler_state = failover_bind_sampler_state;
@@ -433,7 +465,6 @@ failover_init_state_functions( struct failover_context *failover )
failover->pipe.bind_vs_state = failover_bind_vs_state;
failover->pipe.delete_vs_state = failover_delete_vs_state;
- failover->pipe.set_alpha_test_state = failover_set_alpha_test_state;
failover->pipe.set_blend_color = failover_set_blend_color;
failover->pipe.set_clip_state = failover_set_clip_state;
failover->pipe.set_clear_color_state = failover_set_clear_color_state;
diff --git a/src/mesa/pipe/failover/fo_state_emit.c b/src/mesa/pipe/failover/fo_state_emit.c
index c0ea681024..a3aff8abd2 100644
--- a/src/mesa/pipe/failover/fo_state_emit.c
+++ b/src/mesa/pipe/failover/fo_state_emit.c
@@ -56,7 +56,8 @@ failover_state_emit( struct failover_context *failover )
unsigned i;
if (failover->dirty & FO_NEW_ALPHA_TEST)
- failover->sw->set_alpha_test_state( failover->sw, &failover->alpha_test );
+ failover->sw->bind_alpha_test_state( failover->sw,
+ failover->alpha_test->sw_state );
if (failover->dirty & FO_NEW_BLEND)
failover->sw->bind_blend_state( failover->sw,