diff options
author | Asheem Mamoowala <asheem.mamoowala@mapbox.com> | 2017-12-20 14:51:30 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-20 14:51:30 -0800 |
commit | 6a9eec8ed5dee4a4527c25523d4a8b1aee758212 (patch) | |
tree | 28fc102a656bec9d3a35e835cb80dc7ad8026c94 /src/mbgl/renderer/layers/render_custom_layer.cpp | |
parent | f644d188be719fc6a7a5e6b66b2a69c42e28a970 (diff) | |
download | qtlocation-mapboxgl-6a9eec8ed5dee4a4527c25523d4a8b1aee758212.tar.gz |
Fix CustomLayer context retain count (#10765)
* [core] RenderCustomLayer should de-initialize old context
* [iOS, macOS] Use toll-free bridging to retain/release MGLOpenGLStyleLayer instead of a separate array.
Diffstat (limited to 'src/mbgl/renderer/layers/render_custom_layer.cpp')
-rw-r--r-- | src/mbgl/renderer/layers/render_custom_layer.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/src/mbgl/renderer/layers/render_custom_layer.cpp b/src/mbgl/renderer/layers/render_custom_layer.cpp index 7ece3970da..adafd8583f 100644 --- a/src/mbgl/renderer/layers/render_custom_layer.cpp +++ b/src/mbgl/renderer/layers/render_custom_layer.cpp @@ -43,20 +43,25 @@ std::unique_ptr<Bucket> RenderCustomLayer::createBucket(const BucketParameters&, } void RenderCustomLayer::render(PaintParameters& paintParameters, RenderSource*) { - if (!initialized) { + if (context != impl().context || !initialized) { + //If the context changed, deinitialize the previous one before initializing the new one. + if (context && !contextDestroyed && impl().deinitializeFn) { + impl().deinitializeFn(context); + } + context = impl().context; assert(impl().initializeFn); impl().initializeFn(impl().context); initialized = true; } - gl::Context& context = paintParameters.context; + gl::Context& glContext = paintParameters.context; const TransformState& state = paintParameters.state; // Reset GL state to a known state so the CustomLayer always has a clean slate. - context.bindVertexArray = 0; - context.setDepthMode(paintParameters.depthModeForSublayer(0, gl::DepthMode::ReadOnly)); - context.setStencilMode(gl::StencilMode::disabled()); - context.setColorMode(paintParameters.colorModeForRenderPass()); + glContext.bindVertexArray = 0; + glContext.setDepthMode(paintParameters.depthModeForSublayer(0, gl::DepthMode::ReadOnly)); + glContext.setStencilMode(gl::StencilMode::disabled()); + glContext.setColorMode(paintParameters.colorModeForRenderPass()); CustomLayerRenderParameters parameters; @@ -70,12 +75,12 @@ void RenderCustomLayer::render(PaintParameters& paintParameters, RenderSource*) parameters.fieldOfView = state.getFieldOfView(); assert(impl().renderFn); - impl().renderFn(impl().context, parameters); + impl().renderFn(context, parameters); // Reset the view back to our original one, just in case the CustomLayer changed // the viewport or Framebuffer. paintParameters.backend.bind(); - context.setDirtyState(); + glContext.setDirtyState(); } } // namespace mbgl |