1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2019 The SwiftShader Authors. All Rights Reserved. 2*03ce13f7SAndroid Build Coastguard Worker // 3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*03ce13f7SAndroid Build Coastguard Worker // 7*03ce13f7SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 8*03ce13f7SAndroid Build Coastguard Worker // 9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License. 14*03ce13f7SAndroid Build Coastguard Worker 15*03ce13f7SAndroid Build Coastguard Worker #ifndef VK_DEVICE_MEMORY_EXTERNAL_ANDROID_HPP_ 16*03ce13f7SAndroid Build Coastguard Worker #define VK_DEVICE_MEMORY_EXTERNAL_ANDROID_HPP_ 17*03ce13f7SAndroid Build Coastguard Worker 18*03ce13f7SAndroid Build Coastguard Worker #include "VkBuffer.hpp" 19*03ce13f7SAndroid Build Coastguard Worker #include "VkDevice.hpp" 20*03ce13f7SAndroid Build Coastguard Worker #include "VkDeviceMemory.hpp" 21*03ce13f7SAndroid Build Coastguard Worker #include "VkImage.hpp" 22*03ce13f7SAndroid Build Coastguard Worker 23*03ce13f7SAndroid Build Coastguard Worker #include <vndk/hardware_buffer.h> 24*03ce13f7SAndroid Build Coastguard Worker 25*03ce13f7SAndroid Build Coastguard Worker class AHardwareBufferExternalMemory : public vk::DeviceMemory, public vk::ObjectBase<AHardwareBufferExternalMemory, VkDeviceMemory> 26*03ce13f7SAndroid Build Coastguard Worker { 27*03ce13f7SAndroid Build Coastguard Worker public: 28*03ce13f7SAndroid Build Coastguard Worker // Helper struct which reads the parsed allocation info and 29*03ce13f7SAndroid Build Coastguard Worker // extracts relevant information related to the handle type 30*03ce13f7SAndroid Build Coastguard Worker // supported by this DeviceMemory subclass. 31*03ce13f7SAndroid Build Coastguard Worker struct AllocateInfo 32*03ce13f7SAndroid Build Coastguard Worker { 33*03ce13f7SAndroid Build Coastguard Worker bool importAhb = false; 34*03ce13f7SAndroid Build Coastguard Worker bool exportAhb = false; 35*03ce13f7SAndroid Build Coastguard Worker AHardwareBuffer *ahb = nullptr; 36*03ce13f7SAndroid Build Coastguard Worker vk::Image *dedicatedImageHandle = nullptr; 37*03ce13f7SAndroid Build Coastguard Worker vk::Buffer *dedicatedBufferHandle = nullptr; 38*03ce13f7SAndroid Build Coastguard Worker 39*03ce13f7SAndroid Build Coastguard Worker AllocateInfo() = default; 40*03ce13f7SAndroid Build Coastguard Worker 41*03ce13f7SAndroid Build Coastguard Worker // Use the parsed allocation info to initialize a AllocateInfo. 42*03ce13f7SAndroid Build Coastguard Worker AllocateInfo(const vk::DeviceMemory::ExtendedAllocationInfo &extendedAllocationInfo); 43*03ce13f7SAndroid Build Coastguard Worker }; 44*03ce13f7SAndroid Build Coastguard Worker 45*03ce13f7SAndroid Build Coastguard Worker static const VkExternalMemoryHandleTypeFlagBits typeFlagBit = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID; 46*03ce13f7SAndroid Build Coastguard Worker SupportsAllocateInfo(const vk::DeviceMemory::ExtendedAllocationInfo & extendedAllocationInfo)47*03ce13f7SAndroid Build Coastguard Worker static bool SupportsAllocateInfo(const vk::DeviceMemory::ExtendedAllocationInfo &extendedAllocationInfo) 48*03ce13f7SAndroid Build Coastguard Worker { 49*03ce13f7SAndroid Build Coastguard Worker AllocateInfo info(extendedAllocationInfo); 50*03ce13f7SAndroid Build Coastguard Worker return info.importAhb || info.exportAhb; 51*03ce13f7SAndroid Build Coastguard Worker } 52*03ce13f7SAndroid Build Coastguard Worker 53*03ce13f7SAndroid Build Coastguard Worker explicit AHardwareBufferExternalMemory(const VkMemoryAllocateInfo *pCreateInfo, void *mem, const vk::DeviceMemory::ExtendedAllocationInfo &extendedAllocationInfo, vk::Device *pDevice); 54*03ce13f7SAndroid Build Coastguard Worker ~AHardwareBufferExternalMemory(); 55*03ce13f7SAndroid Build Coastguard Worker 56*03ce13f7SAndroid Build Coastguard Worker VkResult allocateBuffer() override; 57*03ce13f7SAndroid Build Coastguard Worker void freeBuffer() override; 58*03ce13f7SAndroid Build Coastguard Worker getFlagBit() const59*03ce13f7SAndroid Build Coastguard Worker VkExternalMemoryHandleTypeFlagBits getFlagBit() const override { return typeFlagBit; } 60*03ce13f7SAndroid Build Coastguard Worker 61*03ce13f7SAndroid Build Coastguard Worker virtual VkResult exportAndroidHardwareBuffer(AHardwareBuffer **pAhb) const override final; 62*03ce13f7SAndroid Build Coastguard Worker 63*03ce13f7SAndroid Build Coastguard Worker static VkFormat GetVkFormatFromAHBFormat(uint32_t ahbFormat); 64*03ce13f7SAndroid Build Coastguard Worker static VkResult GetAndroidHardwareBufferFormatProperties(const AHardwareBuffer_Desc &ahbDesc, VkAndroidHardwareBufferFormatPropertiesANDROID *pFormat); 65*03ce13f7SAndroid Build Coastguard Worker static VkResult GetAndroidHardwareBufferProperties(VkDevice &device, const AHardwareBuffer *buffer, VkAndroidHardwareBufferPropertiesANDROID *pProperties); 66*03ce13f7SAndroid Build Coastguard Worker hasExternalImagePlanes() const67*03ce13f7SAndroid Build Coastguard Worker bool hasExternalImagePlanes() const override final { return true; } 68*03ce13f7SAndroid Build Coastguard Worker int externalImageRowPitchBytes(VkImageAspectFlagBits aspect) const override final; 69*03ce13f7SAndroid Build Coastguard Worker VkDeviceSize externalImageMemoryOffset(VkImageAspectFlagBits aspect) const override final; 70*03ce13f7SAndroid Build Coastguard Worker 71*03ce13f7SAndroid Build Coastguard Worker #ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT isImport() const72*03ce13f7SAndroid Build Coastguard Worker bool isImport() const override 73*03ce13f7SAndroid Build Coastguard Worker { 74*03ce13f7SAndroid Build Coastguard Worker return allocateInfo.importAhb; 75*03ce13f7SAndroid Build Coastguard Worker } 76*03ce13f7SAndroid Build Coastguard Worker uint64_t getMemoryObjectId() const override; 77*03ce13f7SAndroid Build Coastguard Worker #endif // SWIFTSHADER_DEVICE_MEMORY_REPORT 78*03ce13f7SAndroid Build Coastguard Worker 79*03ce13f7SAndroid Build Coastguard Worker private: 80*03ce13f7SAndroid Build Coastguard Worker VkResult importAndroidHardwareBuffer(AHardwareBuffer *buffer, void **pBuffer); 81*03ce13f7SAndroid Build Coastguard Worker VkResult allocateAndroidHardwareBuffer(size_t size, void **pBuffer); 82*03ce13f7SAndroid Build Coastguard Worker VkResult lockAndroidHardwareBuffer(void **pBuffer); 83*03ce13f7SAndroid Build Coastguard Worker VkResult unlockAndroidHardwareBuffer(); 84*03ce13f7SAndroid Build Coastguard Worker 85*03ce13f7SAndroid Build Coastguard Worker AHardwareBuffer *ahb = nullptr; 86*03ce13f7SAndroid Build Coastguard Worker AHardwareBuffer_Desc ahbDesc = {}; 87*03ce13f7SAndroid Build Coastguard Worker AHardwareBuffer_Planes ahbPlanes = {}; 88*03ce13f7SAndroid Build Coastguard Worker vk::Device *device = nullptr; 89*03ce13f7SAndroid Build Coastguard Worker AllocateInfo allocateInfo; 90*03ce13f7SAndroid Build Coastguard Worker }; 91*03ce13f7SAndroid Build Coastguard Worker 92*03ce13f7SAndroid Build Coastguard Worker #endif // VK_DEVICE_MEMORY_EXTERNAL_ANDROID_HPP_ 93