Skip to content

Commit

Permalink
Some rearrangements to prevent GL calls after context destruction
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Apr 7, 2022
1 parent 960945d commit abf0814
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 13 deletions.
24 changes: 13 additions & 11 deletions radiantcore/rendersystem/OpenGLRenderSystem.cpp
Expand Up @@ -31,7 +31,6 @@ OpenGLRenderSystem::OpenGLRenderSystem() :
_glProgramFactory(std::make_shared<GLProgramFactory>()),
_currentShaderProgram(SHADER_PROGRAM_NONE),
_time(0),
_geometryStore(_syncObjectProvider, _bufferObjectProvider),
m_traverseRenderablesMutex(false)
{
bool shouldRealise = false;
Expand Down Expand Up @@ -180,12 +179,12 @@ IRenderResult::Ptr OpenGLRenderSystem::render(SceneRenderer& renderer, RenderSta
void OpenGLRenderSystem::startFrame()
{
// Prepare the storage objects
_geometryStore.onFrameStart();
_geometryStore->onFrameStart();
}

void OpenGLRenderSystem::endFrame()
{
_geometryStore.onFrameFinished();
_geometryStore->onFrameFinished();
}

void OpenGLRenderSystem::renderText()
Expand Down Expand Up @@ -219,9 +218,10 @@ void OpenGLRenderSystem::realise()
shader->realise();
}

_orthoRenderer = std::make_unique<FullBrightRenderer>(RenderViewType::OrthoView, _state_sorted, _geometryStore);
_editorPreviewRenderer = std::make_unique<FullBrightRenderer>(RenderViewType::Camera, _state_sorted, _geometryStore);
_lightingModeRenderer = std::make_unique<LightingModeRenderer>(*_glProgramFactory, _geometryStore, _lights, _entities);
_geometryStore = std::make_unique<GeometryStore>(_syncObjectProvider, _bufferObjectProvider);
_orthoRenderer = std::make_unique<FullBrightRenderer>(RenderViewType::OrthoView, _state_sorted, *_geometryStore);
_editorPreviewRenderer = std::make_unique<FullBrightRenderer>(RenderViewType::Camera, _state_sorted, *_geometryStore);
_lightingModeRenderer = std::make_unique<LightingModeRenderer>(*_glProgramFactory, *_geometryStore, _lights, _entities);
}

void OpenGLRenderSystem::unrealise()
Expand All @@ -232,6 +232,10 @@ void OpenGLRenderSystem::unrealise()

_realised = false;

_orthoRenderer.reset();
_editorPreviewRenderer.reset();
_lightingModeRenderer.reset();

// Unrealise all OpenGLShader objects
for (auto& [_, shader] : _shaders)
{
Expand All @@ -245,6 +249,8 @@ void OpenGLRenderSystem::unrealise()
// Unrealise the GLPrograms
_glProgramFactory->unrealise();
}

_geometryStore.reset();
}

GLProgramFactory& OpenGLRenderSystem::getGLProgramFactory()
Expand Down Expand Up @@ -417,10 +423,6 @@ void OpenGLRenderSystem::initialiseModule(const IApplicationContext& ctx)

void OpenGLRenderSystem::shutdownModule()
{
_orthoRenderer.reset();
_editorPreviewRenderer.reset();
_lightingModeRenderer.reset();

_entities.clear();
_lights.clear();

Expand Down Expand Up @@ -480,7 +482,7 @@ void OpenGLRenderSystem::foreachLight(const std::function<void(const RendererLig

IGeometryStore& OpenGLRenderSystem::getGeometryStore()
{
return _geometryStore;
return *_geometryStore;
}

// Define the static OpenGLRenderSystem module
Expand Down
2 changes: 1 addition & 1 deletion radiantcore/rendersystem/OpenGLRenderSystem.h
Expand Up @@ -65,7 +65,7 @@ class OpenGLRenderSystem final

FenceSyncProvider _syncObjectProvider;
BufferObjectProvider _bufferObjectProvider;
GeometryStore _geometryStore;
std::unique_ptr<GeometryStore> _geometryStore;

// Renderer implementations, one for each view type/purpose

Expand Down
4 changes: 4 additions & 0 deletions radiantcore/rendersystem/SharedOpenGLContextModule.cpp
Expand Up @@ -25,6 +25,8 @@ void SharedOpenGLContextModule::setSharedContext(const IGLContext::Ptr& context)
return; // no change
}

// Don't fire the context destructor yet
auto oldContext = _sharedContext;
_sharedContext = context;

if (_sharedContext)
Expand All @@ -35,6 +37,8 @@ void SharedOpenGLContextModule::setSharedContext(const IGLContext::Ptr& context)
{
_sigSharedContextDestroyed.emit();
}

oldContext.reset();
}

sigc::signal<void>& SharedOpenGLContextModule::signal_sharedContextCreated()
Expand Down
6 changes: 5 additions & 1 deletion radiantcore/rendersystem/backend/BufferObjectProvider.h
Expand Up @@ -28,7 +28,11 @@ class BufferObjectProvider final :

~BufferObject()
{
glDeleteBuffers(1, &_buffer);
if (_buffer != 0)
{
glDeleteBuffers(1, &_buffer);
}

_buffer = 0;
}

Expand Down

0 comments on commit abf0814

Please sign in to comment.