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)