Browse Source

Fix some validation errors

Panagiotis Christopoulos Charitos 2 năm trước cách đây
mục cha
commit
2d82c5ff87

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

@@ -95,7 +95,8 @@ enum class VulkanExtensions : U64
 	kKHR_push_descriptor = 1u << 28u,
 	kKHR_maintenance_4 = 1u << 29u,
 	kKHR_draw_indirect_count = 1u << 30u,
-	kEXT_mesh_shader = 1u << 31u
+	kEXT_mesh_shader = 1u << 31u,
+	kEXT_host_query_reset = 32u,
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(VulkanExtensions)
 

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

@@ -813,6 +813,11 @@ Error GrManagerImpl::initDevice()
 				m_extensions |= VulkanExtensions::kEXT_mesh_shader;
 				extensionsToEnable[extensionsToEnableCount++] = extensionName.cstr();
 			}
+			else if(extensionName == VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME)
+			{
+				m_extensions |= VulkanExtensions::kEXT_host_query_reset;
+				extensionsToEnable[extensionsToEnableCount++] = extensionName.cstr();
+			}
 		}
 
 		ANKI_VK_LOGI("Will enable the following device extensions:");
@@ -1133,6 +1138,28 @@ Error GrManagerImpl::initDevice()
 		ANKI_VK_LOGI(VK_EXT_MESH_SHADER_EXTENSION_NAME " is not supported or disabled ");
 	}
 
+	// Host query reset
+	VkPhysicalDeviceHostQueryResetFeaturesEXT hostQueryResetFeatures = {};
+	if(!!(m_extensions & VulkanExtensions::kEXT_host_query_reset))
+	{
+		hostQueryResetFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES;
+		getPhysicalDevicaFeatures2(hostQueryResetFeatures);
+
+		if(hostQueryResetFeatures.hostQueryReset == false)
+		{
+			ANKI_VK_LOGE("VkPhysicalDeviceHostQueryResetFeaturesEXT::hostQueryReset is false");
+			return Error::kFunctionFailed;
+		}
+
+		hostQueryResetFeatures.pNext = const_cast<void*>(ci.pNext);
+		ci.pNext = &hostQueryResetFeatures;
+	}
+	else
+	{
+		ANKI_VK_LOGE(VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME " is not supported");
+		return Error::kFunctionFailed;
+	}
+
 	VkPhysicalDeviceMaintenance4FeaturesKHR maintenance4Features = {};
 	if(!!(m_extensions & VulkanExtensions::kKHR_maintenance_4))
 	{

+ 4 - 0
AnKi/Gr/Vulkan/QueryFactory.cpp

@@ -53,6 +53,7 @@ Error QueryFactory::newQuery(MicroQuery& handle)
 		ci.pipelineStatistics = m_pplineStatisticsFlags;
 
 		ANKI_VK_CHECK(vkCreateQueryPool(getVkDevice(), &ci, nullptr, &chunk->m_pool));
+
 		m_chunks.pushBack(chunk);
 	}
 
@@ -69,6 +70,9 @@ Error QueryFactory::newQuery(MicroQuery& handle)
 			handle.m_pool = chunk->m_pool;
 			handle.m_queryIndex = i;
 			handle.m_chunk = chunk;
+
+			vkResetQueryPoolEXT(getVkDevice(), chunk->m_pool, handle.m_queryIndex, 1);
+
 			break;
 		}
 	}