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 <brianp@vmware.com>
Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
This commit is contained in:
Mathias Fröhlich
2019-03-01 09:27:53 +01:00
parent efa4fc0ebd
commit 85fd380878
2 changed files with 102 additions and 0 deletions

View File

@@ -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 */
/**********************************************************************/