diff options
Diffstat (limited to 'src/gallium/drivers/failover')
| -rw-r--r-- | src/gallium/drivers/failover/fo_context.c | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/failover/fo_context.h | 3 | ||||
| -rw-r--r-- | src/gallium/drivers/failover/fo_state.c | 65 | ||||
| -rw-r--r-- | src/gallium/drivers/failover/fo_state_emit.c | 10 | 
4 files changed, 52 insertions, 27 deletions
diff --git a/src/gallium/drivers/failover/fo_context.c b/src/gallium/drivers/failover/fo_context.c index 2ccc5d3e60..659e40cbf0 100644 --- a/src/gallium/drivers/failover/fo_context.c +++ b/src/gallium/drivers/failover/fo_context.c @@ -27,7 +27,6 @@  #include "pipe/p_defines.h" -#include "util/u_simple_screen.h"  #include "util/u_memory.h"  #include "pipe/p_context.h" diff --git a/src/gallium/drivers/failover/fo_context.h b/src/gallium/drivers/failover/fo_context.h index 53e1a02bcb..73031321d9 100644 --- a/src/gallium/drivers/failover/fo_context.h +++ b/src/gallium/drivers/failover/fo_context.h @@ -85,6 +85,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; @@ -94,10 +95,8 @@ struct failover_context {     struct pipe_scissor_state scissor;     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]; diff --git a/src/gallium/drivers/failover/fo_state.c b/src/gallium/drivers/failover/fo_state.c index d0c2f1474a..25c6273570 100644 --- a/src/gallium/drivers/failover/fo_state.c +++ b/src/gallium/drivers/failover/fo_state.c @@ -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); @@ -526,22 +569,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, @@ -579,6 +606,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; @@ -590,7 +620,6 @@ failover_init_state_functions( struct failover_context *failover )     failover->pipe.set_vertex_sampler_views = failover_set_vertex_sampler_views;     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;     failover->pipe.create_sampler_view = failover_create_sampler_view;     failover->pipe.sampler_view_destroy = failover_sampler_view_destroy; diff --git a/src/gallium/drivers/failover/fo_state_emit.c b/src/gallium/drivers/failover/fo_state_emit.c index 171151e1ee..42bd6929a7 100644 --- a/src/gallium/drivers/failover/fo_state_emit.c +++ b/src/gallium/drivers/failover/fo_state_emit.c @@ -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 ); @@ -128,11 +132,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;  }  | 
