From 3a57aa65d75af0d71bda9c1bde8fe8118ce7c7d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Tue, 5 Mar 2019 18:36:41 +0100 Subject: [core] move VertexBuffer<> to gfx namespace --- src/core-files.json | 1 + src/mbgl/gfx/vertex_buffer.hpp | 25 ++++++++++++++++++++++ src/mbgl/gl/attribute.hpp | 19 ++++++++-------- src/mbgl/gl/context.cpp | 10 +++++---- src/mbgl/gl/context.hpp | 14 ++++++------ src/mbgl/gl/program.hpp | 2 +- src/mbgl/gl/value.cpp | 3 ++- src/mbgl/gl/vertex_buffer.hpp | 8 ++++--- src/mbgl/layout/symbol_projection.hpp | 2 +- src/mbgl/programs/collision_box_program.hpp | 8 +++---- src/mbgl/programs/program.hpp | 2 +- src/mbgl/programs/symbol_program.hpp | 6 +++--- src/mbgl/renderer/buckets/circle_bucket.hpp | 4 ++-- src/mbgl/renderer/buckets/debug_bucket.hpp | 4 ++-- src/mbgl/renderer/buckets/fill_bucket.hpp | 4 ++-- .../renderer/buckets/fill_extrusion_bucket.hpp | 4 ++-- src/mbgl/renderer/buckets/heatmap_bucket.hpp | 4 ++-- src/mbgl/renderer/buckets/hillshade_bucket.hpp | 4 ++-- src/mbgl/renderer/buckets/line_bucket.hpp | 4 ++-- src/mbgl/renderer/buckets/raster_bucket.hpp | 4 ++-- src/mbgl/renderer/buckets/symbol_bucket.hpp | 18 ++++++++-------- src/mbgl/renderer/paint_property_binder.hpp | 10 ++++----- src/mbgl/renderer/render_static_data.hpp | 8 +++---- 23 files changed, 100 insertions(+), 68 deletions(-) create mode 100644 src/mbgl/gfx/vertex_buffer.hpp diff --git a/src/core-files.json b/src/core-files.json index 7b07dcde5c..1390b7607c 100644 --- a/src/core-files.json +++ b/src/core-files.json @@ -506,6 +506,7 @@ "mbgl/gfx/stencil_mode.hpp": "src/mbgl/gfx/stencil_mode.hpp", "mbgl/gfx/types.hpp": "src/mbgl/gfx/types.hpp", "mbgl/gfx/uniform.hpp": "src/mbgl/gfx/uniform.hpp", + "mbgl/gfx/vertex_buffer.hpp": "src/mbgl/gfx/vertex_buffer.hpp", "mbgl/gfx/vertex_vector.hpp": "src/mbgl/gfx/vertex_vector.hpp", "mbgl/gl/attribute.hpp": "src/mbgl/gl/attribute.hpp", "mbgl/gl/context.hpp": "src/mbgl/gl/context.hpp", diff --git a/src/mbgl/gfx/vertex_buffer.hpp b/src/mbgl/gfx/vertex_buffer.hpp new file mode 100644 index 0000000000..2ed1e62759 --- /dev/null +++ b/src/mbgl/gfx/vertex_buffer.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include + +namespace mbgl { +namespace gfx { + +class VertexBufferResource { +protected: + VertexBufferResource() = default; +public: + virtual ~VertexBufferResource() = default; +}; + +// This class has a template argument that we use to specify the vertex type. It is not used by +// the implementation, but serves type checking purposes during build time. +template +class VertexBuffer { +public: + std::size_t elements; + std::unique_ptr resource; +}; + +} // namespace gfx +} // namespace mbgl diff --git a/src/mbgl/gl/attribute.hpp b/src/mbgl/gl/attribute.hpp index 53ba71a89f..dc112c1ad8 100644 --- a/src/mbgl/gl/attribute.hpp +++ b/src/mbgl/gl/attribute.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -22,13 +22,14 @@ class AttributeBinding { public: gfx::AttributeDescriptor attribute; uint8_t vertexStride; - BufferID vertexBuffer; + const gfx::VertexBufferResource* vertexBufferResource; uint32_t vertexOffset; - friend bool operator==(const AttributeBinding& lhs, - const AttributeBinding& rhs) { - return std::tie(lhs.attribute, lhs.vertexStride, lhs.vertexBuffer, lhs.vertexOffset) - == std::tie(rhs.attribute, rhs.vertexStride, rhs.vertexBuffer, rhs.vertexOffset); + friend bool operator==(const AttributeBinding& lhs, const AttributeBinding& rhs) { + return lhs.attribute == rhs.attribute && + lhs.vertexStride == rhs.vertexStride && + lhs.vertexBufferResource == rhs.vertexBufferResource && + lhs.vertexOffset == rhs.vertexOffset; } }; @@ -40,12 +41,12 @@ using AttributeBindingArray = std::vector>; a buffer with only one float for each vertex can be bound to a `vec2` attribute */ template -AttributeBinding attributeBinding(const VertexBuffer& buffer) { +AttributeBinding attributeBinding(const gfx::VertexBuffer& buffer) { static_assert(I < gfx::VertexDescriptorOf::data.count, "vertex attribute index out of range"); return { gfx::VertexDescriptorOf::data.attributes[I], gfx::VertexDescriptorOf::data.stride, - buffer.buffer, + buffer.resource.get(), 0, }; } @@ -106,7 +107,7 @@ public: return result; } - static Bindings bindings(const VertexBuffer>& buffer) { + static Bindings bindings(const gfx::VertexBuffer>& buffer) { return Bindings { attributeBinding::value>(buffer)... }; } diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index 6fda803a94..9904c43145 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -248,17 +249,18 @@ void Context::verifyProgramLinkage(ProgramID program_) { throw std::runtime_error("program failed to link"); } -UniqueBuffer Context::createVertexBuffer(const void* data, std::size_t size, const BufferUsage usage) { +std::unique_ptr +Context::createVertexBuffer(const void* data, std::size_t size, const BufferUsage usage) { BufferID id = 0; MBGL_CHECK_ERROR(glGenBuffers(1, &id)); UniqueBuffer result { std::move(id), { this } }; vertexBuffer = result; MBGL_CHECK_ERROR(glBufferData(GL_ARRAY_BUFFER, size, data, static_cast(usage))); - return result; + return std::make_unique(std::move(result)); } -void Context::updateVertexBuffer(UniqueBuffer& buffer, const void* data, std::size_t size) { - vertexBuffer = buffer; +void Context::updateVertexBuffer(const gfx::VertexBufferResource& resource, const void* data, std::size_t size) { + vertexBuffer = reinterpret_cast(resource).buffer; MBGL_CHECK_ERROR(glBufferSubData(GL_ARRAY_BUFFER, 0, size, data)); } diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index 2fe0d788bf..4d4a538234 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include @@ -66,17 +66,17 @@ public: optional> getBinaryProgram(ProgramID) const; template - VertexBuffer createVertexBuffer(gfx::VertexVector&& v, const BufferUsage usage = BufferUsage::StaticDraw) { - return VertexBuffer { + gfx::VertexBuffer createVertexBuffer(gfx::VertexVector&& v, const BufferUsage usage = BufferUsage::StaticDraw) { + return { v.elements(), createVertexBuffer(v.data(), v.bytes(), usage) }; } template - void updateVertexBuffer(VertexBuffer& buffer, gfx::VertexVector&& v) { + void updateVertexBuffer(gfx::VertexBuffer& buffer, gfx::VertexVector&& v) { assert(v.elements() == buffer.elements); - updateVertexBuffer(buffer.buffer, v.data(), v.bytes()); + updateVertexBuffer(*buffer.resource, v.data(), v.bytes()); } template @@ -274,8 +274,8 @@ private: State pointSize; #endif // MBGL_USE_GLES2 - UniqueBuffer createVertexBuffer(const void* data, std::size_t size, const BufferUsage usage); - void updateVertexBuffer(UniqueBuffer& buffer, const void* data, std::size_t size); + std::unique_ptr createVertexBuffer(const void* data, std::size_t size, const BufferUsage usage); + void updateVertexBuffer(const gfx::VertexBufferResource&, const void* data, std::size_t size); std::unique_ptr createIndexBuffer(const void* data, std::size_t size, const BufferUsage usage); void updateIndexBuffer(const gfx::IndexBufferResource&, const void* data, std::size_t size); UniqueTexture createTexture(Size size, const void* data, TextureFormat, TextureUnit, TextureType); diff --git a/src/mbgl/gl/program.hpp b/src/mbgl/gl/program.hpp index 6d3a4ce266..df48dfea38 100644 --- a/src/mbgl/gl/program.hpp +++ b/src/mbgl/gl/program.hpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/mbgl/gl/value.cpp b/src/mbgl/gl/value.cpp index b290cde50c..b205f0f358 100644 --- a/src/mbgl/gl/value.cpp +++ b/src/mbgl/gl/value.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -485,7 +486,7 @@ GLint components(const gfx::AttributeDataType type) { void VertexAttribute::Set(const optional& binding, Context& context, AttributeLocation location) { if (binding) { - context.vertexBuffer = binding->vertexBuffer; + context.vertexBuffer = reinterpret_cast(*binding->vertexBufferResource).buffer; MBGL_CHECK_ERROR(glEnableVertexAttribArray(location)); MBGL_CHECK_ERROR(glVertexAttribPointer( location, diff --git a/src/mbgl/gl/vertex_buffer.hpp b/src/mbgl/gl/vertex_buffer.hpp index 94963ce878..95e5e75d45 100644 --- a/src/mbgl/gl/vertex_buffer.hpp +++ b/src/mbgl/gl/vertex_buffer.hpp @@ -1,14 +1,16 @@ #pragma once +#include #include namespace mbgl { namespace gl { -template -class VertexBuffer { +class VertexBufferResource : public gfx::VertexBufferResource { public: - std::size_t elements; + VertexBufferResource(UniqueBuffer&& buffer_) : buffer(std::move(buffer_)) { + } + UniqueBuffer buffer; }; diff --git a/src/mbgl/layout/symbol_projection.hpp b/src/mbgl/layout/symbol_projection.hpp index a13769dcad..03e660b474 100644 --- a/src/mbgl/layout/symbol_projection.hpp +++ b/src/mbgl/layout/symbol_projection.hpp @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #include namespace mbgl { diff --git a/src/mbgl/programs/collision_box_program.hpp b/src/mbgl/programs/collision_box_program.hpp index ef13392323..794921271c 100644 --- a/src/mbgl/programs/collision_box_program.hpp +++ b/src/mbgl/programs/collision_box_program.hpp @@ -63,8 +63,8 @@ public: gfx::ColorMode colorMode, gfx::CullFaceMode cullFaceMode, const UniformValues& uniformValues, - const gl::VertexBuffer>& layoutVertexBuffer, - const gl::VertexBuffer>& dynamicVertexBuffer, + const gfx::VertexBuffer>& layoutVertexBuffer, + const gfx::VertexBuffer>& dynamicVertexBuffer, const gfx::IndexBuffer& indexBuffer, const SegmentVector& segments, const Binders& paintPropertyBinders, @@ -144,8 +144,8 @@ public: gfx::ColorMode colorMode, gfx::CullFaceMode cullFaceMode, const UniformValues& uniformValues, - const gl::VertexBuffer>& layoutVertexBuffer, - const gl::VertexBuffer>& dynamicVertexBuffer, + const gfx::VertexBuffer>& layoutVertexBuffer, + const gfx::VertexBuffer>& dynamicVertexBuffer, const gfx::IndexBuffer& indexBuffer, const SegmentVector& segments, const Binders& paintPropertyBinders, diff --git a/src/mbgl/programs/program.hpp b/src/mbgl/programs/program.hpp index 6c9deab89f..a5736a44cc 100644 --- a/src/mbgl/programs/program.hpp +++ b/src/mbgl/programs/program.hpp @@ -57,7 +57,7 @@ public: } static typename Attributes::Bindings computeAllAttributeBindings( - const gl::VertexBuffer& layoutVertexBuffer, + const gfx::VertexBuffer& layoutVertexBuffer, const Binders& paintPropertyBinders, const typename PaintProperties::PossiblyEvaluated& currentProperties) { return LayoutAttributes::bindings(layoutVertexBuffer) diff --git a/src/mbgl/programs/symbol_program.hpp b/src/mbgl/programs/symbol_program.hpp index 53c65bbecd..76c3057852 100644 --- a/src/mbgl/programs/symbol_program.hpp +++ b/src/mbgl/programs/symbol_program.hpp @@ -286,9 +286,9 @@ public: } static typename Attributes::Bindings computeAllAttributeBindings( - const gl::VertexBuffer& layoutVertexBuffer, - const gl::VertexBuffer>& dynamicLayoutVertexBuffer, - const gl::VertexBuffer>& opacityVertexBuffer, + const gfx::VertexBuffer& layoutVertexBuffer, + const gfx::VertexBuffer>& dynamicLayoutVertexBuffer, + const gfx::VertexBuffer>& opacityVertexBuffer, const Binders& paintPropertyBinders, const typename PaintProperties::PossiblyEvaluated& currentProperties) { assert(layoutVertexBuffer.elements == dynamicLayoutVertexBuffer.elements && diff --git a/src/mbgl/renderer/buckets/circle_bucket.hpp b/src/mbgl/renderer/buckets/circle_bucket.hpp index 9495a9650c..27fdd5339c 100644 --- a/src/mbgl/renderer/buckets/circle_bucket.hpp +++ b/src/mbgl/renderer/buckets/circle_bucket.hpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include @@ -34,7 +34,7 @@ public: gfx::IndexVector triangles; SegmentVector segments; - optional> vertexBuffer; + optional> vertexBuffer; optional indexBuffer; std::map paintPropertyBinders; diff --git a/src/mbgl/renderer/buckets/debug_bucket.hpp b/src/mbgl/renderer/buckets/debug_bucket.hpp index e30d580df4..5623e9697d 100644 --- a/src/mbgl/renderer/buckets/debug_bucket.hpp +++ b/src/mbgl/renderer/buckets/debug_bucket.hpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include @@ -34,7 +34,7 @@ public: const MapDebugOptions debugMode; SegmentVector segments; - optional> vertexBuffer; + optional> vertexBuffer; optional indexBuffer; }; diff --git a/src/mbgl/renderer/buckets/fill_bucket.hpp b/src/mbgl/renderer/buckets/fill_bucket.hpp index dc7180ee3d..3ff3ecc1aa 100644 --- a/src/mbgl/renderer/buckets/fill_bucket.hpp +++ b/src/mbgl/renderer/buckets/fill_bucket.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -46,7 +46,7 @@ public: SegmentVector lineSegments; SegmentVector triangleSegments; - optional> vertexBuffer; + optional> vertexBuffer; optional lineIndexBuffer; optional triangleIndexBuffer; diff --git a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp index 840ed70b4c..0065231b9e 100644 --- a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp +++ b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -43,7 +43,7 @@ public: gfx::IndexVector triangles; SegmentVector triangleSegments; - optional> vertexBuffer; + optional> vertexBuffer; optional indexBuffer; std::unordered_map paintPropertyBinders; diff --git a/src/mbgl/renderer/buckets/heatmap_bucket.hpp b/src/mbgl/renderer/buckets/heatmap_bucket.hpp index ad0ad7b99d..7b3fdacd77 100644 --- a/src/mbgl/renderer/buckets/heatmap_bucket.hpp +++ b/src/mbgl/renderer/buckets/heatmap_bucket.hpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include @@ -33,7 +33,7 @@ public: gfx::IndexVector triangles; SegmentVector segments; - optional> vertexBuffer; + optional> vertexBuffer; optional indexBuffer; std::map paintPropertyBinders; diff --git a/src/mbgl/renderer/buckets/hillshade_bucket.hpp b/src/mbgl/renderer/buckets/hillshade_bucket.hpp index 89da41d174..50b05aaeef 100644 --- a/src/mbgl/renderer/buckets/hillshade_bucket.hpp +++ b/src/mbgl/renderer/buckets/hillshade_bucket.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -50,7 +50,7 @@ public: gfx::IndexVector indices; SegmentVector segments; - optional> vertexBuffer; + optional> vertexBuffer; optional indexBuffer; private: DEMData demdata; diff --git a/src/mbgl/renderer/buckets/line_bucket.hpp b/src/mbgl/renderer/buckets/line_bucket.hpp index 1faf775d55..069e27bfd9 100644 --- a/src/mbgl/renderer/buckets/line_bucket.hpp +++ b/src/mbgl/renderer/buckets/line_bucket.hpp @@ -1,7 +1,7 @@ #pragma once #include #include -#include +#include #include #include #include @@ -47,7 +47,7 @@ public: gfx::IndexVector triangles; SegmentVector segments; - optional> vertexBuffer; + optional> vertexBuffer; optional indexBuffer; std::map paintPropertyBinders; diff --git a/src/mbgl/renderer/buckets/raster_bucket.hpp b/src/mbgl/renderer/buckets/raster_bucket.hpp index 510dbf1f8f..ea48a0c235 100644 --- a/src/mbgl/renderer/buckets/raster_bucket.hpp +++ b/src/mbgl/renderer/buckets/raster_bucket.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -36,7 +36,7 @@ public: gfx::IndexVector indices; SegmentVector segments; - optional> vertexBuffer; + optional> vertexBuffer; optional indexBuffer; }; diff --git a/src/mbgl/renderer/buckets/symbol_bucket.hpp b/src/mbgl/renderer/buckets/symbol_bucket.hpp index c28a2cbc95..67662927ba 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.hpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -95,9 +95,9 @@ public: SegmentVector segments; std::vector placedSymbols; - optional> vertexBuffer; - optional>> dynamicVertexBuffer; - optional>> opacityVertexBuffer; + optional> vertexBuffer; + optional>> dynamicVertexBuffer; + optional>> opacityVertexBuffer; optional indexBuffer; } text; @@ -112,9 +112,9 @@ public: std::vector placedSymbols; PremultipliedImage atlasImage; - optional> vertexBuffer; - optional>> dynamicVertexBuffer; - optional>> opacityVertexBuffer; + optional> vertexBuffer; + optional>> dynamicVertexBuffer; + optional>> opacityVertexBuffer; optional indexBuffer; } icon; @@ -123,8 +123,8 @@ public: gfx::VertexVector> dynamicVertices; SegmentVector segments; - optional>> vertexBuffer; - optional>> dynamicVertexBuffer; + optional>> vertexBuffer; + optional>> dynamicVertexBuffer; }; struct CollisionBoxBuffer : public CollisionBuffer { diff --git a/src/mbgl/renderer/paint_property_binder.hpp b/src/mbgl/renderer/paint_property_binder.hpp index cb4c3b5519..da317f93e8 100644 --- a/src/mbgl/renderer/paint_property_binder.hpp +++ b/src/mbgl/renderer/paint_property_binder.hpp @@ -223,7 +223,7 @@ private: style::PropertyExpression expression; T defaultValue; gfx::VertexVector vertexVector; - optional> vertexBuffer; + optional> vertexBuffer; }; template @@ -288,7 +288,7 @@ private: T defaultValue; Range zoomRange; gfx::VertexVector vertexVector; - optional> vertexBuffer; + optional> vertexBuffer; }; template @@ -377,9 +377,9 @@ private: gfx::VertexVector patternToVertexVector; gfx::VertexVector zoomInVertexVector; gfx::VertexVector zoomOutVertexVector; - optional> patternToVertexBuffer; - optional> zoomInVertexBuffer; - optional> zoomOutVertexBuffer; + optional> patternToVertexBuffer; + optional> zoomInVertexBuffer; + optional> zoomOutVertexBuffer; CrossfadeParameters crossfade; }; diff --git a/src/mbgl/renderer/render_static_data.hpp b/src/mbgl/renderer/render_static_data.hpp index 3d4f3e7dbe..da887dff22 100644 --- a/src/mbgl/renderer/render_static_data.hpp +++ b/src/mbgl/renderer/render_static_data.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include #include @@ -16,9 +16,9 @@ class RenderStaticData { public: RenderStaticData(gl::Context&, float pixelRatio, const optional& programCacheDir); - gl::VertexBuffer> tileVertexBuffer; - gl::VertexBuffer rasterVertexBuffer; - gl::VertexBuffer extrusionTextureVertexBuffer; + gfx::VertexBuffer> tileVertexBuffer; + gfx::VertexBuffer rasterVertexBuffer; + gfx::VertexBuffer extrusionTextureVertexBuffer; gfx::IndexBuffer quadTriangleIndexBuffer; gfx::IndexBuffer tileBorderIndexBuffer; -- cgit v1.2.1