From: Kenneth Graunke Date: Fri, 26 Oct 2012 22:48:00 +0000 (-0700) Subject: i965: Don't replicate data for zero-stride arrays when copying to VBOs. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=369419e847d4a3aeac9386b13204f09c689900da;p=mesa.git i965: Don't replicate data for zero-stride arrays when copying to VBOs. When copy_array_to_vbo_array encountered an array with src_stride == 0 and dst_stride != 0, we would replicate out the single element to the whole size (max - min + 1). This is unnecessary: we can simply upload one copy and set the buffer's stride to 0. Decreases vertex upload overhead in an upcoming Steam for Linux title. Prior to this patch, copy_array_to_vbo_array appeared very high in the profile (Eric quoted 20%). After the patch, it disappeared completely. Reviewed-by: Eric Anholt Signed-off-by: Kenneth Graunke --- diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c index 722166ce1a8..ad7fe7c7f74 100644 --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c @@ -311,13 +311,13 @@ copy_array_to_vbo_array(struct brw_context *brw, struct brw_vertex_buffer *buffer, GLuint dst_stride) { - if (min == -1) { - /* If we don't have computed min/max bounds, then this must be a use of - * the current attribute, which has a 0 stride. Otherwise, we wouldn't - * know what data to upload. - */ - assert(element->glarray->StrideB == 0); + const int src_stride = element->glarray->StrideB; + /* If the source stride is zero, we just want to upload the current + * attribute once and set the buffer's stride to 0. There's no need + * to replicate it out. + */ + if (src_stride == 0) { intel_upload_data(&brw->intel, element->glarray->Ptr, element->element_size, element->element_size, @@ -327,7 +327,6 @@ copy_array_to_vbo_array(struct brw_context *brw, return; } - 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;