diff options
| -rw-r--r-- | src/gallium/drivers/cell/ppu/cell_context.h | 8 | ||||
| -rw-r--r-- | src/gallium/drivers/cell/ppu/cell_state_vertex.c | 41 | 
2 files changed, 37 insertions, 12 deletions
| diff --git a/src/gallium/drivers/cell/ppu/cell_context.h b/src/gallium/drivers/cell/ppu/cell_context.h index a77cc5b906..84ad0f3422 100644 --- a/src/gallium/drivers/cell/ppu/cell_context.h +++ b/src/gallium/drivers/cell/ppu/cell_context.h @@ -93,6 +93,11 @@ struct cell_buffer_list     struct cell_buffer_node *head;  }; +struct cell_velems_state +{ +   unsigned count; +   struct pipe_vertex_element velem[]; +}  /**   * Per-context state, subclass of pipe_context. @@ -110,6 +115,7 @@ struct cell_context     const struct pipe_rasterizer_state *rasterizer;     const struct cell_vertex_shader_state *vs;     const struct cell_fragment_shader_state *fs; +   const struct cell_velems_state *velems;     struct spe_function logic_op; @@ -125,8 +131,6 @@ struct cell_context     struct pipe_viewport_state viewport;     struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];     uint num_vertex_buffers; -   struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS]; -   uint num_vertex_elements;     ubyte *cbuf_map[PIPE_MAX_COLOR_BUFS];     ubyte *zsbuf_map; diff --git a/src/gallium/drivers/cell/ppu/cell_state_vertex.c b/src/gallium/drivers/cell/ppu/cell_state_vertex.c index fbe55c8472..35c919fb6b 100644 --- a/src/gallium/drivers/cell/ppu/cell_state_vertex.c +++ b/src/gallium/drivers/cell/ppu/cell_state_vertex.c @@ -32,24 +32,43 @@  #include "cell_context.h"  #include "cell_state.h" +#include "util/u_memory.h"  #include "draw/draw_context.h" -static void -cell_set_vertex_elements(struct pipe_context *pipe, -                         unsigned count, -                         const struct pipe_vertex_element *elements) +void * +cell_create_vertex_elements_state(struct pipe_context *pipe, +                                  unsigned count, +                                  const struct pipe_vertex_element *attribs)  { -   struct cell_context *cell = cell_context(pipe); - +   struct cell_velems_state *velems;     assert(count <= PIPE_MAX_ATTRIBS); +   velems = (struct cell_velems_state *) MALLOC(sizeof(struct cell_velems_state) + count * sizeof(*attribs)); +   if (velems) { +      velems->count = count; +      memcpy(velems->velem, attribs, sizeof(*attribs) * count); +   } +   return velems; +} + +void +cell_bind_vertex_elements_state(struct pipe_context *pipe, +                                void *velems) +{ +   struct cell_context *cell = cell_context(pipe); +   struct cell_velems_state *cell_velems = (struct cell_velems_state *) velems; -   memcpy(cell->vertex_element, elements, count * sizeof(elements[0])); -   cell->num_vertex_elements = count; +   cell->velems = cell_velems;     cell->dirty |= CELL_NEW_VERTEX; -   draw_set_vertex_elements(cell->draw, count, elements); +   draw_set_vertex_elements(cell->draw, cell_velems->count, cell_velems->velem); +} + +void +cell_delete_vertex_elements_state(struct pipe_context *pipe, void *velems) +{ +   FREE( velems );  } @@ -75,5 +94,7 @@ void  cell_init_vertex_functions(struct cell_context *cell)  {     cell->pipe.set_vertex_buffers = cell_set_vertex_buffers; -   cell->pipe.set_vertex_elements = cell_set_vertex_elements; +   cell->pipe.create_vertex_elements_state = cell_create_vertex_elements_state; +   cell->pipe.bind_vertex_elements_state = cell_bind_vertex_elements_state; +   cell->pipe.delete_vertex_elements_state = cell_delete_vertex_elements_state;  } | 
