xref: /aosp_15_r20/external/swiftshader/src/Vulkan/VkDeviceMemoryExternalAndroid.hpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
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