diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2019-03-12 19:20:55 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2019-03-21 13:48:14 +0100 |
commit | f8d6c68ae37afc1c135b20fb78ea9b89230a0896 (patch) | |
tree | 38f9738098a96d675bf91be33dfbee1a83309e37 | |
parent | 4763fa84ab84796f88ab45d2a2495a1198461577 (diff) | |
download | qtlocation-mapboxgl-f8d6c68ae37afc1c135b20fb78ea9b89230a0896.tar.gz |
[core] move VertexArray behind new gfx::DrawScope facade
-rw-r--r-- | src/core-files.json | 2 | ||||
-rw-r--r-- | src/mbgl/gfx/context.hpp | 9 | ||||
-rw-r--r-- | src/mbgl/gfx/draw_scope.hpp | 21 | ||||
-rw-r--r-- | src/mbgl/gl/context.cpp | 5 | ||||
-rw-r--r-- | src/mbgl/gl/context.hpp | 4 | ||||
-rw-r--r-- | src/mbgl/gl/draw_scope_resource.hpp | 18 | ||||
-rw-r--r-- | src/mbgl/gl/program.hpp | 7 | ||||
-rw-r--r-- | src/mbgl/programs/collision_box_program.hpp | 20 | ||||
-rw-r--r-- | src/mbgl/programs/program.hpp | 10 | ||||
-rw-r--r-- | src/mbgl/programs/segment.hpp | 6 | ||||
-rw-r--r-- | src/mbgl/programs/symbol_program.hpp | 10 |
11 files changed, 86 insertions, 26 deletions
diff --git a/src/core-files.json b/src/core-files.json index 3b6379fce1..1b6177e722 100644 --- a/src/core-files.json +++ b/src/core-files.json @@ -509,6 +509,7 @@ "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", + "mbgl/gfx/draw_scope.hpp": "src/mbgl/gfx/draw_scope.hpp", "mbgl/gfx/index_buffer.hpp": "src/mbgl/gfx/index_buffer.hpp", "mbgl/gfx/index_vector.hpp": "src/mbgl/gfx/index_vector.hpp", "mbgl/gfx/primitives.hpp": "src/mbgl/gfx/primitives.hpp", @@ -523,6 +524,7 @@ "mbgl/gl/debugging.hpp": "src/mbgl/gl/debugging.hpp", "mbgl/gl/debugging_extension.hpp": "src/mbgl/gl/debugging_extension.hpp", "mbgl/gl/defines.hpp": "src/mbgl/gl/defines.hpp", + "mbgl/gl/draw_scope_resource.hpp": "src/mbgl/gl/draw_scope_resource.hpp", "mbgl/gl/enum.hpp": "src/mbgl/gl/enum.hpp", "mbgl/gl/extension.hpp": "src/mbgl/gl/extension.hpp", "mbgl/gl/features.hpp": "src/mbgl/gl/features.hpp", diff --git a/src/mbgl/gfx/context.hpp b/src/mbgl/gfx/context.hpp index 5ec73b8a41..f98b2266f4 100644 --- a/src/mbgl/gfx/context.hpp +++ b/src/mbgl/gfx/context.hpp @@ -5,6 +5,7 @@ #include <mbgl/gfx/index_vector.hpp> #include <mbgl/gfx/index_buffer.hpp> #include <mbgl/gfx/texture.hpp> +#include <mbgl/gfx/draw_scope.hpp> #include <mbgl/gfx/types.hpp> namespace mbgl { @@ -89,6 +90,14 @@ protected: Size, const void* data, TexturePixelType, TextureChannelDataType) = 0; virtual void updateTextureResource(const TextureResource&, Size, const void* data, TexturePixelType, TextureChannelDataType) = 0; + +public: + DrawScope createDrawScope() { + return { createDrawScopeResource() }; + } + +protected: + virtual std::unique_ptr<DrawScopeResource> createDrawScopeResource() = 0; }; } // namespace gfx diff --git a/src/mbgl/gfx/draw_scope.hpp b/src/mbgl/gfx/draw_scope.hpp new file mode 100644 index 0000000000..60aae7a44c --- /dev/null +++ b/src/mbgl/gfx/draw_scope.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include <memory> + +namespace mbgl { +namespace gfx { + +class DrawScopeResource { +protected: + DrawScopeResource() = default; +public: + virtual ~DrawScopeResource() = default; +}; + +class DrawScope { +public: + std::unique_ptr<DrawScopeResource> resource; +}; + +} // namespace gfx +} // namespace mbgl diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index ca06ab660d..f9fe74a36d 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -3,6 +3,7 @@ #include <mbgl/gl/vertex_buffer_resource.hpp> #include <mbgl/gl/index_buffer_resource.hpp> #include <mbgl/gl/texture_resource.hpp> +#include <mbgl/gl/draw_scope_resource.hpp> #include <mbgl/gl/texture.hpp> #include <mbgl/gl/debugging_extension.hpp> #include <mbgl/gl/vertex_array_extension.hpp> @@ -544,6 +545,10 @@ void Context::updateTextureResource(const gfx::TextureResource& resource, Enum<gfx::TextureChannelDataType>::to(type), data)); } +std::unique_ptr<gfx::DrawScopeResource> Context::createDrawScopeResource() { + return std::make_unique<gl::DrawScopeResource>(createVertexArray()); +} + void Context::reset() { std::copy(pooledTextures.begin(), pooledTextures.end(), std::back_inserter(abandonedTextures)); pooledTextures.resize(0); diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index 51b79200ba..c99d6d6367 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -52,7 +52,6 @@ public: void verifyProgramLinkage(ProgramID); void linkProgram(ProgramID); UniqueTexture createUniqueTexture(); - VertexArray createVertexArray(); #if MBGL_HAS_BINARY_PROGRAMS bool supportsProgramBinaries() const; @@ -216,6 +215,8 @@ private: std::unique_ptr<gfx::TextureResource> createTextureResource(Size, const void* data, gfx::TexturePixelType, gfx::TextureChannelDataType) override; void updateTextureResource(const gfx::TextureResource&, Size, const void* data, gfx::TexturePixelType, gfx::TextureChannelDataType) override; + std::unique_ptr<gfx::DrawScopeResource> createDrawScopeResource() override; + UniqueFramebuffer createFramebuffer(); UniqueRenderbuffer createRenderbuffer(RenderbufferType, Size size); std::unique_ptr<uint8_t[]> readFramebuffer(Size, gfx::TexturePixelType, bool flip); @@ -223,6 +224,7 @@ private: void drawPixels(Size size, const void* data, gfx::TexturePixelType); #endif // MBGL_USE_GLES2 + VertexArray createVertexArray(); bool supportsVertexArrays() const; friend detail::ProgramDeleter; diff --git a/src/mbgl/gl/draw_scope_resource.hpp b/src/mbgl/gl/draw_scope_resource.hpp new file mode 100644 index 0000000000..4c446cd4fe --- /dev/null +++ b/src/mbgl/gl/draw_scope_resource.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include <mbgl/gfx/draw_scope.hpp> +#include <mbgl/gl/vertex_array.hpp> + +namespace mbgl { +namespace gl { + +class DrawScopeResource : public gfx::DrawScopeResource { +public: + DrawScopeResource(VertexArray&& vertexArray_) : vertexArray(std::move(vertexArray_)) { + } + + VertexArray vertexArray; +}; + +} // namespace gl +} // namespace mbgl diff --git a/src/mbgl/gl/program.hpp b/src/mbgl/gl/program.hpp index d31535e52b..c6c42bbad2 100644 --- a/src/mbgl/gl/program.hpp +++ b/src/mbgl/gl/program.hpp @@ -3,6 +3,7 @@ #include <mbgl/gl/types.hpp> #include <mbgl/gl/object.hpp> #include <mbgl/gl/context.hpp> +#include <mbgl/gl/draw_scope_resource.hpp> #include <mbgl/gfx/vertex_buffer.hpp> #include <mbgl/gfx/index_buffer.hpp> #include <mbgl/gl/vertex_array.hpp> @@ -118,20 +119,21 @@ public: } template <class DrawMode> - void draw(Context& context, + void draw(gfx::Context& genericContext, DrawMode drawMode, gfx::DepthMode depthMode, gfx::StencilMode stencilMode, gfx::ColorMode colorMode, gfx::CullFaceMode cullFaceMode, const UniformValues& uniformValues, - gl::VertexArray& vertexArray, + gfx::DrawScope& drawScope, const AttributeBindings& attributeBindings, const TextureBindings& textureBindings, const gfx::IndexBuffer& indexBuffer, std::size_t indexOffset, std::size_t indexLength) { static_assert(std::is_same<Primitive, typename DrawMode::Primitive>::value, "incompatible draw mode"); + auto& context = reinterpret_cast<gl::Context&>(genericContext); context.setDrawMode(drawMode); context.setDepthMode(depthMode); @@ -145,6 +147,7 @@ public: textures.bind(context, textureBindings); + auto& vertexArray = reinterpret_cast<gl::DrawScopeResource&>(*drawScope.resource).vertexArray; vertexArray.bind(context, indexBuffer, gl::Attributes<AttributeList>::toBindingArray(attributeLocations, attributeBindings)); diff --git a/src/mbgl/programs/collision_box_program.hpp b/src/mbgl/programs/collision_box_program.hpp index 4bcb423f18..c7a5167fe3 100644 --- a/src/mbgl/programs/collision_box_program.hpp +++ b/src/mbgl/programs/collision_box_program.hpp @@ -62,7 +62,7 @@ public: } template <class DrawMode> - void draw(gl::Context& context, + void draw(gfx::Context& context, DrawMode drawMode, gfx::DepthMode depthMode, gfx::StencilMode stencilMode, @@ -88,10 +88,10 @@ public: assert(layoutVertexBuffer.elements == dynamicVertexBuffer.elements); for (auto& segment : segments) { - auto vertexArrayIt = segment.vertexArrays.find(layerID); + auto drawScopeIt = segment.drawScopes.find(layerID); - if (vertexArrayIt == segment.vertexArrays.end()) { - vertexArrayIt = segment.vertexArrays.emplace(layerID, context.createVertexArray()).first; + if (drawScopeIt == segment.drawScopes.end()) { + drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first; } program.draw( @@ -102,7 +102,7 @@ public: std::move(colorMode), std::move(cullFaceMode), allUniformValues, - vertexArrayIt->second, + drawScopeIt->second, gfx::Attributes<AttributeList>::offsetBindings(allAttributeBindings, segment.vertexOffset), textureBindings, indexBuffer, @@ -150,7 +150,7 @@ public: } template <class DrawMode> - void draw(gl::Context& context, + void draw(gfx::Context& context, DrawMode drawMode, gfx::DepthMode depthMode, gfx::StencilMode stencilMode, @@ -174,10 +174,10 @@ public: .concat(paintPropertyBinders.attributeBindings(currentProperties)); for (auto& segment : segments) { - auto vertexArrayIt = segment.vertexArrays.find(layerID); + auto drawScopeIt = segment.drawScopes.find(layerID); - if (vertexArrayIt == segment.vertexArrays.end()) { - vertexArrayIt = segment.vertexArrays.emplace(layerID, context.createVertexArray()).first; + if (drawScopeIt == segment.drawScopes.end()) { + drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first; } program.draw( @@ -188,7 +188,7 @@ public: std::move(colorMode), std::move(cullFaceMode), allUniformValues, - vertexArrayIt->second, + drawScopeIt->second, gfx::Attributes<AttributeList>::offsetBindings(allAttributeBindings, segment.vertexOffset), textureBindings, indexBuffer, diff --git a/src/mbgl/programs/program.hpp b/src/mbgl/programs/program.hpp index af442260bb..e40eb09951 100644 --- a/src/mbgl/programs/program.hpp +++ b/src/mbgl/programs/program.hpp @@ -72,7 +72,7 @@ public: } template <class DrawMode> - void draw(gl::Context& context, + void draw(gfx::Context& context, DrawMode drawMode, gfx::DepthMode depthMode, gfx::StencilMode stencilMode, @@ -85,10 +85,10 @@ public: const TextureBindings& textureBindings, const std::string& layerID) { for (auto& segment : segments) { - auto vertexArrayIt = segment.vertexArrays.find(layerID); + auto drawScopeIt = segment.drawScopes.find(layerID); - if (vertexArrayIt == segment.vertexArrays.end()) { - vertexArrayIt = segment.vertexArrays.emplace(layerID, context.createVertexArray()).first; + if (drawScopeIt == segment.drawScopes.end()) { + drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first; } program.draw( @@ -99,7 +99,7 @@ public: std::move(colorMode), std::move(cullFaceMode), allUniformValues, - vertexArrayIt->second, + drawScopeIt->second, gfx::Attributes<AttributeList>::offsetBindings(allAttributeBindings, segment.vertexOffset), textureBindings, indexBuffer, diff --git a/src/mbgl/programs/segment.hpp b/src/mbgl/programs/segment.hpp index 4fa5443cbd..5976550d2c 100644 --- a/src/mbgl/programs/segment.hpp +++ b/src/mbgl/programs/segment.hpp @@ -1,6 +1,6 @@ #pragma once -#include <mbgl/gl/vertex_array.hpp> +#include <mbgl/gfx/draw_scope.hpp> #include <cstddef> #include <vector> @@ -28,14 +28,14 @@ public: std::size_t vertexLength; std::size_t indexLength; - // One VertexArray per layer ID. This minimizes rebinding in cases where + // One DrawScope per layer ID. This minimizes rebinding in cases where // several layers share buckets but have different sets of active attributes. // This can happen: // * when two layers have the same layout properties, but differing // data-driven paint properties // * when two fill layers have the same layout properties, but one // uses fill-color and the other uses fill-pattern - mutable std::map<std::string, gl::VertexArray> vertexArrays; + mutable std::map<std::string, gfx::DrawScope> drawScopes; }; template <class AttributeList> diff --git a/src/mbgl/programs/symbol_program.hpp b/src/mbgl/programs/symbol_program.hpp index 562346871d..bcaece8e52 100644 --- a/src/mbgl/programs/symbol_program.hpp +++ b/src/mbgl/programs/symbol_program.hpp @@ -307,7 +307,7 @@ public: } template <class DrawMode> - void draw(gl::Context& context, + void draw(gfx::Context& context, DrawMode drawMode, gfx::DepthMode depthMode, gfx::StencilMode stencilMode, @@ -320,10 +320,10 @@ public: const TextureBindings& textureBindings, const std::string& layerID) { for (auto& segment : segments) { - auto vertexArrayIt = segment.vertexArrays.find(layerID); + auto drawScopeIt = segment.drawScopes.find(layerID); - if (vertexArrayIt == segment.vertexArrays.end()) { - vertexArrayIt = segment.vertexArrays.emplace(layerID, context.createVertexArray()).first; + if (drawScopeIt == segment.drawScopes.end()) { + drawScopeIt = segment.drawScopes.emplace(layerID, context.createDrawScope()).first; } program.draw( @@ -334,7 +334,7 @@ public: std::move(colorMode), std::move(cullFaceMode), allUniformValues, - vertexArrayIt->second, + drawScopeIt->second, gfx::Attributes<AttributeList>::offsetBindings(allAttributeBindings, segment.vertexOffset), textureBindings, indexBuffer, |