summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.cpp1
-rw-r--r--src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp12
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.cpp42
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.h14
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;