Yes, we are not getting the user buffer sizes, because OpenGL lacks
API to set them. The pointer is all you will ever have, just as it was
received from a gl*Pointer call.

Marek

On Thu, May 9, 2013 at 8:29 PM, Zack Rusin <za...@vmware.com> wrote:
> We would crash when stride was bigger than the size of the buffer.
> The correct behavior is to just fetch zero's in this case.
> Unfortunatly with user_buffer's there's no way to validate the size
> because currently we're just not getting it. Adjust the draw interface
> to pass the size along the mapped buffer, which works perfectly
> for buffer backed vertex_buffers and, in future, it will allow
> us to plumb user_buffer sizes through the same interface.
>
> Signed-off-by: Zack Rusin <za...@vmware.com>
> ---
>  src/gallium/auxiliary/draw/draw_context.c          |    6 +-
>  src/gallium/auxiliary/draw/draw_context.h          |    3 +-
>  src/gallium/auxiliary/draw/draw_llvm.c             |   99 
> ++++++++++++++++----
>  src/gallium/auxiliary/draw/draw_llvm.h             |   16 +++-
>  src/gallium/auxiliary/draw/draw_private.h          |   10 +-
>  src/gallium/auxiliary/draw/draw_pt.c               |    7 +-
>  src/gallium/auxiliary/draw/draw_pt_fetch.c         |    4 +-
>  src/gallium/auxiliary/draw/draw_pt_fetch_emit.c    |    2 +-
>  .../auxiliary/draw/draw_pt_fetch_shade_emit.c      |    2 +-
>  .../draw/draw_pt_fetch_shade_pipeline_llvm.c       |    4 +-
>  src/gallium/drivers/i915/i915_context.c            |    4 +-
>  src/gallium/drivers/llvmpipe/lp_draw_arrays.c      |    6 +-
>  src/gallium/drivers/nv30/nv30_draw.c               |    2 +-
>  src/gallium/drivers/r300/r300_state.c              |    4 +-
>  src/gallium/drivers/softpipe/sp_draw_arrays.c      |    6 +-
>  src/gallium/drivers/svga/svga_swtnl_draw.c         |    4 +-
>  src/mesa/state_tracker/st_draw_feedback.c          |    8 +-
>  17 files changed, 142 insertions(+), 45 deletions(-)
>
> diff --git a/src/gallium/auxiliary/draw/draw_context.c 
> b/src/gallium/auxiliary/draw/draw_context.c
> index 6caa62a..4eb1919 100644
> --- a/src/gallium/auxiliary/draw/draw_context.c
> +++ b/src/gallium/auxiliary/draw/draw_context.c
> @@ -364,9 +364,11 @@ draw_set_vertex_elements(struct draw_context *draw,
>   */
>  void
>  draw_set_mapped_vertex_buffer(struct draw_context *draw,
> -                              unsigned attr, const void *buffer)
> +                              unsigned attr, const void *buffer,
> +                              size_t size)
>  {
> -   draw->pt.user.vbuffer[attr] = buffer;
> +   draw->pt.user.vbuffer[attr].map  = buffer;
> +   draw->pt.user.vbuffer[attr].size = size;
>  }
>
>
> diff --git a/src/gallium/auxiliary/draw/draw_context.h 
> b/src/gallium/auxiliary/draw/draw_context.h
> index 94fac88..c7a40a1 100644
> --- a/src/gallium/auxiliary/draw/draw_context.h
> +++ b/src/gallium/auxiliary/draw/draw_context.h
> @@ -215,7 +215,8 @@ void draw_set_indexes(struct draw_context *draw,
>                        const void *elements, unsigned elem_size);
>
>  void draw_set_mapped_vertex_buffer(struct draw_context *draw,
> -                                   unsigned attr, const void *buffer);
> +                                   unsigned attr, const void *buffer,
> +                                   size_t size);
>
>  void
>  draw_set_mapped_constant_buffer(struct draw_context *draw,
> diff --git a/src/gallium/auxiliary/draw/draw_llvm.c 
> b/src/gallium/auxiliary/draw/draw_llvm.c
> index d2821a1..94b18da 100644
> --- a/src/gallium/auxiliary/draw/draw_llvm.c
> +++ b/src/gallium/auxiliary/draw/draw_llvm.c
> @@ -78,6 +78,44 @@ draw_gs_llvm_iface(const struct lp_build_tgsi_gs_iface 
> *iface)
>  }
>
>  /**
> + * Create LLVM type for draw_vertex_buffer.
> + */
> +static LLVMTypeRef
> +create_jit_dvbuffer_type(struct gallivm_state *gallivm,
> +                         const char *struct_name)
> +{
> +   LLVMTargetDataRef target = gallivm->target;
> +   LLVMTypeRef dvbuffer_type;
> +   LLVMTypeRef elem_types[DRAW_JIT_DVBUFFER_NUM_FIELDS];
> +   LLVMTypeRef int32_type = LLVMInt32TypeInContext(gallivm->context);
> +
> +   elem_types[DRAW_JIT_DVBUFFER_MAP] =
> +      LLVMPointerType(LLVMIntTypeInContext(gallivm->context, 8), 0);
> +   elem_types[DRAW_JIT_DVBUFFER_SIZE] = int32_type;
> +
> +   dvbuffer_type = LLVMStructTypeInContext(gallivm->context, elem_types,
> +                                           Elements(elem_types), 0);
> +
> +#if HAVE_LLVM < 0x0300
> +   LLVMAddTypeName(gallivm->module, struct_name, dvbuffer_type);
> +
> +   /* Make sure the target's struct layout cache doesn't return
> +    * stale/invalid data.
> +    */
> +   LLVMInvalidateStructLayout(gallivm->target, dvbuffer_type);
> +#endif
> +
> +   LP_CHECK_MEMBER_OFFSET(struct draw_vertex_buffer, map,
> +                          target, dvbuffer_type,
> +                          DRAW_JIT_DVBUFFER_MAP);
> +   LP_CHECK_MEMBER_OFFSET(struct draw_vertex_buffer, size,
> +                          target, dvbuffer_type,
> +                          DRAW_JIT_DVBUFFER_SIZE);
> +
> +   return dvbuffer_type;
> +}
> +
> +/**
>   * Create LLVM type for struct draw_jit_texture
>   */
>  static LLVMTypeRef
> @@ -328,7 +366,8 @@ create_gs_jit_input_type(struct gallivm_state *gallivm)
>   * Create LLVM type for struct pipe_vertex_buffer
>   */
>  static LLVMTypeRef
> -create_jit_vertex_buffer_type(struct gallivm_state *gallivm, const char 
> *struct_name)
> +create_jit_vertex_buffer_type(struct gallivm_state *gallivm,
> +                              const char *struct_name)
>  {
>     LLVMTargetDataRef target = gallivm->target;
>     LLVMTypeRef elem_types[4];
> @@ -337,7 +376,7 @@ create_jit_vertex_buffer_type(struct gallivm_state 
> *gallivm, const char *struct_
>     elem_types[0] =
>     elem_types[1] = LLVMInt32TypeInContext(gallivm->context);
>     elem_types[2] =
> -   elem_types[3] = LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 
> 0); /* vs_constants */
> +   elem_types[3] = LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 
> 0);
>
>     vb_type = LLVMStructTypeInContext(gallivm->context, elem_types,
>                                       Elements(elem_types), 0);
> @@ -422,7 +461,8 @@ static void
>  create_jit_types(struct draw_llvm_variant *variant)
>  {
>     struct gallivm_state *gallivm = variant->gallivm;
> -   LLVMTypeRef texture_type, sampler_type, context_type, buffer_type, 
> vb_type;
> +   LLVMTypeRef texture_type, sampler_type, context_type, buffer_type,
> +      vb_type;
>
>     texture_type = create_jit_texture_type(gallivm, "texture");
>     sampler_type = create_jit_sampler_type(gallivm, "sampler");
> @@ -431,9 +471,9 @@ create_jit_types(struct draw_llvm_variant *variant)
>                                            "draw_jit_context");
>     variant->context_ptr_type = LLVMPointerType(context_type, 0);
>
> -   buffer_type = LLVMPointerType(LLVMIntTypeInContext(gallivm->context, 8), 
> 0);
> +   buffer_type = create_jit_dvbuffer_type(gallivm, "draw_vertex_buffer");
>     variant->buffer_ptr_type = LLVMPointerType(buffer_type, 0);
> -
> +
>     vb_type = create_jit_vertex_buffer_type(gallivm, "pipe_vertex_buffer");
>     variant->vb_ptr_type = LLVMPointerType(vb_type, 0);
>  }
> @@ -631,7 +671,6 @@ generate_vs(struct draw_llvm_variant *variant,
>     }
>  }
>
> -
>  static void
>  generate_fetch(struct gallivm_state *gallivm,
>                 LLVMValueRef vbuffers_ptr,
> @@ -641,7 +680,8 @@ generate_fetch(struct gallivm_state *gallivm,
>                 LLVMValueRef index,
>                 LLVMValueRef instance_id)
>  {
> -   const struct util_format_description *format_desc = 
> util_format_description(velem->src_format);
> +   const struct util_format_description *format_desc =
> +      util_format_description(velem->src_format);
>     LLVMValueRef zero = 
> LLVMConstNull(LLVMInt32TypeInContext(gallivm->context));
>     LLVMBuilderRef builder = gallivm->builder;
>     LLVMValueRef indices =
> @@ -651,7 +691,14 @@ generate_fetch(struct gallivm_state *gallivm,
>                                             &indices, 1, "");
>     LLVMValueRef vb_stride = draw_jit_vbuffer_stride(gallivm, vbuf);
>     LLVMValueRef vb_buffer_offset = draw_jit_vbuffer_offset(gallivm, vbuf);
> +   LLVMValueRef map_ptr = draw_jit_dvbuffer_map(gallivm, vbuffer_ptr);
> +   LLVMValueRef buffer_size = draw_jit_dvbuffer_size(gallivm, vbuffer_ptr);
>     LLVMValueRef stride;
> +   LLVMValueRef buffer_overflowed;
> +   LLVMValueRef temp_ptr =
> +      lp_build_alloca(gallivm,
> +                      lp_build_vec_type(gallivm, lp_float32_vec4_type()), 
> "");
> +   struct lp_build_if_state if_ctx;
>
>     if (velem->instance_divisor) {
>        /* array index = instance_id / instance_divisor */
> @@ -662,8 +709,6 @@ generate_fetch(struct gallivm_state *gallivm,
>
>     stride = LLVMBuildMul(builder, vb_stride, index, "");
>
> -   vbuffer_ptr = LLVMBuildLoad(builder, vbuffer_ptr, "vbuffer");
> -
>     stride = LLVMBuildAdd(builder, stride,
>                           vb_buffer_offset,
>                           "");
> @@ -671,14 +716,36 @@ generate_fetch(struct gallivm_state *gallivm,
>                           lp_build_const_int32(gallivm, velem->src_offset),
>                           "");
>
> -/*   lp_build_printf(gallivm, "vbuf index = %d, stride is %d\n", indices, 
> stride);*/
> -   vbuffer_ptr = LLVMBuildGEP(builder, vbuffer_ptr, &stride, 1, "");
> +   buffer_overflowed = LLVMBuildICmp(builder, LLVMIntUGE,
> +                                     stride, buffer_size,
> +                                     "buffer_overflowed");
> +   /*
> +   lp_build_printf(gallivm, "vbuf index = %d, stride is %d\n", indices, 
> stride);
> +   lp_build_print_value(gallivm, "   buffer size = ", buffer_size);
> +   lp_build_print_value(gallivm, "   buffer overflowed = ", 
> buffer_overflowed);
> +   */
> +
> +   lp_build_if(&if_ctx, gallivm, buffer_overflowed);
> +   {
> +      LLVMValueRef val =
> +         lp_build_const_vec(gallivm, lp_float32_vec4_type(), 0);
> +      LLVMBuildStore(builder, val, temp_ptr);
> +   }
> +   lp_build_else(&if_ctx);
> +   {
> +      LLVMValueRef val;
> +      map_ptr = LLVMBuildGEP(builder, map_ptr, &stride, 1, "");
> +
> +      val = lp_build_fetch_rgba_aos(gallivm,
> +                                    format_desc,
> +                                    lp_float32_vec4_type(),
> +                                    map_ptr,
> +                                    zero, zero, zero);
> +      LLVMBuildStore(builder, val, temp_ptr);
> +   }
> +   lp_build_endif(&if_ctx);
>
> -   *res = lp_build_fetch_rgba_aos(gallivm,
> -                                  format_desc,
> -                                  lp_float32_vec4_type(),
> -                                  vbuffer_ptr,
> -                                  zero, zero, zero);
> +   *res = LLVMBuildLoad(builder, temp_ptr, "aos");
>  }
>
>  static void
> diff --git a/src/gallium/auxiliary/draw/draw_llvm.h 
> b/src/gallium/auxiliary/draw/draw_llvm.h
> index 5909fc1..d517b29 100644
> --- a/src/gallium/auxiliary/draw/draw_llvm.h
> +++ b/src/gallium/auxiliary/draw/draw_llvm.h
> @@ -173,6 +173,18 @@ enum {
>  #define draw_jit_vbuffer_offset(_gallivm, _ptr)         \
>     lp_build_struct_get(_gallivm, _ptr, 1, "buffer_offset")
>
> +enum {
> +   DRAW_JIT_DVBUFFER_MAP = 0,
> +   DRAW_JIT_DVBUFFER_SIZE,
> +   DRAW_JIT_DVBUFFER_NUM_FIELDS  /* number of fields above */
> +};
> +
> +#define draw_jit_dvbuffer_map(_gallivm, _ptr)         \
> +   lp_build_struct_get(_gallivm, _ptr, DRAW_JIT_DVBUFFER_MAP, "map")
> +
> +#define draw_jit_dvbuffer_size(_gallivm, _ptr)        \
> +   lp_build_struct_get(_gallivm, _ptr, DRAW_JIT_DVBUFFER_SIZE, "size")
> +
>
>  /**
>   * This structure is passed directly to the generated geometry shader.
> @@ -246,7 +258,7 @@ enum {
>  typedef int
>  (*draw_jit_vert_func)(struct draw_jit_context *context,
>                        struct vertex_header *io,
> -                      const char *vbuffers[PIPE_MAX_ATTRIBS],
> +                      const struct draw_vertex_buffer 
> vbuffers[PIPE_MAX_ATTRIBS],
>                        unsigned start,
>                        unsigned count,
>                        unsigned stride,
> @@ -257,7 +269,7 @@ typedef int
>  typedef int
>  (*draw_jit_vert_func_elts)(struct draw_jit_context *context,
>                             struct vertex_header *io,
> -                           const char *vbuffers[PIPE_MAX_ATTRIBS],
> +                           const struct draw_vertex_buffer 
> vbuffers[PIPE_MAX_ATTRIBS],
>                             const unsigned *fetch_elts,
>                             unsigned fetch_count,
>                             unsigned stride,
> diff --git a/src/gallium/auxiliary/draw/draw_private.h 
> b/src/gallium/auxiliary/draw/draw_private.h
> index 25a8ae6..84344c3 100644
> --- a/src/gallium/auxiliary/draw/draw_private.h
> +++ b/src/gallium/auxiliary/draw/draw_private.h
> @@ -67,6 +67,14 @@ struct draw_pt_front_end;
>
>
>  /**
> + * Represents the mapped vertex buffer.
> + */
> +struct draw_vertex_buffer {
> +   const void *map;
> +   size_t size;
> +};
> +
> +/**
>   * Basic vertex info.
>   * Carry some useful information around with the vertices in the prim pipe.
>   */
> @@ -183,7 +191,7 @@ struct draw_context
>           unsigned max_index;
>
>           /** vertex arrays */
> -         const void *vbuffer[PIPE_MAX_ATTRIBS];
> +         struct draw_vertex_buffer vbuffer[PIPE_MAX_ATTRIBS];
>
>           /** constant buffers (for vertex/geometry shader) */
>           const void *vs_constants[PIPE_MAX_CONSTANT_BUFFERS];
> diff --git a/src/gallium/auxiliary/draw/draw_pt.c 
> b/src/gallium/auxiliary/draw/draw_pt.c
> index 602d076..a797d65 100644
> --- a/src/gallium/auxiliary/draw/draw_pt.c
> +++ b/src/gallium/auxiliary/draw/draw_pt.c
> @@ -282,7 +282,7 @@ draw_print_arrays(struct draw_context *draw, uint prim, 
> int start, uint count)
>
>        for (j = 0; j < draw->pt.nr_vertex_elements; j++) {
>           uint buf = draw->pt.vertex_element[j].vertex_buffer_index;
> -         ubyte *ptr = (ubyte *) draw->pt.user.vbuffer[buf];
> +         ubyte *ptr = (ubyte *) draw->pt.user.vbuffer[buf].map;
>
>           if (draw->pt.vertex_element[j].instance_divisor) {
>              ii = draw->instance_id / 
> draw->pt.vertex_element[j].instance_divisor;
> @@ -524,11 +524,12 @@ draw_vbo(struct draw_context *draw,
>        }
>        debug_printf("Buffers:\n");
>        for (i = 0; i < draw->pt.nr_vertex_buffers; i++) {
> -         debug_printf("  %u: stride=%u offset=%u ptr=%p\n",
> +         debug_printf("  %u: stride=%u offset=%u size=%d ptr=%p\n",
>                        i,
>                        draw->pt.vertex_buffer[i].stride,
>                        draw->pt.vertex_buffer[i].buffer_offset,
> -                      draw->pt.user.vbuffer[i]);
> +                      draw->pt.user.vbuffer[i].size,
> +                      draw->pt.user.vbuffer[i].map);
>        }
>     }
>
> diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch.c 
> b/src/gallium/auxiliary/draw/draw_pt_fetch.c
> index 9fab7b6..3740dea 100644
> --- a/src/gallium/auxiliary/draw/draw_pt_fetch.c
> +++ b/src/gallium/auxiliary/draw/draw_pt_fetch.c
> @@ -159,7 +159,7 @@ draw_pt_fetch_run(struct pt_fetch *fetch,
>     for (i = 0; i < draw->pt.nr_vertex_buffers; i++) {
>        translate->set_buffer(translate,
>                             i,
> -                           ((char *)draw->pt.user.vbuffer[i] +
> +                           ((char *)draw->pt.user.vbuffer[i].map +
>                              draw->pt.vertex_buffer[i].buffer_offset),
>                             draw->pt.vertex_buffer[i].stride,
>                             draw->pt.max_index);
> @@ -186,7 +186,7 @@ draw_pt_fetch_run_linear(struct pt_fetch *fetch,
>     for (i = 0; i < draw->pt.nr_vertex_buffers; i++) {
>        translate->set_buffer(translate,
>                             i,
> -                           ((char *)draw->pt.user.vbuffer[i] +
> +                           ((char *)draw->pt.user.vbuffer[i].map +
>                              draw->pt.vertex_buffer[i].buffer_offset),
>                             draw->pt.vertex_buffer[i].stride,
>                             draw->pt.max_index);
> diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c 
> b/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c
> index f30db13..dc6decb 100644
> --- a/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c
> +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c
> @@ -169,7 +169,7 @@ static void fetch_emit_prepare( struct draw_pt_middle_end 
> *middle,
>     for (i = 0; i < draw->pt.nr_vertex_buffers; i++) {
>        feme->translate->set_buffer(feme->translate,
>                                    i,
> -                                  ((char *)draw->pt.user.vbuffer[i] +
> +                                  ((char *)draw->pt.user.vbuffer[i].map +
>                                     draw->pt.vertex_buffer[i].buffer_offset),
>                                    draw->pt.vertex_buffer[i].stride,
>                                    draw->pt.max_index);
> diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c 
> b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c
> index 870b23b..d30cd41 100644
> --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c
> +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c
> @@ -159,7 +159,7 @@ fse_prepare(struct draw_pt_middle_end *middle,
>     for (i = 0; i < draw->pt.nr_vertex_buffers; i++) {
>        fse->active->set_buffer( fse->active,
>                                 i,
> -                               ((const ubyte *) draw->pt.user.vbuffer[i] +
> +                               ((const ubyte *) draw->pt.user.vbuffer[i].map 
> +
>                                  draw->pt.vertex_buffer[i].buffer_offset),
>                                draw->pt.vertex_buffer[i].stride,
>                                draw->pt.max_index );
> diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c 
> b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
> index 1924c73..bc99c16 100644
> --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
> +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
> @@ -348,7 +348,7 @@ llvm_pipeline_generic( struct draw_pt_middle_end *middle,
>     if (fetch_info->linear)
>        clipped = fpme->current_variant->jit_func( &fpme->llvm->jit_context,
>                                         llvm_vert_info.verts,
> -                                       (const char **)draw->pt.user.vbuffer,
> +                                       draw->pt.user.vbuffer,
>                                         fetch_info->start,
>                                         fetch_info->count,
>                                         fpme->vertex_size,
> @@ -357,7 +357,7 @@ llvm_pipeline_generic( struct draw_pt_middle_end *middle,
>     else
>        clipped = fpme->current_variant->jit_func_elts( 
> &fpme->llvm->jit_context,
>                                              llvm_vert_info.verts,
> -                                            (const char 
> **)draw->pt.user.vbuffer,
> +                                            draw->pt.user.vbuffer,
>                                              fetch_info->elts,
>                                              fetch_info->count,
>                                              fpme->vertex_size,
> diff --git a/src/gallium/drivers/i915/i915_context.c 
> b/src/gallium/drivers/i915/i915_context.c
> index 0ee6c0e..90427dc 100644
> --- a/src/gallium/drivers/i915/i915_context.c
> +++ b/src/gallium/drivers/i915/i915_context.c
> @@ -71,7 +71,7 @@ i915_draw_vbo(struct pipe_context *pipe, const struct 
> pipe_draw_info *info)
>        const void *buf = i915->vertex_buffers[i].user_buffer;
>        if (!buf)
>              buf = i915_buffer(i915->vertex_buffers[i].buffer)->data;
> -      draw_set_mapped_vertex_buffer(draw, i, buf);
> +      draw_set_mapped_vertex_buffer(draw, i, buf, ~0);
>     }
>
>     /*
> @@ -106,7 +106,7 @@ i915_draw_vbo(struct pipe_context *pipe, const struct 
> pipe_draw_info *info)
>      * unmap vertex/index buffers
>      */
>     for (i = 0; i < i915->nr_vertex_buffers; i++) {
> -      draw_set_mapped_vertex_buffer(i915->draw, i, NULL);
> +      draw_set_mapped_vertex_buffer(i915->draw, i, NULL, 0);
>     }
>     if (mapped_indices)
>        draw_set_indexes(draw, NULL, 0);
> diff --git a/src/gallium/drivers/llvmpipe/lp_draw_arrays.c 
> b/src/gallium/drivers/llvmpipe/lp_draw_arrays.c
> index fc947b1..63c22c3 100644
> --- a/src/gallium/drivers/llvmpipe/lp_draw_arrays.c
> +++ b/src/gallium/drivers/llvmpipe/lp_draw_arrays.c
> @@ -68,13 +68,15 @@ llvmpipe_draw_vbo(struct pipe_context *pipe, const struct 
> pipe_draw_info *info)
>      */
>     for (i = 0; i < lp->num_vertex_buffers; i++) {
>        const void *buf = lp->vertex_buffer[i].user_buffer;
> +      size_t size = ~0;
>        if (!buf) {
>           if (!lp->vertex_buffer[i].buffer) {
>              continue;
>           }
>           buf = llvmpipe_resource_data(lp->vertex_buffer[i].buffer);
> +         size = lp->vertex_buffer[i].buffer->width0;
>        }
> -      draw_set_mapped_vertex_buffer(draw, i, buf);
> +      draw_set_mapped_vertex_buffer(draw, i, buf, size);
>     }
>
>     /* Map index buffer, if present */
> @@ -121,7 +123,7 @@ llvmpipe_draw_vbo(struct pipe_context *pipe, const struct 
> pipe_draw_info *info)
>      * unmap vertex/index buffers
>      */
>     for (i = 0; i < lp->num_vertex_buffers; i++) {
> -      draw_set_mapped_vertex_buffer(draw, i, NULL);
> +      draw_set_mapped_vertex_buffer(draw, i, NULL, 0);
>     }
>     if (mapped_indices) {
>        draw_set_indexes(draw, NULL, 0);
> diff --git a/src/gallium/drivers/nv30/nv30_draw.c 
> b/src/gallium/drivers/nv30/nv30_draw.c
> index 4dd0df3..92185c9 100644
> --- a/src/gallium/drivers/nv30/nv30_draw.c
> +++ b/src/gallium/drivers/nv30/nv30_draw.c
> @@ -412,7 +412,7 @@ nv30_render_vbo(struct pipe_context *pipe, const struct 
> pipe_draw_info *info)
>                                    PIPE_TRANSFER_UNSYNCHRONIZED |
>                                    PIPE_TRANSFER_READ, &transfer[i]);
>        }
> -      draw_set_mapped_vertex_buffer(draw, i, map);
> +      draw_set_mapped_vertex_buffer(draw, i, map, ~0);
>     }
>
>     if (info->indexed) {
> diff --git a/src/gallium/drivers/r300/r300_state.c 
> b/src/gallium/drivers/r300/r300_state.c
> index 2de0fd6..b3e25e1 100644
> --- a/src/gallium/drivers/r300/r300_state.c
> +++ b/src/gallium/drivers/r300/r300_state.c
> @@ -1821,10 +1821,10 @@ static void r300_set_vertex_buffers_swtcl(struct 
> pipe_context* pipe,
>      for (i = 0; i < count; i++) {
>          if (buffers[i].user_buffer) {
>              draw_set_mapped_vertex_buffer(r300->draw, start_slot + i,
> -                                          buffers[i].user_buffer);
> +                                          buffers[i].user_buffer, ~0);
>          } else if (buffers[i].buffer) {
>              draw_set_mapped_vertex_buffer(r300->draw, start_slot + i,
> -                r300_resource(buffers[i].buffer)->malloced_buffer);
> +                                          
> r300_resource(buffers[i].buffer)->malloced_buffer, ~0);
>          }
>      }
>  }
> diff --git a/src/gallium/drivers/softpipe/sp_draw_arrays.c 
> b/src/gallium/drivers/softpipe/sp_draw_arrays.c
> index 0eb9c50..839fd22 100644
> --- a/src/gallium/drivers/softpipe/sp_draw_arrays.c
> +++ b/src/gallium/drivers/softpipe/sp_draw_arrays.c
> @@ -76,13 +76,15 @@ softpipe_draw_vbo(struct pipe_context *pipe,
>     /* Map vertex buffers */
>     for (i = 0; i < sp->num_vertex_buffers; i++) {
>        const void *buf = sp->vertex_buffer[i].user_buffer;
> +      size_t size = ~0;
>        if (!buf) {
>           if (!sp->vertex_buffer[i].buffer) {
>              continue;
>           }
>           buf = softpipe_resource(sp->vertex_buffer[i].buffer)->data;
> +         size = sp->vertex_buffer[i].buffer->width0;
>        }
> -      draw_set_mapped_vertex_buffer(draw, i, buf);
> +      draw_set_mapped_vertex_buffer(draw, i, buf, size);
>     }
>
>     /* Map index buffer, if present */
> @@ -120,7 +122,7 @@ softpipe_draw_vbo(struct pipe_context *pipe,
>
>     /* unmap vertex/index buffers - will cause draw module to flush */
>     for (i = 0; i < sp->num_vertex_buffers; i++) {
> -      draw_set_mapped_vertex_buffer(draw, i, NULL);
> +      draw_set_mapped_vertex_buffer(draw, i, NULL, 0);
>     }
>     if (mapped_indices) {
>        draw_set_indexes(draw, NULL, 0);
> diff --git a/src/gallium/drivers/svga/svga_swtnl_draw.c 
> b/src/gallium/drivers/svga/svga_swtnl_draw.c
> index bb57f6f..850575c 100644
> --- a/src/gallium/drivers/svga/svga_swtnl_draw.c
> +++ b/src/gallium/drivers/svga/svga_swtnl_draw.c
> @@ -72,7 +72,7 @@ svga_swtnl_draw_vbo(struct svga_context *svga,
>                                 PIPE_TRANSFER_READ,
>                                 &vb_transfer[i]);
>
> -         draw_set_mapped_vertex_buffer(draw, i, map);
> +         draw_set_mapped_vertex_buffer(draw, i, map, ~0);
>        }
>     }
>
> @@ -112,7 +112,7 @@ svga_swtnl_draw_vbo(struct svga_context *svga,
>     for (i = 0; i < svga->curr.num_vertex_buffers; i++) {
>        if (svga->curr.vb[i].buffer) {
>           pipe_buffer_unmap(&svga->pipe, vb_transfer[i]);
> -         draw_set_mapped_vertex_buffer(draw, i, NULL);
> +         draw_set_mapped_vertex_buffer(draw, i, NULL, 0);
>        }
>     }
>
> diff --git a/src/mesa/state_tracker/st_draw_feedback.c 
> b/src/mesa/state_tracker/st_draw_feedback.c
> index cdad2d9..ecd4661 100644
> --- a/src/mesa/state_tracker/st_draw_feedback.c
> +++ b/src/mesa/state_tracker/st_draw_feedback.c
> @@ -175,7 +175,8 @@ st_feedback_draw_vbo(struct gl_context *ctx,
>           map = pipe_buffer_map(pipe, vbuffers[attr].buffer,
>                                 PIPE_TRANSFER_READ,
>                                 &vb_transfer[attr]);
> -         draw_set_mapped_vertex_buffer(draw, attr, map);
> +         draw_set_mapped_vertex_buffer(draw, attr, map,
> +                                       vbuffers[attr].buffer->width0);
>        }
>        else {
>           vbuffers[attr].buffer = NULL;
> @@ -183,7 +184,8 @@ st_feedback_draw_vbo(struct gl_context *ctx,
>           vbuffers[attr].buffer_offset = 0;
>           velements[attr].src_offset = 0;
>
> -         draw_set_mapped_vertex_buffer(draw, attr, 
> vbuffers[attr].user_buffer);
> +         draw_set_mapped_vertex_buffer(draw, attr, 
> vbuffers[attr].user_buffer,
> +                                       ~0);
>        }
>
>        /* common-case setup */
> @@ -260,7 +262,7 @@ st_feedback_draw_vbo(struct gl_context *ctx,
>     for (attr = 0; attr < vp->num_inputs; attr++) {
>        if (vb_transfer[attr])
>           pipe_buffer_unmap(pipe, vb_transfer[attr]);
> -      draw_set_mapped_vertex_buffer(draw, attr, NULL);
> +      draw_set_mapped_vertex_buffer(draw, attr, NULL, 0);
>        pipe_resource_reference(&vbuffers[attr].buffer, NULL);
>     }
>     draw_set_vertex_buffers(draw, 0, vp->num_inputs, NULL);
> --
> 1.7.10.4
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to