diff options
author | Mathias Fröhlich <[email protected]> | 2019-03-01 09:27:53 +0100 |
---|---|---|
committer | Mathias Fröhlich <[email protected]> | 2019-03-15 06:06:42 +0100 |
commit | 85fd380878619ee03453b4e85ebf5b4e9648b496 (patch) | |
tree | a93de1430229164b8bda1f26c93b93b0e319e8fd /src/mesa | |
parent | efa4fc0ebd96b3fbcf30550494251307f11dc7b9 (diff) |
mesa: Implement helper functions to map and unmap a VAO.
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 <[email protected]>
Signed-off-by: Mathias Fröhlich <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/main/arrayobj.c | 84 | ||||
-rw-r--r-- | src/mesa/main/arrayobj.h | 18 |
2 files changed, 102 insertions, 0 deletions
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 |