[Mesa-dev] [PATCH] vbo: Try to reuse the same VAO more often for successive dlists.
Brian Paul
brianp at vmware.com
Fri Mar 2 15:12:04 UTC 2018
On 02/28/2018 10:50 PM, Mathias.Froehlich at gmx.net wrote:
> From: Mathias Fröhlich <mathias.froehlich at web.de>
>
> Hi Brian,
>
> that's what I mentioned yesterday.
> You may want to test this change against your use cases of your recent
> draw primitive optimization.
> With one openscenegraph dlist based workload this change improves the
> framerates on radeonsi by about 10% compared to without that change.
>
> If it helps, please review...
I'll try to re-check the dlist application later. For now though, this
patch looks good. One thing below...
>
> best
> Mathias
>
>
> The change tries to catch more opportunities to reuse the same set
> of VAO's when building up display lists. Instead of checking the
> offset with respect to the beginning of the vertex buffer object
> the change tries to apply this same optimization with respect to the
> previous display list node.
>
> Signed-off-by: Mathias Fröhlich <Mathias.Froehlich at web.de>
> ---
> src/mesa/vbo/vbo_save_api.c | 17 ++++++++++++++---
> 1 file changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c
> index 47ee355e72..c2a9921bb7 100644
> --- a/src/mesa/vbo/vbo_save_api.c
> +++ b/src/mesa/vbo/vbo_save_api.c
> @@ -542,11 +542,18 @@ compile_vertex_list(struct gl_context *ctx)
>
> /* Duplicate our template, increment refcounts to the storage structs:
> */
> + GLintptr old_offset = 0;
> + if (save->VAO[0]) {
> + old_offset = save->VAO[0]->BufferBinding[0].Offset
> + + save->VAO[0]->VertexAttrib[VERT_ATTRIB_POS].RelativeOffset;
> + }
> const GLsizei stride = save->vertex_size*sizeof(GLfloat);
> GLintptr buffer_offset =
> (save->buffer_map - save->vertex_store->buffer_map) * sizeof(GLfloat);
> + assert(old_offset <= buffer_offset);
> + const GLintptr offset_diff = buffer_offset - old_offset;
> GLuint start_offset = 0;
> - if (0 < buffer_offset && 0 < stride && buffer_offset % stride == 0) {
> + if (0 < offset_diff && 0 < stride && offset_diff % stride == 0) {
Minor nit: I find offset_diff > 0 && stride > 0 to be a little easier to
read.
In any case, Reviewed-by: Brian Paul <brianp at vmware.com>
> /* The vertex size is an exact multiple of the buffer offset.
> * This means that we can use zero-based vertex attribute pointers
> * and specify the start of the primitive with the _mesa_prim::start
> @@ -558,8 +565,9 @@ compile_vertex_list(struct gl_context *ctx)
> /* We cannot immediately update the primitives as some methods below
> * still need the uncorrected start vertices
> */
> - start_offset = buffer_offset/stride;
> - buffer_offset = 0;
> + start_offset = offset_diff/stride;
> + assert(old_offset == buffer_offset - offset_diff);
> + buffer_offset = old_offset;
> }
> GLuint offsets[VBO_ATTRIB_MAX];
> for (unsigned i = 0, offset = 0; i < VBO_ATTRIB_MAX; ++i) {
> @@ -666,6 +674,9 @@ compile_vertex_list(struct gl_context *ctx)
> */
> free_vertex_store(ctx, save->vertex_store);
> save->vertex_store = NULL;
> + /* When we have a new vbo, we will for sure need a new vao */
> + for (gl_vertex_processing_mode vpm = 0; vpm < VP_MODE_MAX; ++vpm)
> + _mesa_reference_vao(ctx, &save->VAO[vpm], NULL);
>
> /* Allocate and map new store:
> */
>
More information about the mesa-dev
mailing list