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;