Browse Source

Some rendertarget visualization changes

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
aa17a3edfd

+ 5 - 3
AnKi/Gr/Common.h

@@ -966,14 +966,15 @@ public:
 
 
 	U8 _m_padding[1] = {0};
 	U8 _m_padding[1] = {0};
 
 
-	TextureSubresourceInfo(DepthStencilAspectBit aspect = DepthStencilAspectBit::NONE)
+	constexpr TextureSubresourceInfo(DepthStencilAspectBit aspect = DepthStencilAspectBit::NONE)
 		: m_depthStencilAspect(aspect)
 		: m_depthStencilAspect(aspect)
 	{
 	{
 	}
 	}
 
 
 	TextureSubresourceInfo(const TextureSubresourceInfo&) = default;
 	TextureSubresourceInfo(const TextureSubresourceInfo&) = default;
 
 
-	TextureSubresourceInfo(const TextureSurfaceInfo& surf, DepthStencilAspectBit aspect = DepthStencilAspectBit::NONE)
+	constexpr TextureSubresourceInfo(const TextureSurfaceInfo& surf,
+									 DepthStencilAspectBit aspect = DepthStencilAspectBit::NONE)
 		: m_firstMipmap(surf.m_level)
 		: m_firstMipmap(surf.m_level)
 		, m_mipmapCount(1)
 		, m_mipmapCount(1)
 		, m_firstLayer(surf.m_layer)
 		, m_firstLayer(surf.m_layer)
@@ -984,7 +985,8 @@ public:
 	{
 	{
 	}
 	}
 
 
-	TextureSubresourceInfo(const TextureVolumeInfo& vol, DepthStencilAspectBit aspect = DepthStencilAspectBit::NONE)
+	constexpr TextureSubresourceInfo(const TextureVolumeInfo& vol,
+									 DepthStencilAspectBit aspect = DepthStencilAspectBit::NONE)
 		: m_firstMipmap(vol.m_level)
 		: m_firstMipmap(vol.m_level)
 		, m_mipmapCount(1)
 		, m_mipmapCount(1)
 		, m_firstLayer(0)
 		, m_firstLayer(0)

+ 3 - 2
AnKi/Renderer/Bloom.cpp

@@ -217,11 +217,12 @@ void Bloom::populateRenderGraph(RenderingContext& ctx)
 	}
 	}
 }
 }
 
 
-void Bloom::getDebugRenderTarget([[maybe_unused]] CString rtName, RenderTargetHandle& handle,
+void Bloom::getDebugRenderTarget([[maybe_unused]] CString rtName,
+								 Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 								 [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const
 								 [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const
 {
 {
 	ANKI_ASSERT(rtName == "Bloom");
 	ANKI_ASSERT(rtName == "Bloom");
-	handle = m_runCtx.m_upscaleRt;
+	handles[0] = m_runCtx.m_upscaleRt;
 }
 }
 
 
 } // end namespace anki
 } // end namespace anki

+ 1 - 1
AnKi/Renderer/Bloom.h

@@ -84,7 +84,7 @@ private:
 
 
 	Error initInternal();
 	Error initInternal();
 
 
-	void getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
+	void getDebugRenderTarget(CString rtName, Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 							  [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const override;
 							  [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const override;
 };
 };
 
 

+ 4 - 2
AnKi/Renderer/Common.h

@@ -56,8 +56,10 @@ constexpr U32 VOLUMETRIC_FRACTION = 4;
 /// Used to calculate the mipmap count of the HiZ map.
 /// Used to calculate the mipmap count of the HiZ map.
 constexpr U32 HIERARCHICAL_Z_MIN_HEIGHT = 80;
 constexpr U32 HIERARCHICAL_Z_MIN_HEIGHT = 80;
 
 
-const TextureSubresourceInfo HIZ_HALF_DEPTH(TextureSurfaceInfo(0, 0, 0, 0));
-const TextureSubresourceInfo HIZ_QUARTER_DEPTH(TextureSurfaceInfo(1, 0, 0, 0));
+constexpr TextureSubresourceInfo HIZ_HALF_DEPTH(TextureSurfaceInfo(0, 0, 0, 0));
+constexpr TextureSubresourceInfo HIZ_QUARTER_DEPTH(TextureSurfaceInfo(1, 0, 0, 0));
+
+constexpr U32 kMaxDebugRenderTargets = 2;
 
 
 /// Computes the 'a' and 'b' numbers for linearizeDepthOptimal (see shaders)
 /// Computes the 'a' and 'b' numbers for linearizeDepthOptimal (see shaders)
 inline void computeLinearizeDepthOptimal(F32 near, F32 far, F32& a, F32& b)
 inline void computeLinearizeDepthOptimal(F32 near, F32 far, F32& a, F32& b)

+ 26 - 13
AnKi/Renderer/FinalComposite.cpp

@@ -111,13 +111,18 @@ void FinalComposite::populateRenderGraph(RenderingContext& ctx)
 		RenderPassDependency(m_r->getMotionVectors().getMotionVectorsRt(), TextureUsageBit::SAMPLED_FRAGMENT));
 		RenderPassDependency(m_r->getMotionVectors().getMotionVectorsRt(), TextureUsageBit::SAMPLED_FRAGMENT));
 	pass.newDependency(RenderPassDependency(m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_FRAGMENT));
 	pass.newDependency(RenderPassDependency(m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_FRAGMENT));
 
 
-	RenderTargetHandle dbgRt;
-	Bool dbgRtValid;
+	Array<RenderTargetHandle, kMaxDebugRenderTargets> dbgRts;
 	ShaderProgramPtr debugProgram;
 	ShaderProgramPtr debugProgram;
-	m_r->getCurrentDebugRenderTarget(dbgRt, dbgRtValid, debugProgram);
-	if(dbgRtValid)
+	const Bool hasDebugRt = m_r->getCurrentDebugRenderTarget(dbgRts, debugProgram);
+	if(hasDebugRt)
 	{
 	{
-		pass.newDependency(RenderPassDependency(dbgRt, TextureUsageBit::SAMPLED_FRAGMENT));
+		for(const RenderTargetHandle& handle : dbgRts)
+		{
+			if(handle.isValid())
+			{
+				pass.newDependency(RenderPassDependency(handle, TextureUsageBit::SAMPLED_FRAGMENT));
+			}
+		}
 	}
 	}
 }
 }
 
 
@@ -125,17 +130,17 @@ void FinalComposite::run(RenderingContext& ctx, RenderPassWorkContext& rgraphCtx
 {
 {
 	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
 	CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
 	const Bool dbgEnabled = getConfig().getRDbgEnabled();
 	const Bool dbgEnabled = getConfig().getRDbgEnabled();
-	RenderTargetHandle dbgRt;
-	Bool dbgRtValid;
+
+	Array<RenderTargetHandle, kMaxDebugRenderTargets> dbgRts;
 	ShaderProgramPtr optionalDebugProgram;
 	ShaderProgramPtr optionalDebugProgram;
-	m_r->getCurrentDebugRenderTarget(dbgRt, dbgRtValid, optionalDebugProgram);
+	const Bool hasDebugRt = m_r->getCurrentDebugRenderTarget(dbgRts, optionalDebugProgram);
 
 
 	// Bind program
 	// Bind program
-	if(dbgRtValid && optionalDebugProgram.isCreated())
+	if(hasDebugRt && optionalDebugProgram.isCreated())
 	{
 	{
 		cmdb->bindShaderProgram(optionalDebugProgram);
 		cmdb->bindShaderProgram(optionalDebugProgram);
 	}
 	}
-	else if(dbgRtValid)
+	else if(hasDebugRt)
 	{
 	{
 		cmdb->bindShaderProgram(m_defaultVisualizeRenderTargetGrProg);
 		cmdb->bindShaderProgram(m_defaultVisualizeRenderTargetGrProg);
 	}
 	}
@@ -145,7 +150,7 @@ void FinalComposite::run(RenderingContext& ctx, RenderPassWorkContext& rgraphCtx
 	}
 	}
 
 
 	// Bind stuff
 	// Bind stuff
-	if(!dbgRtValid)
+	if(!hasDebugRt)
 	{
 	{
 		cmdb->bindSampler(0, 0, m_r->getSamplers().m_nearestNearestClamp);
 		cmdb->bindSampler(0, 0, m_r->getSamplers().m_nearestNearestClamp);
 		cmdb->bindSampler(0, 1, m_r->getSamplers().m_trilinearClamp);
 		cmdb->bindSampler(0, 1, m_r->getSamplers().m_trilinearClamp);
@@ -169,8 +174,16 @@ void FinalComposite::run(RenderingContext& ctx, RenderPassWorkContext& rgraphCtx
 	}
 	}
 	else
 	else
 	{
 	{
-		rgraphCtx.bindColorTexture(0, 0, dbgRt);
-		cmdb->bindSampler(0, 1, m_r->getSamplers().m_nearestNearestClamp);
+		cmdb->bindSampler(0, 0, m_r->getSamplers().m_nearestNearestClamp);
+
+		U32 count = 1;
+		for(const RenderTargetHandle& handle : dbgRts)
+		{
+			if(handle.isValid())
+			{
+				rgraphCtx.bindColorTexture(0, count++, handle);
+			}
+		}
 	}
 	}
 
 
 	cmdb->setViewport(0, 0, m_r->getPostProcessResolution().x(), m_r->getPostProcessResolution().y());
 	cmdb->setViewport(0, 0, m_r->getPostProcessResolution().x(), m_r->getPostProcessResolution().y());

+ 4 - 4
AnKi/Renderer/GBuffer.h

@@ -47,20 +47,20 @@ public:
 		return m_runCtx.m_prevFrameDepthRt;
 		return m_runCtx.m_prevFrameDepthRt;
 	}
 	}
 
 
-	void getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
+	void getDebugRenderTarget(CString rtName, Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 							  [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const override
 							  [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const override
 	{
 	{
 		if(rtName == "GBufferAlbedo")
 		if(rtName == "GBufferAlbedo")
 		{
 		{
-			handle = m_runCtx.m_colorRts[0];
+			handles[0] = m_runCtx.m_colorRts[0];
 		}
 		}
 		else if(rtName == "GBufferNormals")
 		else if(rtName == "GBufferNormals")
 		{
 		{
-			handle = m_runCtx.m_colorRts[2];
+			handles[0] = m_runCtx.m_colorRts[2];
 		}
 		}
 		else if(rtName == "GBufferVelocity")
 		else if(rtName == "GBufferVelocity")
 		{
 		{
-			handle = m_runCtx.m_colorRts[3];
+			handles[0] = m_runCtx.m_colorRts[3];
 		}
 		}
 		else
 		else
 		{
 		{

+ 3 - 3
AnKi/Renderer/IndirectDiffuse.cpp

@@ -383,17 +383,17 @@ void IndirectDiffuse::populateRenderGraph(RenderingContext& ctx)
 	}
 	}
 }
 }
 
 
-void IndirectDiffuse::getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
+void IndirectDiffuse::getDebugRenderTarget(CString rtName, Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 										   ShaderProgramPtr& optionalShaderProgram) const
 										   ShaderProgramPtr& optionalShaderProgram) const
 {
 {
 	if(rtName == "IndirectDiffuse")
 	if(rtName == "IndirectDiffuse")
 	{
 	{
-		handle = m_runCtx.m_mainRtHandles[WRITE];
+		handles[0] = m_runCtx.m_mainRtHandles[WRITE];
 	}
 	}
 	else
 	else
 	{
 	{
 		ANKI_ASSERT(rtName == "IndirectDiffuseVrsSri");
 		ANKI_ASSERT(rtName == "IndirectDiffuseVrsSri");
-		handle = m_runCtx.m_sriRt;
+		handles[0] = m_runCtx.m_sriRt;
 		optionalShaderProgram = m_vrs.m_visualizeGrProg;
 		optionalShaderProgram = m_vrs.m_visualizeGrProg;
 	}
 	}
 }
 }

+ 1 - 1
AnKi/Renderer/IndirectDiffuse.h

@@ -31,7 +31,7 @@ public:
 
 
 	void populateRenderGraph(RenderingContext& ctx);
 	void populateRenderGraph(RenderingContext& ctx);
 
 
-	void getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
+	void getDebugRenderTarget(CString rtName, Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 							  ShaderProgramPtr& optionalShaderProgram) const override;
 							  ShaderProgramPtr& optionalShaderProgram) const override;
 
 
 	RenderTargetHandle getRt() const
 	RenderTargetHandle getRt() const

+ 2 - 2
AnKi/Renderer/IndirectSpecular.cpp

@@ -224,12 +224,12 @@ void IndirectSpecular::run(const RenderingContext& ctx, RenderPassWorkContext& r
 	}
 	}
 }
 }
 
 
-void IndirectSpecular::getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
+void IndirectSpecular::getDebugRenderTarget(CString rtName, Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 											[[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const
 											[[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const
 {
 {
 	if(rtName == "SSR")
 	if(rtName == "SSR")
 	{
 	{
-		handle = m_runCtx.m_rts[WRITE];
+		handles[0] = m_runCtx.m_rts[WRITE];
 	}
 	}
 }
 }
 
 

+ 1 - 1
AnKi/Renderer/IndirectSpecular.h

@@ -58,7 +58,7 @@ private:
 
 
 	void run(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx);
 	void run(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx);
 
 
-	void getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
+	void getDebugRenderTarget(CString rtName, Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 							  ShaderProgramPtr& optionalShaderProgram) const override;
 							  ShaderProgramPtr& optionalShaderProgram) const override;
 };
 };
 /// @}
 /// @}

+ 3 - 2
AnKi/Renderer/LightShading.cpp

@@ -409,11 +409,12 @@ void LightShading::populateRenderGraph(RenderingContext& ctx)
 	m_r->getForwardShading().setDependencies(ctx, pass);
 	m_r->getForwardShading().setDependencies(ctx, pass);
 }
 }
 
 
-void LightShading::getDebugRenderTarget([[maybe_unused]] CString rtName, RenderTargetHandle& handle,
+void LightShading::getDebugRenderTarget([[maybe_unused]] CString rtName,
+										Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 										ShaderProgramPtr& optionalShaderProgram) const
 										ShaderProgramPtr& optionalShaderProgram) const
 {
 {
 	ANKI_ASSERT(rtName == "LightShading");
 	ANKI_ASSERT(rtName == "LightShading");
-	handle = m_runCtx.m_rt;
+	handles[0] = m_runCtx.m_rt;
 	optionalShaderProgram = m_visualizeRtGrProg;
 	optionalShaderProgram = m_visualizeRtGrProg;
 }
 }
 
 

+ 1 - 1
AnKi/Renderer/LightShading.h

@@ -79,7 +79,7 @@ private:
 
 
 	void run(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx);
 	void run(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx);
 
 
-	void getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
+	void getDebugRenderTarget(CString rtName, Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 							  ShaderProgramPtr& optionalShaderProgram) const override;
 							  ShaderProgramPtr& optionalShaderProgram) const override;
 };
 };
 /// @}
 /// @}

+ 3 - 3
AnKi/Renderer/MotionVectors.h

@@ -40,17 +40,17 @@ public:
 		return m_runCtx.m_historyLengthWriteRtHandle;
 		return m_runCtx.m_historyLengthWriteRtHandle;
 	}
 	}
 
 
-	void getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
+	void getDebugRenderTarget(CString rtName, Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 							  [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const override
 							  [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const override
 	{
 	{
 		if(rtName == "MotionVectors")
 		if(rtName == "MotionVectors")
 		{
 		{
-			handle = m_runCtx.m_motionVectorsRtHandle;
+			handles[0] = m_runCtx.m_motionVectorsRtHandle;
 		}
 		}
 		else
 		else
 		{
 		{
 			ANKI_ASSERT(rtName == "MotionVectorsHistoryLength");
 			ANKI_ASSERT(rtName == "MotionVectorsHistoryLength");
-			handle = m_runCtx.m_historyLengthWriteRtHandle;
+			handles[0] = m_runCtx.m_historyLengthWriteRtHandle;
 		}
 		}
 	}
 	}
 
 

+ 4 - 5
AnKi/Renderer/Renderer.cpp

@@ -618,13 +618,12 @@ void Renderer::registerDebugRenderTarget(RendererObject* obj, CString rtName)
 	m_debugRts.emplaceBack(getAllocator(), std::move(inf));
 	m_debugRts.emplaceBack(getAllocator(), std::move(inf));
 }
 }
 
 
-void Renderer::getCurrentDebugRenderTarget(RenderTargetHandle& handle, Bool& handleValid,
+Bool Renderer::getCurrentDebugRenderTarget(Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 										   ShaderProgramPtr& optionalShaderProgram)
 										   ShaderProgramPtr& optionalShaderProgram)
 {
 {
 	if(ANKI_LIKELY(m_currentDebugRtName.isEmpty()))
 	if(ANKI_LIKELY(m_currentDebugRtName.isEmpty()))
 	{
 	{
-		handleValid = false;
-		return;
+		return false;
 	}
 	}
 
 
 	RendererObject* obj = nullptr;
 	RendererObject* obj = nullptr;
@@ -637,8 +636,8 @@ void Renderer::getCurrentDebugRenderTarget(RenderTargetHandle& handle, Bool& han
 	}
 	}
 	ANKI_ASSERT(obj);
 	ANKI_ASSERT(obj);
 
 
-	obj->getDebugRenderTarget(m_currentDebugRtName, handle, optionalShaderProgram);
-	handleValid = true;
+	obj->getDebugRenderTarget(m_currentDebugRtName, handles, optionalShaderProgram);
+	return true;
 }
 }
 
 
 void Renderer::setCurrentDebugRenderTarget(CString rtName)
 void Renderer::setCurrentDebugRenderTarget(CString rtName)

+ 1 - 1
AnKi/Renderer/Renderer.h

@@ -222,7 +222,7 @@ public:
 	}
 	}
 
 
 	// Need to call it after the handle is set by the RenderGraph.
 	// Need to call it after the handle is set by the RenderGraph.
-	void getCurrentDebugRenderTarget(RenderTargetHandle& handle, Bool& handleValid,
+	Bool getCurrentDebugRenderTarget(Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 									 ShaderProgramPtr& optionalShaderProgram);
 									 ShaderProgramPtr& optionalShaderProgram);
 	/// @}
 	/// @}
 
 

+ 2 - 1
AnKi/Renderer/RendererObject.h

@@ -37,7 +37,8 @@ public:
 
 
 	HeapAllocator<U8> getAllocator() const;
 	HeapAllocator<U8> getAllocator() const;
 
 
-	virtual void getDebugRenderTarget([[maybe_unused]] CString rtName, [[maybe_unused]] RenderTargetHandle& handle,
+	virtual void getDebugRenderTarget([[maybe_unused]] CString rtName,
+									  [[maybe_unused]] Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 									  [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const
 									  [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const
 	{
 	{
 		ANKI_ASSERT(!"Object doesn't support that");
 		ANKI_ASSERT(!"Object doesn't support that");

+ 2 - 2
AnKi/Renderer/RtShadows.cpp

@@ -689,7 +689,7 @@ Bool RtShadows::findShadowLayer(U64 lightUuid, U32& layerIdx, Bool& rejectHistor
 	return layerIdx != MAX_U32;
 	return layerIdx != MAX_U32;
 }
 }
 
 
-void RtShadows::getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
+void RtShadows::getDebugRenderTarget(CString rtName, Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 									 ShaderProgramPtr& optionalShaderProgram) const
 									 ShaderProgramPtr& optionalShaderProgram) const
 {
 {
 	U32 layerGroup = 0;
 	U32 layerGroup = 0;
@@ -707,7 +707,7 @@ void RtShadows::getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
 		layerGroup = 2;
 		layerGroup = 2;
 	}
 	}
 
 
-	handle = m_runCtx.m_upscaledRt;
+	handles[0] = m_runCtx.m_upscaledRt;
 
 
 	ShaderProgramResourceVariantInitInfo variantInit(m_visualizeRenderTargetsProg);
 	ShaderProgramResourceVariantInitInfo variantInit(m_visualizeRenderTargetsProg);
 	variantInit.addMutation("LAYER_GROUP", layerGroup);
 	variantInit.addMutation("LAYER_GROUP", layerGroup);

+ 1 - 1
AnKi/Renderer/RtShadows.h

@@ -33,7 +33,7 @@ public:
 
 
 	void populateRenderGraph(RenderingContext& ctx);
 	void populateRenderGraph(RenderingContext& ctx);
 
 
-	void getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
+	void getDebugRenderTarget(CString rtName, Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 							  ShaderProgramPtr& optionalShaderProgram) const override;
 							  ShaderProgramPtr& optionalShaderProgram) const override;
 
 
 	RenderTargetHandle getRt() const
 	RenderTargetHandle getRt() const

+ 3 - 2
AnKi/Renderer/ShadowmapsResolve.h

@@ -30,11 +30,12 @@ public:
 
 
 	void populateRenderGraph(RenderingContext& ctx);
 	void populateRenderGraph(RenderingContext& ctx);
 
 
-	void getDebugRenderTarget([[maybe_unused]] CString rtName, RenderTargetHandle& handle,
+	void getDebugRenderTarget([[maybe_unused]] CString rtName,
+							  Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 							  [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const override
 							  [[maybe_unused]] ShaderProgramPtr& optionalShaderProgram) const override
 	{
 	{
 		ANKI_ASSERT(rtName == "SM_resolve");
 		ANKI_ASSERT(rtName == "SM_resolve");
-		handle = m_runCtx.m_rt;
+		handles[0] = m_runCtx.m_rt;
 	}
 	}
 
 
 	RenderTargetHandle getRt() const
 	RenderTargetHandle getRt() const

+ 3 - 3
AnKi/Renderer/VrsSriGeneration.cpp

@@ -96,17 +96,17 @@ Error VrsSriGeneration::initInternal()
 	return Error::NONE;
 	return Error::NONE;
 }
 }
 
 
-void VrsSriGeneration::getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
+void VrsSriGeneration::getDebugRenderTarget(CString rtName, Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 											ShaderProgramPtr& optionalShaderProgram) const
 											ShaderProgramPtr& optionalShaderProgram) const
 {
 {
 	if(rtName == "VrsSri")
 	if(rtName == "VrsSri")
 	{
 	{
-		handle = m_runCtx.m_rt;
+		handles[0] = m_runCtx.m_rt;
 	}
 	}
 	else
 	else
 	{
 	{
 		ANKI_ASSERT(rtName == "VrsSriDownscaled");
 		ANKI_ASSERT(rtName == "VrsSriDownscaled");
-		handle = m_runCtx.m_downscaledRt;
+		handles[0] = m_runCtx.m_downscaledRt;
 	}
 	}
 
 
 	optionalShaderProgram = m_visualizeGrProg;
 	optionalShaderProgram = m_visualizeGrProg;

+ 1 - 1
AnKi/Renderer/VrsSriGeneration.h

@@ -66,7 +66,7 @@ public:
 
 
 	Error initInternal();
 	Error initInternal();
 
 
-	void getDebugRenderTarget(CString rtName, RenderTargetHandle& handle,
+	void getDebugRenderTarget(CString rtName, Array<RenderTargetHandle, kMaxDebugRenderTargets>& handles,
 							  ShaderProgramPtr& optionalShaderProgram) const override;
 							  ShaderProgramPtr& optionalShaderProgram) const override;
 };
 };
 /// @}
 /// @}

+ 2 - 2
AnKi/Shaders/RtShadowsVisualizeRenderTarget.ankiprog

@@ -12,8 +12,8 @@
 #pragma anki start frag
 #pragma anki start frag
 #include <AnKi/Shaders/RtShadows.glsl>
 #include <AnKi/Shaders/RtShadows.glsl>
 
 
-layout(set = 0, binding = 0) uniform utexture2D u_inTex;
-layout(set = 0, binding = 1) uniform sampler u_nearestAnyClampSampler;
+layout(set = 0, binding = 0) uniform sampler u_nearestAnyClampSampler;
+layout(set = 0, binding = 1) uniform utexture2D u_inTex;
 
 
 layout(location = 0) in Vec2 in_uv;
 layout(location = 0) in Vec2 in_uv;
 layout(location = 0) out Vec3 out_color;
 layout(location = 0) out Vec3 out_color;

+ 2 - 2
AnKi/Shaders/VisualizeHdrRenderTarget.ankiprog

@@ -10,8 +10,8 @@
 #pragma anki start frag
 #pragma anki start frag
 #include <AnKi/Shaders/TonemappingFunctions.glsl>
 #include <AnKi/Shaders/TonemappingFunctions.glsl>
 
 
-layout(set = 0, binding = 0) uniform texture2D u_inTex;
-layout(set = 0, binding = 1) uniform sampler u_nearestAnyClampSampler;
+layout(set = 0, binding = 0) uniform sampler u_nearestAnyClampSampler;
+layout(set = 0, binding = 1) uniform texture2D u_inTex;
 
 
 layout(location = 0) in Vec2 in_uv;
 layout(location = 0) in Vec2 in_uv;
 layout(location = 0) out Vec3 out_color;
 layout(location = 0) out Vec3 out_color;

+ 2 - 2
AnKi/Shaders/VisualizeRenderTarget.ankiprog

@@ -10,8 +10,8 @@
 #pragma anki start frag
 #pragma anki start frag
 #include <AnKi/Shaders/Common.glsl>
 #include <AnKi/Shaders/Common.glsl>
 
 
-layout(set = 0, binding = 0) uniform texture2D u_inTex;
-layout(set = 0, binding = 1) uniform sampler u_nearestAnyClampSampler;
+layout(set = 0, binding = 0) uniform sampler u_nearestAnyClampSampler;
+layout(set = 0, binding = 1) uniform texture2D u_inTex;
 
 
 layout(location = 0) in Vec2 in_uv;
 layout(location = 0) in Vec2 in_uv;
 layout(location = 0) out Vec3 out_color;
 layout(location = 0) out Vec3 out_color;

+ 2 - 2
AnKi/Shaders/VrsSriVisualizeRenderTarget.ankiprog

@@ -10,8 +10,8 @@
 #pragma anki start frag
 #pragma anki start frag
 #include <AnKi/Shaders/Functions.glsl>
 #include <AnKi/Shaders/Functions.glsl>
 
 
-layout(set = 0, binding = 0) uniform utexture2D u_inTex;
-layout(set = 0, binding = 1) uniform sampler u_nearestAnyClampSampler;
+layout(set = 0, binding = 0) uniform sampler u_nearestAnyClampSampler;
+layout(set = 0, binding = 1) uniform utexture2D u_inTex;
 
 
 layout(location = 0) in Vec2 in_uv;
 layout(location = 0) in Vec2 in_uv;
 layout(location = 0) out Vec3 out_color;
 layout(location = 0) out Vec3 out_color;