From 85fd380878619ee03453b4e85ebf5b4e9648b496 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mathias=20Fr=C3=B6hlich?= Date: Fri, 1 Mar 2019 09:27:53 +0100 Subject: [PATCH] mesa: Implement helper functions to map and unmap a VAO. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Provide a set of functions that maps or unmaps all VBOs held in a VAO. The functions will be used in the following patches. v2: Update comments. Reviewed-by: Brian Paul Signed-off-by: Mathias Fröhlich --- src/mesa/main/arrayobj.c | 84 ++++++++++++++++++++++++++++++++++++++++ src/mesa/main/arrayobj.h | 18 +++++++++ 2 files changed, 102 insertions(+) diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c index 68d30aa9b1f..63138096da6 100644 --- a/src/mesa/main/arrayobj.c +++ b/src/mesa/main/arrayobj.c @@ -913,6 +913,90 @@ _mesa_all_buffers_are_unmapped(const struct gl_vertex_array_object *vao) return true; } + +/** + * Map buffer objects used in attribute arrays. + */ +void +_mesa_vao_map_arrays(struct gl_context *ctx, struct gl_vertex_array_object *vao, + GLbitfield access) +{ + GLbitfield mask = vao->Enabled & vao->VertexAttribBufferMask; + while (mask) { + /* Do not use u_bit_scan as we can walk multiple attrib arrays at once */ + const gl_vert_attrib attr = ffs(mask) - 1; + const GLubyte bindex = vao->VertexAttrib[attr].BufferBindingIndex; + struct gl_vertex_buffer_binding *binding = &vao->BufferBinding[bindex]; + mask &= ~binding->_BoundArrays; + + struct gl_buffer_object *bo = binding->BufferObj; + assert(_mesa_is_bufferobj(bo)); + if (_mesa_bufferobj_mapped(bo, MAP_INTERNAL)) + continue; + + ctx->Driver.MapBufferRange(ctx, 0, bo->Size, access, bo, MAP_INTERNAL); + } +} + + +/** + * Map buffer objects used in the vao, attribute arrays and index buffer. + */ +void +_mesa_vao_map(struct gl_context *ctx, struct gl_vertex_array_object *vao, + GLbitfield access) +{ + struct gl_buffer_object *bo = vao->IndexBufferObj; + + /* map the index buffer, if there is one, and not already mapped */ + if (_mesa_is_bufferobj(bo) && !_mesa_bufferobj_mapped(bo, MAP_INTERNAL)) + ctx->Driver.MapBufferRange(ctx, 0, bo->Size, access, bo, MAP_INTERNAL); + + _mesa_vao_map_arrays(ctx, vao, access); +} + + +/** + * Unmap buffer objects used in attribute arrays. + */ +void +_mesa_vao_unmap_arrays(struct gl_context *ctx, + struct gl_vertex_array_object *vao) +{ + GLbitfield mask = vao->Enabled & vao->VertexAttribBufferMask; + while (mask) { + /* Do not use u_bit_scan as we can walk multiple attrib arrays at once */ + const gl_vert_attrib attr = ffs(mask) - 1; + const GLubyte bindex = vao->VertexAttrib[attr].BufferBindingIndex; + struct gl_vertex_buffer_binding *binding = &vao->BufferBinding[bindex]; + mask &= ~binding->_BoundArrays; + + struct gl_buffer_object *bo = binding->BufferObj; + assert(_mesa_is_bufferobj(bo)); + if (!_mesa_bufferobj_mapped(bo, MAP_INTERNAL)) + continue; + + ctx->Driver.UnmapBuffer(ctx, bo, MAP_INTERNAL); + } +} + + +/** + * Unmap buffer objects used in the vao, attribute arrays and index buffer. + */ +void +_mesa_vao_unmap(struct gl_context *ctx, struct gl_vertex_array_object *vao) +{ + struct gl_buffer_object *bo = vao->IndexBufferObj; + + /* unmap the index buffer, if there is one, and still mapped */ + if (_mesa_is_bufferobj(bo) && _mesa_bufferobj_mapped(bo, MAP_INTERNAL)) + ctx->Driver.UnmapBuffer(ctx, bo, MAP_INTERNAL); + + _mesa_vao_unmap_arrays(ctx, vao); +} + + /**********************************************************************/ /* API Functions */ /**********************************************************************/ diff --git a/src/mesa/main/arrayobj.h b/src/mesa/main/arrayobj.h index ee87b4b6ba5..7516bae9e39 100644 --- a/src/mesa/main/arrayobj.h +++ b/src/mesa/main/arrayobj.h @@ -100,6 +100,24 @@ extern bool _mesa_all_buffers_are_unmapped(const struct gl_vertex_array_object *vao); +extern void +_mesa_vao_map_arrays(struct gl_context *ctx, struct gl_vertex_array_object *vao, + GLbitfield access); + +extern void +_mesa_vao_map(struct gl_context *ctx, struct gl_vertex_array_object *vao, + GLbitfield access); + + +extern void +_mesa_vao_unmap_arrays(struct gl_context *ctx, + struct gl_vertex_array_object *vao); + +extern void +_mesa_vao_unmap(struct gl_context *ctx, + struct gl_vertex_array_object *vao); + + /** * Array to apply the position/generic0 aliasing map to * an attribute value used in vertex processing inputs to an attribute -- 2.30.2