diff options
| -rw-r--r-- | src/gallium/drivers/failover/fo_context.h | 6 | ||||
| -rw-r--r-- | src/gallium/drivers/failover/fo_state.c | 77 | ||||
| -rw-r--r-- | src/gallium/drivers/failover/fo_state_emit.c | 6 | 
3 files changed, 82 insertions, 7 deletions
| diff --git a/src/gallium/drivers/failover/fo_context.h b/src/gallium/drivers/failover/fo_context.h index 9ba86ba866..149393712a 100644 --- a/src/gallium/drivers/failover/fo_context.h +++ b/src/gallium/drivers/failover/fo_context.h @@ -72,6 +72,7 @@ struct failover_context {      */     const struct fo_state     *blend;     const struct fo_state     *sampler[PIPE_MAX_SAMPLERS]; +   const struct fo_state     *vertex_samplers[PIPE_MAX_VERTEX_SAMPLERS];     const struct fo_state     *depth_stencil;     const struct fo_state     *rasterizer;     const struct fo_state     *fragment_shader; @@ -83,6 +84,7 @@ struct failover_context {     struct pipe_poly_stipple poly_stipple;     struct pipe_scissor_state scissor;     struct pipe_texture *texture[PIPE_MAX_SAMPLERS]; +   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]; @@ -92,11 +94,15 @@ struct failover_context {     void *sw_sampler_state[PIPE_MAX_SAMPLERS];     void *hw_sampler_state[PIPE_MAX_SAMPLERS]; +   void *sw_vertex_sampler_state[PIPE_MAX_VERTEX_SAMPLERS]; +   void *hw_vertex_sampler_state[PIPE_MAX_VERTEX_SAMPLERS];     unsigned dirty;     unsigned num_samplers; +   unsigned num_vertex_samplers;     unsigned num_textures; +   unsigned num_vertex_textures;     unsigned mode;     struct pipe_context *hw; diff --git a/src/gallium/drivers/failover/fo_state.c b/src/gallium/drivers/failover/fo_state.c index fca6caa227..3f5f556032 100644 --- a/src/gallium/drivers/failover/fo_state.c +++ b/src/gallium/drivers/failover/fo_state.c @@ -322,8 +322,9 @@ failover_create_sampler_state(struct pipe_context *pipe,  }  static void -failover_bind_sampler_states(struct pipe_context *pipe, -                             unsigned num, void **sampler) +failover_bind_fragment_sampler_states(struct pipe_context *pipe, +                                      unsigned num, +                                      void **sampler)  {     struct failover_context *failover = failover_context(pipe);     struct fo_state *state = (struct fo_state*)sampler; @@ -346,6 +347,36 @@ failover_bind_sampler_states(struct pipe_context *pipe,  }  static void +failover_bind_vertex_sampler_states(struct pipe_context *pipe, +                                    unsigned num_samplers, +                                    void **samplers) +{ +   struct failover_context *failover = failover_context(pipe); +   struct fo_state *state = (struct fo_state*)samplers; +   uint i; + +   assert(num_samplers <= PIPE_MAX_VERTEX_SAMPLERS); + +   /* Check for no-op */ +   if (num_samplers == failover->num_vertex_samplers && +       !memcmp(failover->vertex_samplers, samplers, num_samplers * sizeof(void *))) { +      return; +   } +   for (i = 0; i < PIPE_MAX_VERTEX_SAMPLERS; i++) { +      failover->sw_vertex_sampler_state[i] = i < num_samplers ? state[i].sw_state : NULL; +      failover->hw_vertex_sampler_state[i] = i < num_samplers ? state[i].hw_state : NULL; +   } +   failover->dirty |= FO_NEW_SAMPLER; +   failover->num_vertex_samplers = num_samplers; +   failover->sw->bind_vertex_sampler_states(failover->sw, +                                            num_samplers, +                                            failover->sw_vertex_sampler_state); +   failover->hw->bind_vertex_sampler_states(failover->hw, +                                            num_samplers, +                                            failover->hw_vertex_sampler_state); +} + +static void  failover_delete_sampler_state(struct pipe_context *pipe, void *sampler)  {     struct fo_state *state = (struct fo_state*)sampler; @@ -360,9 +391,9 @@ failover_delete_sampler_state(struct pipe_context *pipe, void *sampler)  static void -failover_set_sampler_textures(struct pipe_context *pipe, -                              unsigned num, -                              struct pipe_texture **texture) +failover_set_fragment_sampler_textures(struct pipe_context *pipe, +                                       unsigned num, +                                       struct pipe_texture **texture)  {     struct failover_context *failover = failover_context(pipe);     uint i; @@ -386,6 +417,36 @@ failover_set_sampler_textures(struct pipe_context *pipe,  } +static void +failover_set_vertex_sampler_textures(struct pipe_context *pipe, +                                     unsigned num_textures, +                                     struct pipe_texture **textures) +{ +   struct failover_context *failover = failover_context(pipe); +   uint i; + +   assert(num_textures <= PIPE_MAX_VERTEX_SAMPLERS); + +   /* Check for no-op */ +   if (num_textures == failover->num_vertex_textures && +       !memcmp(failover->vertex_textures, textures, num_textures * sizeof(struct pipe_texture *))) { +      return; +   } +   for (i = 0; i < num_textures; i++) { +      pipe_texture_reference((struct pipe_texture **)&failover->vertex_textures[i], +                             textures[i]); +   } +   for (i = num_textures; i < failover->num_vertex_textures; i++) { +      pipe_texture_reference((struct pipe_texture **)&failover->vertex_textures[i], +                             NULL); +   } +   failover->dirty |= FO_NEW_TEXTURE; +   failover->num_vertex_textures = num_textures; +   failover->sw->set_vertex_sampler_textures(failover->sw, num_textures, textures); +   failover->hw->set_vertex_sampler_textures(failover->hw, num_textures, textures); +} + +  static void   failover_set_viewport_state( struct pipe_context *pipe,  			     const struct pipe_viewport_state *viewport ) @@ -453,7 +514,8 @@ failover_init_state_functions( struct failover_context *failover )     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_fragment_sampler_states  = failover_bind_sampler_states; +   failover->pipe.bind_fragment_sampler_states  = failover_bind_fragment_sampler_states; +   failover->pipe.bind_vertex_sampler_states  = failover_bind_vertex_sampler_states;     failover->pipe.delete_sampler_state = failover_delete_sampler_state;     failover->pipe.create_depth_stencil_alpha_state = failover_create_depth_stencil_state;     failover->pipe.bind_depth_stencil_alpha_state   = failover_bind_depth_stencil_state; @@ -473,7 +535,8 @@ failover_init_state_functions( struct failover_context *failover )     failover->pipe.set_framebuffer_state = failover_set_framebuffer_state;     failover->pipe.set_polygon_stipple = failover_set_polygon_stipple;     failover->pipe.set_scissor_state = failover_set_scissor_state; -   failover->pipe.set_fragment_sampler_textures = failover_set_sampler_textures; +   failover->pipe.set_fragment_sampler_textures = failover_set_fragment_sampler_textures; +   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; diff --git a/src/gallium/drivers/failover/fo_state_emit.c b/src/gallium/drivers/failover/fo_state_emit.c index b4b1067924..a3341e33f8 100644 --- a/src/gallium/drivers/failover/fo_state_emit.c +++ b/src/gallium/drivers/failover/fo_state_emit.c @@ -94,11 +94,17 @@ failover_state_emit( struct failover_context *failover )     if (failover->dirty & FO_NEW_SAMPLER) {        failover->sw->bind_fragment_sampler_states( failover->sw, failover->num_samplers,                                                    failover->sw_sampler_state ); +      failover->sw->bind_vertex_sampler_states(failover->sw, +                                               failover->num_vertex_samplers, +                                               failover->sw_vertex_sampler_state);     }     if (failover->dirty & FO_NEW_TEXTURE) {        failover->sw->set_fragment_sampler_textures( failover->sw, failover->num_textures,                                                      failover->texture ); +      failover->sw->set_vertex_sampler_textures(failover->sw, +                                                failover->num_vertex_textures,  +                                                failover->vertex_textures);     }     if (failover->dirty & FO_NEW_VERTEX_BUFFER) { | 
