Path: blob/main_old/src/tests/test_utils/VulkanExternalHelper.h
1693 views
//1// Copyright 2019 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// VulkanExternalHelper.h : Helper for allocating & managing vulkan external objects.67#ifndef ANGLE_TESTS_TESTUTILS_VULKANEXTERNALHELPER_H_8#define ANGLE_TESTS_TESTUTILS_VULKANEXTERNALHELPER_H_910#include "common/vulkan/vk_headers.h"11#include "vulkan/vulkan_fuchsia_ext.h"1213namespace angle14{1516class VulkanExternalHelper17{18public:19VulkanExternalHelper();20~VulkanExternalHelper();2122void initialize(bool useSwiftshader, bool enableValidationLayers);2324VkInstance getInstance() const { return mInstance; }25VkPhysicalDevice getPhysicalDevice() const { return mPhysicalDevice; }26VkDevice getDevice() const { return mDevice; }27VkQueue getGraphicsQueue() const { return mGraphicsQueue; }2829bool canCreateImageExternal(VkFormat format,30VkImageType type,31VkImageTiling tiling,32VkImageCreateFlags createFlags,33VkImageUsageFlags usageFlags,34VkExternalMemoryHandleTypeFlagBits handleType) const;35VkResult createImage2DExternal(VkFormat format,36VkImageCreateFlags createFlags,37VkImageUsageFlags usageFlags,38VkExtent3D extent,39VkExternalMemoryHandleTypeFlags handleTypes,40VkImage *imageOut,41VkDeviceMemory *deviceMemoryOut,42VkDeviceSize *deviceMemorySizeOut);4344// VK_KHR_external_memory_fd45bool canCreateImageOpaqueFd(VkFormat format,46VkImageType type,47VkImageTiling tiling,48VkImageCreateFlags createFlags,49VkImageUsageFlags usageFlags) const;50VkResult createImage2DOpaqueFd(VkFormat format,51VkImageCreateFlags createFlags,52VkImageUsageFlags usageFlags,53VkExtent3D extent,54VkImage *imageOut,55VkDeviceMemory *deviceMemoryOut,56VkDeviceSize *deviceMemorySizeOut);57VkResult exportMemoryOpaqueFd(VkDeviceMemory deviceMemory, int *fd);5859// VK_FUCHSIA_external_memory60bool canCreateImageZirconVmo(VkFormat format,61VkImageType type,62VkImageTiling tiling,63VkImageCreateFlags createFlags,64VkImageUsageFlags usageFlags) const;65VkResult createImage2DZirconVmo(VkFormat format,66VkImageCreateFlags createFlags,67VkImageUsageFlags usageFlags,68VkExtent3D extent,69VkImage *imageOut,70VkDeviceMemory *deviceMemoryOut,71VkDeviceSize *deviceMemorySizeOut);72VkResult exportMemoryZirconVmo(VkDeviceMemory deviceMemory, zx_handle_t *vmo);7374// VK_KHR_external_semaphore_fd75bool canCreateSemaphoreOpaqueFd() const;76VkResult createSemaphoreOpaqueFd(VkSemaphore *semaphore);77VkResult exportSemaphoreOpaqueFd(VkSemaphore semaphore, int *fd);7879// VK_FUCHSIA_external_semaphore80bool canCreateSemaphoreZirconEvent() const;81VkResult createSemaphoreZirconEvent(VkSemaphore *semaphore);82VkResult exportSemaphoreZirconEvent(VkSemaphore semaphore, zx_handle_t *event);8384// Performs a queue ownership transfer to VK_QUEUE_FAMILY_EXTERNAL on an85// image owned by our instance. The current image layout must be |oldLayout|86// and will be in |newLayout| after the memory barrier. |semaphore|87// will be signaled upon completion of the release operation.88void releaseImageAndSignalSemaphore(VkImage image,89VkImageLayout oldLayout,90VkImageLayout newLayout,91VkSemaphore semaphore);9293// Performs a queue ownership transfer from VK_QUEUE_FAMILY_EXTERNAL on an94// image owned by an external instance. The current image layout must be95// |oldLayout| and will be in |newLayout| after the memory barrier. The96// barrier will wait for |semaphore|.97void waitSemaphoreAndAcquireImage(VkImage image,98VkImageLayout oldLayout,99VkImageLayout newLayout,100VkSemaphore semaphore);101102// Copies pixels out of an image. Currently only VK_FORMAT_R8G8B8A8_UNORM103// and VK_FORMAT_B8G8R8A8_UNORM formats are supported.104void readPixels(VkImage srcImage,105VkImageLayout srcImageLayout,106VkFormat srcImageFormat,107VkOffset3D imageOffset,108VkExtent3D imageExtent,109void *pixels,110size_t pixelsSize);111112private:113VkInstance mInstance = VK_NULL_HANDLE;114VkPhysicalDevice mPhysicalDevice = VK_NULL_HANDLE;115VkDevice mDevice = VK_NULL_HANDLE;116VkQueue mGraphicsQueue = VK_NULL_HANDLE;117VkCommandPool mCommandPool = VK_NULL_HANDLE;118119VkPhysicalDeviceMemoryProperties mMemoryProperties = {};120121uint32_t mGraphicsQueueFamilyIndex = UINT32_MAX;122123bool mHasExternalMemoryFd = false;124bool mHasExternalMemoryFuchsia = false;125bool mHasExternalSemaphoreFd = false;126bool mHasExternalSemaphoreFuchsia = false;127PFN_vkGetPhysicalDeviceImageFormatProperties2 vkGetPhysicalDeviceImageFormatProperties2 =128nullptr;129PFN_vkGetMemoryFdKHR vkGetMemoryFdKHR = nullptr;130PFN_vkGetSemaphoreFdKHR vkGetSemaphoreFdKHR = nullptr;131PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR132vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = nullptr;133PFN_vkGetMemoryZirconHandleFUCHSIA vkGetMemoryZirconHandleFUCHSIA = nullptr;134PFN_vkGetSemaphoreZirconHandleFUCHSIA vkGetSemaphoreZirconHandleFUCHSIA = nullptr;135};136137} // namespace angle138139#endif // ANGLE_TESTS_TESTUTILS_VULKANEXTERNALHELPER_H_140141142