Quellcode durchsuchen

Changes in command buffer reset

Panagiotis Christopoulos Charitos vor 4 Jahren
Ursprung
Commit
024bae1394

+ 1 - 1
AnKi/Gr/ConfigDefs.h

@@ -3,7 +3,7 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-ANKI_CONFIG_OPTION(gr_debugContext, 0, 0, 1)
+ANKI_CONFIG_OPTION(gr_validation, 0, 0, 1)
 ANKI_CONFIG_OPTION(gr_vsync, 0, 0, 1)
 ANKI_CONFIG_OPTION(gr_debugMarkers, 0, 0, 1)
 ANKI_CONFIG_OPTION(gr_maxBindlessTextures, 256, 8, 1024)

+ 1 - 0
AnKi/Gr/Vulkan/CommandBuffer.cpp

@@ -13,6 +13,7 @@ namespace anki
 
 CommandBuffer* CommandBuffer::newInstance(GrManager* manager, const CommandBufferInitInfo& init)
 {
+	ANKI_TRACE_SCOPED_EVENT(VK_NEW_CCOMMAND_BUFFER);
 	CommandBufferImpl* impl = manager->getAllocator().newInstance<CommandBufferImpl>(manager, init.getName());
 	const Error err = impl->init(init);
 	if(err)

+ 27 - 19
AnKi/Gr/Vulkan/CommandBufferFactory.cpp

@@ -22,7 +22,7 @@ void MicroCommandBuffer::destroy()
 
 void MicroCommandBuffer::reset()
 {
-	ANKI_TRACE_SCOPED_EVENT(GR_COMMAND_BUFFER_RESET);
+	ANKI_TRACE_SCOPED_EVENT(VK_COMMAND_BUFFER_RESET);
 
 	ANKI_ASSERT(m_refcount.load() == 0);
 	ANKI_ASSERT(!m_fence.isCreated() || m_fence->done());
@@ -30,6 +30,7 @@ void MicroCommandBuffer::reset()
 	for(GrObjectType type : EnumIterable<GrObjectType>())
 	{
 		m_objectRefs[type].destroy(m_fastAlloc);
+		++i;
 	}
 
 	m_fastAlloc.getMemoryPool().reset();
@@ -53,8 +54,7 @@ void CommandBufferThreadAllocator::destroyList(IntrusiveList<MicroCommandBuffer>
 {
 	while(!list.isEmpty())
 	{
-		MicroCommandBuffer* ptr = &list.getFront();
-		list.popFront();
+		MicroCommandBuffer* ptr = list.popFront();
 		ptr->destroy();
 		getAllocator().deleteInstance(ptr);
 #if ANKI_EXTRA_CHECKS
@@ -99,22 +99,22 @@ Error CommandBufferThreadAllocator::newCommandBuffer(CommandBufferFlag cmdbFlags
 	const Bool smallBatch = !!(cmdbFlags & CommandBufferFlag::SMALL_BATCH);
 	CmdbType& type = m_types[secondLevel][smallBatch];
 
-	// Move the deleted to (possibly) in-use
+	// Move the deleted to (possibly) in-use or ready
 	{
 		LockGuard<Mutex> lock(type.m_deletedMtx);
 
 		while(!type.m_deletedCmdbs.isEmpty())
 		{
-			MicroCommandBuffer* ptr = &type.m_deletedCmdbs.getFront();
-			type.m_deletedCmdbs.popFront();
+			MicroCommandBuffer* ptr = type.m_deletedCmdbs.popFront();
 
 			if(secondLevel)
 			{
-				type.m_readyCmdbs.pushBack(ptr);
+				type.m_readyCmdbs.pushFront(ptr);
+				ptr->reset();
 			}
 			else
 			{
-				type.m_inUseCmdbs.pushBack(ptr);
+				type.m_inUseCmdbs.pushFront(ptr);
 			}
 		}
 	}
@@ -125,28 +125,35 @@ Error CommandBufferThreadAllocator::newCommandBuffer(CommandBufferFlag cmdbFlags
 	{
 		// Primary
 
-		IntrusiveList<MicroCommandBuffer> inUseCmdbs; // Push to temporary
+		// Try to reuse a ready buffer
+		if(!type.m_readyCmdbs.isEmpty())
+		{
+			out = type.m_readyCmdbs.popFront();
+		}
 
+		// Do a sweep and move in-use buffers to ready
+		IntrusiveList<MicroCommandBuffer> inUseCmdbs; // Push to temporary because we are iterating
 		while(!type.m_inUseCmdbs.isEmpty())
 		{
-			MicroCommandBuffer* mcmdb = &type.m_inUseCmdbs.getFront();
-			type.m_inUseCmdbs.popFront();
+			MicroCommandBuffer* inUseCmdb = type.m_inUseCmdbs.popFront();
 
-			if(!mcmdb->m_fence.isCreated() || mcmdb->m_fence->done())
+			if(!inUseCmdb->m_fence.isCreated() || inUseCmdb->m_fence->done())
 			{
-				// Can re-use it
+				// It's ready
+
 				if(out)
 				{
-					inUseCmdbs.pushBack(mcmdb);
+					type.m_readyCmdbs.pushFront(inUseCmdb);
+					inUseCmdb->reset();
 				}
 				else
 				{
-					out = mcmdb;
+					out = inUseCmdb;
 				}
 			}
 			else
 			{
-				inUseCmdbs.pushBack(mcmdb);
+				inUseCmdbs.pushBack(inUseCmdb);
 			}
 		}
 
@@ -155,12 +162,13 @@ Error CommandBufferThreadAllocator::newCommandBuffer(CommandBufferFlag cmdbFlags
 	}
 	else
 	{
+		// Secondary
+
 		ANKI_ASSERT(type.m_inUseCmdbs.isEmpty());
 
 		if(!type.m_readyCmdbs.isEmpty())
 		{
-			out = &type.m_readyCmdbs.getFront();
-			type.m_readyCmdbs.popFront();
+			out = type.m_readyCmdbs.popFront();
 		}
 	}
 
@@ -174,7 +182,7 @@ Error CommandBufferThreadAllocator::newCommandBuffer(CommandBufferFlag cmdbFlags
 		ci.level = (secondLevel) ? VK_COMMAND_BUFFER_LEVEL_SECONDARY : VK_COMMAND_BUFFER_LEVEL_PRIMARY;
 		ci.commandBufferCount = 1;
 
-		ANKI_TRACE_INC_COUNTER(VK_CMD_BUFFER_CREATE, 1);
+		ANKI_TRACE_INC_COUNTER(VK_COMMAND_BUFFER_CREATE, 1);
 		VkCommandBuffer cmdb;
 		ANKI_VK_CHECK(vkAllocateCommandBuffers(m_factory->m_dev, &ci, &cmdb));
 

+ 2 - 2
AnKi/Gr/Vulkan/CommandBufferFactory.h

@@ -143,8 +143,8 @@ private:
 	class CmdbType
 	{
 	public:
-		IntrusiveList<MicroCommandBuffer> m_readyCmdbs;
-		IntrusiveList<MicroCommandBuffer> m_inUseCmdbs;
+		IntrusiveList<MicroCommandBuffer> m_readyCmdbs; ///< Buffers that are ready to be used.
+		IntrusiveList<MicroCommandBuffer> m_inUseCmdbs; ///< Buffer that got dereferenced and maybe in-use.
 
 		IntrusiveList<MicroCommandBuffer> m_deletedCmdbs;
 		Mutex m_deletedMtx; ///< Lock because the dallocations may happen anywhere.

+ 2 - 2
AnKi/Gr/Vulkan/GrManagerImpl.cpp

@@ -225,7 +225,7 @@ Error GrManagerImpl::initInstance(const GrManagerInitInfo& init)
 	// Layers
 	static Array<const char*, 1> LAYERS = {"VK_LAYER_KHRONOS_validation"};
 	Array<const char*, LAYERS.getSize()> layersToEnable; // Keep it alive in the stack
-	if(init.m_config->getBool("gr_debugContext"))
+	if(init.m_config->getBool("gr_validation"))
 	{
 		uint32_t count;
 		vkEnumerateInstanceLayerProperties(&count, nullptr);
@@ -573,7 +573,7 @@ Error GrManagerImpl::initDevice(const GrManagerInitInfo& init)
 		vkGetPhysicalDeviceFeatures2(m_physicalDevice, &devFeatures);
 		m_devFeatures = devFeatures.features;
 		m_devFeatures.robustBufferAccess =
-			(init.m_config->getBool("gr_debugContext") && m_devFeatures.robustBufferAccess) ? true : false;
+			(init.m_config->getBool("gr_validation") && m_devFeatures.robustBufferAccess) ? true : false;
 		ANKI_VK_LOGI("Robust buffer access is %s", (m_devFeatures.robustBufferAccess) ? "enabled" : "disabled");
 
 		ci.pEnabledFeatures = &m_devFeatures;

+ 15 - 7
AnKi/Renderer/TemporalAA.cpp

@@ -53,9 +53,6 @@ Error TemporalAA::initInternal(const ConfigSet& config)
 		const ShaderProgramResourceVariant* variant;
 		m_prog->getOrCreateVariant(variantInitInfo, variant);
 		m_grProgs[i] = variant->getProgram();
-
-		m_workgroupSize[0] = variant->getWorkgroupSizes()[0];
-		m_workgroupSize[1] = variant->getWorkgroupSizes()[1];
 	}
 
 	for(U i = 0; i < 2; ++i)
@@ -87,7 +84,7 @@ void TemporalAA::run(const RenderingContext& ctx, RenderPassWorkContext& rgraphC
 	rgraphCtx.bindImage(0, 5, m_runCtx.m_renderRt, TextureSubresourceInfo());
 	rgraphCtx.bindUniformBuffer(0, 6, m_r->getTonemapping().getAverageLuminanceBuffer());
 
-	dispatchPPCompute(cmdb, m_workgroupSize[0], m_workgroupSize[1], m_r->getWidth(), m_r->getHeight());
+	dispatchPPCompute(cmdb, 8, 8, m_r->getWidth(), m_r->getHeight());
 }
 
 void TemporalAA::populateRenderGraph(RenderingContext& ctx)
@@ -95,10 +92,21 @@ void TemporalAA::populateRenderGraph(RenderingContext& ctx)
 	m_runCtx.m_ctx = &ctx;
 	RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
 
+	const U32 historyRtIdx = (m_r->getFrameCount() + 1) & 1;
+	const U32 renderRtIdx = !historyRtIdx;
+
 	// Import RTs
-	m_runCtx.m_historyRt =
-		rgraph.importRenderTarget(m_rtTextures[(m_r->getFrameCount() + 1) & 1], TextureUsageBit::SAMPLED_FRAGMENT);
-	m_runCtx.m_renderRt = rgraph.importRenderTarget(m_rtTextures[m_r->getFrameCount() & 1], TextureUsageBit::NONE);
+	if(ANKI_LIKELY(m_rtTexturesImportedOnce[historyRtIdx]))
+	{
+		m_runCtx.m_historyRt = rgraph.importRenderTarget(m_rtTextures[historyRtIdx]);
+	}
+	else
+	{
+		m_runCtx.m_historyRt = rgraph.importRenderTarget(m_rtTextures[historyRtIdx], TextureUsageBit::SAMPLED_FRAGMENT);
+		m_rtTexturesImportedOnce[historyRtIdx] = true;
+	}
+
+	m_runCtx.m_renderRt = rgraph.importRenderTarget(m_rtTextures[renderRtIdx], TextureUsageBit::NONE);
 
 	// Create pass
 	ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass("TemporalAA");

+ 1 - 2
AnKi/Renderer/TemporalAA.h

@@ -32,12 +32,11 @@ public:
 
 private:
 	Array<TexturePtr, 2> m_rtTextures;
+	Array<Bool, 2> m_rtTexturesImportedOnce = {};
 
 	ShaderProgramResourcePtr m_prog;
 	Array<ShaderProgramPtr, 2> m_grProgs;
 
-	Array<U32, 2> m_workgroupSize = {};
-
 	class
 	{
 	public:

+ 1 - 1
Samples/Common/Framework.cpp

@@ -24,7 +24,7 @@ Error SampleApp::init(int argc, char** argv, CString sampleName)
 	ConfigSet config = DefaultConfigSet::get();
 	config.set("window_fullscreen", true);
 	config.set("rsrc_dataPaths", StringAuto(alloc).sprintf("%s:%s", mainDataPath.cstr(), assetsDataPath.cstr()));
-	config.set("gr_debugContext", 0);
+	config.set("gr_validation", 0);
 	ANKI_CHECK(config.setFromCommandLineArguments(argc - 1, argv + 1));
 	ANKI_CHECK(App::init(config, allocAligned, nullptr));
 

+ 1 - 1
Tests/Gr/Gr.cpp

@@ -294,7 +294,7 @@ static StagingGpuMemoryManager* stagingMem = nullptr;
 	ConfigSet cfg = DefaultConfigSet::get(); \
 	cfg.set("width", WIDTH); \
 	cfg.set("height", HEIGHT); \
-	cfg.set("gr_debugContext", true); \
+	cfg.set("gr_validation", true); \
 	cfg.set("gr_vsync", false); \
 	cfg.set("gr_rayTracing", true); \
 	cfg.set("gr_debugMarkers", true); \

+ 1 - 1
Tests/Ui/Ui.cpp

@@ -57,7 +57,7 @@ ANKI_TEST(Ui, Ui)
 	ConfigSet cfg = DefaultConfigSet::get();
 	initConfig(cfg);
 	cfg.set("gr_vsync", 1);
-	cfg.set("gr_debugContext", 0);
+	cfg.set("gr_validation", 0);
 	cfg.set("width", 1024);
 	cfg.set("height", 760);
 	cfg.set("rsrc_dataPaths", "EngineAssets");