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)