xref: /aosp_15_r20/external/angle/src/tests/test_utils/VulkanHelper.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2019 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // VulkanHelper.h : Helper for vulkan.
7 
8 #ifndef ANGLE_TESTS_TESTUTILS_VULKANHELPER_H_
9 #define ANGLE_TESTS_TESTUTILS_VULKANHELPER_H_
10 
11 #include "common/angleutils.h"
12 #include "common/vulkan/vk_headers.h"
13 #include "vulkan/vulkan_fuchsia_ext.h"
14 
15 namespace angle
16 {
17 
18 class VulkanHelper
19 {
20   public:
21     VulkanHelper();
22     ~VulkanHelper();
23 
24     void initialize(bool useSwiftshader, bool enableValidationLayers);
25     void initializeFromANGLE();
26 
getInstance()27     VkInstance getInstance() const { return mInstance; }
getPhysicalDevice()28     VkPhysicalDevice getPhysicalDevice() const { return mPhysicalDevice; }
getDevice()29     VkDevice getDevice() const { return mDevice; }
getGraphicsQueue()30     VkQueue getGraphicsQueue() const { return mGraphicsQueue; }
31 
32     VkResult createImage2D(VkFormat format,
33                            VkImageCreateFlags createFlags,
34                            VkImageUsageFlags usageFlags,
35                            VkExtent3D extent,
36                            VkImage *imageOut,
37                            VkDeviceMemory *deviceMemoryOut,
38                            VkDeviceSize *deviceMemorySizeOut,
39                            VkImageCreateInfo *imageCreateInfoOut);
40     bool canCreateImageExternal(VkFormat format,
41                                 VkImageType type,
42                                 VkImageTiling tiling,
43                                 VkImageCreateFlags createFlags,
44                                 VkImageUsageFlags usageFlags,
45                                 VkExternalMemoryHandleTypeFlagBits handleType) const;
46     VkResult createImage2DExternal(VkFormat format,
47                                    VkImageCreateFlags createFlags,
48                                    VkImageUsageFlags usageFlags,
49                                    const void *imageCreateInfoPNext,
50                                    VkExtent3D extent,
51                                    VkExternalMemoryHandleTypeFlags handleTypes,
52                                    VkImage *imageOut,
53                                    VkDeviceMemory *deviceMemoryOut,
54                                    VkDeviceSize *deviceMemorySizeOut);
55 
56     // VK_KHR_external_memory_fd
57     bool canCreateImageOpaqueFd(VkFormat format,
58                                 VkImageType type,
59                                 VkImageTiling tiling,
60                                 VkImageCreateFlags createFlags,
61                                 VkImageUsageFlags usageFlags) const;
62     VkResult createImage2DOpaqueFd(VkFormat format,
63                                    VkImageCreateFlags createFlags,
64                                    VkImageUsageFlags usageFlags,
65                                    const void *imageCreateInfoPNext,
66                                    VkExtent3D extent,
67                                    VkImage *imageOut,
68                                    VkDeviceMemory *deviceMemoryOut,
69                                    VkDeviceSize *deviceMemorySizeOut);
70     VkResult exportMemoryOpaqueFd(VkDeviceMemory deviceMemory, int *fd);
71 
72     // VK_FUCHSIA_external_memory
73     bool canCreateImageZirconVmo(VkFormat format,
74                                  VkImageType type,
75                                  VkImageTiling tiling,
76                                  VkImageCreateFlags createFlags,
77                                  VkImageUsageFlags usageFlags) const;
78     VkResult createImage2DZirconVmo(VkFormat format,
79                                     VkImageCreateFlags createFlags,
80                                     VkImageUsageFlags usageFlags,
81                                     const void *imageCreateInfoPNext,
82                                     VkExtent3D extent,
83                                     VkImage *imageOut,
84                                     VkDeviceMemory *deviceMemoryOut,
85                                     VkDeviceSize *deviceMemorySizeOut);
86     VkResult exportMemoryZirconVmo(VkDeviceMemory deviceMemory, zx_handle_t *vmo);
87 
88     // VK_KHR_external_semaphore_fd
89     bool canCreateSemaphoreOpaqueFd() const;
90     VkResult createSemaphoreOpaqueFd(VkSemaphore *semaphore);
91     VkResult exportSemaphoreOpaqueFd(VkSemaphore semaphore, int *fd);
92 
93     // VK_FUCHSIA_external_semaphore
94     bool canCreateSemaphoreZirconEvent() const;
95     VkResult createSemaphoreZirconEvent(VkSemaphore *semaphore);
96     VkResult exportSemaphoreZirconEvent(VkSemaphore semaphore, zx_handle_t *event);
97 
98     // Performs a queue ownership transfer to VK_QUEUE_FAMILY_EXTERNAL on an
99     // image owned by our instance. The current image layout must be |oldLayout|
100     // and will be in |newLayout| after the memory barrier. |semaphore|
101     // will be signaled upon completion of the release operation.
102     void releaseImageAndSignalSemaphore(VkImage image,
103                                         VkImageLayout oldLayout,
104                                         VkImageLayout newLayout,
105                                         VkSemaphore semaphore);
106     // Just signal the given semaphore
107     void signalSemaphore(VkSemaphore semaphore);
108 
109     // Performs a queue ownership transfer from VK_QUEUE_FAMILY_EXTERNAL on an
110     // image owned by an external instance. The current image layout must be
111     // |oldLayout| and will be in |newLayout| after the memory barrier. The
112     // barrier will wait for |semaphore|.
113     void waitSemaphoreAndAcquireImage(VkImage image,
114                                       VkImageLayout oldLayout,
115                                       VkImageLayout newLayout,
116                                       VkSemaphore semaphore);
117 
118     // Writes pixels into an image. Currently only VK_FORMAT_R8G8B8A8_UNORM
119     // and VK_FORMAT_B8G8R8A8_UNORM formats are supported.
120     void writePixels(VkImage dstImage,
121                      VkImageLayout imageLayout,
122                      VkFormat imageFormat,
123                      VkOffset3D imageOffset,
124                      VkExtent3D imageExtent,
125                      const void *pixels,
126                      size_t pixelsSize);
127 
128     // Copies pixels out of an image. Currently only VK_FORMAT_R8G8B8A8_UNORM
129     // and VK_FORMAT_B8G8R8A8_UNORM formats are supported.
130     void readPixels(VkImage srcImage,
131                     VkImageLayout srcImageLayout,
132                     VkFormat srcImageFormat,
133                     VkOffset3D imageOffset,
134                     VkExtent3D imageExtent,
135                     void *pixels,
136                     size_t pixelsSize);
137 
138   private:
139     bool mInitializedFromANGLE       = false;
140     VkInstance mInstance             = VK_NULL_HANDLE;
141     VkPhysicalDevice mPhysicalDevice = VK_NULL_HANDLE;
142     VkDevice mDevice                 = VK_NULL_HANDLE;
143     VkQueue mGraphicsQueue           = VK_NULL_HANDLE;
144     VkCommandPool mCommandPool       = VK_NULL_HANDLE;
145 
146     VkPhysicalDeviceMemoryProperties mMemoryProperties = {};
147 
148     uint32_t mGraphicsQueueFamilyIndex = UINT32_MAX;
149 
150     bool mHasExternalMemoryFd         = false;
151     bool mHasExternalMemoryFuchsia    = false;
152     bool mHasExternalSemaphoreFd      = false;
153     bool mHasExternalSemaphoreFuchsia = false;
154     PFN_vkGetPhysicalDeviceImageFormatProperties2 vkGetPhysicalDeviceImageFormatProperties2 =
155         nullptr;
156     PFN_vkGetMemoryFdKHR vkGetMemoryFdKHR       = nullptr;
157     PFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHR = nullptr;
158     ANGLE_MAYBE_UNUSED_PRIVATE_FIELD PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR
159         vkGetPhysicalDeviceExternalSemaphorePropertiesKHR                   = nullptr;
160     PFN_vkGetMemoryZirconHandleFUCHSIA vkGetMemoryZirconHandleFUCHSIA       = nullptr;
161     PFN_vkGetSemaphoreZirconHandleFUCHSIA vkGetSemaphoreZirconHandleFUCHSIA = nullptr;
162 };
163 
164 }  // namespace angle
165 
166 #endif  // ANGLE_TESTS_TESTUTILS_VULKANHELPER_H_
167