CL/VK: Implement wait APIs

This commit implements:
    clWaitForEvents
    clEnqueueWaitForEvents

Bug: angleproject:8633
Change-Id: I873310ab11dfac08c165dc36be2400a35be48878
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5406616
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Austin Annestrand <a.annestrand@samsung.com>
diff --git a/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp b/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp
index f461da5..fa8a233 100644
--- a/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp
+++ b/src/libANGLE/renderer/vulkan/CLCommandQueueVk.cpp
@@ -391,8 +391,12 @@
 
 angle::Result CLCommandQueueVk::enqueueWaitForEvents(const cl::EventPtrs &events)
 {
-    UNIMPLEMENTED();
-    ANGLE_CL_RETURN_ERROR(CL_OUT_OF_RESOURCES);
+    std::scoped_lock<std::mutex> sl(mCommandQueueMutex);
+
+    // Unlike clWaitForEvents, this routine is non-blocking
+    ANGLE_TRY(processWaitlist(events));
+
+    return angle::Result::Continue;
 }
 
 angle::Result CLCommandQueueVk::enqueueBarrierWithWaitList(const cl::EventPtrs &waitEvents,
diff --git a/src/libANGLE/renderer/vulkan/CLContextVk.cpp b/src/libANGLE/renderer/vulkan/CLContextVk.cpp
index bac0ba4..5acd9a1 100644
--- a/src/libANGLE/renderer/vulkan/CLContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/CLContextVk.cpp
@@ -15,6 +15,7 @@
 
 #include "libANGLE/CLBuffer.h"
 #include "libANGLE/CLContext.h"
+#include "libANGLE/CLEvent.h"
 #include "libANGLE/CLProgram.h"
 #include "libANGLE/cl_utils.h"
 
@@ -251,8 +252,23 @@
 
 angle::Result CLContextVk::waitForEvents(const cl::EventPtrs &events)
 {
-    UNIMPLEMENTED();
-    ANGLE_CL_RETURN_ERROR(CL_OUT_OF_RESOURCES);
+    for (auto &event : events)
+    {
+        CLEventVk *eventVk = &event.get()->getImpl<CLEventVk>();
+        if (eventVk->isUserEvent())
+        {
+            ANGLE_TRY(eventVk->waitForUserEventStatus());
+        }
+        else
+        {
+            // TODO rework this to instead (flush w/ ResourceUse serial wait) once we move away from
+            // spawning a submit-thread/Task for flush routine
+            // https://anglebug.com/8669
+            ANGLE_TRY(event->getCommandQueue()->finish());
+        }
+    }
+
+    return angle::Result::Continue;
 }
 
 }  // namespace rx