Forráskód Böngészése

Put more responsibility into the RenderGraph. Can derive the texture usage from the dependencies

Panagiotis Christopoulos Charitos 7 éve
szülő
commit
1c12dff86d

+ 15 - 3
src/anki/gr/RenderGraph.cpp

@@ -567,7 +567,18 @@ RenderGraph::BakeContext* RenderGraph::newContext(const RenderGraphDescription&
 		}
 		else
 		{
-			tex = getOrCreateRenderTarget(descr.m_renderTargets[rtIdx].m_initInfo, descr.m_renderTargets[rtIdx].m_hash);
+			// Need to create new
+
+			// Create a new TextureInitInfo with the derived usage
+			TextureInitInfo initInf = descr.m_renderTargets[rtIdx].m_initInfo;
+			initInf.m_usage = descr.m_renderTargets[rtIdx].m_usageDerivedByDeps;
+			ANKI_ASSERT(initInf.m_usage != TextureUsageBit::NONE);
+
+			// Create the new hash
+			const U64 hash = appendHash(&initInf.m_usage, sizeof(initInf.m_usage), descr.m_renderTargets[rtIdx].m_hash);
+
+			// Get or create the texture
+			tex = getOrCreateRenderTarget(initInf, hash);
 		}
 
 		outRt.m_texture = tex;
@@ -575,8 +586,9 @@ RenderGraph::BakeContext* RenderGraph::newContext(const RenderGraphDescription&
 		// Init the surfs or volumes
 		const U surfOrVolumeCount =
 			tex->getMipmapCount() * tex->getLayerCount() * (textureTypeIsCube(tex->getTextureType()) ? 6 : 1);
-		outRt.m_surfOrVolUsages.create(
-			alloc, surfOrVolumeCount, (imported) ? descr.m_renderTargets[rtIdx].m_usage : TextureUsageBit::NONE);
+		outRt.m_surfOrVolUsages.create(alloc,
+			surfOrVolumeCount,
+			(imported) ? descr.m_renderTargets[rtIdx].m_importedLastKnownUsage : TextureUsageBit::NONE);
 		outRt.m_lastBatchThatTransitionedIt.create(alloc, surfOrVolumeCount, MAX_U16);
 	}
 

+ 11 - 3
src/anki/gr/RenderGraph.h

@@ -108,6 +108,8 @@ public:
 	/// Create an internal hash.
 	void bake()
 	{
+		ANKI_ASSERT(m_hash == 0);
+		ANKI_ASSERT(m_usage == TextureUsageBit::NONE && "No need to supply the usage. RenderGraph will find out");
 		m_hash = computeHash();
 	}
 
@@ -257,6 +259,7 @@ private:
 class RenderPassDescriptionBase
 {
 	friend class RenderGraph;
+	friend class RenderGraphDescription;
 
 public:
 	virtual ~RenderPassDescriptionBase()
@@ -497,7 +500,8 @@ public:
 	{
 		RT& rt = *m_renderTargets.emplaceBack(m_alloc);
 		rt.m_importedTex = tex;
-		rt.m_usage = usage;
+		rt.m_importedLastKnownUsage = usage;
+		rt.m_usageDerivedByDeps = TextureUsageBit::NONE;
 		rt.setName(name);
 
 		RenderTargetHandle out;
@@ -509,10 +513,13 @@ public:
 	RenderTargetHandle newRenderTarget(const RenderTargetDescription& initInf)
 	{
 		ANKI_ASSERT(initInf.m_hash && "Forgot to call RenderTargetDescription::bake");
+		ANKI_ASSERT(
+			initInf.m_usage == TextureUsageBit::NONE && "Don't need to supply the usage. Render grap will find it");
 		RT& rt = *m_renderTargets.emplaceBack(m_alloc);
 		rt.m_initInfo = initInf;
 		rt.m_hash = initInf.m_hash;
-		rt.m_usage = TextureUsageBit::NONE;
+		rt.m_importedLastKnownUsage = TextureUsageBit::NONE;
+		rt.m_usageDerivedByDeps = TextureUsageBit::NONE;
 		rt.setName(initInf.getName());
 
 		RenderTargetHandle out;
@@ -553,7 +560,8 @@ private:
 		TextureInitInfo m_initInfo;
 		U64 m_hash = 0;
 		TexturePtr m_importedTex;
-		TextureUsageBit m_usage;
+		TextureUsageBit m_importedLastKnownUsage;
+		TextureUsageBit m_usageDerivedByDeps; ///< XXX
 	};
 
 	class Buffer : public Resource

+ 3 - 0
src/anki/gr/RenderGraph.inl.h

@@ -61,6 +61,9 @@ inline void RenderPassDescriptionBase::newConsumer(const RenderPassDependency& d
 	{
 		fixSubresource(m_consumers.getBack());
 		m_consumerRtMask.set(dep.m_texture.m_handle.m_idx);
+
+		// Try to derive the usage by that dep
+		m_descr->m_renderTargets[dep.m_texture.m_handle.m_idx].m_usageDerivedByDeps |= dep.m_texture.m_usage;
 	}
 	else if(dep.m_buffer.m_usage != BufferUsageBit::NONE)
 	{

+ 4 - 10
src/anki/renderer/Bloom.cpp

@@ -31,11 +31,8 @@ Error Bloom::initExposure(const ConfigSet& config)
 	m_exposure.m_scale = config.getNumber("r.bloom.scale");
 
 	// Create RT info
-	m_exposure.m_rtDescr = m_r->create2DRenderTargetDescription(m_exposure.m_width,
-		m_exposure.m_height,
-		RT_PIXEL_FORMAT,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		"Bloom Exp");
+	m_exposure.m_rtDescr =
+		m_r->create2DRenderTargetDescription(m_exposure.m_width, m_exposure.m_height, RT_PIXEL_FORMAT, "Bloom Exp");
 	m_exposure.m_rtDescr.bake();
 
 	// Create FB info
@@ -63,11 +60,8 @@ Error Bloom::initUpscale(const ConfigSet& config)
 	m_upscale.m_height = m_r->getHeight() / BLOOM_FRACTION;
 
 	// Create RT descr
-	m_upscale.m_rtDescr = m_r->create2DRenderTargetDescription(m_upscale.m_width,
-		m_upscale.m_height,
-		RT_PIXEL_FORMAT,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		"Bloom Upscale");
+	m_upscale.m_rtDescr =
+		m_r->create2DRenderTargetDescription(m_upscale.m_width, m_upscale.m_height, RT_PIXEL_FORMAT, "Bloom Upscale");
 	m_upscale.m_rtDescr.bake();
 
 	// Create FB descr

+ 2 - 5
src/anki/renderer/Dbg.cpp

@@ -39,11 +39,8 @@ Error Dbg::lazyInit()
 	ANKI_ASSERT(!m_initialized);
 
 	// RT descr
-	m_rtDescr = m_r->create2DRenderTargetDescription(m_r->getWidth(),
-		m_r->getHeight(),
-		DBG_COLOR_ATTACHMENT_PIXEL_FORMAT,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
-		"Dbg");
+	m_rtDescr = m_r->create2DRenderTargetDescription(
+		m_r->getWidth(), m_r->getHeight(), DBG_COLOR_ATTACHMENT_PIXEL_FORMAT, "Dbg");
 	m_rtDescr.bake();
 
 	// Create FB descr

+ 3 - 11
src/anki/renderer/DepthDownscale.cpp

@@ -20,19 +20,11 @@ Error DepthDownscale::initInternal(const ConfigSet&)
 	const U height = m_r->getHeight() / 2;
 
 	// Create RT descrs
-	m_depthRtDescr = m_r->create2DRenderTargetDescription(width,
-		height,
-		GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT,
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
-		"Half depth");
+	m_depthRtDescr =
+		m_r->create2DRenderTargetDescription(width, height, GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT, "Half depth");
 	m_depthRtDescr.bake();
 
-	m_hizRtDescr = m_r->create2DRenderTargetDescription(width,
-		height,
-		Format::R32_SFLOAT,
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE | TextureUsageBit::SAMPLED_FRAGMENT
-			| TextureUsageBit::SAMPLED_COMPUTE,
-		"HiZ");
+	m_hizRtDescr = m_r->create2DRenderTargetDescription(width, height, Format::R32_SFLOAT, "HiZ");
 	m_hizRtDescr.m_mipmapCount = HIERARCHICAL_Z_MIPMAP_COUNT;
 	m_hizRtDescr.bake();
 

+ 4 - 6
src/anki/renderer/DownscaleBlur.cpp

@@ -32,12 +32,10 @@ Error DownscaleBlur::initInternal(const ConfigSet&)
 	ANKI_R_LOGI("Initializing dowscale blur (passCount: %u)", U(m_passCount));
 
 	// Create the miped texture
-	TextureInitInfo texinit = m_r->create2DRenderTargetDescription(m_r->getWidth() / 2,
-		m_r->getHeight() / 2,
-		LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE
-			| TextureUsageBit::SAMPLED_COMPUTE,
-		"DownscaleBlur");
+	TextureInitInfo texinit = m_r->create2DRenderTargetDescription(
+		m_r->getWidth() / 2, m_r->getHeight() / 2, LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT, "DownscaleBlur");
+	texinit.m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE
+					  | TextureUsageBit::SAMPLED_COMPUTE;
 	texinit.m_mipmapCount = m_passCount;
 	texinit.m_initialUsage = TextureUsageBit::SAMPLED_COMPUTE;
 	m_rtTex = m_r->createAndClearRenderTarget(texinit);

+ 2 - 5
src/anki/renderer/FinalComposite.cpp

@@ -39,11 +39,8 @@ Error FinalComposite::initInternal(const ConfigSet& config)
 
 	if(!m_r->getDrawToDefaultFramebuffer())
 	{
-		m_rtDescr = m_r->create2DRenderTargetDescription(m_r->getWidth(),
-			m_r->getHeight(),
-			RT_PIXEL_FORMAT,
-			TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
-			"Final Composite");
+		m_rtDescr =
+			m_r->create2DRenderTargetDescription(m_r->getWidth(), m_r->getHeight(), RT_PIXEL_FORMAT, "Final Composite");
 		m_rtDescr.bake();
 
 		m_fbDescr.m_colorAttachmentCount = 1;

+ 2 - 5
src/anki/renderer/ForwardShading.cpp

@@ -39,11 +39,8 @@ Error ForwardShading::initInternal(const ConfigSet&)
 	m_height = m_r->getHeight() / FS_FRACTION;
 
 	// Create RT descr
-	m_rtDescr = m_r->create2DRenderTargetDescription(m_width,
-		m_height,
-		FORWARD_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
-		"forward");
+	m_rtDescr = m_r->create2DRenderTargetDescription(
+		m_width, m_height, FORWARD_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT, "forward");
 	m_rtDescr.bake();
 
 	// Create FB descr

+ 4 - 12
src/anki/renderer/GBuffer.cpp

@@ -35,23 +35,15 @@ Error GBuffer::init(const ConfigSet& initializer)
 Error GBuffer::initInternal(const ConfigSet& initializer)
 {
 	// RT descrs
-	m_depthRtDescr = m_r->create2DRenderTargetDescription(m_r->getWidth(),
-		m_r->getHeight(),
-		GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::SAMPLED_COMPUTE
-			| TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
-		"GBuffer depth");
+	m_depthRtDescr = m_r->create2DRenderTargetDescription(
+		m_r->getWidth(), m_r->getHeight(), GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT, "GBuffer depth");
 	m_depthRtDescr.bake();
 
 	static const char* rtNames[GBUFFER_COLOR_ATTACHMENT_COUNT] = {"GBuffer rt0", "GBuffer rt1", "GBuffer rt2"};
 	for(U i = 0; i < GBUFFER_COLOR_ATTACHMENT_COUNT; ++i)
 	{
-		m_colorRtDescrs[i] = m_r->create2DRenderTargetDescription(m_r->getWidth(),
-			m_r->getHeight(),
-			MS_COLOR_ATTACHMENT_PIXEL_FORMATS[i],
-			TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::SAMPLED_COMPUTE
-				| TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
-			rtNames[i]);
+		m_colorRtDescrs[i] = m_r->create2DRenderTargetDescription(
+			m_r->getWidth(), m_r->getHeight(), MS_COLOR_ATTACHMENT_PIXEL_FORMATS[i], rtNames[i]);
 		m_colorRtDescrs[i].bake();
 	}
 

+ 2 - 6
src/anki/renderer/Indirect.cpp

@@ -92,11 +92,8 @@ Error Indirect::initGBuffer(const ConfigSet& config)
 
 	// Create RT descriptions
 	{
-		RenderTargetDescription texinit = m_r->create2DRenderTargetDescription(m_gbuffer.m_tileSize * 6,
-			m_gbuffer.m_tileSize,
-			MS_COLOR_ATTACHMENT_PIXEL_FORMATS[0],
-			TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-			"GI GBuffer");
+		RenderTargetDescription texinit = m_r->create2DRenderTargetDescription(
+			m_gbuffer.m_tileSize * 6, m_gbuffer.m_tileSize, MS_COLOR_ATTACHMENT_PIXEL_FORMATS[0], "GI GBuffer");
 
 		// Create color RT descriptions
 		for(U i = 0; i < GBUFFER_COLOR_ATTACHMENT_COUNT; ++i)
@@ -108,7 +105,6 @@ Error Indirect::initGBuffer(const ConfigSet& config)
 		}
 
 		// Create depth RT
-		texinit.m_usage |= TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
 		texinit.m_format = GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT;
 		texinit.setName("GI GBuff Depth");
 		m_gbuffer.m_depthRtDescr = texinit;

+ 2 - 5
src/anki/renderer/LightShading.cpp

@@ -98,11 +98,8 @@ Error LightShading::initInternal(const ConfigSet& config)
 	m_prog->getOrCreateVariant(consts.get(), m_progVariant);
 
 	// Create RT descr
-	m_rtDescr = m_r->create2DRenderTargetDescription(m_r->getWidth(),
-		m_r->getHeight(),
-		LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
-		"Light Shading");
+	m_rtDescr = m_r->create2DRenderTargetDescription(
+		m_r->getWidth(), m_r->getHeight(), LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT, "Light Shading");
 	m_rtDescr.bake();
 
 	// Create FB descr

+ 2 - 5
src/anki/renderer/Reflections.cpp

@@ -37,11 +37,8 @@ Error Reflections::initInternal(const ConfigSet& cfg)
 	ANKI_R_LOGI("Initializing reflection pass (%ux%u)", width, height);
 
 	// Create RTs
-	m_rtDescr = m_r->create2DRenderTargetDescription(width,
-		height,
-		LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::IMAGE_COMPUTE_WRITE,
-		"IndirectRes");
+	m_rtDescr =
+		m_r->create2DRenderTargetDescription(width, height, LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT, "IndirectRes");
 	m_rtDescr.bake();
 
 	// Create shader

+ 2 - 3
src/anki/renderer/Renderer.cpp

@@ -337,8 +337,7 @@ TextureInitInfo Renderer::create2DRenderTargetInitInfo(U32 w, U32 h, Format form
 	return init;
 }
 
-RenderTargetDescription Renderer::create2DRenderTargetDescription(
-	U32 w, U32 h, Format format, TextureUsageBit usage, CString name)
+RenderTargetDescription Renderer::create2DRenderTargetDescription(U32 w, U32 h, Format format, CString name)
 {
 	RenderTargetDescription init(name);
 
@@ -350,7 +349,7 @@ RenderTargetDescription Renderer::create2DRenderTargetDescription(
 	init.m_format = format;
 	init.m_mipmapCount = 1;
 	init.m_samples = 1;
-	init.m_usage = usage;
+	init.m_usage = TextureUsageBit::NONE;
 
 	return init;
 }

+ 1 - 1
src/anki/renderer/Renderer.h

@@ -253,7 +253,7 @@ anki_internal:
 
 	/// Create the init info for a 2D texture that will be used as a render target.
 	ANKI_USE_RESULT RenderTargetDescription create2DRenderTargetDescription(
-		U32 w, U32 h, Format format, TextureUsageBit usage, CString name = {});
+		U32 w, U32 h, Format format, CString name = {});
 
 	ANKI_USE_RESULT TexturePtr createAndClearRenderTarget(
 		const TextureInitInfo& inf, const ClearValue& clearVal = ClearValue());

+ 0 - 1
src/anki/renderer/ShadowMapping.cpp

@@ -51,7 +51,6 @@ Error ShadowMapping::initScratch(const ConfigSet& cfg)
 		m_scratchRtDescr = m_r->create2DRenderTargetDescription(m_scratchTileResolution * m_scratchTileCount,
 			m_scratchTileResolution,
 			SHADOW_DEPTH_PIXEL_FORMAT,
-			TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
 			"Scratch ShadMap");
 		m_scratchRtDescr.bake();
 

+ 2 - 12
src/anki/renderer/Ssao.cpp

@@ -95,20 +95,10 @@ Error Ssao::init(const ConfigSet& config)
 	ANKI_R_LOGI("Initializing SSAO. Size %ux%u", m_width, m_height);
 
 	// RT
-	m_rtDescrs[0] = m_r->create2DRenderTargetDescription(m_width,
-		m_height,
-		Ssao::RT_PIXEL_FORMAT,
-		((m_blurUseCompute) ? TextureUsageBit::SAMPLED_COMPUTE : TextureUsageBit::SAMPLED_FRAGMENT)
-			| ((m_useCompute) ? TextureUsageBit::IMAGE_COMPUTE_WRITE : TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE),
-		"SSAOMain");
+	m_rtDescrs[0] = m_r->create2DRenderTargetDescription(m_width, m_height, Ssao::RT_PIXEL_FORMAT, "SSAOMain");
 	m_rtDescrs[0].bake();
 
-	m_rtDescrs[1] = m_r->create2DRenderTargetDescription(m_width,
-		m_height,
-		Ssao::RT_PIXEL_FORMAT,
-		((m_blurUseCompute) ? TextureUsageBit::IMAGE_COMPUTE_WRITE : TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE)
-			| TextureUsageBit::SAMPLED_FRAGMENT,
-		"SSAOBlur");
+	m_rtDescrs[1] = m_r->create2DRenderTargetDescription(m_width, m_height, Ssao::RT_PIXEL_FORMAT, "SSAOBlur");
 	m_rtDescrs[1].bake();
 
 	// FB descr