summaryrefslogtreecommitdiffstats
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.h12
-rw-r--r--src/mesa/pipe/failover/fo_state.c72
-rw-r--r--src/mesa/pipe/failover/fo_state_emit.c2
3 files changed, 58 insertions, 28 deletions
diff --git a/src/mesa/pipe/failover/fo_context.h b/src/mesa/pipe/failover/fo_context.h
index 7371ad4392b..8a2fbe2be9b 100644
--- a/src/mesa/pipe/failover/fo_context.h
+++ b/src/mesa/pipe/failover/fo_context.h
@@ -70,12 +70,12 @@ struct failover_context {
/* The most recent drawing state as set by the driver:
*/
- const struct fo_state *blend;
- const struct pipe_sampler_state *sampler[PIPE_MAX_SAMPLERS];
- const struct fo_state *depth_stencil;
- const struct fo_state *rasterizer;
- const struct fo_state *fragment_shader;
- const struct fo_state *vertex_shader;
+ const struct fo_state *blend;
+ const struct fo_state *sampler[PIPE_MAX_SAMPLERS];
+ const struct fo_state *depth_stencil;
+ const struct fo_state *rasterizer;
+ 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;
diff --git a/src/mesa/pipe/failover/fo_state.c b/src/mesa/pipe/failover/fo_state.c
index 3379f453557..ce3f0ca6358 100644
--- a/src/mesa/pipe/failover/fo_state.c
+++ b/src/mesa/pipe/failover/fo_state.c
@@ -75,10 +75,10 @@ failover_bind_blend_state( struct pipe_context *pipe,
void *blend )
{
struct failover_context *failover = failover_context(pipe);
-
- failover->blend = (struct fo_state *)blend;
+ struct fo_state *state = (struct fo_state *)blend;
+ failover->blend = state;
failover->dirty |= FO_NEW_BLEND;
- failover->hw->bind_blend_state( failover->hw, blend );
+ failover->hw->bind_blend_state( failover->hw, state->hw_state );
}
static void
@@ -146,10 +146,10 @@ failover_bind_depth_stencil_state(struct pipe_context *pipe,
void *depth_stencil)
{
struct failover_context *failover = failover_context(pipe);
-
- failover->depth_stencil = (struct fo_state *)depth_stencil;
+ struct fo_state *state = (struct fo_state *)depth_stencil;
+ failover->depth_stencil = state;
failover->dirty |= FO_NEW_DEPTH_STENCIL;
- failover->hw->bind_depth_stencil_state( failover->hw, depth_stencil );
+ failover->hw->bind_depth_stencil_state(failover->hw, state->hw_state);
}
static void
@@ -192,14 +192,13 @@ failover_create_fs_state(struct pipe_context *pipe,
}
static void
-failover_bind_fs_state(struct pipe_context *pipe,
- void *fs)
+failover_bind_fs_state(struct pipe_context *pipe, void *fs)
{
struct failover_context *failover = failover_context(pipe);
-
- failover->fragment_shader = (struct fo_state *)fs;
+ struct fo_state *state = (struct fo_state*)fs;
+ failover->fragment_shader = state;
failover->dirty |= FO_NEW_FRAGMENT_SHADER;
- failover->hw->bind_fs_state(failover->hw, (struct pipe_shader_state *)fs);
+ failover->hw->bind_fs_state(failover->hw, state->hw_state);
}
static void
@@ -235,9 +234,10 @@ failover_bind_vs_state(struct pipe_context *pipe,
{
struct failover_context *failover = failover_context(pipe);
- failover->vertex_shader = (struct fo_state*)vs;
+ struct fo_state *state = (struct fo_state*)vs;
+ failover->vertex_shader = state;
failover->dirty |= FO_NEW_VERTEX_SHADER;
- failover->hw->bind_vs_state(failover->hw, vs);
+ failover->hw->bind_vs_state(failover->hw, state->hw_state);
}
static void
@@ -284,9 +284,10 @@ failover_bind_rasterizer_state(struct pipe_context *pipe,
{
struct failover_context *failover = failover_context(pipe);
- failover->rasterizer = (struct fo_state *)raster;
+ struct fo_state *state = (struct fo_state*)raster;
+ failover->rasterizer = state;
failover->dirty |= FO_NEW_RASTERIZER;
- failover->hw->bind_rasterizer_state( failover->hw, raster );
+ failover->hw->bind_rasterizer_state(failover->hw, state->hw_state);
}
static void
@@ -315,17 +316,44 @@ failover_set_scissor_state( struct pipe_context *pipe,
failover->hw->set_scissor_state( failover->hw, scissor );
}
+
+static void *
+failover_create_sampler_state(struct pipe_context *pipe,
+ const struct pipe_sampler_state *templ)
+{
+ struct fo_state *state = malloc(sizeof(struct fo_state));
+ struct failover_context *failover = failover_context(pipe);
+
+ state->sw_state = failover->sw->create_sampler_state(pipe, templ);
+ state->hw_state = failover->hw->create_sampler_state(pipe, templ);
+
+ return state;
+}
+
static void
failover_bind_sampler_state(struct pipe_context *pipe,
- unsigned unit,
- const struct pipe_sampler_state *sampler)
+ unsigned unit, void *sampler)
{
struct failover_context *failover = failover_context(pipe);
-
- failover->sampler[unit] = sampler;
+ struct fo_state *state = (struct fo_state*)sampler;
+ failover->sampler[unit] = state;
failover->dirty |= FO_NEW_SAMPLER;
failover->dirty_sampler |= (1<<unit);
- failover->hw->bind_sampler_state( failover->hw, unit, sampler );
+ failover->hw->bind_sampler_state(failover->hw, unit,
+ state->hw_state);
+}
+
+static void
+failover_delete_sampler_state(struct pipe_context *pipe, void *sampler)
+{
+ struct fo_state *state = (struct fo_state*)sampler;
+ struct failover_context *failover = failover_context(pipe);
+
+ failover->sw->delete_sampler_state(pipe, state->sw_state);
+ failover->hw->delete_sampler_state(pipe, state->hw_state);
+ state->sw_state = 0;
+ state->hw_state = 0;
+ free(state);
}
@@ -389,7 +417,9 @@ failover_init_state_functions( struct failover_context *failover )
failover->pipe.create_blend_state = failover_create_blend_state;
failover->pipe.bind_blend_state = failover_bind_blend_state;
failover->pipe.delete_blend_state = failover_delete_blend_state;
- failover->pipe.bind_sampler_state = failover_bind_sampler_state;
+ failover->pipe.create_sampler_state = failover_create_sampler_state;
+ failover->pipe.bind_sampler_state = failover_bind_sampler_state;
+ failover->pipe.delete_sampler_state = failover_delete_sampler_state;
failover->pipe.create_depth_stencil_state = failover_create_depth_stencil_state;
failover->pipe.bind_depth_stencil_state = failover_bind_depth_stencil_state;
failover->pipe.delete_depth_stencil_state = failover_delete_depth_stencil_state;
diff --git a/src/mesa/pipe/failover/fo_state_emit.c b/src/mesa/pipe/failover/fo_state_emit.c
index da12b4e25ce..c0ea6810246 100644
--- a/src/mesa/pipe/failover/fo_state_emit.c
+++ b/src/mesa/pipe/failover/fo_state_emit.c
@@ -103,7 +103,7 @@ failover_state_emit( struct failover_context *failover )
for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
if (failover->dirty_sampler & (1<<i)) {
failover->sw->bind_sampler_state( failover->sw, i,
- failover->sampler[i] );
+ failover->sampler[i]->sw_state );
}
}
}