From ddc70c4bfbd0c3819ecf859f53c9069844fd2ca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20M=C3=A4=C3=A4tt=C3=A4?= Date: Tue, 20 Oct 2020 13:33:13 +0300 Subject: Fix black screen in the editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Clear and destroy resource manager resources between switching projects. Task-number: QT3DS-4190 Change-Id: Id650481ab41038d4b274809f1ea87bf3e2271e49 Reviewed-by: Tony Leinonen Reviewed-by: Tomi Korpipää --- src/runtimerender/Qt3DSRenderContextCore.cpp | 1 + .../Qt3DSRenderCustomMaterialSystem.cpp | 12 +++---- .../resourcemanager/Qt3DSRenderResourceManager.cpp | 42 +++++++++++++++------- .../resourcemanager/Qt3DSRenderResourceManager.h | 14 ++++---- 4 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/runtimerender/Qt3DSRenderContextCore.cpp b/src/runtimerender/Qt3DSRenderContextCore.cpp index 44f10c0..c87e48b 100644 --- a/src/runtimerender/Qt3DSRenderContextCore.cpp +++ b/src/runtimerender/Qt3DSRenderContextCore.cpp @@ -874,6 +874,7 @@ struct SRenderContext : public IQt3DSRenderContext void RunRenderTasks() override { + m_RenderContext->resetStates(); m_RenderList->RunRenderTasks(); // Don't (re)setup when rendering stereoscopic second (right) eye. // Except in progressive mode, where each viewport needs to be cleared separately. diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp index 4e090a9..4e109dd 100644 --- a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp +++ b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp @@ -909,10 +909,10 @@ struct SMaterialSystem : public ICustomMaterialSystem void clearImageAndBufferCaches() { while (m_AllocatedBuffers.size()) - ReleaseBuffer(0); + ReleaseBuffer(0, true); } - void ReleaseBuffer(QT3DSU32 inIdx) + void ReleaseBuffer(QT3DSU32 inIdx, bool forceRelease) { // Don't call this on MaterialSystem destroy. // This causes issues for scene liftime buffers @@ -922,8 +922,8 @@ struct SMaterialSystem : public ICustomMaterialSystem theEntry.m_FrameBuffer->Attach(NVRenderFrameBufferAttachments::Color0, NVRenderTextureOrRenderBuffer()); - theManager.Release(*theEntry.m_FrameBuffer); - theManager.Release(*theEntry.m_Texture); + theManager.Release(*theEntry.m_FrameBuffer, forceRelease); + theManager.Release(*theEntry.m_Texture, forceRelease); m_AllocatedBuffers.replace_with_last(inIdx); } @@ -1513,7 +1513,7 @@ struct SMaterialSystem : public ICustomMaterialSystem && theDetails.m_Format == theFormat) { theTexture = theEntry.m_Texture; } else { - ReleaseBuffer(bufferIdx); + ReleaseBuffer(bufferIdx, false); } } @@ -1885,7 +1885,7 @@ struct SMaterialSystem : public ICustomMaterialSystem // Release any per-frame buffers for (QT3DSU32 idx = 0; idx < m_AllocatedBuffers.size(); ++idx) { if (m_AllocatedBuffers[idx].m_Flags.IsSceneLifetime() == false) { - ReleaseBuffer(idx); + ReleaseBuffer(idx, false); --idx; } } diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.cpp index 3593688..68f90fb 100644 --- a/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.cpp +++ b/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.cpp @@ -83,7 +83,7 @@ struct SResourceManager : public IResourceManager m_FreeFrameBuffers.pop_back(); return retval; } - void Release(NVRenderFrameBuffer &inBuffer) override + void Release(NVRenderFrameBuffer &inBuffer, bool forceRelease) override { if (inBuffer.HasAnyAttachment()) { // Ensure the framebuffer has no attachments. @@ -116,7 +116,10 @@ struct SResourceManager : public IResourceManager eastl::find(m_FreeFrameBuffers.begin(), m_FreeFrameBuffers.end(), &inBuffer); QT3DS_ASSERT(theFind == m_FreeFrameBuffers.end()); #endif - m_FreeFrameBuffers.push_back(&inBuffer); + if (forceRelease) + RemoveObjectAllocation(&inBuffer); + else + m_FreeFrameBuffers.push_back(&inBuffer); } virtual NVRenderRenderBuffer * @@ -151,14 +154,17 @@ struct SResourceManager : public IResourceManager m_AllocatedObjects.push_back(theBuffer); return theBuffer; } - void Release(NVRenderRenderBuffer &inBuffer) override + void Release(NVRenderRenderBuffer &inBuffer, bool forceRelease) override { #ifdef _DEBUG nvvector::iterator theFind = eastl::find(m_FreeRenderBuffers.begin(), m_FreeRenderBuffers.end(), &inBuffer); QT3DS_ASSERT(theFind == m_FreeRenderBuffers.end()); #endif - m_FreeRenderBuffers.push_back(&inBuffer); + if (forceRelease) + RemoveObjectAllocation(&inBuffer); + else + m_FreeRenderBuffers.push_back(&inBuffer); } NVRenderTexture2D *SetupAllocatedTexture(NVRenderTexture2D &inTexture) { @@ -211,14 +217,17 @@ struct SResourceManager : public IResourceManager m_AllocatedObjects.push_back(theTexture); return SetupAllocatedTexture(*theTexture); } - void Release(NVRenderTexture2D &inBuffer) override + void Release(NVRenderTexture2D &inBuffer, bool forceRelease) override { #ifdef _DEBUG nvvector::iterator theFind = eastl::find(m_FreeTextures.begin(), m_FreeTextures.end(), &inBuffer); QT3DS_ASSERT(theFind == m_FreeTextures.end()); #endif - m_FreeTextures.push_back(&inBuffer); + if (forceRelease) + RemoveObjectAllocation(&inBuffer); + else + m_FreeTextures.push_back(&inBuffer); } NVRenderTexture2DArray *AllocateTexture2DArray(QT3DSU32 inWidth, QT3DSU32 inHeight, QT3DSU32 inSlices, @@ -273,14 +282,17 @@ struct SResourceManager : public IResourceManager return theTexture; } - void Release(NVRenderTexture2DArray &inBuffer) override + void Release(NVRenderTexture2DArray &inBuffer, bool forceRelease) override { #ifdef _DEBUG nvvector::iterator theFind = eastl::find(m_FreeTexArrays.begin(), m_FreeTexArrays.end(), &inBuffer); QT3DS_ASSERT(theFind == m_FreeTexArrays.end()); #endif - m_FreeTexArrays.push_back(&inBuffer); + if (forceRelease) + RemoveObjectAllocation(&inBuffer); + else + m_FreeTexArrays.push_back(&inBuffer); } NVRenderTextureCube *AllocateTextureCube(QT3DSU32 inWidth, QT3DSU32 inHeight, @@ -356,14 +368,17 @@ struct SResourceManager : public IResourceManager return theTexture; } - void Release(NVRenderTextureCube &inBuffer) override + void Release(NVRenderTextureCube &inBuffer, bool forceRelease) override { #ifdef _DEBUG nvvector::iterator theFind = eastl::find(m_FreeTexCubes.begin(), m_FreeTexCubes.end(), &inBuffer); QT3DS_ASSERT(theFind == m_FreeTexCubes.end()); #endif - m_FreeTexCubes.push_back(&inBuffer); + if (forceRelease) + RemoveObjectAllocation(&inBuffer); + else + m_FreeTexCubes.push_back(&inBuffer); } NVRenderImage2D *AllocateImage2D(NVRenderTexture2D *inTexture, @@ -383,14 +398,17 @@ struct SResourceManager : public IResourceManager return retval; } - void Release(NVRenderImage2D &inBuffer) override + void Release(NVRenderImage2D &inBuffer, bool forceRelease) override { #ifdef _DEBUG nvvector::iterator theFind = eastl::find(m_FreeImages.begin(), m_FreeImages.end(), &inBuffer); QT3DS_ASSERT(theFind == m_FreeImages.end()); #endif - m_FreeImages.push_back(&inBuffer); + if (forceRelease) + RemoveObjectAllocation(&inBuffer); + else + m_FreeImages.push_back(&inBuffer); } NVRenderContext &GetRenderContext() override { return *m_RenderContext; } diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.h b/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.h index 675d644..3d6d59b 100644 --- a/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.h +++ b/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.h @@ -46,29 +46,31 @@ namespace render { public: virtual NVRenderFrameBuffer *AllocateFrameBuffer() = 0; - virtual void Release(NVRenderFrameBuffer &inBuffer) = 0; virtual NVRenderRenderBuffer * AllocateRenderBuffer(QT3DSU32 inWidth, QT3DSU32 inHeight, NVRenderRenderBufferFormats::Enum inBufferFormat) = 0; - virtual void Release(NVRenderRenderBuffer &inBuffer) = 0; + virtual NVRenderTexture2D *AllocateTexture2D(QT3DSU32 inWidth, QT3DSU32 inHeight, NVRenderTextureFormats::Enum inTextureFormat, QT3DSU32 inSampleCount = 1, bool immutable = false) = 0; - virtual void Release(NVRenderTexture2D &inBuffer) = 0; virtual NVRenderTexture2DArray * AllocateTexture2DArray(QT3DSU32 inWidth, QT3DSU32 inHeight, QT3DSU32 inSlices, NVRenderTextureFormats::Enum inTextureFormat, QT3DSU32 inSampleCount = 1) = 0; - virtual void Release(NVRenderTexture2DArray &inBuffer) = 0; virtual NVRenderTextureCube * AllocateTextureCube(QT3DSU32 inWidth, QT3DSU32 inHeight, NVRenderTextureFormats::Enum inTextureFormat, QT3DSU32 inSampleCount = 1) = 0; - virtual void Release(NVRenderTextureCube &inBuffer) = 0; virtual NVRenderImage2D *AllocateImage2D(NVRenderTexture2D *inTexture, NVRenderImageAccessType::Enum inAccess) = 0; - virtual void Release(NVRenderImage2D &inBuffer) = 0; + + virtual void Release(NVRenderFrameBuffer &inBuffer, bool forceRelease = false) = 0; + virtual void Release(NVRenderRenderBuffer &inBuffer, bool forceRelease = false) = 0; + virtual void Release(NVRenderTexture2D &inBuffer, bool forceRelease = false) = 0; + virtual void Release(NVRenderTexture2DArray &inBuffer, bool forceRelease = false) = 0; + virtual void Release(NVRenderTextureCube &inBuffer, bool forceRelease = false) = 0; + virtual void Release(NVRenderImage2D &inBuffer, bool forceRelease = false) = 0; virtual NVRenderContext &GetRenderContext() = 0; virtual void DestroyFreeSizedResources() = 0; -- cgit v1.2.3