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