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