mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 15:48:36 +02:00
failover: adapt to new vertex element cso
This commit is contained in:
parent
470dbb84b8
commit
2918edb46a
3 changed files with 52 additions and 26 deletions
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue