Add VK_EXT_host_query_reset
This extension allows the host to reset query pools without the use of
vkCmdResetQueryPool.
Bug: b/169602655
Tests: dEQP-VK.query_pool.occlusion_query.*
Change-Id: I20a121d30ff5c39dc9df0a803c3f054ff217e5dc
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/51309
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Sean Risser <srisser@google.com>
Commit-Queue: Sean Risser <srisser@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/VkGetProcAddress.cpp b/src/Vulkan/VkGetProcAddress.cpp
index 9b7c516..ebc3220 100644
--- a/src/Vulkan/VkGetProcAddress.cpp
+++ b/src/Vulkan/VkGetProcAddress.cpp
@@ -313,6 +313,7 @@
MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass2),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass2),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass2),
+ MAKE_VULKAN_DEVICE_ENTRY(vkResetQueryPool),
};
static const std::vector<std::pair<const char *, std::unordered_map<std::string, PFN_vkVoidFunction>>> deviceExtensionFunctionPointers = {
@@ -381,6 +382,12 @@
{
MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineStippleEXT),
} },
+ // VK_EXT_host_query_reset
+ {
+ VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME,
+ {
+ MAKE_VULKAN_DEVICE_ENTRY(vkResetQueryPoolEXT),
+ } },
#ifndef __ANDROID__
// VK_KHR_swapchain
{
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp
index a342d6e..cacc782 100644
--- a/src/Vulkan/VkPhysicalDevice.cpp
+++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -183,6 +183,12 @@
}
template<typename T>
+static void getPhysicalDeviceHostQueryResetFeatures(T *features)
+{
+ features->hostQueryReset = VK_TRUE;
+}
+
+template<typename T>
static void getPhysicalDeviceImageRobustnessFeaturesEXT(T *features)
{
features->robustImageAccess = VK_TRUE;
@@ -287,7 +293,7 @@
getPhysicalDeviceUniformBufferStandardLayoutFeatures(features);
getPhysicalDeviceShaderSubgroupExtendedTypesFeatures(features);
getPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR(features);
- features->hostQueryReset = VK_FALSE;
+ getPhysicalDeviceHostQueryResetFeatures(features);
features->timelineSemaphore = VK_FALSE;
features->bufferDeviceAddress = VK_FALSE;
features->bufferDeviceAddressCaptureReplay = VK_FALSE;
@@ -331,6 +337,9 @@
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES:
getPhysicalDeviceShaderDrawParameterFeatures(reinterpret_cast<VkPhysicalDeviceShaderDrawParameterFeatures *>(curExtension));
break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
+ getPhysicalDeviceHostQueryResetFeatures(reinterpret_cast<VkPhysicalDeviceHostQueryResetFeatures *>(curExtension));
+ break;
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
getPhysicalDeviceImageRobustnessFeaturesEXT(reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT *>(curExtension));
break;
diff --git a/src/Vulkan/VkPromotedExtensions.cpp b/src/Vulkan/VkPromotedExtensions.cpp
index 2c4b2fe..d406a80 100644
--- a/src/Vulkan/VkPromotedExtensions.cpp
+++ b/src/Vulkan/VkPromotedExtensions.cpp
@@ -209,4 +209,10 @@
{
vkCmdNextSubpass2(commandBuffer, pSubpassBegin, pSubpassEnd);
}
+
+// VK_EXT_host_query_reset
+VKAPI_ATTR void VKAPI_CALL vkResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount)
+{
+ vkResetQueryPool(device, queryPool, firstQuery, queryCount);
+}
}
diff --git a/src/Vulkan/VkQueryPool.cpp b/src/Vulkan/VkQueryPool.cpp
index 2105608..5d4334e 100644
--- a/src/Vulkan/VkQueryPool.cpp
+++ b/src/Vulkan/VkQueryPool.cpp
@@ -153,7 +153,7 @@
const auto current = query.getData();
bool writeResult = true;
- if(current.state == Query::ACTIVE)
+ if(current.state == Query::ACTIVE || (current.state == Query::UNAVAILABLE && !(flags & VK_QUERY_RESULT_WAIT_BIT)))
{
result = VK_NOT_READY;
writeResult = (flags & VK_QUERY_RESULT_PARTIAL_BIT); // Allow writing partial results
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index 4fbbea1..d4dbc89 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -403,6 +403,7 @@
{ VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME, VK_EXT_DEVICE_MEMORY_REPORT_SPEC_VERSION },
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
// Vulkan 1.2 promoted extensions
+ { VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, VK_EXT_HOST_QUERY_RESET_SPEC_VERSION },
{ VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, VK_EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION },
{ VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME, VK_EXT_SEPARATE_STENCIL_USAGE_SPEC_VERSION },
{ VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, VK_KHR_IMAGE_FORMAT_LIST_SPEC_VERSION },
@@ -798,6 +799,14 @@
}
break;
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES:
+ {
+ const VkPhysicalDeviceHostQueryResetFeatures *hostQueryResetFeatures = reinterpret_cast<const VkPhysicalDeviceHostQueryResetFeatures *>(extensionCreateInfo);
+
+ // VK_EXT_host_query_reset is always enabled.
+ (void)hostQueryResetFeatures->hostQueryReset;
+ break;
+ }
default:
// "the [driver] must skip over, without processing (other than reading the sType and pNext members) any structures in the chain with sType values not defined by [supported extenions]"
LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
@@ -2775,6 +2784,13 @@
vk::Cast(commandBuffer)->dispatchBase(baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
}
+VKAPI_ATTR void VKAPI_CALL vkResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount)
+{
+ TRACE("(VkDevice device = %p, VkQueryPool queryPool = %p, uint32_t firstQuery = %d, uint32_t queryCount = %d)",
+ device, static_cast<void *>(queryPool), firstQuery, queryCount);
+ vk::Cast(queryPool)->reset(firstQuery, queryCount);
+}
+
VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceGroups(VkInstance instance, uint32_t *pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties *pPhysicalDeviceGroupProperties)
{
TRACE("(VkInstance instance = %p, uint32_t* pPhysicalDeviceGroupCount = %p, VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties = %p)",
diff --git a/src/Vulkan/vk_swiftshader.def b/src/Vulkan/vk_swiftshader.def
index aba9696..464bb59 100644
--- a/src/Vulkan/vk_swiftshader.def
+++ b/src/Vulkan/vk_swiftshader.def
@@ -229,3 +229,5 @@
; VK_KHR_win32_surface
vkCreateWin32SurfaceKHR
vkGetPhysicalDeviceWin32PresentationSupportKHR
+ ; VK_EXT_host_query_reset
+ vkResetQueryPool
diff --git a/src/Vulkan/vk_swiftshader.lds b/src/Vulkan/vk_swiftshader.lds
index 4344c41..1e43950 100644
--- a/src/Vulkan/vk_swiftshader.lds
+++ b/src/Vulkan/vk_swiftshader.lds
@@ -226,6 +226,8 @@
vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
vkGetPhysicalDeviceSurfaceFormatsKHR;
vkGetPhysicalDeviceSurfacePresentModesKHR;
+ # VK_EXT_host_query_reset
+ vkResetQueryPool;
# Android HAL module info object
HMI;