summaryrefslogtreecommitdiffstats
path: root/src/runtimerender
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtimerender')
-rw-r--r--src/runtimerender/Qt3DSRenderEffectSystem.cpp19
-rw-r--r--src/runtimerender/Qt3DSRenderEffectSystem.h7
-rw-r--r--src/runtimerender/Qt3DSRenderer.h2
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp14
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.h2
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp23
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)