| // | |
| // Copyright 2019 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // VulkanHelper.h : Helper for vulkan. | |
| #ifndef ANGLE_TESTS_TESTUTILS_VULKANHELPER_H_ | |
| #define ANGLE_TESTS_TESTUTILS_VULKANHELPER_H_ | |
| #include "common/angleutils.h" | |
| #include "common/vulkan/vk_headers.h" | |
| #include "vulkan/vulkan_fuchsia_ext.h" | |
| namespace angle | |
| { | |
| class VulkanHelper | |
| { | |
| public: | |
| VulkanHelper(); | |
| ~VulkanHelper(); | |
| void initialize(bool useSwiftshader, bool enableValidationLayers); | |
| void initializeFromANGLE(); | |
| VkInstance getInstance() const { return mInstance; } | |
| VkPhysicalDevice getPhysicalDevice() const { return mPhysicalDevice; } | |
| VkDevice getDevice() const { return mDevice; } | |
| VkQueue getGraphicsQueue() const { return mGraphicsQueue; } | |
| VkResult createImage2D(VkFormat format, | |
| VkImageCreateFlags createFlags, | |
| VkImageUsageFlags usageFlags, | |
| VkExtent3D extent, | |
| VkImage *imageOut, | |
| VkDeviceMemory *deviceMemoryOut, | |
| VkDeviceSize *deviceMemorySizeOut, | |
| VkImageCreateInfo *imageCreateInfoOut); | |
| bool canCreateImageExternal(VkFormat format, | |
| VkImageType type, | |
| VkImageTiling tiling, | |
| VkImageCreateFlags createFlags, | |
| VkImageUsageFlags usageFlags, | |
| VkExternalMemoryHandleTypeFlagBits handleType) const; | |
| VkResult createImage2DExternal(VkFormat format, | |
| VkImageCreateFlags createFlags, | |
| VkImageUsageFlags usageFlags, | |
| const void *imageCreateInfoPNext, | |
| VkExtent3D extent, | |
| VkExternalMemoryHandleTypeFlags handleTypes, | |
| VkImage *imageOut, | |
| VkDeviceMemory *deviceMemoryOut, | |
| VkDeviceSize *deviceMemorySizeOut); | |
| // VK_KHR_external_memory_fd | |
| bool canCreateImageOpaqueFd(VkFormat format, | |
| VkImageType type, | |
| VkImageTiling tiling, | |
| VkImageCreateFlags createFlags, | |
| VkImageUsageFlags usageFlags) const; | |
| VkResult createImage2DOpaqueFd(VkFormat format, | |
| VkImageCreateFlags createFlags, | |
| VkImageUsageFlags usageFlags, | |
| const void *imageCreateInfoPNext, | |
| VkExtent3D extent, | |
| VkImage *imageOut, | |
| VkDeviceMemory *deviceMemoryOut, | |
| VkDeviceSize *deviceMemorySizeOut); | |
| VkResult exportMemoryOpaqueFd(VkDeviceMemory deviceMemory, int *fd); | |
| // VK_FUCHSIA_external_memory | |
| bool canCreateImageZirconVmo(VkFormat format, | |
| VkImageType type, | |
| VkImageTiling tiling, | |
| VkImageCreateFlags createFlags, | |
| VkImageUsageFlags usageFlags) const; | |
| VkResult createImage2DZirconVmo(VkFormat format, | |
| VkImageCreateFlags createFlags, | |
| VkImageUsageFlags usageFlags, | |
| const void *imageCreateInfoPNext, | |
| VkExtent3D extent, | |
| VkImage *imageOut, | |
| VkDeviceMemory *deviceMemoryOut, | |
| VkDeviceSize *deviceMemorySizeOut); | |
| VkResult exportMemoryZirconVmo(VkDeviceMemory deviceMemory, zx_handle_t *vmo); | |
| // VK_KHR_external_semaphore_fd | |
| bool canCreateSemaphoreOpaqueFd() const; | |
| VkResult createSemaphoreOpaqueFd(VkSemaphore *semaphore); | |
| VkResult exportSemaphoreOpaqueFd(VkSemaphore semaphore, int *fd); | |
| // VK_FUCHSIA_external_semaphore | |
| bool canCreateSemaphoreZirconEvent() const; | |
| VkResult createSemaphoreZirconEvent(VkSemaphore *semaphore); | |
| VkResult exportSemaphoreZirconEvent(VkSemaphore semaphore, zx_handle_t *event); | |
| // Performs a queue ownership transfer to VK_QUEUE_FAMILY_EXTERNAL on an | |
| // image owned by our instance. The current image layout must be |oldLayout| | |
| // and will be in |newLayout| after the memory barrier. |semaphore| | |
| // will be signaled upon completion of the release operation. | |
| void releaseImageAndSignalSemaphore(VkImage image, | |
| VkImageLayout oldLayout, | |
| VkImageLayout newLayout, | |
| VkSemaphore semaphore); | |
| // Just signal the given semaphore | |
| void signalSemaphore(VkSemaphore semaphore); | |
| // Performs a queue ownership transfer from VK_QUEUE_FAMILY_EXTERNAL on an | |
| // image owned by an external instance. The current image layout must be | |
| // |oldLayout| and will be in |newLayout| after the memory barrier. The | |
| // barrier will wait for |semaphore|. | |
| void waitSemaphoreAndAcquireImage(VkImage image, | |
| VkImageLayout oldLayout, | |
| VkImageLayout newLayout, | |
| VkSemaphore semaphore); | |
| // Writes pixels into an image. Currently only VK_FORMAT_R8G8B8A8_UNORM | |
| // and VK_FORMAT_B8G8R8A8_UNORM formats are supported. | |
| void writePixels(VkImage dstImage, | |
| VkImageLayout imageLayout, | |
| VkFormat imageFormat, | |
| VkOffset3D imageOffset, | |
| VkExtent3D imageExtent, | |
| const void *pixels, | |
| size_t pixelsSize); | |
| // Copies pixels out of an image. Currently only VK_FORMAT_R8G8B8A8_UNORM | |
| // and VK_FORMAT_B8G8R8A8_UNORM formats are supported. | |
| void readPixels(VkImage srcImage, | |
| VkImageLayout srcImageLayout, | |
| VkFormat srcImageFormat, | |
| VkOffset3D imageOffset, | |
| VkExtent3D imageExtent, | |
| void *pixels, | |
| size_t pixelsSize); | |
| private: | |
| bool mInitializedFromANGLE = false; | |
| VkInstance mInstance = VK_NULL_HANDLE; | |
| VkPhysicalDevice mPhysicalDevice = VK_NULL_HANDLE; | |
| VkDevice mDevice = VK_NULL_HANDLE; | |
| VkQueue mGraphicsQueue = VK_NULL_HANDLE; | |
| VkCommandPool mCommandPool = VK_NULL_HANDLE; | |
| VkPhysicalDeviceMemoryProperties mMemoryProperties = {}; | |
| uint32_t mGraphicsQueueFamilyIndex = UINT32_MAX; | |
| bool mHasExternalMemoryFd = false; | |
| bool mHasExternalMemoryFuchsia = false; | |
| bool mHasExternalSemaphoreFd = false; | |
| bool mHasExternalSemaphoreFuchsia = false; | |
| PFN_vkGetPhysicalDeviceImageFormatProperties2 vkGetPhysicalDeviceImageFormatProperties2 = | |
| nullptr; | |
| PFN_vkGetMemoryFdKHR vkGetMemoryFdKHR = nullptr; | |
| PFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHR = nullptr; | |
| ANGLE_MAYBE_UNUSED_PRIVATE_FIELD PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR | |
| vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = nullptr; | |
| PFN_vkGetMemoryZirconHandleFUCHSIA vkGetMemoryZirconHandleFUCHSIA = nullptr; | |
| PFN_vkGetSemaphoreZirconHandleFUCHSIA vkGetSemaphoreZirconHandleFUCHSIA = nullptr; | |
| }; | |
| } // namespace angle | |
| #endif // ANGLE_TESTS_TESTUTILS_VULKANHELPER_H_ |