diff options
Diffstat (limited to 'src/runtimerender')
-rw-r--r-- | src/runtimerender/Qt3DSRenderEffectSystem.cpp | 19 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderEffectSystem.h | 7 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderer.h | 2 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp | 14 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImpl.h | 2 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp | 23 |
6 files changed, 49 insertions, 18 deletions
diff --git a/src/runtimerender/Qt3DSRenderEffectSystem.cpp b/src/runtimerender/Qt3DSRenderEffectSystem.cpp index 81027f1..795eeea 100644 --- a/src/runtimerender/Qt3DSRenderEffectSystem.cpp +++ b/src/runtimerender/Qt3DSRenderEffectSystem.cpp @@ -1719,13 +1719,18 @@ struct SEffectSystem : public IEffectSystem QT3DSU32 theFinalWidth = ITextRenderer::NextMultipleOf4((QT3DSU32)(theDetails.m_Width)); QT3DSU32 theFinalHeight = ITextRenderer::NextMultipleOf4((QT3DSU32)(theDetails.m_Height)); NVRenderFrameBuffer *theBuffer = theManager.AllocateFrameBuffer(); - // UdoL Some Effects may need to run before HDR tonemap. This means we need to keep the - // input format - NVRenderTextureFormats::Enum theOutputFormat = NVRenderTextureFormats::RGBA8; - if (theClass->m_DynamicClass->GetOutputTextureFormat() == NVRenderTextureFormats::Unknown) - theOutputFormat = theDetails.m_Format; - NVRenderTexture2D *theTargetTexture = - theManager.AllocateTexture2D(theFinalWidth, theFinalHeight, theOutputFormat); + NVRenderTexture2D *theTargetTexture = inRenderArgument.m_targetTexture; + if (theTargetTexture == nullptr) { + // Some Effects may need to run before HDR tonemap. This means we need to keep the + // input format + NVRenderTextureFormats::Enum theOutputFormat = NVRenderTextureFormats::RGBA8; + if (theClass->m_DynamicClass->GetOutputTextureFormat() + == NVRenderTextureFormats::Unknown) { + theOutputFormat = theDetails.m_Format; + } + theTargetTexture = theManager.AllocateTexture2D(theFinalWidth, theFinalHeight, + theOutputFormat); + } theBuffer->Attach(NVRenderFrameBufferAttachments::Color0, *theTargetTexture); theContext.SetRenderTarget(theBuffer); NVRenderContextScopedProperty<NVRenderRect> __viewport( diff --git a/src/runtimerender/Qt3DSRenderEffectSystem.h b/src/runtimerender/Qt3DSRenderEffectSystem.h index a9ea7c5..def1539 100644 --- a/src/runtimerender/Qt3DSRenderEffectSystem.h +++ b/src/runtimerender/Qt3DSRenderEffectSystem.h @@ -57,16 +57,19 @@ namespace render { // this is a depth preapass texture we need for some effects like bloom // actually we need the stencil values NVRenderTexture2D *m_DepthStencilBuffer; + NVRenderTexture2D *m_targetTexture; SEffectRenderArgument(SEffect &inEffect, NVRenderTexture2D &inColorBuffer, const QT3DSVec2 &inCameraClipRange, - NVRenderTexture2D *inDepthTexture = NULL, - NVRenderTexture2D *inDepthBuffer = NULL) + NVRenderTexture2D *inDepthTexture = nullptr, + NVRenderTexture2D *inDepthBuffer = nullptr, + NVRenderTexture2D *targetTexture = nullptr) : m_Effect(inEffect) , m_ColorBuffer(inColorBuffer) , m_CameraClipRange(inCameraClipRange) , m_DepthTexture(inDepthTexture) , m_DepthStencilBuffer(inDepthBuffer) + , m_targetTexture(targetTexture) { } }; diff --git a/src/runtimerender/Qt3DSRenderer.h b/src/runtimerender/Qt3DSRenderer.h index fb6c3de..392fb62 100644 --- a/src/runtimerender/Qt3DSRenderer.h +++ b/src/runtimerender/Qt3DSRenderer.h @@ -167,6 +167,8 @@ namespace render { const QT3DSVec3 &inMouseVec) const = 0; virtual QT3DSVec3 ProjectPosition(SNode &inNode, const QT3DSVec3 &inPosition) const = 0; + virtual uint getLayerTextureId(SLayer &layer) = 0; + // Roughly equivalent of gluPickMatrix, allows users to setup a perspective transform that // will draw some sub component // of the layer. Used in combination with an expected viewport of 0,0,width,height the diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp index db3697a..04b08c1 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp @@ -968,6 +968,20 @@ namespace render { return mouseVec; } + uint Qt3DSRendererImpl::getLayerTextureId(SLayer &layer) + { + SLayerRenderData *data = GetOrCreateLayerRenderDataForNode(layer); + if (data->m_LayerCachedTexture) { + return static_cast<uint>(reinterpret_cast<size_t>( + data->m_LayerCachedTexture->GetTextureObjectHandle())); + } + if (data->m_LayerTexture) { + return static_cast<uint>(reinterpret_cast<size_t>( + data->m_LayerTexture->GetTextureObjectHandle())); + } + return 0; + } + Option<SLayerPickSetup> Qt3DSRendererImpl::GetLayerPickSetup(SLayer &inLayer, const QT3DSVec2 &inMouseCoords, const QSize &inPickDims) diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h index cd104df..32c48d3 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h @@ -385,6 +385,8 @@ namespace render { const QT3DSVec3 &inMouseVec) const override; QT3DSVec3 ProjectPosition(SNode &inNode, const QT3DSVec3 &inPosition) const override; + uint getLayerTextureId(SLayer &layer) override; + Option<SLayerPickSetup> GetLayerPickSetup(SLayer &inLayer, const QT3DSVec2 &inMouseCoords, const QSize &inPickDims) override; diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp index 3571c96..0eb7c51 100644 --- a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp +++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp @@ -1746,16 +1746,29 @@ namespace render { NVRenderTexture2D *theLayerColorTexture = m_LayerTexture; NVRenderTexture2D *theLayerDepthTexture = m_LayerDepthTexture; + if (!m_LayerCachedTexture) { + STextureDetails details(theLayerColorTexture->GetTextureDetails()); + QT3DSU32 finalWidth = ITextRenderer::NextMultipleOf4((QT3DSU32)(details.m_Width)); + QT3DSU32 finalHeight = ITextRenderer::NextMultipleOf4((QT3DSU32)(details.m_Height)); + m_LayerCachedTexture = theResourceManager.AllocateTexture2D(finalWidth, finalHeight, + details.m_Format); + } + NVRenderTexture2D *theCurrentTexture = theLayerColorTexture; for (SEffect *theEffect = m_Layer.m_FirstEffect; theEffect; theEffect = theEffect->m_NextEffect) { if (theEffect->m_Flags.IsActive() && m_Camera) { + NVRenderTexture2D *targetTexture = nullptr; + if (!theEffect->m_NextEffect) + targetTexture = m_LayerCachedTexture; + StartProfiling(theEffect->m_ClassName, false); NVRenderTexture2D *theRenderedEffect = theEffectSystem.RenderEffect( SEffectRenderArgument(*theEffect, *theCurrentTexture, QT3DSVec2(m_Camera->m_ClipNear, m_Camera->m_ClipFar), - theLayerDepthTexture, m_LayerPrepassDepthTexture)); + theLayerDepthTexture, m_LayerPrepassDepthTexture, + targetTexture)); EndProfiling(theEffect->m_ClassName); @@ -1775,14 +1788,6 @@ namespace render { } } } - - if (m_LayerCachedTexture && m_LayerCachedTexture != m_LayerTexture) { - theResourceManager.Release(*m_LayerCachedTexture); - m_LayerCachedTexture = NULL; - } - - if (theCurrentTexture != m_LayerTexture) - m_LayerCachedTexture = theCurrentTexture; } inline bool AnyCompletelyNonTransparentObjects(TRenderableObjectList &inObjects) |