• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/vulkan/vk_headers.h"
12 #include "vulkan/vulkan_fuchsia_ext.h"
13 
14 namespace angle
15 {
16 
17 class VulkanHelper
18 {
19   public:
20     VulkanHelper();
21     ~VulkanHelper();
22 
23     void initialize(bool useSwiftshader, bool enableValidationLayers);
24     void initializeFromANGLE();
25 
getInstance()26     VkInstance getInstance() const { return mInstance; }
getPhysicalDevice()27     VkPhysicalDevice getPhysicalDevice() const { return mPhysicalDevice; }
getDevice()28     VkDevice getDevice() const { return mDevice; }
getGraphicsQueue()29     VkQueue getGraphicsQueue() const { return mGraphicsQueue; }
30 
31     bool canCreateImageExternal(VkFormat format,
32                                 VkImageType type,
33                                 VkImageTiling tiling,
34                                 VkImageCreateFlags createFlags,
35                                 VkImageUsageFlags usageFlags,
36                                 VkExternalMemoryHandleTypeFlagBits handleType) const;
37     VkResult createImage2DExternal(VkFormat format,
38                                    VkImageCreateFlags createFlags,
39                                    VkImageUsageFlags usageFlags,
40                                    const void *imageCreateInfoPNext,
41                                    VkExtent3D extent,
42                                    VkExternalMemoryHandleTypeFlags handleTypes,
43                                    VkImage *imageOut,
44                                    VkDeviceMemory *deviceMemoryOut,
45                                    VkDeviceSize *deviceMemorySizeOut);
46 
47     // VK_KHR_external_memory_fd
48     bool canCreateImageOpaqueFd(VkFormat format,
49                                 VkImageType type,
50                                 VkImageTiling tiling,
51                                 VkImageCreateFlags createFlags,
52                                 VkImageUsageFlags usageFlags) const;
53     VkResult createImage2DOpaqueFd(VkFormat format,
54                                    VkImageCreateFlags createFlags,
55                                    VkImageUsageFlags usageFlags,
56                                    const void *imageCreateInfoPNext,
57                                    VkExtent3D extent,
58                                    VkImage *imageOut,
59                                    VkDeviceMemory *deviceMemoryOut,
60                                    VkDeviceSize *deviceMemorySizeOut);
61     VkResult exportMemoryOpaqueFd(VkDeviceMemory deviceMemory, int *fd);
62 
63     // VK_FUCHSIA_external_memory
64     bool canCreateImageZirconVmo(VkFormat format,
65                                  VkImageType type,
66                                  VkImageTiling tiling,
67                                  VkImageCreateFlags createFlags,
68                                  VkImageUsageFlags usageFlags) const;
69     VkResult createImage2DZirconVmo(VkFormat format,
70                                     VkImageCreateFlags createFlags,
71                                     VkImageUsageFlags usageFlags,
72                                     const void *imageCreateInfoPNext,
73                                     VkExtent3D extent,
74                                     VkImage *imageOut,
75                                     VkDeviceMemory *deviceMemoryOut,
76                                     VkDeviceSize *deviceMemorySizeOut);
77     VkResult exportMemoryZirconVmo(VkDeviceMemory deviceMemory, zx_handle_t *vmo);
78 
79     // VK_KHR_external_semaphore_fd
80     bool canCreateSemaphoreOpaqueFd() const;
81     VkResult createSemaphoreOpaqueFd(VkSemaphore *semaphore);
82     VkResult exportSemaphoreOpaqueFd(VkSemaphore semaphore, int *fd);
83 
84     // VK_FUCHSIA_external_semaphore
85     bool canCreateSemaphoreZirconEvent() const;
86     VkResult createSemaphoreZirconEvent(VkSemaphore *semaphore);
87     VkResult exportSemaphoreZirconEvent(VkSemaphore semaphore, zx_handle_t *event);
88 
89     // Performs a queue ownership transfer to VK_QUEUE_FAMILY_EXTERNAL on an
90     // image owned by our instance. The current image layout must be |oldLayout|
91     // and will be in |newLayout| after the memory barrier. |semaphore|
92     // will be signaled upon completion of the release operation.
93     void releaseImageAndSignalSemaphore(VkImage image,
94                                         VkImageLayout oldLayout,
95                                         VkImageLayout newLayout,
96                                         VkSemaphore semaphore);
97 
98     // Performs a queue ownership transfer from VK_QUEUE_FAMILY_EXTERNAL on an
99     // image owned by an external instance. The current image layout must be
100     // |oldLayout| and will be in |newLayout| after the memory barrier. The
101     // barrier will wait for |semaphore|.
102     void waitSemaphoreAndAcquireImage(VkImage image,
103                                       VkImageLayout oldLayout,
104                                       VkImageLayout newLayout,
105                                       VkSemaphore semaphore);
106 
107     // Copies pixels out of an image. Currently only VK_FORMAT_R8G8B8A8_UNORM
108     // and VK_FORMAT_B8G8R8A8_UNORM formats are supported.
109     void readPixels(VkImage srcImage,
110                     VkImageLayout srcImageLayout,
111                     VkFormat srcImageFormat,
112                     VkOffset3D imageOffset,
113                     VkExtent3D imageExtent,
114                     void *pixels,
115                     size_t pixelsSize);
116 
117   private:
118     bool mInitializedFromANGLE       = false;
119     VkInstance mInstance             = VK_NULL_HANDLE;
120     VkPhysicalDevice mPhysicalDevice = VK_NULL_HANDLE;
121     VkDevice mDevice                 = VK_NULL_HANDLE;
122     VkQueue mGraphicsQueue           = VK_NULL_HANDLE;
123     VkCommandPool mCommandPool       = VK_NULL_HANDLE;
124 
125     VkPhysicalDeviceMemoryProperties mMemoryProperties = {};
126 
127     uint32_t mGraphicsQueueFamilyIndex = UINT32_MAX;
128 
129     bool mHasExternalMemoryFd         = false;
130     bool mHasExternalMemoryFuchsia    = false;
131     bool mHasExternalSemaphoreFd      = false;
132     bool mHasExternalSemaphoreFuchsia = false;
133     PFN_vkGetPhysicalDeviceImageFormatProperties2 vkGetPhysicalDeviceImageFormatProperties2 =
134         nullptr;
135     PFN_vkGetMemoryFdKHR vkGetMemoryFdKHR       = nullptr;
136     PFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHR = nullptr;
137     PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR
138         vkGetPhysicalDeviceExternalSemaphorePropertiesKHR                   = nullptr;
139     PFN_vkGetMemoryZirconHandleFUCHSIA vkGetMemoryZirconHandleFUCHSIA       = nullptr;
140     PFN_vkGetSemaphoreZirconHandleFUCHSIA vkGetSemaphoreZirconHandleFUCHSIA = nullptr;
141 };
142 
143 }  // namespace angle
144 
145 #endif  // ANGLE_TESTS_TESTUTILS_VULKANHELPER_H_
146