[core] move cleanup to gfx::Context

This commit is contained in:
Konstantin Käfer
2019-03-20 10:34:02 +01:00
parent 1e30fdac36
commit f86cc81680
4 changed files with 20 additions and 15 deletions

View File

@@ -33,6 +33,10 @@ public:
Context& operator=(const Context& other) = delete;
virtual ~Context() = default;
public:
// Called at the end of a frame.
virtual void performCleanup() = 0;
public:
template <class Vertex>
VertexBuffer<Vertex>

View File

@@ -5,6 +5,7 @@
#include <mbgl/gl/texture_resource.hpp>
#include <mbgl/gl/draw_scope_resource.hpp>
#include <mbgl/gl/texture.hpp>
#include <mbgl/gl/debugging.hpp>
#include <mbgl/gl/debugging_extension.hpp>
#include <mbgl/gl/vertex_array_extension.hpp>
#include <mbgl/gl/program_binary_extension.hpp>
@@ -706,6 +707,19 @@ void Context::draw(const gfx::DrawMode& drawMode,
}
void Context::performCleanup() {
// TODO: Find a better way to unbind VAOs after we're done with them without introducing
// unnecessary bind(0)/bind(N) sequences.
{
MBGL_DEBUG_GROUP(*this, "cleanup");
activeTextureUnit = 1;
texture[1] = 0;
activeTextureUnit = 0;
texture[0] = 0;
bindVertexArray = 0;
}
for (auto id : abandonedPrograms) {
if (program == id) {
program.setDirty();

View File

@@ -110,7 +110,7 @@ public:
// Actually remove the objects we marked as abandoned with the above methods.
// Only call this while the OpenGL context is exclusive to this thread.
void performCleanup();
void performCleanup() override;
// Drain pools and remove abandoned objects, in preparation for destroying the store.
// Only call this while the OpenGL context is exclusive to this thread.

View File

@@ -589,19 +589,6 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
}
#endif
// TODO: Find a better way to unbind VAOs after we're done with them without introducing
// unnecessary bind(0)/bind(N) sequences.
{
MBGL_DEBUG_GROUP(parameters.context, "cleanup");
glContext.activeTextureUnit = 1;
glContext.texture[1] = 0;
glContext.activeTextureUnit = 0;
glContext.texture[0] = 0;
glContext.bindVertexArray = 0;
}
observer->onDidFinishRenderingFrame(
loaded ? RendererObserver::RenderMode::Full : RendererObserver::RenderMode::Partial,
updateParameters.mode == MapMode::Continuous && hasTransitions(parameters.timePoint)
@@ -615,7 +602,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
}
// Cleanup only after signaling completion
glContext.performCleanup();
parameters.context.performCleanup();
}
std::vector<Feature> Renderer::Impl::queryRenderedFeatures(const ScreenLineString& geometry, const RenderedQueryOptions& options) const {