summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMathias Fröhlich <[email protected]>2019-03-01 09:27:53 +0100
committerMathias Fröhlich <[email protected]>2019-03-15 06:06:42 +0100
commit85fd380878619ee03453b4e85ebf5b4e9648b496 (patch)
treea93de1430229164b8bda1f26c93b93b0e319e8fd /src
parentefa4fc0ebd96b3fbcf30550494251307f11dc7b9 (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')
-rw-r--r--src/mesa/main/arrayobj.c84
-rw-r--r--src/mesa/main/arrayobj.h18
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