Implement waiting for fences as noop

For the purpose of running dEQP tests, for now, fences can be
implemented as noop. Once more complex rendering tests exercise
this, we'll be able to implement and test fences.

Bug b/117835459

Change-Id: I2b54be816c83f7a626108f61bd14eb9c969a2b0f
Reviewed-on: https://swiftshader-review.googlesource.com/c/23068
Reviewed-by: Chris Forbes <chrisforbes@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/VkDevice.cpp b/src/Vulkan/VkDevice.cpp
index 7d0df8c..092b252 100644
--- a/src/Vulkan/VkDevice.cpp
+++ b/src/Vulkan/VkDevice.cpp
@@ -79,6 +79,11 @@
 	return queues[queueIndex];
 }
 
+void Device::waitForFences(uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout)
+{
+	// FIXME(b/117835459) : noop
+}
+
 void Device::getDescriptorSetLayoutSupport(const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
                                            VkDescriptorSetLayoutSupport* pSupport) const
 {
diff --git a/src/Vulkan/VkDevice.hpp b/src/Vulkan/VkDevice.hpp
index 424e9bb..6b29ead 100644
--- a/src/Vulkan/VkDevice.hpp
+++ b/src/Vulkan/VkDevice.hpp
@@ -39,6 +39,7 @@
 	static size_t ComputeRequiredAllocationSize(const CreateInfo* info);
 
 	VkQueue getQueue(uint32_t queueFamilyIndex, uint32_t queueIndex) const;
+	void waitForFences(uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout);
 	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 f0978cf..43bb4a0 100644
--- a/src/Vulkan/VkQueue.cpp
+++ b/src/Vulkan/VkQueue.cpp
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include "VkCommandBuffer.hpp"
+#include "VkFence.hpp"
 #include "VkQueue.hpp"
 #include "VkSemaphore.hpp"
 
@@ -25,11 +26,6 @@
 
 void Queue::submit(uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence)
 {
-	if(fence != VK_NULL_HANDLE)
-	{
-		UNIMPLEMENTED();
-	}
-
 	for(uint32_t i = 0; i < submitCount; i++)
 	{
 		auto& submitInfo = pSubmits[i];
@@ -48,6 +44,12 @@
 			vk::Cast(submitInfo.pSignalSemaphores[j])->signal();
 		}
 	}
+
+	// FIXME (b\117835459): signal the fence only once the work is completed
+	if(fence != VK_NULL_HANDLE)
+	{
+		vk::Cast(fence)->signal();
+	}
 }
 
 } // namespace vk
\ No newline at end of file
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index 9d23ec8..5ce5b48 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -639,8 +639,11 @@
 
 VKAPI_ATTR VkResult VKAPI_CALL vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout)
 {
-	TRACE("()");
-	UNIMPLEMENTED();
+	TRACE("(VkDevice device = 0x%X, uint32_t fenceCount = %d, const VkFence* pFences = 0x%X, VkBool32 waitAll = %d, uint64_t timeout = %d)",
+		device, fenceCount, pFences, waitAll, timeout);
+
+	vk::Cast(device)->waitForFences(fenceCount, pFences, waitAll, timeout);
+
 	return VK_SUCCESS;
 }