| #ifndef _VKTEXTERNALMEMORYUTIL_HPP |
| #define _VKTEXTERNALMEMORYUTIL_HPP |
| /*------------------------------------------------------------------------- |
| * Vulkan Conformance Tests |
| * ------------------------ |
| * |
| * Copyright (c) 2016 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * \brief Vulkan external memory utilities |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "tcuDefs.hpp" |
| |
| #include "vkPlatform.hpp" |
| #include "vkRefUtil.hpp" |
| |
| #include "deMemory.h" |
| #include "deInt32.h" |
| |
| namespace vkt |
| { |
| namespace ExternalMemoryUtil |
| { |
| |
| class NativeHandle |
| { |
| public: |
| enum Win32HandleType |
| { |
| WIN32HANDLETYPE_NT = 0, |
| WIN32HANDLETYPE_KMT, |
| |
| WIN32HANDLETYPE_LAST |
| }; |
| |
| NativeHandle (void); |
| NativeHandle (const NativeHandle& other); |
| NativeHandle (int fd); |
| NativeHandle (Win32HandleType type, vk::pt::Win32Handle handle); |
| NativeHandle (vk::pt::AndroidHardwareBufferPtr buffer); |
| ~NativeHandle (void); |
| |
| NativeHandle& operator= (int fd); |
| NativeHandle& operator= (vk::pt::AndroidHardwareBufferPtr buffer); |
| |
| void setWin32Handle (Win32HandleType type, vk::pt::Win32Handle handle); |
| vk::pt::Win32Handle getWin32Handle (void) const; |
| void setHostPtr (void* hostPtr); |
| void* getHostPtr (void) const; |
| int getFd (void) const; |
| vk::pt::AndroidHardwareBufferPtr getAndroidHardwareBuffer (void) const; |
| void disown (void); |
| void reset (void); |
| |
| private: |
| int m_fd; |
| Win32HandleType m_win32HandleType; |
| vk::pt::Win32Handle m_win32Handle; |
| vk::pt::AndroidHardwareBufferPtr m_androidHardwareBuffer; |
| void* m_hostPtr; |
| |
| // Disabled |
| NativeHandle& operator= (const NativeHandle&); |
| }; |
| |
| class AndroidHardwareBufferExternalApi |
| { |
| public: |
| |
| /** |
| * getInstance obtains the object, that provides an interface to AHB system APIs . |
| * If the AHB system API is not supported or if it is not built as supported with the CTS, |
| * then this function would return a null object. |
| */ |
| static AndroidHardwareBufferExternalApi* getInstance(); |
| |
| /* Is AndroidHardwareBuffer supported? */ |
| static bool supportsAhb(); |
| |
| /* Are Cube maps supported on current api level? */ |
| static bool supportsCubeMap(); |
| |
| /** |
| * Allocates a buffer that backs an AHardwareBuffer using the passed parameter as follows: |
| * width; - width in pixels |
| * height; - height in pixels |
| * layers; - number of images |
| * format; - One of AHARDWAREBUFFER_FORMAT_* |
| * usage; - Combination of AHARDWAREBUFFER_USAGE_* |
| * |
| * Returns a valid AndroidHardwareBufferPtr object on success, or an null AndroidHardwareBufferPtr if |
| * the allocation fails for any reason. |
| */ |
| virtual vk::pt::AndroidHardwareBufferPtr allocate(deUint32 width, deUint32 height, deUint32 layers, deUint32 format, deUint64 usage) = 0; |
| |
| /** |
| * Acquire a reference on the given AHardwareBuffer object. This prevents the |
| * object from being deleted until the last reference is removed. |
| */ |
| virtual void acquire(vk::pt::AndroidHardwareBufferPtr buffer) = 0; |
| |
| /** |
| * Remove a reference that was previously acquired with |
| * AHardwareBuffer_acquire(). |
| */ |
| virtual void release(vk::pt::AndroidHardwareBufferPtr buffer) = 0; |
| |
| /** |
| * Return a description of the AHardwareBuffer in the passed in the following fields, if not NULL: |
| * width; - width in pixels |
| * height; - height in pixels |
| * layers; - number of images |
| * format; - One of AHARDWAREBUFFER_FORMAT_* |
| * usage; - Combination of AHARDWAREBUFFER_USAGE_* |
| * |
| */ |
| virtual void describe(const vk::pt::AndroidHardwareBufferPtr buffer, |
| deUint32* width, |
| deUint32* height, |
| deUint32* layers, |
| deUint32* format, |
| deUint64* usage, |
| deUint32* stride) = 0; |
| |
| |
| virtual deUint64 vkUsageToAhbUsage(vk::VkImageUsageFlagBits vkFlag) = 0; |
| virtual deUint64 vkCreateToAhbUsage(vk::VkImageCreateFlagBits vkFlag) = 0; |
| virtual deUint32 vkFormatToAhbFormat(vk::VkFormat vkFormat) = 0; |
| virtual deUint64 mustSupportAhbUsageFlags() = 0; |
| virtual bool ahbFormatIsBlob(deUint32 format) = 0; |
| |
| virtual ~AndroidHardwareBufferExternalApi(); |
| |
| protected: |
| // Protected Constructor |
| AndroidHardwareBufferExternalApi(); |
| |
| private: |
| // Stop the compiler generating methods of copy the object |
| AndroidHardwareBufferExternalApi(AndroidHardwareBufferExternalApi const& copy); // Not Implemented |
| AndroidHardwareBufferExternalApi& operator=(AndroidHardwareBufferExternalApi const& copy); // Not Implemented |
| |
| static bool loadAhbDynamicApis(deInt32 sdkVersion); |
| }; |
| |
| const char* externalSemaphoreTypeToName (vk::VkExternalSemaphoreHandleTypeFlagBits type); |
| const char* externalFenceTypeToName (vk::VkExternalFenceHandleTypeFlagBits type); |
| const char* externalMemoryTypeToName (vk::VkExternalMemoryHandleTypeFlagBits type); |
| |
| enum Permanence |
| { |
| PERMANENCE_PERMANENT = 0, |
| PERMANENCE_TEMPORARY |
| }; |
| |
| enum Transference |
| { |
| TRANSFERENCE_COPY = 0, |
| TRANSFERENCE_REFERENCE |
| }; |
| |
| struct ExternalHostMemory |
| { |
| ExternalHostMemory(vk::VkDeviceSize aSize, vk::VkDeviceSize aAlignment) |
| : size(deAlignSize(static_cast<size_t>(aSize), static_cast<size_t>(aAlignment))) |
| { |
| data = deAlignedMalloc(this->size, static_cast<size_t>(aAlignment)); |
| } |
| |
| ~ExternalHostMemory() |
| { |
| if (data != DE_NULL) |
| { |
| deAlignedFree(data); |
| } |
| } |
| |
| size_t size; |
| void* data; |
| }; |
| |
| bool isSupportedPermanence (vk::VkExternalSemaphoreHandleTypeFlagBits type, |
| Permanence permanence); |
| Transference getHandelTypeTransferences (vk::VkExternalSemaphoreHandleTypeFlagBits type); |
| |
| bool isSupportedPermanence (vk::VkExternalFenceHandleTypeFlagBits type, |
| Permanence permanence); |
| Transference getHandelTypeTransferences (vk::VkExternalFenceHandleTypeFlagBits type); |
| |
| int getMemoryFd (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkDeviceMemory memory, |
| vk::VkExternalMemoryHandleTypeFlagBits externalType); |
| |
| void getMemoryNative (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkDeviceMemory memory, |
| vk::VkExternalMemoryHandleTypeFlagBits externalType, |
| NativeHandle& nativeHandle); |
| |
| vk::Move<vk::VkSemaphore> createExportableSemaphore (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkExternalSemaphoreHandleTypeFlagBits externalType); |
| |
| vk::Move<vk::VkSemaphore> createExportableSemaphoreType (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkSemaphoreType semaphoreType, |
| vk::VkExternalSemaphoreHandleTypeFlagBits externalType); |
| |
| int getSemaphoreFd (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkSemaphore semaphore, |
| vk::VkExternalSemaphoreHandleTypeFlagBits externalType); |
| |
| void getSemaphoreNative (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkSemaphore semaphore, |
| vk::VkExternalSemaphoreHandleTypeFlagBits externalType, |
| NativeHandle& nativeHandle); |
| |
| void importSemaphore (const vk::DeviceInterface& vkd, |
| const vk::VkDevice device, |
| const vk::VkSemaphore semaphore, |
| vk::VkExternalSemaphoreHandleTypeFlagBits externalType, |
| NativeHandle& handle, |
| vk::VkSemaphoreImportFlags flags); |
| |
| vk::Move<vk::VkSemaphore> createAndImportSemaphore (const vk::DeviceInterface& vkd, |
| const vk::VkDevice device, |
| vk::VkExternalSemaphoreHandleTypeFlagBits externalType, |
| NativeHandle& handle, |
| vk::VkSemaphoreImportFlags flags); |
| |
| vk::Move<vk::VkFence> createExportableFence (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkExternalFenceHandleTypeFlagBits externalType); |
| |
| int getFenceFd (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkFence fence, |
| vk::VkExternalFenceHandleTypeFlagBits externalType); |
| |
| void getFenceNative (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkFence fence, |
| vk::VkExternalFenceHandleTypeFlagBits externalType, |
| NativeHandle& nativeHandle, |
| bool expectFenceUnsignaled = true); |
| |
| void importFence (const vk::DeviceInterface& vkd, |
| const vk::VkDevice device, |
| const vk::VkFence fence, |
| vk::VkExternalFenceHandleTypeFlagBits externalType, |
| NativeHandle& handle, |
| vk::VkFenceImportFlags flags); |
| |
| vk::Move<vk::VkFence> createAndImportFence (const vk::DeviceInterface& vkd, |
| const vk::VkDevice device, |
| vk::VkExternalFenceHandleTypeFlagBits externalType, |
| NativeHandle& handle, |
| vk::VkFenceImportFlags flags); |
| |
| deUint32 chooseMemoryType (deUint32 bits); |
| |
| deUint32 chooseHostVisibleMemoryType (deUint32 bits, |
| const vk::VkPhysicalDeviceMemoryProperties properties); |
| |
| vk::VkMemoryRequirements getImageMemoryRequirements (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkImage image, |
| vk::VkExternalMemoryHandleTypeFlagBits externalType); |
| |
| // If buffer is not null use dedicated allocation |
| vk::Move<vk::VkDeviceMemory> allocateExportableMemory (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkDeviceSize allocationSize, |
| deUint32 memoryTypeIndex, |
| vk::VkExternalMemoryHandleTypeFlagBits externalType, |
| vk::VkBuffer buffer); |
| |
| // If image is not null use dedicated allocation |
| vk::Move<vk::VkDeviceMemory> allocateExportableMemory (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkDeviceSize allocationSize, |
| deUint32 memoryTypeIndex, |
| vk::VkExternalMemoryHandleTypeFlagBits externalType, |
| vk::VkImage image); |
| |
| /* |
| // \note hostVisible argument is strict. Setting it to false will cause NotSupportedError to be thrown if non-host visible memory doesn't exist. |
| // If buffer is not null use dedicated allocation |
| vk::Move<vk::VkDeviceMemory> allocateExportableMemory (const vk::InstanceInterface& vki, |
| vk::VkPhysicalDevice physicalDevice, |
| const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| const vk::VkMemoryRequirements& requirements, |
| vk::VkExternalMemoryHandleTypeFlagBits externalType, |
| bool hostVisible, |
| vk::VkBuffer buffer, |
| deUint32& exportedMemoryTypeIndex); |
| */ |
| |
| vk::Move<vk::VkDeviceMemory> importMemory (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| const vk::VkMemoryRequirements& requirements, |
| vk::VkExternalMemoryHandleTypeFlagBits externalType, |
| deUint32 memoryTypeIndex, |
| NativeHandle& handle); |
| |
| vk::Move<vk::VkDeviceMemory> importDedicatedMemory (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkBuffer buffer, |
| const vk::VkMemoryRequirements& requirements, |
| vk::VkExternalMemoryHandleTypeFlagBits externalType, |
| deUint32 memoryTypeIndex, |
| NativeHandle& handle); |
| |
| vk::Move<vk::VkDeviceMemory> importDedicatedMemory (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| vk::VkImage image, |
| const vk::VkMemoryRequirements& requirements, |
| vk::VkExternalMemoryHandleTypeFlagBits externalType, |
| deUint32 memoryTypeIndex, |
| NativeHandle& handle); |
| |
| vk::Move<vk::VkBuffer> createExternalBuffer (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| deUint32 queueFamilyIndex, |
| vk::VkExternalMemoryHandleTypeFlagBits externalType, |
| vk::VkDeviceSize size, |
| vk::VkBufferCreateFlags createFlags, |
| vk::VkBufferUsageFlags usageFlags); |
| |
| vk::Move<vk::VkImage> createExternalImage (const vk::DeviceInterface& vkd, |
| vk::VkDevice device, |
| deUint32 queueFamilyIndex, |
| vk::VkExternalMemoryHandleTypeFlagBits externalType, |
| vk::VkFormat format, |
| deUint32 width, |
| deUint32 height, |
| vk::VkImageTiling tiling, |
| vk::VkImageCreateFlags createFlags, |
| vk::VkImageUsageFlags usageFlags, |
| deUint32 mipLevels = 1u, |
| deUint32 arrayLayers = 1u); |
| |
| vk::VkPhysicalDeviceExternalMemoryHostPropertiesEXT getPhysicalDeviceExternalMemoryHostProperties(const vk::InstanceInterface& vki, |
| vk::VkPhysicalDevice physicalDevice); |
| |
| } // ExternalMemoryUtil |
| } // vkt |
| |
| #endif // _VKTEXTERNALMEMORYUTIL_HPP |