diff options
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<NVRenderRenderBuffer *>::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<NVRenderTexture2D *>::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<NVRenderTexture2DArray *>::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<NVRenderTextureCube *>::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<NVRenderImage2D *>::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; |