failover: adapt to new vertex element cso

This commit is contained in:
Roland Scheidegger 2010-03-01 18:47:54 +01:00
parent 470dbb84b8
commit 2918edb46a
3 changed files with 52 additions and 26 deletions

View file

@ -78,6 +78,7 @@ struct failover_context {
const struct fo_state *rasterizer;
const struct fo_state *fragment_shader;
const struct fo_state *vertex_shader;
const struct fo_state *vertex_elements;
struct pipe_blend_color blend_color;
struct pipe_stencil_ref stencil_ref;
@ -89,10 +90,8 @@ struct failover_context {
struct pipe_texture *vertex_textures[PIPE_MAX_VERTEX_SAMPLERS];
struct pipe_viewport_state viewport;
struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS];
struct pipe_vertex_element vertex_elements[PIPE_MAX_ATTRIBS];
uint num_vertex_buffers;
uint num_vertex_elements;
void *sw_sampler_state[PIPE_MAX_SAMPLERS];
void *hw_sampler_state[PIPE_MAX_SAMPLERS];

View file

@ -255,9 +255,52 @@ failover_delete_vs_state(struct pipe_context *pipe,
free(state);
}
static void *
failover_create_vertex_elements_state( struct pipe_context *pipe,
unsigned count,
const struct pipe_vertex_element *velems )
{
struct fo_state *state = malloc(sizeof(struct fo_state));
struct failover_context *failover = failover_context(pipe);
state->sw_state = failover->sw->create_vertex_elements_state(failover->sw, count, velems);
state->hw_state = failover->hw->create_vertex_elements_state(failover->hw, count, velems);
return state;
}
static void
failover_bind_vertex_elements_state(struct pipe_context *pipe,
void *velems )
{
struct failover_context *failover = failover_context(pipe);
struct fo_state *state = (struct fo_state*)velems;
failover->vertex_elements = state;
failover->dirty |= FO_NEW_VERTEX_ELEMENT;
failover->sw->bind_vertex_elements_state( failover->sw, velems );
failover->hw->bind_vertex_elements_state( failover->hw, velems );
}
static void
failover_delete_vertex_elements_state( struct pipe_context *pipe,
void *velems )
{
struct fo_state *state = (struct fo_state*)velems;
struct failover_context *failover = failover_context(pipe);
failover->sw->delete_vertex_elements_state(failover->sw, state->sw_state);
failover->hw->delete_vertex_elements_state(failover->hw, state->hw_state);
state->sw_state = 0;
state->hw_state = 0;
free(state);
}
static void
failover_set_polygon_stipple( struct pipe_context *pipe,
const struct pipe_poly_stipple *stipple )
const struct pipe_poly_stipple *stipple )
{
struct failover_context *failover = failover_context(pipe);
@ -490,22 +533,6 @@ failover_set_vertex_buffers(struct pipe_context *pipe,
}
static void
failover_set_vertex_elements(struct pipe_context *pipe,
unsigned count,
const struct pipe_vertex_element *vertex_elements)
{
struct failover_context *failover = failover_context(pipe);
memcpy(failover->vertex_elements, vertex_elements,
count * sizeof(vertex_elements[0]));
failover->dirty |= FO_NEW_VERTEX_ELEMENT;
failover->num_vertex_elements = count;
failover->sw->set_vertex_elements( failover->sw, count, vertex_elements );
failover->hw->set_vertex_elements( failover->hw, count, vertex_elements );
}
void
failover_set_constant_buffer(struct pipe_context *pipe,
uint shader, uint index,
@ -543,6 +570,9 @@ failover_init_state_functions( struct failover_context *failover )
failover->pipe.create_vs_state = failover_create_vs_state;
failover->pipe.bind_vs_state = failover_bind_vs_state;
failover->pipe.delete_vs_state = failover_delete_vs_state;
failover->pipe.create_vertex_elements_state = failover_create_vertex_elements_state;
failover->pipe.bind_vertex_elements_state = failover_bind_vertex_elements_state;
failover->pipe.delete_vertex_elements_state = failover_delete_vertex_elements_state;
failover->pipe.set_blend_color = failover_set_blend_color;
failover->pipe.set_stencil_ref = failover_set_stencil_ref;
@ -554,6 +584,5 @@ failover_init_state_functions( struct failover_context *failover )
failover->pipe.set_vertex_sampler_textures = failover_set_vertex_sampler_textures;
failover->pipe.set_viewport_state = failover_set_viewport_state;
failover->pipe.set_vertex_buffers = failover_set_vertex_buffers;
failover->pipe.set_vertex_elements = failover_set_vertex_elements;
failover->pipe.set_constant_buffer = failover_set_constant_buffer;
}

View file

@ -81,6 +81,10 @@ failover_state_emit( struct failover_context *failover )
failover->sw->bind_vs_state( failover->sw,
failover->vertex_shader->sw_state );
if (failover->dirty & FO_NEW_VERTEX_ELEMENT)
failover->sw->bind_vertex_elements_state( failover->sw,
failover->vertex_elements->sw_state );
if (failover->dirty & FO_NEW_STIPPLE)
failover->sw->set_polygon_stipple( failover->sw, &failover->poly_stipple );
@ -116,11 +120,5 @@ failover_state_emit( struct failover_context *failover )
failover->vertex_buffers );
}
if (failover->dirty & FO_NEW_VERTEX_ELEMENT) {
failover->sw->set_vertex_elements( failover->sw,
failover->num_vertex_elements,
failover->vertex_elements );
}
failover->dirty = 0;
}