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