diff --git a/src/core-files.json b/src/core-files.json index 928cb9c8a..ab43e6b40 100644 --- a/src/core-files.json +++ b/src/core-files.json @@ -497,6 +497,7 @@ "mbgl/geometry/line_atlas.hpp": "src/mbgl/geometry/line_atlas.hpp", "mbgl/gfx/attribute.hpp": "src/mbgl/gfx/attribute.hpp", "mbgl/gfx/color_mode.hpp": "src/mbgl/gfx/color_mode.hpp", + "mbgl/gfx/context.hpp": "src/mbgl/gfx/context.hpp", "mbgl/gfx/cull_face_mode.hpp": "src/mbgl/gfx/cull_face_mode.hpp", "mbgl/gfx/depth_mode.hpp": "src/mbgl/gfx/depth_mode.hpp", "mbgl/gfx/draw_mode.hpp": "src/mbgl/gfx/draw_mode.hpp", diff --git a/src/mbgl/gfx/context.hpp b/src/mbgl/gfx/context.hpp new file mode 100644 index 000000000..b57cfcb65 --- /dev/null +++ b/src/mbgl/gfx/context.hpp @@ -0,0 +1,62 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace mbgl { +namespace gfx { + +class Context { +protected: + Context() = default; + +public: + Context(Context&&) = delete; + Context(const Context&) = delete; + Context& operator=(Context&& other) = delete; + Context& operator=(const Context& other) = delete; + virtual ~Context() = default; + +public: + template + VertexBuffer + createVertexBuffer(VertexVector&& v, + const BufferUsageType usage = BufferUsageType::StaticDraw) { + return { v.elements(), createVertexBufferResource(v.data(), v.bytes(), usage) }; + } + + template + void updateVertexBuffer(VertexBuffer& buffer, VertexVector&& v) { + assert(v.elements() == buffer.elements); + updateVertexBufferResource(*buffer.resource, v.data(), v.bytes()); + } + + template + IndexBuffer createIndexBuffer(IndexVector&& v, + const BufferUsageType usage = BufferUsageType::StaticDraw) { + return { v.elements(), createIndexBufferResource(v.data(), v.bytes(), usage) }; + } + + template + void updateIndexBuffer(IndexBuffer& buffer, IndexVector&& v) { + assert(v.elements() == buffer.elements); + updateIndexBufferResource(*buffer.resource, v.data(), v.bytes()); + } + +protected: + virtual std::unique_ptr + createVertexBufferResource(const void* data, std::size_t size, const BufferUsageType) = 0; + virtual void + updateVertexBufferResource(const VertexBufferResource&, const void* data, std::size_t size) = 0; + + virtual std::unique_ptr + createIndexBufferResource(const void* data, std::size_t size, const BufferUsageType) = 0; + virtual void + updateIndexBufferResource(const IndexBufferResource&, const void* data, std::size_t size) = 0; +}; + +} // namespace gfx +} // namespace mbgl diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index 514bc0115..df304eb7d 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -246,7 +246,7 @@ void Context::verifyProgramLinkage(ProgramID program_) { } std::unique_ptr -Context::createVertexBuffer(const void* data, std::size_t size, const gfx::BufferUsageType usage) { +Context::createVertexBufferResource(const void* data, std::size_t size, const gfx::BufferUsageType usage) { BufferID id = 0; MBGL_CHECK_ERROR(glGenBuffers(1, &id)); UniqueBuffer result { std::move(id), { this } }; @@ -255,13 +255,13 @@ Context::createVertexBuffer(const void* data, std::size_t size, const gfx::Buffe return std::make_unique(std::move(result)); } -void Context::updateVertexBuffer(const gfx::VertexBufferResource& resource, const void* data, std::size_t size) { +void Context::updateVertexBufferResource(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)); } std::unique_ptr -Context::createIndexBuffer(const void* data, std::size_t size, const gfx::BufferUsageType usage) { +Context::createIndexBufferResource(const void* data, std::size_t size, const gfx::BufferUsageType usage) { BufferID id = 0; MBGL_CHECK_ERROR(glGenBuffers(1, &id)); UniqueBuffer result { std::move(id), { this } }; @@ -271,7 +271,7 @@ Context::createIndexBuffer(const void* data, std::size_t size, const gfx::Buffer return std::make_unique(std::move(result)); } -void Context::updateIndexBuffer(const gfx::IndexBufferResource& resource, const void* data, std::size_t size) { +void Context::updateIndexBufferResource(const gfx::IndexBufferResource& resource, const void* data, std::size_t size) { // Be sure to unbind any existing vertex array object before binding the index buffer // so that we don't mess up another VAO bindVertexArray = 0; diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index 585ee286c..70ba1ec10 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -7,12 +8,8 @@ #include #include #include -#include -#include #include #include -#include -#include #include #include #include @@ -39,10 +36,10 @@ class Debugging; class ProgramBinary; } // namespace extension -class Context { +class Context final : public gfx::Context { public: Context(); - ~Context(); + ~Context() override; Context(const Context&) = delete; Context& operator=(const Context& other) = delete; @@ -65,34 +62,6 @@ public: #endif optional> getBinaryProgram(ProgramID) const; - template - gfx::VertexBuffer createVertexBuffer(gfx::VertexVector&& v, const gfx::BufferUsageType usage = gfx::BufferUsageType::StaticDraw) { - return { - v.elements(), - createVertexBuffer(v.data(), v.bytes(), usage) - }; - } - - template - void updateVertexBuffer(gfx::VertexBuffer& buffer, gfx::VertexVector&& v) { - assert(v.elements() == buffer.elements); - updateVertexBuffer(*buffer.resource, v.data(), v.bytes()); - } - - template - gfx::IndexBuffer createIndexBuffer(gfx::IndexVector&& v, const gfx::BufferUsageType usage = gfx::BufferUsageType::StaticDraw) { - return { - v.elements(), - createIndexBuffer(v.data(), v.bytes(), usage) - }; - } - - template - void updateIndexBuffer(gfx::IndexBuffer& buffer, gfx::IndexVector&& v) { - assert(v.elements() == buffer.elements); - updateIndexBuffer(*buffer.resource, v.data(), v.bytes()); - } - template Renderbuffer createRenderbuffer(const Size size) { static_assert(type == RenderbufferType::RGBA || @@ -274,10 +243,11 @@ private: State pointSize; #endif // MBGL_USE_GLES2 - std::unique_ptr createVertexBuffer(const void* data, std::size_t size, const gfx::BufferUsageType 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 gfx::BufferUsageType usage); - void updateIndexBuffer(const gfx::IndexBufferResource&, const void* data, std::size_t size); + std::unique_ptr createVertexBufferResource(const void* data, std::size_t size, const gfx::BufferUsageType) override; + void updateVertexBufferResource(const gfx::VertexBufferResource&, const void* data, std::size_t size) override; + std::unique_ptr createIndexBufferResource(const void* data, std::size_t size, const gfx::BufferUsageType) override; + void updateIndexBufferResource(const gfx::IndexBufferResource&, const void* data, std::size_t size) override; + UniqueTexture createTexture(Size size, const void* data, TextureFormat, TextureUnit, TextureType); void updateTexture(TextureID, Size size, const void* data, TextureFormat, TextureUnit, TextureType); UniqueFramebuffer createFramebuffer(); diff --git a/src/mbgl/renderer/paint_property_binder.hpp b/src/mbgl/renderer/paint_property_binder.hpp index da317f93e..34600508a 100644 --- a/src/mbgl/renderer/paint_property_binder.hpp +++ b/src/mbgl/renderer/paint_property_binder.hpp @@ -1,10 +1,10 @@ #pragma once +#include #include #include #include #include -#include #include #include #include @@ -96,7 +96,7 @@ public: virtual ~PaintPropertyBinder() = default; virtual void populateVertexVector(const GeometryTileFeature& feature, std::size_t length, const ImagePositions&, const optional&) = 0; - virtual void upload(gl::Context& context) = 0; + virtual void upload(gfx::Context& context) = 0; virtual void setPatternParameters(const optional&, const optional&, CrossfadeParameters&) = 0; virtual std::tuple>...> attributeBinding(const PossiblyEvaluatedType& currentValue) const = 0; virtual std::tuple...> interpolationFactor(float currentZoom) const = 0; @@ -115,7 +115,7 @@ public: } void populateVertexVector(const GeometryTileFeature&, std::size_t, const ImagePositions&, const optional&) override {} - void upload(gl::Context&) override {} + void upload(gfx::Context&) override {} void setPatternParameters(const optional&, const optional&, CrossfadeParameters&) override {}; std::tuple> attributeBinding(const PossiblyEvaluatedPropertyValue&) const override { @@ -142,7 +142,7 @@ public: } void populateVertexVector(const GeometryTileFeature&, std::size_t, const ImagePositions&, const optional&) override {} - void upload(gl::Context&) override {} + void upload(gfx::Context&) override {} void setPatternParameters(const optional& posA, const optional& posB, CrossfadeParameters&) override { if (!posA && !posB) { @@ -192,7 +192,7 @@ public: } } - void upload(gl::Context& context) override { + void upload(gfx::Context& context) override { vertexBuffer = context.createVertexBuffer(std::move(vertexVector)); } @@ -252,7 +252,7 @@ public: } } - void upload(gl::Context& context) override { + void upload(gfx::Context& context) override { vertexBuffer = context.createVertexBuffer(std::move(vertexVector)); } @@ -344,7 +344,7 @@ public: } } - void upload(gl::Context& context) override { + void upload(gfx::Context& context) override { patternToVertexBuffer = context.createVertexBuffer(std::move(patternToVertexVector)); zoomInVertexBuffer = context.createVertexBuffer(std::move(zoomInVertexVector)); zoomOutVertexBuffer = context.createVertexBuffer(std::move(zoomOutVertexVector)); @@ -486,7 +486,7 @@ public: }); } - void upload(gl::Context& context) { + void upload(gfx::Context& context) { util::ignore({ (binders.template get()->upload(context), 0)... });