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