vkQueueWaitIdle and vkDeviceWaitIdle as noops Added the implementation for vkDeviceWaitIdle, which calls into a noop vkQueueWaitIdle for now, until we have a non noop implementation of Fence objects. This allows many tests to run properly. Bug b/117835459 Change-Id: I39be52f9462d87591bbb0bccee1e9e41b5a744b9 Reviewed-on: https://swiftshader-review.googlesource.com/c/24048 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Vulkan/VkDevice.cpp b/src/Vulkan/VkDevice.cpp index 78a9e9c..6b64cb0 100644 --- a/src/Vulkan/VkDevice.cpp +++ b/src/Vulkan/VkDevice.cpp
@@ -89,6 +89,14 @@ // FIXME(b/117835459) : noop } +void Device::waitIdle() +{ + for(uint32_t i = 0; i < queueCount; i++) + { + queues[i].waitIdle(); + } +} + void Device::getDescriptorSetLayoutSupport(const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport) const {
diff --git a/src/Vulkan/VkDevice.hpp b/src/Vulkan/VkDevice.hpp index 6b29ead..5eca001 100644 --- a/src/Vulkan/VkDevice.hpp +++ b/src/Vulkan/VkDevice.hpp
@@ -40,6 +40,7 @@ VkQueue getQueue(uint32_t queueFamilyIndex, uint32_t queueIndex) const; void waitForFences(uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout); + void waitIdle(); void getDescriptorSetLayoutSupport(const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport) const; VkPhysicalDevice getPhysicalDevice() const { return physicalDevice; }
diff --git a/src/Vulkan/VkQueue.cpp b/src/Vulkan/VkQueue.cpp index cb704ae..1a7f0fc 100644 --- a/src/Vulkan/VkQueue.cpp +++ b/src/Vulkan/VkQueue.cpp
@@ -58,11 +58,19 @@ } } - // FIXME (b\117835459): signal the fence only once the work is completed + // FIXME (b/117835459): signal the fence only once the work is completed if(fence != VK_NULL_HANDLE) { vk::Cast(fence)->signal(); } } +void Queue::waitIdle() +{ + // equivalent to submitting a fence to a queue and waiting + // with an infinite timeout for that fence to signal + + // FIXME (b/117835459): implement once we have working fences +} + } // namespace vk \ No newline at end of file
diff --git a/src/Vulkan/VkQueue.hpp b/src/Vulkan/VkQueue.hpp index 93e65b8..d38e3a0 100644 --- a/src/Vulkan/VkQueue.hpp +++ b/src/Vulkan/VkQueue.hpp
@@ -42,6 +42,7 @@ void destroy(); void submit(uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence); + void waitIdle(); private: sw::Context* context = nullptr;
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp index 00fe21d..926a5c3 100644 --- a/src/Vulkan/libVulkan.cpp +++ b/src/Vulkan/libVulkan.cpp
@@ -454,18 +454,22 @@ return VK_SUCCESS; } -VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) -{ - TRACE("()"); - UNIMPLEMENTED(); - return VK_SUCCESS; -} - -VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) -{ - TRACE("()"); - UNIMPLEMENTED(); - return VK_SUCCESS; +VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) +{ + TRACE("(VkQueue queue = 0x%X)", queue); + + vk::Cast(queue)->waitIdle(); + + return VK_SUCCESS; +} + +VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) +{ + TRACE("(VkDevice device = 0x%X)", device); + + vk::Cast(device)->waitIdle(); + + return VK_SUCCESS; } VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory)