From 7e1b57a6d964ac58e84ec4ece2951e4e643d6b1a Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Thu, 16 Apr 2020 09:46:04 -0700 Subject: [PATCH] mesa: avoid redundant VBO updates MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Avoids re-emitting unchanged VBO state, which is a big chunk of the state updates in gfxbench driver2 Signed-off-by: Rob Clark Reviewed-by: Kristian H. Kristensen Reviewed-by: Eric Anholt Reviewed-by: Marek Olšák Part-of: --- src/mesa/main/varray.c | 23 ++++++++++++++--------- src/mesa/vbo/vbo_private.h | 7 +------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index 559ff9d949f..71ba518f2d1 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -627,14 +627,21 @@ _mesa_update_array_format(struct gl_context *ctx, GLuint relativeOffset) { struct gl_array_attributes *const array = &vao->VertexAttrib[attrib]; + struct gl_vertex_format new_format; assert(!vao->SharedAndImmutable); assert(size <= 4); - array->RelativeOffset = relativeOffset; - _mesa_set_vertex_format(&array->Format, size, type, format, + _mesa_set_vertex_format(&new_format, size, type, format, normalized, integer, doubles); + if ((array->RelativeOffset == relativeOffset) && + !memcmp(&new_format, &array->Format, sizeof(new_format))) + return; + + array->RelativeOffset = relativeOffset; + array->Format = new_format; + vao->NewArrays |= vao->Enabled & VERT_BIT(attrib); } @@ -891,13 +898,11 @@ update_array(struct gl_context *ctx, /* The Stride and Ptr fields are not set by update_array_format() */ struct gl_array_attributes *array = &vao->VertexAttrib[attrib]; - array->Stride = stride; - /* For updating the pointer we would need to add the vao->NewArrays flag - * to the VAO. But but that is done already unconditionally in - * _mesa_update_array_format called above. - */ - assert((vao->NewArrays | ~vao->Enabled) & VERT_BIT(attrib)); - array->Ptr = ptr; + if ((array->Stride != stride) || (array->Ptr != ptr)) { + array->Stride = stride; + array->Ptr = ptr; + vao->NewArrays |= vao->Enabled & VERT_BIT(attrib); + } /* Update the vertex buffer binding */ GLsizei effectiveStride = stride != 0 ? diff --git a/src/mesa/vbo/vbo_private.h b/src/mesa/vbo/vbo_private.h index a70ba0a032c..85396654682 100644 --- a/src/mesa/vbo/vbo_private.h +++ b/src/mesa/vbo/vbo_private.h @@ -243,12 +243,7 @@ _vbo_set_attrib_format(struct gl_context *ctx, size /= 2; _mesa_update_array_format(ctx, vao, attr, size, type, GL_RGBA, GL_FALSE, integer, doubles, offset); - /* Ptr for userspace arrays. - * For updating the pointer we would need to add the vao->NewArrays flag - * to the VAO. But but that is done already unconditionally in - * _mesa_update_array_format called above. - */ - assert((vao->NewArrays | ~vao->Enabled) & VERT_BIT(attr)); + vao->NewArrays |= vao->Enabled & VERT_BIT(attr); vao->VertexAttrib[attr].Ptr = ADD_POINTERS(buffer_offset, offset); } -- 2.30.2