diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-03-01 14:12:22 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-03-01 16:33:40 +0000 |
commit | 69b3f24658b74f15b622adda6464a6fcb87f4ee6 (patch) | |
tree | ad6036218b0fd87c82a8e872a7a95b412cea78f3 /src/mesa/drivers/dri | |
parent | 6ddfb322f58c7e00db73e25689ee55ffa1111bd9 (diff) |
i965: Fix uploading of shortened vertex packets
... handle all cases and not just the interleaved upload.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/mesa/drivers/dri')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_draw_upload.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c index 41565231b5..baf35a6a50 100644 --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c @@ -242,30 +242,31 @@ static GLuint get_index_type(GLenum type) static void copy_array_to_vbo_array(struct brw_context *brw, struct brw_vertex_element *element, - int count, + int min, int max, struct brw_vertex_buffer *buffer, GLuint dst_stride) { + int src_stride = element->glarray->StrideB; + const unsigned char *src = element->glarray->Ptr + min * src_stride; + int count = max - min + 1; GLuint size = count * dst_stride; - buffer->stride = dst_stride; - if (dst_stride == element->glarray->StrideB) { - intel_upload_data(&brw->intel, element->glarray->Ptr, size, dst_stride, + if (dst_stride == src_stride) { + intel_upload_data(&brw->intel, src, size, dst_stride, &buffer->bo, &buffer->offset); } else { - const unsigned char *src = element->glarray->Ptr; - char *map = intel_upload_map(&brw->intel, size, dst_stride); + char * const map = intel_upload_map(&brw->intel, size, dst_stride); char *dst = map; - int i; - for (i = 0; i < count; i++) { + while (count--) { memcpy(dst, src, dst_stride); - src += element->glarray->StrideB; + src += src_stride; dst += dst_stride; } intel_upload_unmap(&brw->intel, map, size, dst_stride, &buffer->bo, &buffer->offset); } + buffer->stride = dst_stride; } static void brw_prepare_vertices(struct brw_context *brw) @@ -413,7 +414,7 @@ static void brw_prepare_vertices(struct brw_context *brw) /* All uploads are interleaved, so upload the arrays together as * interleaved. First, upload the contents and set up upload[0]. */ - copy_array_to_vbo_array(brw, upload[0], max_index - min_index + 1, + copy_array_to_vbo_array(brw, upload[0], min_index, max_index, &brw->vb.buffers[j], interleaved); for (i = 0; i < nr_uploads; i++) { @@ -443,7 +444,7 @@ static void brw_prepare_vertices(struct brw_context *brw) offset = ALIGN(offset, get_size(upload[i]->glarray->Type)); dst = map + offset; - src += min_index * size; + src += min_index * stride; for (n = 0; n < count; n++) { memcpy(dst, src, size); @@ -467,7 +468,7 @@ static void brw_prepare_vertices(struct brw_context *brw) } /* Upload non-interleaved arrays */ for (i = 0; i < nr_uploads; i++) { - copy_array_to_vbo_array(brw, upload[i], max_index - min_index + 1, + copy_array_to_vbo_array(brw, upload[i], min_index, max_index, &brw->vb.buffers[j], upload[i]->element_size); upload[i]->buffer = j++; upload[i]->offset = 0; |