diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp index 12d441de37..956284419b 100644 --- a/source/renderer/Renderer.cpp +++ b/source/renderer/Renderer.cpp @@ -426,6 +426,9 @@ void CRenderer::RenderFrame(const bool needsPresent) } else { + if (needsPresent) + g_VideoMode.GetBackendDevice()->AcquireNextBackbuffer(); + RenderFrameImpl(true, true); m->deviceCommandContext->Flush(); @@ -540,6 +543,9 @@ void CRenderer::RenderScreenShot(const bool needsPresent) const size_t width = static_cast(g_xres), height = static_cast(g_yres); const size_t bpp = 24; + if (needsPresent) + g_VideoMode.GetBackendDevice()->AcquireNextBackbuffer(); + // Hide log messages and re-render RenderFrameImpl(true, false); @@ -647,6 +653,9 @@ void CRenderer::RenderBigScreenShot(const bool needsPresent) } g_Game->GetView()->GetCamera()->SetProjection(projection); + if (needsPresent) + g_VideoMode.GetBackendDevice()->AcquireNextBackbuffer(); + RenderFrameImpl(false, false); m->deviceCommandContext->ReadbackFramebufferSync(0, 0, tileWidth, tileHeight, tileData); diff --git a/source/renderer/backend/IDevice.h b/source/renderer/backend/IDevice.h index a08c180e4d..90a4aab0dd 100644 --- a/source/renderer/backend/IDevice.h +++ b/source/renderer/backend/IDevice.h @@ -95,6 +95,7 @@ public: virtual std::unique_ptr CreateShaderProgram( const CStr& name, const CShaderDefines& defines) = 0; + virtual void AcquireNextBackbuffer() = 0; virtual void Present() = 0; virtual bool IsTextureFormatSupported(const Format format) const = 0; diff --git a/source/renderer/backend/dummy/Device.cpp b/source/renderer/backend/dummy/Device.cpp index acabf6b711..f3f2791d49 100644 --- a/source/renderer/backend/dummy/Device.cpp +++ b/source/renderer/backend/dummy/Device.cpp @@ -112,6 +112,11 @@ std::unique_ptr CDevice::CreateShaderProgram( return CShaderProgram::Create(this); } +void CDevice::AcquireNextBackbuffer() +{ + // We have nothing to acquire. +} + void CDevice::Present() { // We have nothing to present. diff --git a/source/renderer/backend/dummy/Device.h b/source/renderer/backend/dummy/Device.h index 972378bb66..f04b23daeb 100644 --- a/source/renderer/backend/dummy/Device.h +++ b/source/renderer/backend/dummy/Device.h @@ -72,6 +72,7 @@ public: std::unique_ptr CreateShaderProgram( const CStr& name, const CShaderDefines& defines) override; + void AcquireNextBackbuffer() override; void Present() override; bool IsTextureFormatSupported(const Format format) const override; diff --git a/source/renderer/backend/gl/Device.cpp b/source/renderer/backend/gl/Device.cpp index 643659c059..625a1defe2 100644 --- a/source/renderer/backend/gl/Device.cpp +++ b/source/renderer/backend/gl/Device.cpp @@ -904,8 +904,17 @@ std::unique_ptr CDevice::CreateShaderProgram( return CShaderProgram::Create(this, name, defines); } +void CDevice::AcquireNextBackbuffer() +{ + ENSURE(!m_BackbufferAcquired); + m_BackbufferAcquired = true; +} + void CDevice::Present() { + ENSURE(m_BackbufferAcquired); + m_BackbufferAcquired = false; + if (m_Window) { PROFILE3("swap buffers"); diff --git a/source/renderer/backend/gl/Device.h b/source/renderer/backend/gl/Device.h index 9c30c7ed1b..67bd124cd8 100644 --- a/source/renderer/backend/gl/Device.h +++ b/source/renderer/backend/gl/Device.h @@ -89,6 +89,7 @@ public: std::unique_ptr CreateShaderProgram( const CStr& name, const CShaderDefines& defines) override; + void AcquireNextBackbuffer() override; void Present() override; bool IsTextureFormatSupported(const Format format) const override; @@ -116,6 +117,7 @@ private: CDeviceCommandContext* m_ActiveCommandContext = nullptr; std::unique_ptr m_Backbuffer; + bool m_BackbufferAcquired = false; Capabilities m_Capabilities{}; }; diff --git a/source/renderer/backend/vulkan/Device.cpp b/source/renderer/backend/vulkan/Device.cpp index f39311ad94..281d99c8a5 100644 --- a/source/renderer/backend/vulkan/Device.cpp +++ b/source/renderer/backend/vulkan/Device.cpp @@ -152,6 +152,10 @@ std::unique_ptr CDevice::CreateShaderProgram( return nullptr; } +void CDevice::AcquireNextBackbuffer() +{ +} + void CDevice::Present() { } diff --git a/source/renderer/backend/vulkan/Device.h b/source/renderer/backend/vulkan/Device.h index bedd225476..d5b8703b61 100644 --- a/source/renderer/backend/vulkan/Device.h +++ b/source/renderer/backend/vulkan/Device.h @@ -77,6 +77,7 @@ public: std::unique_ptr CreateShaderProgram( const CStr& name, const CShaderDefines& defines) override; + void AcquireNextBackbuffer() override; void Present() override; bool IsTextureFormatSupported(const Format format) const override; diff --git a/source/tools/atlas/GameInterface/View.cpp b/source/tools/atlas/GameInterface/View.cpp index 06c8262c6d..563c0312e0 100644 --- a/source/tools/atlas/GameInterface/View.cpp +++ b/source/tools/atlas/GameInterface/View.cpp @@ -223,6 +223,8 @@ void AtlasViewGame::Update(float realFrameLength) void AtlasViewGame::Render() { + g_VideoMode.GetBackendDevice()->AcquireNextBackbuffer(); + SViewPort vp = { 0, 0, g_xres, g_yres }; CCamera& camera = GetCamera(); camera.SetViewPort(vp);