Fix vulkan_tests

Bug: 1065499
Change-Id: Ib0dde0f46f73d73dbb580a6cc03288b6c0337c1e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2124687
Reviewed-by: Sadrul Chowdhury <sadrul@chromium.org>
Reviewed-by: Vasiliy Telezhnikov <vasilyt@chromium.org>
Commit-Queue: Peng Huang <penghuang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#754148}
diff --git a/gpu/vulkan/BUILD.gn b/gpu/vulkan/BUILD.gn
index 5c85d73..740ada57 100644
--- a/gpu/vulkan/BUILD.gn
+++ b/gpu/vulkan/BUILD.gn
@@ -147,6 +147,8 @@
         "//gpu/vulkan/init",
         "//testing/gmock",
         "//testing/gtest",
+        "//ui/events/platform",
+        "//ui/events/platform/x11",
         "//ui/gfx",
         "//ui/gfx:native_widget_types",
         "//ui/gfx/geometry",
diff --git a/gpu/vulkan/tests/DEPS b/gpu/vulkan/tests/DEPS
new file mode 100644
index 0000000..d9fe530
--- /dev/null
+++ b/gpu/vulkan/tests/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+ui/events/platform",
+]
diff --git a/gpu/vulkan/tests/basic_vulkan_test.cc b/gpu/vulkan/tests/basic_vulkan_test.cc
index 4b344a33..46c06d9 100644
--- a/gpu/vulkan/tests/basic_vulkan_test.cc
+++ b/gpu/vulkan/tests/basic_vulkan_test.cc
@@ -7,6 +7,7 @@
 #include "gpu/vulkan/init/vulkan_factory.h"
 #include "gpu/vulkan/tests/native_window.h"
 #include "gpu/vulkan/vulkan_surface.h"
+#include "ui/events/platform/platform_event_source.h"
 #include "ui/gfx/geometry/rect.h"
 
 namespace gpu {
@@ -16,6 +17,7 @@
 BasicVulkanTest::~BasicVulkanTest() {}
 
 void BasicVulkanTest::SetUp() {
+  platform_event_source_ = ui::PlatformEventSource::CreateDefault();
   const gfx::Rect kDefaultBounds(10, 10, 100, 100);
   window_ = CreateNativeWindow(kDefaultBounds);
   vulkan_implementation_ = CreateVulkanImplementation();
@@ -33,6 +35,7 @@
   window_ = gfx::kNullAcceleratedWidget;
   device_queue_->Destroy();
   vulkan_implementation_.reset();
+  platform_event_source_.reset();
 }
 
 std::unique_ptr<VulkanSurface> BasicVulkanTest::CreateViewSurface(
diff --git a/gpu/vulkan/tests/basic_vulkan_test.h b/gpu/vulkan/tests/basic_vulkan_test.h
index ece7509..ca4ef0cb 100644
--- a/gpu/vulkan/tests/basic_vulkan_test.h
+++ b/gpu/vulkan/tests/basic_vulkan_test.h
@@ -10,6 +10,10 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/native_widget_types.h"
 
+namespace ui {
+class PlatformEventSource;
+}
+
 namespace gpu {
 
 class BasicVulkanTest : public testing::Test {
@@ -25,10 +29,13 @@
     return vulkan_implementation_.get();
   }
   VulkanDeviceQueue* GetDeviceQueue() { return device_queue_.get(); }
+  VkDevice device() { return device_queue_->GetVulkanDevice(); }
+  VkQueue queue() { return device_queue_->GetVulkanQueue(); }
   std::unique_ptr<VulkanSurface> CreateViewSurface(
       gfx::AcceleratedWidget window);
 
  private:
+  std::unique_ptr<ui::PlatformEventSource> platform_event_source_;
   std::unique_ptr<VulkanImplementation> vulkan_implementation_;
   std::unique_ptr<VulkanDeviceQueue> device_queue_;
 
diff --git a/gpu/vulkan/tests/vulkan_test.cc b/gpu/vulkan/tests/vulkan_test.cc
index b30a4b53..1b17fbc 100644
--- a/gpu/vulkan/tests/vulkan_test.cc
+++ b/gpu/vulkan/tests/vulkan_test.cc
@@ -4,10 +4,13 @@
 
 #include <memory>
 
+#include "base/optional.h"
 #include "gpu/vulkan/tests/basic_vulkan_test.h"
 #include "gpu/vulkan/vulkan_command_buffer.h"
+#include "gpu/vulkan/vulkan_fence_helper.h"
 #include "gpu/vulkan/vulkan_surface.h"
 #include "gpu/vulkan/vulkan_swap_chain.h"
+#include "gpu/vulkan/vulkan_util.h"
 
 // This file tests basic vulkan initialization steps.
 
@@ -31,11 +34,42 @@
   ASSERT_TRUE(
       surface->Reshape(gfx::Size(100, 100), gfx::OVERLAY_TRANSFORM_NONE));
 
+  constexpr VkSemaphore kNullSemaphore = VK_NULL_HANDLE;
+  auto* fence_helper = GetDeviceQueue()->GetFenceHelper();
+
+  base::Optional<VulkanSwapChain::ScopedWrite> scoped_write;
+  scoped_write.emplace(surface->swap_chain());
+  EXPECT_TRUE(scoped_write->success());
+  VkSemaphore begin_semaphore = scoped_write->TakeBeginSemaphore();
+  EXPECT_NE(begin_semaphore, kNullSemaphore);
+  EXPECT_TRUE(SubmitWaitVkSemaphore(queue(), begin_semaphore));
+
+  fence_helper->EnqueueSemaphoreCleanupForSubmittedWork(begin_semaphore);
+
+  VkSemaphore end_semaphore = scoped_write->GetEndSemaphore();
+  EXPECT_NE(end_semaphore, kNullSemaphore);
+  EXPECT_TRUE(SubmitSignalVkSemaphore(queue(), end_semaphore));
+
+  scoped_write.reset();
+
   // First swap is a special case, call it first to get better errors.
   EXPECT_EQ(gfx::SwapResult::SWAP_ACK, surface->SwapBuffers());
 
   // Also make sure we can swap multiple times.
   for (int i = 0; i < 10; ++i) {
+    base::Optional<VulkanSwapChain::ScopedWrite> scoped_write;
+    scoped_write.emplace(surface->swap_chain());
+    EXPECT_TRUE(scoped_write->success());
+    VkSemaphore begin_semaphore = scoped_write->TakeBeginSemaphore();
+    EXPECT_NE(begin_semaphore, kNullSemaphore);
+    EXPECT_TRUE(SubmitWaitVkSemaphore(queue(), begin_semaphore));
+
+    VkSemaphore end_semaphore = scoped_write->GetEndSemaphore();
+    EXPECT_NE(end_semaphore, kNullSemaphore);
+    EXPECT_TRUE(SubmitSignalVkSemaphore(queue(), end_semaphore));
+
+    scoped_write.reset();
+
     EXPECT_EQ(gfx::SwapResult::SWAP_ACK, surface->SwapBuffers());
   }
   surface->Finish();
diff --git a/gpu/vulkan/vulkan_fence_helper_unittest.cc b/gpu/vulkan/vulkan_fence_helper_unittest.cc
index 8e3d9d1..a921560 100644
--- a/gpu/vulkan/vulkan_fence_helper_unittest.cc
+++ b/gpu/vulkan/vulkan_fence_helper_unittest.cc
@@ -168,6 +168,9 @@
       fence_helper->GenerateCleanupFence();
   EXPECT_TRUE(fence_handle.is_valid());
 
+  // Call vkQueueWaitIdle() to make sure the |fence_handle| is passed.
+  vkQueueWaitIdle(queue());
+
   // Enqueue 5 more callbacks.
   for (int i = 5; i < 10; i++) {
     fence_helper->EnqueueCleanupTaskForSubmittedWork(
diff --git a/gpu/vulkan/vulkan_util.cc b/gpu/vulkan/vulkan_util.cc
index 797d78e..14fb435 100644
--- a/gpu/vulkan/vulkan_util.cc
+++ b/gpu/vulkan/vulkan_util.cc
@@ -31,10 +31,14 @@
                             const base::span<VkSemaphore>& vk_semaphores,
                             VkFence vk_fence) {
   DCHECK(!vk_semaphores.empty());
+  std::vector<VkPipelineStageFlags> semaphore_stages(vk_semaphores.size());
+  std::fill(semaphore_stages.begin(), semaphore_stages.end(),
+            VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
   // Structure specifying a queue submit operation.
   VkSubmitInfo submit_info = {VK_STRUCTURE_TYPE_SUBMIT_INFO};
   submit_info.waitSemaphoreCount = vk_semaphores.size();
   submit_info.pWaitSemaphores = vk_semaphores.data();
+  submit_info.pWaitDstStageMask = semaphore_stages.data();
   const unsigned int submit_count = 1;
   return vkQueueSubmit(vk_queue, submit_count, &submit_info, vk_fence) ==
          VK_SUCCESS;