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