Browse Source

Can dump shader info

Panagiotis Christopoulos Charitos 7 years ago
parent
commit
1efbd3ad1d

+ 1 - 0
src/anki/gr/Enums.h

@@ -442,6 +442,7 @@ enum class ShaderType : U8
 
 	COUNT,
 	FIRST = VERTEX,
+	LAST = COUNT - 1,
 	FIRST_GRAPHICS = VERTEX,
 	LAST_GRAPHICS = FRAGMENT,
 };

+ 53 - 15
src/anki/gr/vulkan/GrManagerImpl.cpp

@@ -402,7 +402,7 @@ Error GrManagerImpl::initInstance(const GrManagerInitInfo& init)
 		m_capabilities.m_gpuVendor = GpuVendor::UNKNOWN;
 	}
 	ANKI_VK_LOGI(
-		"GPU is %s. Vendor identified a %s", m_devProps.deviceName, &GPU_VENDOR_STR[m_capabilities.m_gpuVendor][0]);
+		"GPU is %s. Vendor identified as %s", m_devProps.deviceName, &GPU_VENDOR_STR[m_capabilities.m_gpuVendor][0]);
 
 	vkGetPhysicalDeviceFeatures(m_physicalDevice, &m_devFeatures);
 
@@ -893,37 +893,75 @@ VkBool32 GrManagerImpl::debugReportCallbackEXT(VkDebugReportFlagsEXT flags,
 	return false;
 }
 
-void GrManagerImpl::printPipelineShaderInfo(VkPipeline ppline, CString name, ShaderTypeBit stages) const
+void GrManagerImpl::printPipelineShaderInfo(VkPipeline ppline, CString name, ShaderTypeBit stages, U64 hash) const
+{
+	Error err = printPipelineShaderInfoInternal(ppline, name, stages, hash);
+	if(err)
+	{
+		ANKI_VK_LOGE("Ignoring previous errors");
+	}
+}
+
+Error GrManagerImpl::printPipelineShaderInfoInternal(
+	VkPipeline ppline, CString name, ShaderTypeBit stages, U64 hash) const
 {
 	if(m_pfnGetShaderInfoAMD)
 	{
 		VkShaderStatisticsInfoAMD stats = {};
-		size_t size = sizeof(stats);
 
-		ANKI_VK_LOGI("Pipeline \"%s\" stats:", name.cstr());
+		LockGuard<SpinLock> lock(m_shaderStatsFileMtx);
+
+		// Open the file
+		if(!m_shaderStatsFile.isOpen())
+		{
+			ANKI_CHECK(m_shaderStatsFile.open(
+				StringAuto(getAllocator()).sprintf("%s/../ppline_stats.csv", m_cacheDir.cstr()).toCString(),
+				FileOpenFlag::WRITE));
+
+			ANKI_CHECK(m_shaderStatsFile.writeText("ppline name,hash,"
+												   "stage 0 VGPR,stage 0 SGPR,"
+												   "stage 1 VGPR,stage 1 SGPR,"
+												   "stage 2 VGPR,stage 2 SGPR,"
+												   "stage 3 VGPR,stage 3 SGPR,"
+												   "stage 4 VGPR,stage 4 SGPR,"
+												   "stage 5 VGPR,stage 5 SGPR\n"));
+		}
+
+		ANKI_CHECK(m_shaderStatsFile.writeText("%s,0x%" PRIx64 ",", name.cstr(), hash));
+
+		StringAuto str(getAllocator());
 
 		for(ShaderType type = ShaderType::FIRST; type < ShaderType::COUNT; ++type)
 		{
 			ShaderTypeBit stage = stages & ShaderTypeBit(1 << type);
 			if(!stage)
 			{
+				ANKI_CHECK(m_shaderStatsFile.writeText((type != ShaderType::LAST) ? "0,0," : "0,0\n"));
 				continue;
 			}
 
-			VkResult err = m_pfnGetShaderInfoAMD(
-				m_device, ppline, convertShaderTypeBit(stage), VK_SHADER_INFO_TYPE_STATISTICS_AMD, &size, &stats);
+			size_t size = sizeof(stats);
+			ANKI_VK_CHECK(m_pfnGetShaderInfoAMD(
+				m_device, ppline, convertShaderTypeBit(stage), VK_SHADER_INFO_TYPE_STATISTICS_AMD, &size, &stats));
 
-			if(!err)
-			{
-				ANKI_VK_LOGI("\tStage %u: VGRPS %u/%u, SGRPS %u/%u",
-					U32(type),
-					stats.resourceUsage.numUsedVgprs,
-					stats.numAvailableVgprs,
-					stats.resourceUsage.numUsedSgprs,
-					stats.numAvailableSgprs);
-			}
+			str.append(StringAuto(getAllocator())
+						   .sprintf("Stage %u: VGRPS %02u, SGRPS %02u ",
+							   U32(type),
+							   stats.resourceUsage.numUsedVgprs,
+							   stats.resourceUsage.numUsedSgprs));
+
+			ANKI_CHECK(m_shaderStatsFile.writeText((type != ShaderType::LAST) ? "%u,%u," : "%u,%u\n",
+				stats.resourceUsage.numUsedVgprs,
+				stats.resourceUsage.numUsedSgprs));
 		}
+
+		ANKI_VK_LOGI("Pipeline \"%s\" (0x%016" PRIx64 ") stats: %s", name.cstr(), hash, str.cstr());
+
+		// Flush the file just in case
+		ANKI_CHECK(m_shaderStatsFile.flush());
 	}
+
+	return Error::NONE;
 }
 
 } // end namespace anki

+ 6 - 1
src/anki/gr/vulkan/GrManagerImpl.h

@@ -212,7 +212,7 @@ public:
 	}
 	/// @}
 
-	void printPipelineShaderInfo(VkPipeline ppline, CString name, ShaderTypeBit stages) const;
+	void printPipelineShaderInfo(VkPipeline ppline, CString name, ShaderTypeBit stages, U64 hash = 0) const;
 
 private:
 	U64 m_frame = 0;
@@ -245,6 +245,8 @@ private:
 	PFN_vkCmdDebugMarkerBeginEXT m_pfnCmdDebugMarkerBeginEXT = nullptr;
 	PFN_vkCmdDebugMarkerEndEXT m_pfnCmdDebugMarkerEndEXT = nullptr;
 	PFN_vkGetShaderInfoAMD m_pfnGetShaderInfoAMD = nullptr;
+	mutable File m_shaderStatsFile;
+	mutable SpinLock m_shaderStatsFileMtx;
 
 	/// @name Surface_related
 	/// @{
@@ -324,6 +326,9 @@ private:
 		const char* pLayerPrefix,
 		const char* pMessage,
 		void* pUserData);
+
+	ANKI_USE_RESULT Error printPipelineShaderInfoInternal(
+		VkPipeline ppline, CString name, ShaderTypeBit stages, U64 hash) const;
 };
 /// @}
 

+ 1 - 1
src/anki/gr/vulkan/Pipeline.cpp

@@ -457,7 +457,7 @@ void PipelineFactory::newPipeline(PipelineStateTracker& state, Pipeline& ppline,
 		// Print shader info
 		const ShaderProgramImpl& shaderImpl = static_cast<const ShaderProgramImpl&>(*state.m_state.m_prog);
 		shaderImpl.getGrManagerImpl().printPipelineShaderInfo(
-			pp.m_handle, shaderImpl.getName(), shaderImpl.getStages());
+			pp.m_handle, shaderImpl.getName(), shaderImpl.getStages(), hash);
 	}
 }