summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLauren Budorick <lauren@mapbox.com>2017-05-08 09:06:07 -0700
committerGitHub <noreply@github.com>2017-05-08 09:06:07 -0700
commit1c9af3226f0ad306cf2ec8be9ff1558938f69736 (patch)
tree407389df9fd8c9c807fcab09d4ba99482829dc6f /src
parentb622aed3490d623a31ec576aefe9696f221ead76 (diff)
downloadqtlocation-mapboxgl-1c9af3226f0ad306cf2ec8be9ff1558938f69736.tar.gz
[core] Reuse fill-extrusion textures between frames (#8896)
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/renderer/painter.cpp19
-rw-r--r--src/mbgl/renderer/painter.hpp3
-rw-r--r--src/mbgl/util/offscreen_texture.cpp41
-rw-r--r--src/mbgl/util/offscreen_texture.hpp14
4 files changed, 43 insertions, 34 deletions
diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp
index 01df326d95..60c4757893 100644
--- a/src/mbgl/renderer/painter.cpp
+++ b/src/mbgl/renderer/painter.cpp
@@ -34,8 +34,6 @@
#include <mbgl/util/mat3.hpp>
#include <mbgl/util/string.hpp>
-#include <mbgl/util/offscreen_texture.hpp>
-
#include <mbgl/util/stopwatch.hpp>
#include <cassert>
@@ -328,8 +326,11 @@ void Painter::renderPass(PaintParameters& parameters,
} else if (layer.is<RenderFillExtrusionLayer>()) {
const auto size = context.viewport.getCurrentValue().size;
- OffscreenTexture texture(context, size);
- texture.bindRenderbuffers(1);
+ if (!extrusionTexture || extrusionTexture->getSize() != size) {
+ extrusionTexture = OffscreenTexture(context, size, OffscreenTextureAttachment::Depth);
+ }
+
+ extrusionTexture->bind();
context.setStencilMode(gl::StencilMode::disabled());
context.setDepthMode(depthModeForSublayer(0, gl::DepthMode::ReadWrite));
@@ -344,6 +345,7 @@ void Painter::renderPass(PaintParameters& parameters,
}
parameters.view.bind();
+ context.bindTexture(extrusionTexture->getTexture());
mat4 viewportMat;
matrix::ortho(viewportMat, 0, size.width, size.height, 0, 0, 1);
@@ -355,11 +357,10 @@ void Painter::renderPass(PaintParameters& parameters,
colorModeForRenderPass(),
ExtrusionTextureProgram::UniformValues{
uniforms::u_matrix::Value{ viewportMat }, uniforms::u_world::Value{ size },
- uniforms::u_image::Value{ 1 },
- uniforms::u_opacity::Value{
- layer.as<RenderFillExtrusionLayer>()->evaluated.get<FillExtrusionOpacity>() } },
- extrusionTextureVertexBuffer, quadTriangleIndexBuffer,
- extrusionTextureSegments,
+ uniforms::u_image::Value{ 0 },
+ uniforms::u_opacity::Value{ layer.as<RenderFillExtrusionLayer>()
+ ->evaluated.get<FillExtrusionOpacity>() } },
+ extrusionTextureVertexBuffer, quadTriangleIndexBuffer, extrusionTextureSegments,
ExtrusionTextureProgram::PaintPropertyBinders{ properties, 0 }, properties,
state.getZoom());
} else {
diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp
index ff72749718..47b469d971 100644
--- a/src/mbgl/renderer/painter.hpp
+++ b/src/mbgl/renderer/painter.hpp
@@ -20,6 +20,7 @@
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/chrono.hpp>
#include <mbgl/util/constants.hpp>
+#include <mbgl/util/offscreen_texture.hpp>
#include <array>
#include <vector>
@@ -158,6 +159,8 @@ private:
GlyphAtlas* glyphAtlas = nullptr;
LineAtlas* lineAtlas = nullptr;
+ optional<OffscreenTexture> extrusionTexture;
+
EvaluatedLight evaluatedLight;
FrameHistory frameHistory;
diff --git a/src/mbgl/util/offscreen_texture.cpp b/src/mbgl/util/offscreen_texture.cpp
index e719ac566e..fe24774b7c 100644
--- a/src/mbgl/util/offscreen_texture.cpp
+++ b/src/mbgl/util/offscreen_texture.cpp
@@ -6,16 +6,28 @@
namespace mbgl {
+OffscreenTexture::OffscreenTexture(OffscreenTexture&&) = default;
+OffscreenTexture& OffscreenTexture::operator=(OffscreenTexture&&) = default;
+
class OffscreenTexture::Impl {
public:
- Impl(gl::Context& context_, const Size size_) : context(context_), size(std::move(size_)) {
+ Impl(gl::Context& context_, const Size size_, OffscreenTextureAttachment type_)
+ : context(context_), size(std::move(size_)), type(type_) {
assert(!size.isEmpty());
}
void bind() {
if (!framebuffer) {
texture = context.createTexture(size, gl::TextureFormat::RGBA);
- framebuffer = context.createFramebuffer(*texture);
+
+ if (type == OffscreenTextureAttachment::Depth) {
+ gl::Renderbuffer<gl::RenderbufferType::DepthComponent> depth =
+ context.createRenderbuffer<gl::RenderbufferType::DepthComponent>(size);
+ framebuffer = context.createFramebuffer(*texture, depth);
+
+ } else {
+ framebuffer = context.createFramebuffer(*texture);
+ }
} else {
context.bindFramebuffer = framebuffer->framebuffer;
}
@@ -37,29 +49,18 @@ public:
return size;
}
- void bindRenderbuffers(gl::TextureUnit unit) {
- if (!framebuffer) {
- texture = context.createTexture(size, gl::TextureFormat::RGBA, unit);
- gl::Renderbuffer<gl::RenderbufferType::DepthComponent> depthTarget = context.createRenderbuffer<gl::RenderbufferType::DepthComponent>(size);
- framebuffer = context.createFramebuffer(*texture, depthTarget);
-
- } else {
- context.bindFramebuffer = framebuffer->framebuffer;
- }
-
- context.activeTexture = unit;
- context.viewport = { 0, 0, size };
- }
-
private:
gl::Context& context;
const Size size;
+ OffscreenTextureAttachment type;
optional<gl::Framebuffer> framebuffer;
optional<gl::Texture> texture;
};
-OffscreenTexture::OffscreenTexture(gl::Context& context, const Size size)
- : impl(std::make_unique<Impl>(context, std::move(size))) {
+OffscreenTexture::OffscreenTexture(gl::Context& context,
+ const Size size,
+ OffscreenTextureAttachment type)
+ : impl(std::make_unique<Impl>(context, std::move(size), type)) {
assert(!size.isEmpty());
}
@@ -81,8 +82,4 @@ const Size& OffscreenTexture::getSize() const {
return impl->getSize();
}
-void OffscreenTexture::bindRenderbuffers(gl::TextureUnit unit) {
- impl->bindRenderbuffers(unit);
-}
-
} // namespace mbgl
diff --git a/src/mbgl/util/offscreen_texture.hpp b/src/mbgl/util/offscreen_texture.hpp
index 4e9e936114..ae96286340 100644
--- a/src/mbgl/util/offscreen_texture.hpp
+++ b/src/mbgl/util/offscreen_texture.hpp
@@ -10,13 +10,21 @@ class Context;
class Texture;
} // namespace gl
+enum class OffscreenTextureAttachment {
+ None,
+ Depth,
+};
+
class OffscreenTexture : public View {
public:
- OffscreenTexture(gl::Context&, Size size = { 256, 256 });
+ OffscreenTexture(gl::Context&,
+ Size size = { 256, 256 },
+ OffscreenTextureAttachment type = OffscreenTextureAttachment::None);
~OffscreenTexture();
+ OffscreenTexture(OffscreenTexture&&);
+ OffscreenTexture& operator=(OffscreenTexture&&);
void bind() override;
- void bindRenderbuffers(gl::TextureUnit unit = 0);
PremultipliedImage readStillImage();
@@ -26,7 +34,7 @@ public:
private:
class Impl;
- const std::unique_ptr<Impl> impl;
+ std::unique_ptr<Impl> impl;
};
} // namespace mbgl