Browse Source

Add support for a few extensions

Panagiotis Christopoulos Charitos 7 years ago
parent
commit
f94646ba1c

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

@@ -328,7 +328,7 @@ TexturePtr RenderGraph::getOrCreateRenderTarget(const TextureInitInfo& initInf,
 }
 }
 
 
 FramebufferPtr RenderGraph::getOrCreateFramebuffer(
 FramebufferPtr RenderGraph::getOrCreateFramebuffer(
-	const FramebufferDescription& fbDescr, const RenderTargetHandle* rtHandles)
+	const FramebufferDescription& fbDescr, const RenderTargetHandle* rtHandles, CString name)
 {
 {
 	ANKI_ASSERT(rtHandles);
 	ANKI_ASSERT(rtHandles);
 	U64 hash = fbDescr.m_hash;
 	U64 hash = fbDescr.m_hash;
@@ -363,7 +363,7 @@ FramebufferPtr RenderGraph::getOrCreateFramebuffer(
 	else
 	else
 	{
 	{
 		// Create a complete fb init info
 		// Create a complete fb init info
-		FramebufferInitInfo fbInit("RenderGraph");
+		FramebufferInitInfo fbInit;
 		if(!defaultFb)
 		if(!defaultFb)
 		{
 		{
 			fbInit.m_colorAttachmentCount = fbDescr.m_colorAttachmentCount;
 			fbInit.m_colorAttachmentCount = fbDescr.m_colorAttachmentCount;
@@ -409,6 +409,14 @@ FramebufferPtr RenderGraph::getOrCreateFramebuffer(
 			fbInit.m_colorAttachmentCount = 1;
 			fbInit.m_colorAttachmentCount = 1;
 		}
 		}
 
 
+		// Set FB name
+		Array<char, MAX_GR_OBJECT_NAME_LENGTH + 1> cutName;
+		const U cutNameLen = min<U>(name.getLength(), MAX_GR_OBJECT_NAME_LENGTH);
+		memcpy(&cutName[0], &name[0], cutNameLen);
+		cutName[cutNameLen] = '\0';
+		fbInit.setName(&cutName[0]);
+
+		// Create
 		fb = getManager().newFramebuffer(fbInit);
 		fb = getManager().newFramebuffer(fbInit);
 
 
 		// TODO: Check why the hell it compiles if you remove the parameter "hash"
 		// TODO: Check why the hell it compiles if you remove the parameter "hash"
@@ -620,7 +628,8 @@ void RenderGraph::initRenderPassesAndSetDeps(const RenderGraphDescription& descr
 
 
 			if(graphicsPass.hasFramebuffer())
 			if(graphicsPass.hasFramebuffer())
 			{
 			{
-				outPass.fb() = getOrCreateFramebuffer(graphicsPass.m_fbDescr, &graphicsPass.m_rtHandles[0]);
+				outPass.fb() =
+					getOrCreateFramebuffer(graphicsPass.m_fbDescr, &graphicsPass.m_rtHandles[0], inPass.m_name.cstr());
 				outPass.m_drawsToDefaultFb = graphicsPass.m_fbDescr.m_defaultFb;
 				outPass.m_drawsToDefaultFb = graphicsPass.m_fbDescr.m_defaultFb;
 
 
 				outPass.m_fbRenderArea = graphicsPass.m_fbRenderArea;
 				outPass.m_fbRenderArea = graphicsPass.m_fbRenderArea;

+ 2 - 1
src/anki/gr/RenderGraph.h

@@ -655,7 +655,8 @@ private:
 	void setBatchBarriers(const RenderGraphDescription& descr);
 	void setBatchBarriers(const RenderGraphDescription& descr);
 
 
 	TexturePtr getOrCreateRenderTarget(const TextureInitInfo& initInf, U64 hash);
 	TexturePtr getOrCreateRenderTarget(const TextureInitInfo& initInf, U64 hash);
-	FramebufferPtr getOrCreateFramebuffer(const FramebufferDescription& fbDescr, const RenderTargetHandle* rtHandles);
+	FramebufferPtr getOrCreateFramebuffer(
+		const FramebufferDescription& fbDescr, const RenderTargetHandle* rtHandles, CString name);
 
 
 	ANKI_HOT Bool passADependsOnB(const RenderPassDescriptionBase& a, const RenderPassDescriptionBase& b) const;
 	ANKI_HOT Bool passADependsOnB(const RenderPassDescriptionBase& a, const RenderPassDescriptionBase& b) const;
 
 

+ 2 - 0
src/anki/gr/vulkan/CommandBufferImpl.cpp

@@ -225,6 +225,7 @@ void CommandBufferImpl::beginRenderPassInternal()
 	bi.renderArea.extent.width = m_renderArea[2];
 	bi.renderArea.extent.width = m_renderArea[2];
 	bi.renderArea.extent.height = m_renderArea[3];
 	bi.renderArea.extent.height = m_renderArea[3];
 
 
+	getGrManagerImpl().beginMarker(m_handle, impl.getName());
 	ANKI_CMD(vkCmdBeginRenderPass(m_handle, &bi, m_subpassContents), ANY_OTHER_COMMAND);
 	ANKI_CMD(vkCmdBeginRenderPass(m_handle, &bi, m_subpassContents), ANY_OTHER_COMMAND);
 }
 }
 
 
@@ -239,6 +240,7 @@ void CommandBufferImpl::endRenderPass()
 	}
 	}
 
 
 	ANKI_CMD(vkCmdEndRenderPass(m_handle), ANY_OTHER_COMMAND);
 	ANKI_CMD(vkCmdEndRenderPass(m_handle), ANY_OTHER_COMMAND);
+	getGrManagerImpl().endMarker(m_handle);
 
 
 	// Default FB barrier/transition
 	// Default FB barrier/transition
 	if(static_cast<const FramebufferImpl&>(*m_activeFb).isDefaultFramebuffer())
 	if(static_cast<const FramebufferImpl&>(*m_activeFb).isDefaultFramebuffer())

+ 1 - 0
src/anki/gr/vulkan/Common.h

@@ -47,6 +47,7 @@ enum class VulkanExtensions : U16
 	NV_DEDICATED_ALLOCATION = 1 << 7,
 	NV_DEDICATED_ALLOCATION = 1 << 7,
 	EXT_SHADER_SUBGROUP_BALLOT = 1 << 8,
 	EXT_SHADER_SUBGROUP_BALLOT = 1 << 8,
 	EXT_DEBUG_REPORT = 1 << 9,
 	EXT_DEBUG_REPORT = 1 << 9,
+	AMD_SHADER_INFO = 1 << 10,
 };
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(VulkanExtensions, inline)
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(VulkanExtensions, inline)
 
 

+ 30 - 1
src/anki/gr/vulkan/GrManagerImpl.cpp

@@ -523,6 +523,11 @@ Error GrManagerImpl::initDevice(const GrManagerInitInfo& init)
 				m_extensions |= VulkanExtensions::EXT_SHADER_SUBGROUP_BALLOT;
 				m_extensions |= VulkanExtensions::EXT_SHADER_SUBGROUP_BALLOT;
 				extensionsToEnable[extensionsToEnableCount++] = VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME;
 				extensionsToEnable[extensionsToEnableCount++] = VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME;
 			}
 			}
+			else if(CString(extensionInfos[extCount].extensionName) == VK_AMD_SHADER_INFO_EXTENSION_NAME)
+			{
+				m_extensions |= VulkanExtensions::AMD_SHADER_INFO;
+				extensionsToEnable[extensionsToEnableCount++] = VK_AMD_SHADER_INFO_EXTENSION_NAME;
+			}
 		}
 		}
 
 
 		if(!!(m_extensions & VulkanExtensions::KHR_MAINENANCE1))
 		if(!!(m_extensions & VulkanExtensions::KHR_MAINENANCE1))
@@ -556,11 +561,35 @@ Error GrManagerImpl::initDevice(const GrManagerInitInfo& init)
 	{
 	{
 		m_pfnDebugMarkerSetObjectNameEXT = reinterpret_cast<PFN_vkDebugMarkerSetObjectNameEXT>(
 		m_pfnDebugMarkerSetObjectNameEXT = reinterpret_cast<PFN_vkDebugMarkerSetObjectNameEXT>(
 			vkGetDeviceProcAddr(m_device, "vkDebugMarkerSetObjectNameEXT"));
 			vkGetDeviceProcAddr(m_device, "vkDebugMarkerSetObjectNameEXT"));
-
 		if(!m_pfnDebugMarkerSetObjectNameEXT)
 		if(!m_pfnDebugMarkerSetObjectNameEXT)
 		{
 		{
 			ANKI_VK_LOGW("VK_EXT_debug_marker is present but vkDebugMarkerSetObjectNameEXT is not there");
 			ANKI_VK_LOGW("VK_EXT_debug_marker is present but vkDebugMarkerSetObjectNameEXT is not there");
 		}
 		}
+
+		m_pfnCmdDebugMarkerBeginEXT =
+			reinterpret_cast<PFN_vkCmdDebugMarkerBeginEXT>(vkGetDeviceProcAddr(m_device, "vkCmdDebugMarkerBeginEXT"));
+		if(!m_pfnCmdDebugMarkerBeginEXT)
+		{
+			ANKI_VK_LOGW("VK_EXT_debug_marker is present but vkCmdDebugMarkerBeginEXT is not there");
+		}
+
+		m_pfnCmdDebugMarkerEndEXT =
+			reinterpret_cast<PFN_vkCmdDebugMarkerEndEXT>(vkGetDeviceProcAddr(m_device, "vkCmdDebugMarkerEndEXT"));
+		if(!m_pfnCmdDebugMarkerEndEXT)
+		{
+			ANKI_VK_LOGW("VK_EXT_debug_marker is present but vkCmdDebugMarkerEndEXT is not there");
+		}
+	}
+
+	// Get VK_AMD_shader_info entry points
+	if(!!(m_extensions & VulkanExtensions::AMD_SHADER_INFO))
+	{
+		m_pfnGetShaderInfoAMD =
+			reinterpret_cast<PFN_vkGetShaderInfoAMD>(vkGetDeviceProcAddr(m_device, "vkGetShaderInfoAMD"));
+		if(!m_pfnGetShaderInfoAMD)
+		{
+			ANKI_VK_LOGW("VK_AMD_shader_info is present but vkGetShaderInfoAMD is not there");
+		}
 	}
 	}
 
 
 	return Error::NONE;
 	return Error::NONE;

+ 49 - 0
src/anki/gr/vulkan/GrManagerImpl.h

@@ -173,6 +173,30 @@ public:
 		return m_queueIdx;
 		return m_queueIdx;
 	}
 	}
 
 
+	/// @name Debug report
+	/// @{
+	void beginMarker(VkCommandBuffer cmdb, CString name) const
+	{
+		ANKI_ASSERT(cmdb);
+		if(m_pfnCmdDebugMarkerBeginEXT)
+		{
+			VkDebugMarkerMarkerInfoEXT markerInfo = {};
+			markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT;
+			markerInfo.color[0] = 1.0f;
+			markerInfo.pMarkerName = (!name.isEmpty() && name.getLength() > 0) ? name.cstr() : "Unnamed";
+			m_pfnCmdDebugMarkerBeginEXT(cmdb, &markerInfo);
+		}
+	}
+
+	void endMarker(VkCommandBuffer cmdb) const
+	{
+		ANKI_ASSERT(cmdb);
+		if(m_pfnCmdDebugMarkerEndEXT)
+		{
+			m_pfnCmdDebugMarkerEndEXT(cmdb);
+		}
+	}
+
 	void trySetVulkanHandleName(CString name, VkDebugReportObjectTypeEXT type, U64 handle) const;
 	void trySetVulkanHandleName(CString name, VkDebugReportObjectTypeEXT type, U64 handle) const;
 
 
 	void trySetVulkanHandleName(CString name, VkDebugReportObjectTypeEXT type, void* handle) const
 	void trySetVulkanHandleName(CString name, VkDebugReportObjectTypeEXT type, void* handle) const
@@ -186,6 +210,28 @@ public:
 	{
 	{
 		return tryGetVulkanHandleName(U64(ptrToNumber(handle)));
 		return tryGetVulkanHandleName(U64(ptrToNumber(handle)));
 	}
 	}
+	/// @}
+
+	void printPipelineShaderInfo(VkPipeline ppline, CString name) const
+	{
+		if(m_pfnGetShaderInfoAMD)
+		{
+			VkShaderStatisticsInfoAMD stats = {};
+			size_t size = sizeof(stats);
+			VkResult err = m_pfnGetShaderInfoAMD(
+				m_device, ppline, VK_SHADER_STAGE_ALL, VK_SHADER_INFO_TYPE_STATISTICS_AMD, &size, &stats);
+
+			if(!err)
+			{
+				ANKI_VK_LOGI("Pipeline \"%s\" stats: VGRPS %u/%u, SGRPS %u/%u",
+					name.cstr(),
+					stats.resourceUsage.numUsedVgprs,
+					stats.numAvailableVgprs,
+					stats.resourceUsage.numUsedSgprs,
+					stats.numAvailableSgprs);
+			}
+		}
+	}
 
 
 private:
 private:
 	U64 m_frame = 0;
 	U64 m_frame = 0;
@@ -215,6 +261,9 @@ private:
 	VkPhysicalDeviceFeatures m_devFeatures = {};
 	VkPhysicalDeviceFeatures m_devFeatures = {};
 
 
 	PFN_vkDebugMarkerSetObjectNameEXT m_pfnDebugMarkerSetObjectNameEXT = nullptr;
 	PFN_vkDebugMarkerSetObjectNameEXT m_pfnDebugMarkerSetObjectNameEXT = nullptr;
+	PFN_vkCmdDebugMarkerBeginEXT m_pfnCmdDebugMarkerBeginEXT = nullptr;
+	PFN_vkCmdDebugMarkerEndEXT m_pfnCmdDebugMarkerEndEXT = nullptr;
+	PFN_vkGetShaderInfoAMD m_pfnGetShaderInfoAMD = nullptr;
 
 
 	/// @name Surface_related
 	/// @name Surface_related
 	/// @{
 	/// @{

+ 1 - 0
src/anki/gr/vulkan/ShaderProgramImpl.cpp

@@ -180,6 +180,7 @@ Error ShaderProgramImpl::init(const ShaderProgramInitInfo& inf)
 
 
 		ANKI_VK_CHECK(vkCreateComputePipelines(
 		ANKI_VK_CHECK(vkCreateComputePipelines(
 			getDevice(), getGrManagerImpl().getPipelineCache(), 1, &ci, nullptr, &m_computePpline));
 			getDevice(), getGrManagerImpl().getPipelineCache(), 1, &ci, nullptr, &m_computePpline));
+		getGrManagerImpl().printPipelineShaderInfo(m_computePpline, getName());
 	}
 	}
 
 
 	return Error::NONE;
 	return Error::NONE;

+ 1 - 1
thirdparty

@@ -1 +1 @@
-Subproject commit fa5d32fa9a8545989e22a5d2bf7738e78b4a9d9b
+Subproject commit 2e44ed9366a0f030bf8d9c168f83faaf259a222b