Browse Source

Added VK_EXT_ASTC_decode_mode support. Fixed VK validation errors

Panagiotis Christopoulos Charitos 4 years ago
parent
commit
8e80cc55f4

+ 1 - 1
AnKi/Core/App.cpp

@@ -268,7 +268,7 @@ Error App::initInternal(const ConfigSet& config_, AllocAlignedCallback allocCb,
 	//
 	//
 	// Mali HW counters
 	// Mali HW counters
 	//
 	//
-	if(m_gr->getDeviceCapabilities().m_gpuVendor == GpuVendor::ARM)
+	if(m_gr->getDeviceCapabilities().m_gpuVendor == GpuVendor::ARM && config.getBool("core_maliHwCounters"))
 	{
 	{
 		m_maliHwCounters = m_heapAlloc.newInstance<MaliHwCounters>(m_heapAlloc);
 		m_maliHwCounters = m_heapAlloc.newInstance<MaliHwCounters>(m_heapAlloc);
 	}
 	}

+ 1 - 0
AnKi/Core/ConfigDefs.h

@@ -8,6 +8,7 @@ ANKI_CONFIG_OPTION(core_storagePerFrameMemorySize, 24_MB, 1_MB, 1_GB)
 ANKI_CONFIG_OPTION(core_vertexPerFrameMemorySize, 12_MB, 1_MB, 1_GB)
 ANKI_CONFIG_OPTION(core_vertexPerFrameMemorySize, 12_MB, 1_MB, 1_GB)
 ANKI_CONFIG_OPTION(core_textureBufferPerFrameMemorySize, 1_MB, 1_MB, 1_GB)
 ANKI_CONFIG_OPTION(core_textureBufferPerFrameMemorySize, 1_MB, 1_MB, 1_GB)
 ANKI_CONFIG_OPTION(core_globalVertexMemorySize, 128_MB, 16_MB, 2_GB)
 ANKI_CONFIG_OPTION(core_globalVertexMemorySize, 128_MB, 16_MB, 2_GB)
+ANKI_CONFIG_OPTION(core_maliHwCounters, 0, 0, 1)
 
 
 ANKI_CONFIG_OPTION(width, 1920, 16, 16 * 1024, "Width")
 ANKI_CONFIG_OPTION(width, 1920, 16, 16 * 1024, "Width")
 ANKI_CONFIG_OPTION(height, 1080, 16, 16 * 1024, "Height")
 ANKI_CONFIG_OPTION(height, 1080, 16, 16 * 1024, "Height")

+ 16 - 0
AnKi/Gr/Vulkan/CommandBufferImpl.cpp

@@ -101,6 +101,12 @@ void CommandBufferImpl::beginRecording()
 	}
 	}
 
 
 	vkBeginCommandBuffer(m_handle, &begin);
 	vkBeginCommandBuffer(m_handle, &begin);
+
+	// Stats
+	if(!!(getGrManagerImpl().getExtensions() & VulkanExtensions::KHR_PIPELINE_EXECUTABLE_PROPERTIES))
+	{
+		m_state.setEnablePipelineStatistics(true);
+	}
 }
 }
 
 
 void CommandBufferImpl::beginRenderPass(FramebufferPtr fb,
 void CommandBufferImpl::beginRenderPass(FramebufferPtr fb,
@@ -803,6 +809,16 @@ void CommandBufferImpl::rebindDynamicState()
 		ANKI_CMD(vkCmdSetStencilReference(m_handle, VK_STENCIL_FACE_BACK_BIT, m_stencilReferenceMasks[1]),
 		ANKI_CMD(vkCmdSetStencilReference(m_handle, VK_STENCIL_FACE_BACK_BIT, m_stencilReferenceMasks[1]),
 				 ANY_OTHER_COMMAND);
 				 ANY_OTHER_COMMAND);
 	}
 	}
+
+	// Rebind VRS
+	if(m_vrsRate != VrsRate::COUNT)
+	{
+		const VkExtent2D extend = convertVrsShadingRate(m_vrsRate);
+		Array<VkFragmentShadingRateCombinerOpKHR, 2> combiner;
+		combiner[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR; // Keep pipeline rating over primitive
+		combiner[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR; // Keep pipeline rating over attachment
+		vkCmdSetFragmentShadingRateKHR(m_handle, &extend, &combiner[0]);
+	}
 }
 }
 
 
 void CommandBufferImpl::buildAccelerationStructureInternal(AccelerationStructurePtr& as)
 void CommandBufferImpl::buildAccelerationStructureInternal(AccelerationStructurePtr& as)

+ 2 - 1
AnKi/Gr/Vulkan/CommandBufferImpl.h

@@ -423,8 +423,8 @@ private:
 	/// @{
 	/// @{
 	Array<U32, 4> m_viewport = {0, 0, 0, 0};
 	Array<U32, 4> m_viewport = {0, 0, 0, 0};
 	Array<U32, 4> m_scissor = {0, 0, MAX_U32, MAX_U32};
 	Array<U32, 4> m_scissor = {0, 0, MAX_U32, MAX_U32};
-	Bool m_viewportDirty = true;
 	VkViewport m_lastViewport = {};
 	VkViewport m_lastViewport = {};
+	Bool m_viewportDirty = true;
 	Bool m_scissorDirty = true;
 	Bool m_scissorDirty = true;
 	VkRect2D m_lastScissor = {{-1, -1}, {MAX_U32, MAX_U32}};
 	VkRect2D m_lastScissor = {{-1, -1}, {MAX_U32, MAX_U32}};
 	Array<U32, 2> m_stencilCompareMasks = {0x5A5A5A5A, 0x5A5A5A5A}; ///< Use a stupid number to initialize.
 	Array<U32, 2> m_stencilCompareMasks = {0x5A5A5A5A, 0x5A5A5A5A}; ///< Use a stupid number to initialize.
@@ -433,6 +433,7 @@ private:
 #if ANKI_ENABLE_ASSERTIONS
 #if ANKI_ENABLE_ASSERTIONS
 	Bool m_lineWidthSet = false;
 	Bool m_lineWidthSet = false;
 #endif
 #endif
+	VrsRate m_vrsRate = VrsRate::COUNT;
 
 
 	/// Rebind the above dynamic state. Needed after pushing secondary command buffers (they dirty the state).
 	/// Rebind the above dynamic state. Needed after pushing secondary command buffers (they dirty the state).
 	void rebindDynamicState();
 	void rebindDynamicState();

+ 10 - 5
AnKi/Gr/Vulkan/CommandBufferImpl.inl.h

@@ -957,11 +957,16 @@ inline void CommandBufferImpl::setVrsRateInternal(VrsRate rate)
 
 
 	commandCommon();
 	commandCommon();
 
 
-	const VkExtent2D extend = convertVrsShadingRate(rate);
-	Array<VkFragmentShadingRateCombinerOpKHR, 2> combiner;
-	combiner[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR; // Keep pipeline rating over primitive
-	combiner[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR; // Keep pipeline rating over attachment
-	vkCmdSetFragmentShadingRateKHR(m_handle, &extend, &combiner[0]);
+	if(m_vrsRate != rate)
+	{
+		const VkExtent2D extend = convertVrsShadingRate(rate);
+		Array<VkFragmentShadingRateCombinerOpKHR, 2> combiner;
+		combiner[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR; // Keep pipeline rating over primitive
+		combiner[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR; // Keep pipeline rating over attachment
+		vkCmdSetFragmentShadingRateKHR(m_handle, &extend, &combiner[0]);
+
+		m_vrsRate = rate;
+	}
 }
 }
 
 
 } // end namespace anki
 } // end namespace anki

+ 1 - 0
AnKi/Gr/Vulkan/Common.h

@@ -82,6 +82,7 @@ enum class VulkanExtensions : U32
 	EXT_SAMPLER_FILTER_MIN_MAX = 1 << 21,
 	EXT_SAMPLER_FILTER_MIN_MAX = 1 << 21,
 	KHR_CREATE_RENDERPASS_2 = 1 << 22,
 	KHR_CREATE_RENDERPASS_2 = 1 << 22,
 	KHR_FRAGMENT_SHADING_RATE = 1 << 23,
 	KHR_FRAGMENT_SHADING_RATE = 1 << 23,
+	EXT_ASTC_DECODE_MODE = 1 << 24,
 };
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(VulkanExtensions)
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(VulkanExtensions)
 
 

+ 15 - 0
AnKi/Gr/Vulkan/GrManagerImpl.cpp

@@ -729,6 +729,11 @@ Error GrManagerImpl::initDevice(const GrManagerInitInfo& init)
 				m_extensions |= VulkanExtensions::KHR_FRAGMENT_SHADING_RATE;
 				m_extensions |= VulkanExtensions::KHR_FRAGMENT_SHADING_RATE;
 				extensionsToEnable[extensionsToEnableCount++] = extensionName.cstr();
 				extensionsToEnable[extensionsToEnableCount++] = extensionName.cstr();
 			}
 			}
+			else if(extensionName == VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME)
+			{
+				m_extensions |= VulkanExtensions::EXT_ASTC_DECODE_MODE;
+				extensionsToEnable[extensionsToEnableCount++] = extensionName.cstr();
+			}
 		}
 		}
 
 
 		ANKI_VK_LOGI("Will enable the following device extensions:");
 		ANKI_VK_LOGI("Will enable the following device extensions:");
@@ -1514,6 +1519,11 @@ Error GrManagerImpl::printPipelineShaderInfoInternal(VkPipeline ppline, CString
 		U32 executableCount = 0;
 		U32 executableCount = 0;
 		ANKI_VK_CHECK(vkGetPipelineExecutablePropertiesKHR(m_device, &pplineInf, &executableCount, nullptr));
 		ANKI_VK_CHECK(vkGetPipelineExecutablePropertiesKHR(m_device, &pplineInf, &executableCount, nullptr));
 		DynamicArrayAuto<VkPipelineExecutablePropertiesKHR> executableProps(m_alloc, executableCount);
 		DynamicArrayAuto<VkPipelineExecutablePropertiesKHR> executableProps(m_alloc, executableCount);
+		for(VkPipelineExecutablePropertiesKHR& prop : executableProps)
+		{
+			prop = {};
+			prop.sType = VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR;
+		}
 		ANKI_VK_CHECK(
 		ANKI_VK_CHECK(
 			vkGetPipelineExecutablePropertiesKHR(m_device, &pplineInf, &executableCount, &executableProps[0]));
 			vkGetPipelineExecutablePropertiesKHR(m_device, &pplineInf, &executableCount, &executableProps[0]));
 
 
@@ -1531,6 +1541,11 @@ Error GrManagerImpl::printPipelineShaderInfoInternal(VkPipeline ppline, CString
 			U32 statCount = 0;
 			U32 statCount = 0;
 			vkGetPipelineExecutableStatisticsKHR(m_device, &exeInf, &statCount, nullptr);
 			vkGetPipelineExecutableStatisticsKHR(m_device, &exeInf, &statCount, nullptr);
 			DynamicArrayAuto<VkPipelineExecutableStatisticKHR> stats(m_alloc, statCount);
 			DynamicArrayAuto<VkPipelineExecutableStatisticKHR> stats(m_alloc, statCount);
+			for(VkPipelineExecutableStatisticKHR& s : stats)
+			{
+				s = {};
+				s.sType = VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR;
+			}
 			vkGetPipelineExecutableStatisticsKHR(m_device, &exeInf, &statCount, &stats[0]);
 			vkGetPipelineExecutableStatisticsKHR(m_device, &exeInf, &statCount, &stats[0]);
 
 
 			for(U32 s = 0; s < statCount; ++s)
 			for(U32 s = 0; s < statCount; ++s)

+ 5 - 0
AnKi/Gr/Vulkan/Pipeline.cpp

@@ -212,6 +212,11 @@ const VkGraphicsPipelineCreateInfo& PipelineStateTracker::updatePipelineCreateIn
 	ci = {};
 	ci = {};
 	ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
 	ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
 
 
+	if(m_pipelineStatisticsEnabled)
+	{
+		ci.flags |= VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR;
+	}
+
 	// Prog
 	// Prog
 	ci.pStages = static_cast<const ShaderProgramImpl&>(*m_state.m_prog).getShaderCreateInfos(ci.stageCount);
 	ci.pStages = static_cast<const ShaderProgramImpl&>(*m_state.m_prog).getShaderCreateInfos(ci.stageCount);
 
 

+ 12 - 0
AnKi/Gr/Vulkan/Pipeline.h

@@ -386,6 +386,16 @@ public:
 		return m_state.m_inputAssembler.m_topology;
 		return m_state.m_inputAssembler.m_topology;
 	}
 	}
 
 
+	Bool getEnablePipelineStatistics() const
+	{
+		return m_pipelineStatisticsEnabled;
+	}
+
+	void setEnablePipelineStatistics(Bool enable)
+	{
+		m_pipelineStatisticsEnabled = enable;
+	}
+
 	/// Flush state
 	/// Flush state
 	void flush(U64& pipelineHash, Bool& stateDirty)
 	void flush(U64& pipelineHash, Bool& stateDirty)
 	{
 	{
@@ -505,6 +515,8 @@ private:
 		VkPipelineRasterizationStateRasterizationOrderAMD m_rasterOrder;
 		VkPipelineRasterizationStateRasterizationOrderAMD m_rasterOrder;
 	} m_ci;
 	} m_ci;
 
 
+	Bool m_pipelineStatisticsEnabled = false;
+
 	Bool updateHashes();
 	Bool updateHashes();
 	void updateSuperHash();
 	void updateSuperHash();
 };
 };

+ 6 - 0
AnKi/Gr/Vulkan/ShaderProgramImpl.cpp

@@ -232,6 +232,12 @@ Error ShaderProgramImpl::init(const ShaderProgramInitInfo& inf)
 		const ShaderImpl& shaderImpl = static_cast<const ShaderImpl&>(*m_shaders[0]);
 		const ShaderImpl& shaderImpl = static_cast<const ShaderImpl&>(*m_shaders[0]);
 
 
 		VkComputePipelineCreateInfo ci = {};
 		VkComputePipelineCreateInfo ci = {};
+
+		if(!!(getGrManagerImpl().getExtensions() & VulkanExtensions::KHR_PIPELINE_EXECUTABLE_PROPERTIES))
+		{
+			ci.flags |= VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR;
+		}
+
 		ci.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
 		ci.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
 		ci.layout = m_pplineLayout.getHandle();
 		ci.layout = m_pplineLayout.getHandle();
 
 

+ 39 - 0
AnKi/Gr/Vulkan/TextureImpl.cpp

@@ -13,6 +13,35 @@
 
 
 namespace anki {
 namespace anki {
 
 
+static Bool isAstcLdrFormat(const VkFormat format)
+{
+	return format >= VK_FORMAT_ASTC_4x4_UNORM_BLOCK && format <= VK_FORMAT_ASTC_12x12_SRGB_BLOCK;
+}
+
+static Bool isAstcSrgbFormat(const VkFormat format)
+{
+	switch(format)
+	{
+	case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
+	case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
+	case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
+	case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
+	case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
+	case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
+	case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
+	case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
+	case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
+	case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
+	case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
+	case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
+	case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
+	case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
+		return true;
+	default:
+		return false;
+	}
+}
+
 U32 MicroImageView::getOrCreateBindlessIndex(VkImageLayout layout, GrManagerImpl& gr) const
 U32 MicroImageView::getOrCreateBindlessIndex(VkImageLayout layout, GrManagerImpl& gr) const
 {
 {
 	ANKI_ASSERT(layout == VK_IMAGE_LAYOUT_GENERAL || layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
 	ANKI_ASSERT(layout == VK_IMAGE_LAYOUT_GENERAL || layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
@@ -139,6 +168,16 @@ Error TextureImpl::initInternal(VkImage externalImage, const TextureInitInfo& in
 	m_viewCreateInfoTemplate.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
 	m_viewCreateInfoTemplate.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
 	m_viewCreateInfoTemplate.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
 	m_viewCreateInfoTemplate.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
 
 
+	if(!!(getGrManagerImpl().getExtensions() & VulkanExtensions::EXT_ASTC_DECODE_MODE) && isAstcLdrFormat(m_vkFormat)
+	   && !isAstcSrgbFormat(m_vkFormat))
+	{
+		m_astcDecodeMode = {};
+		m_astcDecodeMode.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT;
+		m_astcDecodeMode.decodeMode = VK_FORMAT_R8G8B8A8_UNORM;
+
+		m_viewCreateInfoTemplate.pNext = &m_astcDecodeMode;
+	}
+
 	// Transition the image layout from undefined to something relevant
 	// Transition the image layout from undefined to something relevant
 	if(!!init.m_initialUsage)
 	if(!!init.m_initialUsage)
 	{
 	{

+ 1 - 0
AnKi/Gr/Vulkan/TextureImpl.h

@@ -105,6 +105,7 @@ public:
 	TextureImplWorkaround m_workarounds = TextureImplWorkaround::NONE;
 	TextureImplWorkaround m_workarounds = TextureImplWorkaround::NONE;
 
 
 	VkImageViewCreateInfo m_viewCreateInfoTemplate;
 	VkImageViewCreateInfo m_viewCreateInfoTemplate;
+	VkImageViewASTCDecodeModeEXT m_astcDecodeMode;
 
 
 	TextureImpl(GrManager* manager, CString name)
 	TextureImpl(GrManager* manager, CString name)
 		: Texture(manager, name)
 		: Texture(manager, name)

+ 0 - 1
AnKi/Renderer/ForwardShading.cpp

@@ -72,7 +72,6 @@ void ForwardShading::run(const RenderingContext& ctx, RenderPassWorkContext& rgr
 void ForwardShading::setDependencies(const RenderingContext& ctx, GraphicsRenderPassDescription& pass)
 void ForwardShading::setDependencies(const RenderingContext& ctx, GraphicsRenderPassDescription& pass)
 {
 {
 	pass.newDependency({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_FRAGMENT, HIZ_HALF_DEPTH});
 	pass.newDependency({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_FRAGMENT, HIZ_HALF_DEPTH});
-	pass.newDependency({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_FRAGMENT, HIZ_QUARTER_DEPTH});
 	pass.newDependency({m_r->getVolumetricLightingAccumulation().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 	pass.newDependency({m_r->getVolumetricLightingAccumulation().getRt(), TextureUsageBit::SAMPLED_FRAGMENT});
 
 
 	if(ctx.m_renderQueue->m_lensFlares.getSize())
 	if(ctx.m_renderQueue->m_lensFlares.getSize())

+ 1 - 1
AnKi/Renderer/LightShading.cpp

@@ -271,7 +271,7 @@ void LightShading::populateRenderGraph(RenderingContext& ctx)
 
 
 	// Apply indirect
 	// Apply indirect
 	pass.newDependency(RenderPassDependency(m_r->getIndirectDiffuse().getRt(), readUsage));
 	pass.newDependency(RenderPassDependency(m_r->getIndirectDiffuse().getRt(), readUsage));
-	pass.newDependency(RenderPassDependency(m_r->getDepthDownscale().getHiZRt(), readUsage, HIZ_HALF_DEPTH));
+	pass.newDependency(RenderPassDependency(m_r->getDepthDownscale().getHiZRt(), readUsage));
 
 
 	// Fog
 	// Fog
 	pass.newDependency(RenderPassDependency(m_r->getVolumetricFog().getRt(), readUsage));
 	pass.newDependency(RenderPassDependency(m_r->getVolumetricFog().getRt(), readUsage));