From b843b255b7f66b80f030961829db91d15315a9da Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Tue, 20 Sep 2016 15:55:48 -0700 Subject: [PATCH] Make the creation of VulkanWindow platform agnostic by refactoring out Android specific surface creation routines. (#3048) --- vulkan/BUILD.gn | 4 +++ vulkan/vulkan_interface.h | 21 +++--------- vulkan/vulkan_proc_table.cc | 9 +++-- vulkan/vulkan_proc_table.h | 5 ++- vulkan/vulkan_surface.cc | 13 ++++++++ vulkan/vulkan_surface.h | 34 +++++++++++++++++++ vulkan/vulkan_surface_android.cc | 56 ++++++++++++++++++++++++++++++++ vulkan/vulkan_surface_android.h | 37 +++++++++++++++++++++ vulkan/vulkan_window.cc | 25 +++++++------- vulkan/vulkan_window.h | 6 ++-- 10 files changed, 174 insertions(+), 36 deletions(-) create mode 100644 vulkan/vulkan_surface.cc create mode 100644 vulkan/vulkan_surface.h create mode 100644 vulkan/vulkan_surface_android.cc create mode 100644 vulkan/vulkan_surface_android.h diff --git a/vulkan/BUILD.gn b/vulkan/BUILD.gn index 9c8ef548e..f5c184caa 100644 --- a/vulkan/BUILD.gn +++ b/vulkan/BUILD.gn @@ -11,6 +11,10 @@ source_set("vulkan") { "vulkan_interface.h", "vulkan_proc_table.cc", "vulkan_proc_table.h", + "vulkan_surface.cc", + "vulkan_surface.h", + "vulkan_surface_android.cc", + "vulkan_surface_android.h", "vulkan_window.cc", "vulkan_window.h", ] diff --git a/vulkan/vulkan_interface.h b/vulkan/vulkan_interface.h index d02781bab..e0ffa9436 100644 --- a/vulkan/vulkan_interface.h +++ b/vulkan/vulkan_interface.h @@ -7,23 +7,12 @@ #define VK_NO_PROTOTYPES 1 -#include "third_party/vulkan/src/vulkan/vulkan.h" - -#define VK_KHR_ANDROID_SURFACE_EXTENSION_NAME "VK_KHR_android_surface" +#include "lib/ftl/build_config.h" -typedef VkFlags VkAndroidSurfaceCreateFlagsKHR; +#if OS_ANDROID +#define VK_USE_PLATFORM_ANDROID_KHR 1 +#endif // OS_ANDROID -typedef struct VkAndroidSurfaceCreateInfoKHR { - VkStructureType sType; - const void* pNext; - VkAndroidSurfaceCreateFlagsKHR flags; - void* window; -} VkAndroidSurfaceCreateInfoKHR; - -typedef VkResult(VKAPI_PTR* PFN_vkCreateAndroidSurfaceKHR)( - VkInstance instance, - const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkSurfaceKHR* pSurface); +#include "third_party/vulkan/src/vulkan/vulkan.h" #endif // FLUTTER_VULKAN_VULKAN_INTERFACE_H_ diff --git a/vulkan/vulkan_proc_table.cc b/vulkan/vulkan_proc_table.cc index 7b2003d1e..ac7db27e8 100644 --- a/vulkan/vulkan_proc_table.cc +++ b/vulkan/vulkan_proc_table.cc @@ -70,7 +70,6 @@ bool VulkanProcTable::AcquireProcs() { ACQUIRE_PROC(enumeratePhysicalDevices, "vkEnumeratePhysicalDevices"); ACQUIRE_PROC(createDevice, "vkCreateDevice"); ACQUIRE_PROC(destroyDevice, "vkDestroyDevice"); - ACQUIRE_PROC(createAndroidSurfaceKHR, "vkCreateAndroidSurfaceKHR"); ACQUIRE_PROC(getDeviceQueue, "vkGetDeviceQueue"); ACQUIRE_PROC(getPhysicalDeviceSurfaceCapabilitiesKHR, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"); @@ -81,8 +80,8 @@ bool VulkanProcTable::AcquireProcs() { ACQUIRE_PROC(getPhysicalDeviceSurfacePresentModesKHR, "vkGetPhysicalDeviceSurfacePresentModesKHR"); ACQUIRE_PROC(destroySurfaceKHR, "vkDestroySurfaceKHR"); - ACQUIRE_PROC(createCommandPool, "createCommandPool"); - ACQUIRE_PROC(destroyCommandPool, "destroyCommandPool"); + ACQUIRE_PROC(createCommandPool, "vkCreateCommandPool"); + ACQUIRE_PROC(destroyCommandPool, "vkDestroyCommandPool"); ACQUIRE_PROC(createSemaphore, "vkCreateSemaphore"); ACQUIRE_PROC(destroySemaphore, "vkDestroySemaphore"); ACQUIRE_PROC(allocateCommandBuffers, "vkAllocateCommandBuffers"); @@ -91,6 +90,10 @@ bool VulkanProcTable::AcquireProcs() { ACQUIRE_PROC(destroyFence, "vkDestroyFence"); ACQUIRE_PROC(waitForFences, "vkWaitForFences"); +#if OS_ANDROID + ACQUIRE_PROC(createAndroidSurfaceKHR, "vkCreateAndroidSurfaceKHR"); +#endif // OS_ANDROID + #undef ACQUIRE_PROC return true; diff --git a/vulkan/vulkan_proc_table.h b/vulkan/vulkan_proc_table.h index da3da83b9..0e5d8078f 100644 --- a/vulkan/vulkan_proc_table.h +++ b/vulkan/vulkan_proc_table.h @@ -45,7 +45,6 @@ class VulkanProcTable { Proc enumeratePhysicalDevices; Proc createDevice; Proc destroyDevice; - Proc createAndroidSurfaceKHR; Proc getDeviceQueue; Proc getPhysicalDeviceSurfaceCapabilitiesKHR; @@ -67,6 +66,10 @@ class VulkanProcTable { Proc destroyFence; Proc waitForFences; +#if OS_ANDROID + Proc createAndroidSurfaceKHR; +#endif // OS_ANDROID + private: bool valid_; void* handle_; diff --git a/vulkan/vulkan_surface.cc b/vulkan/vulkan_surface.cc new file mode 100644 index 000000000..6979620d4 --- /dev/null +++ b/vulkan/vulkan_surface.cc @@ -0,0 +1,13 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "vulkan_surface.h" + +namespace vulkan { + +VulkanSurface::VulkanSurface() = default; + +VulkanSurface::~VulkanSurface() = default; + +} // namespace vulkan diff --git a/vulkan/vulkan_surface.h b/vulkan/vulkan_surface.h new file mode 100644 index 000000000..9999ca479 --- /dev/null +++ b/vulkan/vulkan_surface.h @@ -0,0 +1,34 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FLUTTER_VULKAN_VULKAN_SURFACE_H_ +#define FLUTTER_VULKAN_VULKAN_SURFACE_H_ + +#include "lib/ftl/macros.h" +#include "vulkan_handle.h" +#include "vulkan_proc_table.h" + +namespace vulkan { + +class VulkanSurface { + public: + VulkanSurface(); + + virtual ~VulkanSurface(); + + virtual const char* ExtensionName() = 0; + + virtual VkSurfaceKHR CreateSurfaceHandle( + VulkanProcTable& vk, + VulkanHandle& instance) = 0; + + virtual bool IsValid() const = 0; + + private: + FTL_DISALLOW_COPY_AND_ASSIGN(VulkanSurface); +}; + +} // namespace vulkan + +#endif // FLUTTER_VULKAN_VULKAN_SURFACE_H_ diff --git a/vulkan/vulkan_surface_android.cc b/vulkan/vulkan_surface_android.cc new file mode 100644 index 000000000..2a7c4e6c2 --- /dev/null +++ b/vulkan/vulkan_surface_android.cc @@ -0,0 +1,56 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "vulkan_surface_android.h" + +namespace vulkan { + +VulkanSurfaceAndroid::VulkanSurfaceAndroid(ANativeWindow* native_window) + : native_window_(native_window) { + if (native_window_ == nullptr) { + return; + } + ANativeWindow_acquire(native_window_); +} + +VulkanSurfaceAndroid::~VulkanSurfaceAndroid() { + if (native_window_ == nullptr) { + return; + } + ANativeWindow_release(native_window_); +} + +const char* VulkanSurfaceAndroid::ExtensionName() { + return VK_KHR_ANDROID_SURFACE_EXTENSION_NAME; +} + +VkSurfaceKHR VulkanSurfaceAndroid::CreateSurfaceHandle( + VulkanProcTable& vk, + VulkanHandle& instance) { + if (!vk.IsValid() || !instance) { + return VK_NULL_HANDLE; + } + + const VkAndroidSurfaceCreateInfoKHR create_info = { + .sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR, + .pNext = nullptr, + .flags = 0, + .window = native_window_, + }; + + VkSurfaceKHR surface = VK_NULL_HANDLE; + + if (vk.createAndroidSurfaceKHR(instance, &create_info, nullptr, &surface) != + VK_SUCCESS) { + return VK_NULL_HANDLE; + } + + return surface; +} + +bool VulkanSurfaceAndroid::IsValid() const { + return native_window_ != nullptr; +} + +} // namespace vulkan diff --git a/vulkan/vulkan_surface_android.h b/vulkan/vulkan_surface_android.h new file mode 100644 index 000000000..9370f31df --- /dev/null +++ b/vulkan/vulkan_surface_android.h @@ -0,0 +1,37 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FLUTTER_VULKAN_VULKAN_SURFACE_ANDROID_H_ +#define FLUTTER_VULKAN_VULKAN_SURFACE_ANDROID_H_ + +#include "lib/ftl/macros.h" +#include "vulkan_surface.h" + +struct ANativeWindow; +typedef struct ANativeWindow ANativeWindow; + +namespace vulkan { + +class VulkanSurfaceAndroid : public VulkanSurface { + public: + VulkanSurfaceAndroid(ANativeWindow* native_window); + + ~VulkanSurfaceAndroid() override; + + const char* ExtensionName() override; + + VkSurfaceKHR CreateSurfaceHandle(VulkanProcTable& vk, + VulkanHandle& instance) override; + + bool IsValid() const override; + + private: + ANativeWindow* native_window_; + + FTL_DISALLOW_COPY_AND_ASSIGN(VulkanSurfaceAndroid); +}; + +} // namespace vulkan + +#endif // FLUTTER_VULKAN_VULKAN_SURFACE_ANDROID_H_ diff --git a/vulkan/vulkan_window.cc b/vulkan/vulkan_window.cc index e0349191e..d2648592a 100644 --- a/vulkan/vulkan_window.cc +++ b/vulkan/vulkan_window.cc @@ -6,7 +6,12 @@ namespace vulkan { -VulkanWindow::VulkanWindow(void* native_window) : valid_(false) { +VulkanWindow::VulkanWindow(std::unique_ptr platform_surface) + : valid_(false), platform_surface_(std::move(platform_surface)) { + if (platform_surface_ == nullptr || !platform_surface_->IsValid()) { + return; + } + if (!vk.IsValid()) { return; } @@ -15,7 +20,7 @@ VulkanWindow::VulkanWindow(void* native_window) : valid_(false) { return; } - if (!CreateSurface(native_window)) { + if (!CreateSurface()) { return; } @@ -64,7 +69,7 @@ bool VulkanWindow::CreateInstance() { }; const char* extensions[] = { - VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, + VK_KHR_SURFACE_EXTENSION_NAME, platform_surface_->ExtensionName(), }; const VkInstanceCreateInfo create_info = { @@ -89,22 +94,14 @@ bool VulkanWindow::CreateInstance() { return true; } -bool VulkanWindow::CreateSurface(void* native_window) { +bool VulkanWindow::CreateSurface() { if (!instance_) { return false; } - const VkAndroidSurfaceCreateInfoKHR create_info = { - .sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR, - .pNext = nullptr, - .flags = 0, - .window = native_window, - }; - - VkSurfaceKHR surface = VK_NULL_HANDLE; + VkSurfaceKHR surface = platform_surface_->CreateSurfaceHandle(vk, instance_); - if (vk.createAndroidSurfaceKHR(instance_, &create_info, nullptr, &surface) != - VK_SUCCESS) { + if (surface == VK_NULL_HANDLE) { return false; } diff --git a/vulkan/vulkan_window.h b/vulkan/vulkan_window.h index d51fa2872..93c40954c 100644 --- a/vulkan/vulkan_window.h +++ b/vulkan/vulkan_window.h @@ -13,12 +13,13 @@ #include "vulkan_handle.h" #include "vulkan_proc_table.h" #include "vulkan_backbuffer.h" +#include "vulkan_surface.h" namespace vulkan { class VulkanWindow { public: - VulkanWindow(void* native_window); + VulkanWindow(std::unique_ptr platform_surface); ~VulkanWindow(); @@ -28,6 +29,7 @@ class VulkanWindow { bool valid_; VulkanProcTable vk; VulkanHandle instance_; + std::unique_ptr platform_surface_; VulkanHandle surface_; VulkanHandle physical_device_; VulkanHandle device_; @@ -38,7 +40,7 @@ class VulkanWindow { bool CreateInstance(); - bool CreateSurface(void* native_window); + bool CreateSurface(); bool SelectPhysicalDevice(); -- GitLab