diff options
Diffstat (limited to 'src/Runtime/ogl-runtime/src/runtimerender/Qt3DSOffscreenRenderManager.cpp')
m--------- | src/Runtime/ogl-runtime | 0 | ||||
-rw-r--r-- | src/Runtime/ogl-runtime/src/runtimerender/Qt3DSOffscreenRenderManager.cpp | 498 |
2 files changed, 0 insertions, 498 deletions
diff --git a/src/Runtime/ogl-runtime b/src/Runtime/ogl-runtime new file mode 160000 +Subproject 2025912174c4cf99270b7439ec3b021e1d089ae diff --git a/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSOffscreenRenderManager.cpp b/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSOffscreenRenderManager.cpp deleted file mode 100644 index 7d66c7a3..00000000 --- a/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSOffscreenRenderManager.cpp +++ /dev/null @@ -1,498 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2008-2012 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSOffscreenRenderManager.h" -#include "foundation/Qt3DSContainers.h" -#include "foundation/Qt3DSAtomic.h" -#include "render/Qt3DSRenderBaseTypes.h" -#include "foundation/StringTable.h" -#include "render/Qt3DSRenderFrameBuffer.h" -#include "render/Qt3DSRenderTexture2D.h" -#include "Qt3DSRenderResourceManager.h" -#include "render/Qt3DSRenderContext.h" -#include "foundation/Qt3DSFoundation.h" -#include "Qt3DSTextRenderer.h" -#include "Qt3DSRenderContextCore.h" -#include "Qt3DSOffscreenRenderKey.h" -#include "foundation/FastAllocator.h" -#include "Qt3DSRenderRenderList.h" -#include "Qt3DSRenderResourceTexture2D.h" -#include "Qt3DSRenderResourceBufferObjects.h" -#include "Qt3DSRendererUtil.h" - -using namespace qt3ds::render; - -namespace eastl { -template <> -struct hash<SOffscreenRendererKey> -{ - size_t operator()(const SOffscreenRendererKey &key) const - { - switch (key.getType()) { - case OffscreenRendererKeyTypes::RegisteredString: - return hash<CRegisteredString>()(key.getData<CRegisteredString>()); - case OffscreenRendererKeyTypes::VoidPtr: - return hash<size_t>()(reinterpret_cast<size_t>(key.getData<void *>())); - default: - break; - } - QT3DS_ASSERT(false); - return 0; - } - bool operator()(const SOffscreenRendererKey &lhs, const SOffscreenRendererKey &rhs) const - { - return lhs == rhs; - } -}; -} - -namespace { - -using eastl::pair; -using eastl::make_pair; - -struct SRendererData : SOffscreenRenderResult -{ - NVAllocatorCallback &m_Allocator; - IResourceManager &m_ResourceManager; - QT3DSU32 m_FrameCount; - bool m_Rendering; - - SRendererData(NVAllocatorCallback &inAllocator, IResourceManager &inResourceManager) - : m_Allocator(inAllocator) - , m_ResourceManager(inResourceManager) - , m_FrameCount(QT3DS_MAX_U32) - , m_Rendering(false) - { - } - ~SRendererData() - { - if (m_Texture) - m_ResourceManager.Release(*m_Texture); - m_Texture = NULL; - } - void Release() { NVDelete(m_Allocator, this); } -}; - -struct SScopedRenderDataRenderMarker -{ - SRendererData &m_Data; - SScopedRenderDataRenderMarker(SRendererData &d) - : m_Data(d) - { - QT3DS_ASSERT(m_Data.m_Rendering == false); - m_Data.m_Rendering = true; - } - ~SScopedRenderDataRenderMarker() { m_Data.m_Rendering = false; } -}; - -struct SRenderDataReleaser -{ - SRendererData *mPtr; - SRenderDataReleaser(SRendererData *inItem) - : mPtr(inItem) - { - } - // Transfer ownership - SRenderDataReleaser(const SRenderDataReleaser &inOther) - : mPtr(inOther.mPtr) - { - const_cast<SRenderDataReleaser &>(inOther).mPtr = NULL; - } - - ~SRenderDataReleaser() - { - if (mPtr) - mPtr->Release(); - } -}; -struct SOffscreenRenderManager; - -struct SOffscreenRunnable : public IRenderTask -{ - SOffscreenRenderManager &m_RenderManager; - SRendererData &m_Data; - SOffscreenRendererEnvironment m_DesiredEnvironment; - SOffscreenRunnable(SOffscreenRenderManager &rm, SRendererData &data, - SOffscreenRendererEnvironment env) - : m_RenderManager(rm) - , m_Data(data) - , m_DesiredEnvironment(env) - { - } - void Run() override; -}; - -struct SOffscreenRenderManager : public IOffscreenRenderManager -{ - typedef nvhash_map<SOffscreenRendererKey, SRenderDataReleaser> TRendererMap; - IQt3DSRenderContext &m_Context; - NVAllocatorCallback &m_Allocator; - NVScopedRefCounted<IStringTable> m_StringTable; - NVScopedRefCounted<IResourceManager> m_ResourceManager; - TRendererMap m_Renderers; - SFastAllocator<> m_PerFrameAllocator; - QT3DSU32 m_FrameCount; // cheap per- - - volatile QT3DSI32 mRefCount; - - SOffscreenRenderManager(NVAllocatorCallback &inCallback, IStringTable &inStringTable, - IResourceManager &inManager, IQt3DSRenderContext &inContext) - : m_Context(inContext) - , m_Allocator(inCallback) - , m_StringTable(inStringTable) - , m_ResourceManager(inManager) - , m_Renderers(inCallback, "SOffscreenRenderManager::m_Renderers") - , m_PerFrameAllocator(inCallback, "m_PerFrameAllocator") - , m_FrameCount(0) - , mRefCount(0) - { - } - - virtual ~SOffscreenRenderManager() {} - - QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Allocator) - - Option<bool> MaybeRegisterOffscreenRenderer(const SOffscreenRendererKey &inKey, - IOffscreenRenderer &inRenderer) override - { - TRendererMap::iterator theIter = m_Renderers.find(inKey); - if (theIter != m_Renderers.end()) { - SRendererData &theData = *(theIter->second.mPtr); - if (theData.m_Renderer != &inRenderer) { - if (inKey.getType() == OffscreenRendererKeyTypes::RegisteredString) { - qCCritical(INVALID_OPERATION, "Different renderers registered under same key: %s", - inKey.getData<CRegisteredString>().c_str()); - } - QT3DS_ASSERT(false); - return Empty(); - } - return false; - } - RegisterOffscreenRenderer(inKey, inRenderer); - return true; - } - - void RegisterOffscreenRenderer(const SOffscreenRendererKey &inKey, - IOffscreenRenderer &inRenderer) override - { - pair<TRendererMap::iterator, bool> theInsert = m_Renderers.insert( - make_pair(inKey, QT3DS_NEW(m_Allocator, SRendererData)(m_Allocator, *m_ResourceManager))); - QT3DS_ASSERT(theInsert.second); - SRendererData &theData = *(theInsert.first->second.mPtr); - theData.m_Renderer = &inRenderer; - } - - bool HasOffscreenRenderer(const SOffscreenRendererKey &inKey) override - { - return m_Renderers.find(inKey) != m_Renderers.end(); - } - - IOffscreenRenderer *GetOffscreenRenderer(const SOffscreenRendererKey &inKey) override - { - TRendererMap::iterator theRenderer = m_Renderers.find(inKey); - if (theRenderer != m_Renderers.end()) { - SRendererData &theData = *theRenderer->second.mPtr; - return theData.m_Renderer; - } - return NULL; - } - void ReleaseOffscreenRenderer(const SOffscreenRendererKey &inKey) override - { - m_Renderers.erase(inKey); - } - - void RenderItem(SRendererData &theData, SOffscreenRendererEnvironment theDesiredEnvironment) - { - NVRenderContext &theContext = m_ResourceManager->GetRenderContext(); - QT3DSVec2 thePresScaleFactor = m_Context.GetPresentationScaleFactor(); - SOffscreenRendererEnvironment theOriginalDesiredEnvironment(theDesiredEnvironment); - // Ensure that our overall render context comes back no matter what the client does. - qt3ds::render::NVRenderContextScopedProperty<QT3DSVec4> __clearColor( - theContext, &NVRenderContext::GetClearColor, &NVRenderContext::SetClearColor, - QT3DSVec4(0, 0, 0, 0)); - qt3ds::render::NVRenderContextScopedProperty<bool> __scissorEnabled( - theContext, &NVRenderContext::IsScissorTestEnabled, - &NVRenderContext::SetScissorTestEnabled, false); - qt3ds::render::NVRenderContextScopedProperty<NVRenderRect> __scissorRect( - theContext, &NVRenderContext::GetScissorRect, &NVRenderContext::SetScissorRect); - qt3ds::render::NVRenderContextScopedProperty<NVRenderRect> __viewportRect( - theContext, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport); - qt3ds::render::NVRenderContextScopedProperty<bool> __depthWrite( - theContext, &NVRenderContext::IsDepthWriteEnabled, - &NVRenderContext::SetDepthWriteEnabled, false); - qt3ds::render::NVRenderContextScopedProperty<qt3ds::render::NVRenderBoolOp::Enum> __depthFunction( - theContext, &NVRenderContext::GetDepthFunction, &NVRenderContext::SetDepthFunction, - qt3ds::render::NVRenderBoolOp::Less); - qt3ds::render::NVRenderContextScopedProperty<bool> __blendEnabled( - theContext, &NVRenderContext::IsBlendingEnabled, &NVRenderContext::SetBlendingEnabled, - false); - qt3ds::render::NVRenderContextScopedProperty<qt3ds::render::NVRenderBlendFunctionArgument> - __blendFunction(theContext, &NVRenderContext::GetBlendFunction, - &NVRenderContext::SetBlendFunction, - qt3ds::render::NVRenderBlendFunctionArgument()); - qt3ds::render::NVRenderContextScopedProperty<qt3ds::render::NVRenderBlendEquationArgument> - __blendEquation(theContext, &NVRenderContext::GetBlendEquation, - &NVRenderContext::SetBlendEquation, - qt3ds::render::NVRenderBlendEquationArgument()); - qt3ds::render::NVRenderContextScopedProperty<qt3ds::render::NVRenderFrameBufferPtr> - __rendertarget(theContext, &NVRenderContext::GetRenderTarget, - &NVRenderContext::SetRenderTarget); - - QT3DSU32 theSampleCount = 1; - bool isMultisamplePass = false; - if (theDesiredEnvironment.m_MSAAMode != AAModeValues::NoAA) { - switch (theDesiredEnvironment.m_MSAAMode) { - case AAModeValues::SSAA: - theSampleCount = 1; - isMultisamplePass = true; - break; - case AAModeValues::X2: - theSampleCount = 2; - isMultisamplePass = true; - break; - case AAModeValues::X4: - theSampleCount = 4; - isMultisamplePass = true; - break; - case AAModeValues::X8: - theSampleCount = 8; - isMultisamplePass = true; - break; - default: - QT3DS_ASSERT(false); - break; - }; - - // adjust render size for SSAA - if (theDesiredEnvironment.m_MSAAMode == AAModeValues::SSAA) { - CRendererUtil::GetSSAARenderSize( - theOriginalDesiredEnvironment.m_Width, theOriginalDesiredEnvironment.m_Height, - theDesiredEnvironment.m_Width, theDesiredEnvironment.m_Height); - } - } - CResourceFrameBuffer theFrameBuffer(*m_ResourceManager); - theFrameBuffer.EnsureFrameBuffer(); - NVRenderTexture2D *renderTargetTexture(theData.m_Texture); - qt3ds::render::NVRenderTextureTargetType::Enum fboAttachmentType = - qt3ds::render::NVRenderTextureTargetType::Texture2D; - if (isMultisamplePass) { - renderTargetTexture = NULL; - if (theSampleCount > 1) - fboAttachmentType = qt3ds::render::NVRenderTextureTargetType::Texture2D_MS; - } - - CResourceTexture2D renderColorTexture(*m_ResourceManager, renderTargetTexture); - - CResourceTexture2D renderDepthStencilTexture(*m_ResourceManager); - - if (theSampleCount > 1) - m_Context.GetRenderContext().SetMultisampleEnabled(true); - - qt3ds::render::NVRenderClearFlags theClearFlags; - NVRenderTextureFormats::Enum theDepthStencilTextureFormat(NVRenderTextureFormats::Unknown); - NVRenderFrameBufferAttachments::Enum theAttachmentLocation( - NVRenderFrameBufferAttachments::Unknown); - if (theDesiredEnvironment.m_Stencil) { - theDepthStencilTextureFormat = NVRenderTextureFormats::Depth24Stencil8; - theAttachmentLocation = NVRenderFrameBufferAttachments::DepthStencil; - } else if (theDesiredEnvironment.m_Depth != OffscreenRendererDepthValues::NoDepthBuffer) { - theAttachmentLocation = NVRenderFrameBufferAttachments::Depth; - switch (theDesiredEnvironment.m_Depth) { - case OffscreenRendererDepthValues::Depth16: - theDepthStencilTextureFormat = NVRenderTextureFormats::Depth16; - break; - case OffscreenRendererDepthValues::Depth24: - theDepthStencilTextureFormat = NVRenderTextureFormats::Depth24; - break; - case OffscreenRendererDepthValues::Depth32: - theDepthStencilTextureFormat = NVRenderTextureFormats::Depth32; - break; - default: - theAttachmentLocation = NVRenderFrameBufferAttachments::Unknown; - theDepthStencilTextureFormat = NVRenderTextureFormats::Unknown; - break; - } - } - renderColorTexture.EnsureTexture(theDesiredEnvironment.m_Width, - theDesiredEnvironment.m_Height, - theDesiredEnvironment.m_Format, theSampleCount); - theFrameBuffer->Attach(NVRenderFrameBufferAttachments::Color0, *renderColorTexture, - fboAttachmentType); - - if (theDepthStencilTextureFormat != NVRenderTextureFormats::Unknown) { - renderDepthStencilTexture.EnsureTexture(theDesiredEnvironment.m_Width, - theDesiredEnvironment.m_Height, - theDepthStencilTextureFormat, theSampleCount); - theFrameBuffer->Attach(theAttachmentLocation, *renderDepthStencilTexture, - fboAttachmentType); - } - // IsComplete check takes a really long time so I am not going to worry about it for now. - - theContext.SetRenderTarget(theFrameBuffer); - theContext.SetViewport( - NVRenderRect(0, 0, theDesiredEnvironment.m_Width, theDesiredEnvironment.m_Height)); - theContext.SetScissorTestEnabled(false); - - theContext.SetBlendingEnabled(false); - theData.m_Renderer->Render(theDesiredEnvironment, theContext, thePresScaleFactor, - SScene::AlwaysClear, this); - - if (theSampleCount > 1) { - CResourceTexture2D theResult(*m_ResourceManager, theData.m_Texture); - - if (theDesiredEnvironment.m_MSAAMode != AAModeValues::SSAA) { - // Have to downsample the FBO. - CRendererUtil::ResolveMutisampleFBOColorOnly( - *m_ResourceManager, theResult, m_Context.GetRenderContext(), - theDesiredEnvironment.m_Width, theDesiredEnvironment.m_Height, - theDesiredEnvironment.m_Format, *theFrameBuffer); - - m_Context.GetRenderContext().SetMultisampleEnabled(false); - } else { - // Resolve the FBO to the layer texture - CRendererUtil::ResolveSSAAFBOColorOnly( - *m_ResourceManager, theResult, theOriginalDesiredEnvironment.m_Width, - theOriginalDesiredEnvironment.m_Height, m_Context.GetRenderContext(), - theDesiredEnvironment.m_Width, theDesiredEnvironment.m_Height, - theDesiredEnvironment.m_Format, *theFrameBuffer); - } - - QT3DS_ASSERT(theData.m_Texture == theResult.GetTexture()); - theResult.ForgetTexture(); - } else { - renderColorTexture.ForgetTexture(); - } - theFrameBuffer->Attach(NVRenderFrameBufferAttachments::Color0, - NVRenderTextureOrRenderBuffer(), fboAttachmentType); - if (theAttachmentLocation != NVRenderFrameBufferAttachments::Unknown) - theFrameBuffer->Attach(theAttachmentLocation, NVRenderTextureOrRenderBuffer(), - fboAttachmentType); - } - - SOffscreenRenderResult GetRenderedItem(const SOffscreenRendererKey &inKey) override - { - TRendererMap::iterator theRenderer = m_Renderers.find(inKey); - QT3DSVec2 thePresScaleFactor = m_Context.GetPresentationScaleFactor(); - if (theRenderer != m_Renderers.end() && theRenderer->second.mPtr->m_Rendering == false) { - SRendererData &theData = *theRenderer->second.mPtr; - SScopedRenderDataRenderMarker __renderMarker(theData); - - bool renderedThisFrame = theData.m_Texture && theData.m_FrameCount == m_FrameCount; - theData.m_FrameCount = m_FrameCount; - // Two different quick-out pathways. - if (renderedThisFrame) - return theData; - - SOffscreenRendererEnvironment theDesiredEnvironment = - theData.m_Renderer->GetDesiredEnvironment(thePresScaleFactor); - // Ensure we get a valid width and height - theDesiredEnvironment.m_Width = - ITextRenderer::NextMultipleOf4(theDesiredEnvironment.m_Width); - theDesiredEnvironment.m_Height = - ITextRenderer::NextMultipleOf4(theDesiredEnvironment.m_Height); - if (theDesiredEnvironment.m_Width == 0 || theDesiredEnvironment.m_Height == 0) { - return SOffscreenRenderResult(); - } - - NVRenderRect theViewport(0, 0, theDesiredEnvironment.m_Width, - theDesiredEnvironment.m_Height); - IRenderList &theRenderList(m_Context.GetRenderList()); - NVRenderContext &theContext(m_Context.GetRenderContext()); - // This happens here because if there are any fancy render steps - SRenderListScopedProperty<bool> _scissor(theRenderList, - &IRenderList::IsScissorTestEnabled, - &IRenderList::SetScissorTestEnabled, false); - SRenderListScopedProperty<NVRenderRect> _viewport( - theRenderList, &IRenderList::GetViewport, &IRenderList::SetViewport, theViewport); - // Some plugins don't use the render list so they need the actual gl context setup. - qt3ds::render::NVRenderContextScopedProperty<bool> __scissorEnabled( - theContext, &NVRenderContext::IsScissorTestEnabled, - &NVRenderContext::SetScissorTestEnabled, false); - qt3ds::render::NVRenderContextScopedProperty<NVRenderRect> __viewportRect( - theContext, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport, - theViewport); - - QT3DSU32 taskId = m_Context.GetRenderList().AddRenderTask( - *QT3DS_NEW(m_Context.GetPerFrameAllocator(), - SOffscreenRunnable)(*this, theData, theDesiredEnvironment)); - - SOffscreenRenderFlags theFlags = - theData.m_Renderer->NeedsRender(theDesiredEnvironment, thePresScaleFactor, this); - theData.m_HasTransparency = theFlags.m_HasTransparency; - theData.m_HasChangedSinceLastFrame = theFlags.m_HasChangedSinceLastFrame; - if (theData.m_Texture) { - // Quick-out if the renderer doesn't need to render itself. - if (theData.m_HasChangedSinceLastFrame == false) { - m_Context.GetRenderList().DiscardRenderTask(taskId); - return theData; - } - } else - theData.m_HasChangedSinceLastFrame = true; - - // Release existing texture if it doesn't match latest environment request. - if (theData.m_Texture) { - STextureDetails theDetails = theData.m_Texture->GetTextureDetails(); - if (theDesiredEnvironment.m_Width != theDetails.m_Width - || theDesiredEnvironment.m_Height != theDetails.m_Height - || theDesiredEnvironment.m_Format != theDetails.m_Format) { - m_ResourceManager->Release(*theData.m_Texture); - theData.m_Texture = NULL; - } - } - - if (theData.m_Texture == NULL) - theData.m_Texture = m_ResourceManager->AllocateTexture2D( - theDesiredEnvironment.m_Width, theDesiredEnvironment.m_Height, - theDesiredEnvironment.m_Format); - - // Add the node to the graph and get on with it. - - return theData; - } - return SOffscreenRenderResult(); - } - - void BeginFrame() override { m_PerFrameAllocator.reset(); } - void EndFrame() override { ++m_FrameCount; } -}; - -void SOffscreenRunnable::Run() -{ - m_RenderManager.RenderItem(m_Data, m_DesiredEnvironment); -} -} - -IOffscreenRenderManager &IOffscreenRenderManager::CreateOffscreenRenderManager( - NVAllocatorCallback &inCallback, IStringTable &inStringTable, IResourceManager &inManager, - IQt3DSRenderContext &inContext) -{ - return *QT3DS_NEW(inCallback, SOffscreenRenderManager)(inCallback, inStringTable, inManager, - inContext); -} |