summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2019-03-12 19:20:55 +0100
committerKonstantin Käfer <mail@kkaefer.com>2019-03-21 13:48:14 +0100
commitf8d6c68ae37afc1c135b20fb78ea9b89230a0896 (patch)
tree38f9738098a96d675bf91be33dfbee1a83309e37
parent4763fa84ab84796f88ab45d2a2495a1198461577 (diff)
downloadqtlocation-mapboxgl-f8d6c68ae37afc1c135b20fb78ea9b89230a0896.tar.gz
[core] move VertexArray behind new gfx::DrawScope facade
-rw-r--r--src/core-files.json2
-rw-r--r--src/mbgl/gfx/context.hpp9
-rw-r--r--src/mbgl/gfx/draw_scope.hpp21
-rw-r--r--src/mbgl/gl/context.cpp5
-rw-r--r--src/mbgl/gl/context.hpp4
-rw-r--r--src/mbgl/gl/draw_scope_resource.hpp18
-rw-r--r--src/mbgl/gl/program.hpp7
-rw-r--r--src/mbgl/programs/collision_box_program.hpp20
-rw-r--r--src/mbgl/programs/program.hpp10
-rw-r--r--src/mbgl/programs/segment.hpp6
-rw-r--r--src/mbgl/programs/symbol_program.hpp10
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,