diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/auxiliary/draw/draw_context.c | 35 | ||||
| -rw-r--r-- | src/gallium/auxiliary/draw/draw_context.h | 9 | ||||
| -rw-r--r-- | src/gallium/auxiliary/draw/draw_private.h | 2 | ||||
| -rw-r--r-- | src/gallium/auxiliary/draw/draw_pt.c | 83 | ||||
| -rw-r--r-- | src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h | 6 | 
5 files changed, 104 insertions, 31 deletions
| diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c index d118a8db52..c2b7a441bd 100644 --- a/src/gallium/auxiliary/draw/draw_context.c +++ b/src/gallium/auxiliary/draw/draw_context.c @@ -496,6 +496,27 @@ void draw_set_render( struct draw_context *draw,  } +void +draw_set_index_buffer(struct draw_context *draw, +                      const struct pipe_index_buffer *ib) +{ +   if (ib) +      memcpy(&draw->pt.index_buffer, ib, sizeof(draw->pt.index_buffer)); +   else +      memset(&draw->pt.index_buffer, 0, sizeof(draw->pt.index_buffer)); +} + + +/** + * Tell drawing context where to find mapped index/element buffer. + */ +void +draw_set_mapped_index_buffer(struct draw_context *draw, +                             const void *elements) +{ +    draw->pt.user.elts = elements; +} +  /**   * Tell the drawing context about the index/element buffer to use @@ -515,8 +536,13 @@ draw_set_mapped_element_buffer_range( struct draw_context *draw,                                        unsigned max_index,                                        const void *elements )  { +   struct pipe_index_buffer ib; + +   memset(&ib, 0, sizeof(ib)); +   ib.index_size = eltSize; +   draw_set_index_buffer(draw, &ib); +     draw->pt.user.elts = elements; -   draw->pt.user.eltSize = eltSize;     draw->pt.user.eltBias = eltBias;     draw->pt.user.min_index = min_index;     draw->pt.user.max_index = max_index; @@ -529,11 +555,8 @@ draw_set_mapped_element_buffer( struct draw_context *draw,                                  int eltBias,                                  const void *elements )  { -   draw->pt.user.elts = elements; -   draw->pt.user.eltSize = eltSize; -   draw->pt.user.eltBias = eltBias; -   draw->pt.user.min_index = 0; -   draw->pt.user.max_index = 0xffffffff; +   draw_set_mapped_element_buffer_range(draw, +         eltSize, eltBias, 0, 0xffffffff, elements);  } diff --git a/src/gallium/auxiliary/draw/draw_context.h b/src/gallium/auxiliary/draw/draw_context.h index 116716af6f..e9f3237dda 100644 --- a/src/gallium/auxiliary/draw/draw_context.h +++ b/src/gallium/auxiliary/draw/draw_context.h @@ -160,6 +160,12 @@ void draw_set_vertex_elements(struct draw_context *draw,  			      unsigned count,                                const struct pipe_vertex_element *elements); +void draw_set_index_buffer(struct draw_context *draw, +                           const struct pipe_index_buffer *ib); + +void draw_set_mapped_index_buffer(struct draw_context *draw, +                                  const void *elements); +  void  draw_set_mapped_element_buffer_range( struct draw_context *draw,                                        unsigned eltSize, @@ -196,6 +202,9 @@ draw_set_so_state(struct draw_context *draw,   * draw_pt.c    */ +void draw_vbo(struct draw_context *draw, +              const struct pipe_draw_info *info); +  void draw_arrays(struct draw_context *draw, unsigned prim,  		 unsigned start, unsigned count); diff --git a/src/gallium/auxiliary/draw/draw_private.h b/src/gallium/auxiliary/draw/draw_private.h index 854c45f060..7bc3923692 100644 --- a/src/gallium/auxiliary/draw/draw_private.h +++ b/src/gallium/auxiliary/draw/draw_private.h @@ -149,6 +149,8 @@ struct draw_context        struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];        unsigned nr_vertex_elements; +      struct pipe_index_buffer index_buffer; +        /* user-space vertex data, buffers */        struct {           /** vertex element/index buffer (ex: glDrawElements) */ diff --git a/src/gallium/auxiliary/draw/draw_pt.c b/src/gallium/auxiliary/draw/draw_pt.c index feacd8258b..8db0d73662 100644 --- a/src/gallium/auxiliary/draw/draw_pt.c +++ b/src/gallium/auxiliary/draw/draw_pt.c @@ -39,6 +39,7 @@  #include "util/u_math.h"  #include "util/u_prim.h"  #include "util/u_format.h" +#include "util/u_draw.h"  DEBUG_GET_ONCE_BOOL_OPTION(draw_fse, "DRAW_FSE", FALSE) @@ -189,24 +190,29 @@ draw_print_arrays(struct draw_context *draw, uint prim, int start, uint count)        uint ii = 0;        uint j; -      if (draw->pt.user.elts) { +      if (draw->pt.user.eltSize) { +         const char *elts; +           /* indexed arrays */ +         elts = (const char *) draw->pt.user.elts; +         elts += draw->pt.index_buffer.offset; +           switch (draw->pt.user.eltSize) {           case 1:              { -               const ubyte *elem = (const ubyte *) draw->pt.user.elts; +               const ubyte *elem = (const ubyte *) elts;                 ii = elem[start + i];              }              break;           case 2:              { -               const ushort *elem = (const ushort *) draw->pt.user.elts; +               const ushort *elem = (const ushort *) elts;                 ii = elem[start + i];              }              break;           case 4:              { -               const uint *elem = (const uint *) draw->pt.user.elts; +               const uint *elem = (const uint *) elts;                 ii = elem[start + i];              }              break; @@ -292,17 +298,9 @@ draw_arrays(struct draw_context *draw, unsigned prim,  /** - * Draw vertex arrays. - * This is the main entrypoint into the drawing module. - * If drawing an indexed primitive, the draw_set_mapped_element_buffer_range() - * function should have already been called to specify the element/index buffer - * information. - * - * \param prim  one of PIPE_PRIM_x - * \param start  index of first vertex to draw - * \param count  number of vertices to draw - * \param startInstance  number for the first primitive instance (usually 0). - * \param instanceCount  number of instances to draw (1=non-instanced) + * Instanced drawing. + * draw_set_mapped_element_buffer must be called before calling this function. + * \sa draw_vbo   */  void  draw_arrays_instanced(struct draw_context *draw, @@ -312,10 +310,49 @@ draw_arrays_instanced(struct draw_context *draw,                        unsigned startInstance,                        unsigned instanceCount)  { -   unsigned reduced_prim = u_reduced_prim(mode); +   struct pipe_draw_info info; + +   util_draw_init_info(&info); + +   info.mode = mode; +   info.start = start; +   info.count = count; +   info.start_instance = startInstance; +   info.instance_count = instanceCount; + +   info.indexed = (draw->pt.user.elts != NULL); +   info.index_bias = draw->pt.user.eltBias; +   info.min_index = draw->pt.user.min_index; +   info.max_index = draw->pt.user.max_index; + +   draw_vbo(draw, &info); +} + + +/** + * Draw vertex arrays. + * This is the main entrypoint into the drawing module.  If drawing an indexed + * primitive, the draw_set_index_buffer() and draw_set_mapped_index_buffer() + * functions should have already been called to specify the element/index + * buffer information. + */ +void +draw_vbo(struct draw_context *draw, +         const struct pipe_draw_info *info) +{ +   unsigned reduced_prim = u_reduced_prim(info->mode);     unsigned instance; -   assert(instanceCount > 0); +   assert(info->instance_count > 0); +   if (info->indexed) +      assert(draw->pt.user.elts); + +   draw->pt.user.eltSize = +      (info->indexed) ? draw->pt.index_buffer.index_size : 0; + +   draw->pt.user.eltBias = info->index_bias; +   draw->pt.user.min_index = info->min_index; +   draw->pt.user.max_index = info->max_index;     if (reduced_prim != draw->reduced_prim) {        draw_do_flush(draw, DRAW_FLUSH_STATE_CHANGE); @@ -323,8 +360,8 @@ draw_arrays_instanced(struct draw_context *draw,     }     if (0) -      debug_printf("draw_arrays(mode=%u start=%u count=%u):\n", -                   mode, start, count); +      debug_printf("draw_vbo(mode=%u start=%u count=%u):\n", +                   info->mode, info->start, info->count);     if (0)        tgsi_dump(draw->vs.vertex_shader->state.tokens, 0); @@ -352,10 +389,10 @@ draw_arrays_instanced(struct draw_context *draw,     }     if (0) -      draw_print_arrays(draw, mode, start, MIN2(count, 20)); +      draw_print_arrays(draw, info->mode, info->start, MIN2(info->count, 20)); -   for (instance = 0; instance < instanceCount; instance++) { -      draw->instance_id = instance + startInstance; -      draw_pt_arrays(draw, mode, start, count); +   for (instance = 0; instance < info->instance_count; instance++) { +      draw->instance_id = instance + info->start_instance; +      draw_pt_arrays(draw, info->mode, info->start, info->count);     }  } diff --git a/src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h b/src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h index 4bb57b1493..3f66f962e1 100644 --- a/src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h +++ b/src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h @@ -38,7 +38,8 @@ CONCAT(vsplit_primitive_, ELT_TYPE)(struct vsplit_frontend *vsplit,                                      unsigned istart, unsigned icount)  {     struct draw_context *draw = vsplit->draw; -   const ELT_TYPE *ib = (const ELT_TYPE *) draw->pt.user.elts; +   const ELT_TYPE *ib = (const ELT_TYPE *) +      ((const char *) draw->pt.user.elts + draw->pt.index_buffer.offset);     const unsigned min_index = draw->pt.user.min_index;     const unsigned max_index = draw->pt.user.max_index;     const int elt_bias = draw->pt.user.eltBias; @@ -119,7 +120,8 @@ CONCAT(vsplit_segment_cache_, ELT_TYPE)(struct vsplit_frontend *vsplit,                                          boolean close, unsigned iclose)  {     struct draw_context *draw = vsplit->draw; -   const ELT_TYPE *ib = (const ELT_TYPE *) draw->pt.user.elts; +   const ELT_TYPE *ib = (const ELT_TYPE *) +      ((const char *) draw->pt.user.elts + draw->pt.index_buffer.offset);     const int ibias = draw->pt.user.eltBias;     unsigned i; | 
