summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2012-10-26 15:48:00 -0700
committerKenneth Graunke <[email protected]>2012-10-31 19:54:36 -0700
commit369419e847d4a3aeac9386b13204f09c689900da (patch)
treebaad0fb922759751e15922cd31a5e504b47ab598 /src/mesa/drivers
parent3d2b4291c2e448fd51c14fc1ff52ceaef00788cc (diff)
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 <[email protected]> Signed-off-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r--src/mesa/drivers/dri/i965/brw_draw_upload.c13
1 files changed, 6 insertions, 7 deletions
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;