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