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