1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "ui/ozone/platform/wayland/gpu/vulkan_implementation_wayland.h"
6 
7 #include <vulkan/vulkan_wayland.h>
8 
9 #include "base/base_paths.h"
10 #include "base/callback_helpers.h"
11 #include "base/files/file_path.h"
12 #include "base/notreached.h"
13 #include "base/path_service.h"
14 #include "gpu/vulkan/vulkan_function_pointers.h"
15 #include "gpu/vulkan/vulkan_image.h"
16 #include "gpu/vulkan/vulkan_instance.h"
17 #include "gpu/vulkan/vulkan_surface.h"
18 #include "gpu/vulkan/vulkan_util.h"
19 #include "ui/gfx/gpu_fence.h"
20 #include "ui/gfx/gpu_memory_buffer.h"
21 
22 namespace ui {
23 
24 namespace {
25 
InitializeVulkanFunctionPointers(const base::FilePath & path,gpu::VulkanFunctionPointers * vulkan_function_pointers)26 bool InitializeVulkanFunctionPointers(
27     const base::FilePath& path,
28     gpu::VulkanFunctionPointers* vulkan_function_pointers) {
29   base::NativeLibraryLoadError native_library_load_error;
30   vulkan_function_pointers->vulkan_loader_library =
31       base::LoadNativeLibrary(path, &native_library_load_error);
32   return !!vulkan_function_pointers->vulkan_loader_library;
33 }
34 
35 }  // namespace
36 
VulkanImplementationWayland()37 VulkanImplementationWayland::VulkanImplementationWayland()
38     : gpu::VulkanImplementation(false /* use_swiftshader */) {}
39 
~VulkanImplementationWayland()40 VulkanImplementationWayland::~VulkanImplementationWayland() {}
41 
InitializeVulkanInstance(bool using_surface)42 bool VulkanImplementationWayland::InitializeVulkanInstance(bool using_surface) {
43   std::vector<const char*> required_extensions = {
44       VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME,
45       VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME,
46   };
47 
48   auto* vulkan_function_pointers = gpu::GetVulkanFunctionPointers();
49 
50   base::FilePath path("libvulkan.so.1");
51 
52   if (!InitializeVulkanFunctionPointers(path, vulkan_function_pointers))
53     return false;
54 
55   if (!vulkan_instance_.Initialize(required_extensions, {}))
56     return false;
57   return true;
58 }
59 
GetVulkanInstance()60 gpu::VulkanInstance* VulkanImplementationWayland::GetVulkanInstance() {
61   return &vulkan_instance_;
62 }
63 
64 std::unique_ptr<gpu::VulkanSurface>
CreateViewSurface(gfx::AcceleratedWidget window)65 VulkanImplementationWayland::CreateViewSurface(gfx::AcceleratedWidget window) {
66   NOTIMPLEMENTED();
67   return nullptr;
68 }
69 
GetPhysicalDevicePresentationSupport(VkPhysicalDevice device,const std::vector<VkQueueFamilyProperties> & queue_family_properties,uint32_t queue_family_index)70 bool VulkanImplementationWayland::GetPhysicalDevicePresentationSupport(
71     VkPhysicalDevice device,
72     const std::vector<VkQueueFamilyProperties>& queue_family_properties,
73     uint32_t queue_family_index) {
74   NOTIMPLEMENTED();
75   return false;
76 }
77 
78 std::vector<const char*>
GetRequiredDeviceExtensions()79 VulkanImplementationWayland::GetRequiredDeviceExtensions() {
80   return {
81       VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME,
82       VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME,
83       VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
84       VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
85       VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
86   };
87 }
88 
89 std::vector<const char*>
GetOptionalDeviceExtensions()90 VulkanImplementationWayland::GetOptionalDeviceExtensions() {
91   // VK_EXT_image_drm_format_modifier is not well supported right now, so has to
92   // request as an optional extension.
93   return {
94       VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME,
95   };
96 }
97 
CreateVkFenceForGpuFence(VkDevice vk_device)98 VkFence VulkanImplementationWayland::CreateVkFenceForGpuFence(
99     VkDevice vk_device) {
100   NOTREACHED();
101   return VK_NULL_HANDLE;
102 }
103 
104 std::unique_ptr<gfx::GpuFence>
ExportVkFenceToGpuFence(VkDevice vk_device,VkFence vk_fence)105 VulkanImplementationWayland::ExportVkFenceToGpuFence(VkDevice vk_device,
106                                                      VkFence vk_fence) {
107   NOTREACHED();
108   return nullptr;
109 }
110 
CreateExternalSemaphore(VkDevice vk_device)111 VkSemaphore VulkanImplementationWayland::CreateExternalSemaphore(
112     VkDevice vk_device) {
113   return gpu::CreateExternalVkSemaphore(
114       vk_device, VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT);
115 }
116 
ImportSemaphoreHandle(VkDevice vk_device,gpu::SemaphoreHandle sync_handle)117 VkSemaphore VulkanImplementationWayland::ImportSemaphoreHandle(
118     VkDevice vk_device,
119     gpu::SemaphoreHandle sync_handle) {
120   return gpu::ImportVkSemaphoreHandle(vk_device, std::move(sync_handle));
121 }
122 
GetSemaphoreHandle(VkDevice vk_device,VkSemaphore vk_semaphore)123 gpu::SemaphoreHandle VulkanImplementationWayland::GetSemaphoreHandle(
124     VkDevice vk_device,
125     VkSemaphore vk_semaphore) {
126   return gpu::GetVkSemaphoreHandle(
127       vk_device, vk_semaphore, VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT);
128 }
129 
130 VkExternalMemoryHandleTypeFlagBits
GetExternalImageHandleType()131 VulkanImplementationWayland::GetExternalImageHandleType() {
132   return VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
133 }
134 
CanImportGpuMemoryBuffer(gfx::GpuMemoryBufferType memory_buffer_type)135 bool VulkanImplementationWayland::CanImportGpuMemoryBuffer(
136     gfx::GpuMemoryBufferType memory_buffer_type) {
137   NOTIMPLEMENTED();
138   return false;
139 }
140 
141 std::unique_ptr<gpu::VulkanImage>
CreateImageFromGpuMemoryHandle(gpu::VulkanDeviceQueue * device_queue,gfx::GpuMemoryBufferHandle gmb_handle,gfx::Size size,VkFormat vk_formate)142 VulkanImplementationWayland::CreateImageFromGpuMemoryHandle(
143     gpu::VulkanDeviceQueue* device_queue,
144     gfx::GpuMemoryBufferHandle gmb_handle,
145     gfx::Size size,
146     VkFormat vk_formate) {
147   NOTIMPLEMENTED();
148   return nullptr;
149 }
150 
151 }  // namespace ui
152