xref: /aosp_15_r20/external/swiftshader/src/Vulkan/VkDeviceMemoryExternalAndroid.cpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2020 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 #include "VkDeviceMemoryExternalAndroid.hpp"
16*03ce13f7SAndroid Build Coastguard Worker 
17*03ce13f7SAndroid Build Coastguard Worker #include "VkDestroy.hpp"
18*03ce13f7SAndroid Build Coastguard Worker #include "VkFormat.hpp"
19*03ce13f7SAndroid Build Coastguard Worker #include "VkObject.hpp"
20*03ce13f7SAndroid Build Coastguard Worker #include "VkPhysicalDevice.hpp"
21*03ce13f7SAndroid Build Coastguard Worker #include "VkStringify.hpp"
22*03ce13f7SAndroid Build Coastguard Worker #include "System/Debug.hpp"
23*03ce13f7SAndroid Build Coastguard Worker 
24*03ce13f7SAndroid Build Coastguard Worker namespace {
25*03ce13f7SAndroid Build Coastguard Worker 
GetAHBFormatFromVkFormat(VkFormat format)26*03ce13f7SAndroid Build Coastguard Worker uint32_t GetAHBFormatFromVkFormat(VkFormat format)
27*03ce13f7SAndroid Build Coastguard Worker {
28*03ce13f7SAndroid Build Coastguard Worker 	switch(format)
29*03ce13f7SAndroid Build Coastguard Worker 	{
30*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_D16_UNORM:
31*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_D16_UNORM;
32*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_X8_D24_UNORM_PACK32:
33*03ce13f7SAndroid Build Coastguard Worker 		UNSUPPORTED("AHardwareBufferExternalMemory::VkFormat VK_FORMAT_X8_D24_UNORM_PACK32");
34*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_D24_UNORM;
35*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_D24_UNORM_S8_UINT:
36*03ce13f7SAndroid Build Coastguard Worker 		UNSUPPORTED("AHardwareBufferExternalMemory::VkFormat VK_FORMAT_D24_UNORM_S8_UINT");
37*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT;
38*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_D32_SFLOAT:
39*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_D32_FLOAT;
40*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_D32_SFLOAT_S8_UINT:
41*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT;
42*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
43*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM;
44*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_R16G16B16A16_SFLOAT:
45*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT;
46*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_R5G6B5_UNORM_PACK16:
47*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM;
48*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_R8_UNORM:
49*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_R8_UNORM;
50*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_R8G8B8A8_UNORM:
51*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
52*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_R8G8B8_UNORM:
53*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM;
54*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_S8_UINT:
55*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_S8_UINT;
56*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
57*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420;
58*03ce13f7SAndroid Build Coastguard Worker 	case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
59*03ce13f7SAndroid Build Coastguard Worker 		return AHARDWAREBUFFER_FORMAT_YCbCr_P010;
60*03ce13f7SAndroid Build Coastguard Worker 	default:
61*03ce13f7SAndroid Build Coastguard Worker 		UNSUPPORTED("AHardwareBufferExternalMemory::VkFormat %d", int(format));
62*03ce13f7SAndroid Build Coastguard Worker 		return 0;
63*03ce13f7SAndroid Build Coastguard Worker 	}
64*03ce13f7SAndroid Build Coastguard Worker }
65*03ce13f7SAndroid Build Coastguard Worker 
GetAHBLockUsageFromVkImageUsageFlags(VkImageUsageFlags flags)66*03ce13f7SAndroid Build Coastguard Worker uint64_t GetAHBLockUsageFromVkImageUsageFlags(VkImageUsageFlags flags)
67*03ce13f7SAndroid Build Coastguard Worker {
68*03ce13f7SAndroid Build Coastguard Worker 	uint64_t usage = 0;
69*03ce13f7SAndroid Build Coastguard Worker 
70*03ce13f7SAndroid Build Coastguard Worker 	if(flags & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT ||
71*03ce13f7SAndroid Build Coastguard Worker 	   flags & VK_IMAGE_USAGE_SAMPLED_BIT ||
72*03ce13f7SAndroid Build Coastguard Worker 	   flags & VK_IMAGE_USAGE_TRANSFER_SRC_BIT)
73*03ce13f7SAndroid Build Coastguard Worker 	{
74*03ce13f7SAndroid Build Coastguard Worker 		usage |= AHARDWAREBUFFER_USAGE_CPU_READ_MASK;
75*03ce13f7SAndroid Build Coastguard Worker 	}
76*03ce13f7SAndroid Build Coastguard Worker 
77*03ce13f7SAndroid Build Coastguard Worker 	if(flags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT ||
78*03ce13f7SAndroid Build Coastguard Worker 	   flags & VK_IMAGE_USAGE_TRANSFER_DST_BIT)
79*03ce13f7SAndroid Build Coastguard Worker 	{
80*03ce13f7SAndroid Build Coastguard Worker 		usage |= AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK;
81*03ce13f7SAndroid Build Coastguard Worker 	}
82*03ce13f7SAndroid Build Coastguard Worker 
83*03ce13f7SAndroid Build Coastguard Worker 	return usage;
84*03ce13f7SAndroid Build Coastguard Worker }
85*03ce13f7SAndroid Build Coastguard Worker 
GetAHBLockUsageFromVkBufferUsageFlags(VkBufferUsageFlags flags)86*03ce13f7SAndroid Build Coastguard Worker uint64_t GetAHBLockUsageFromVkBufferUsageFlags(VkBufferUsageFlags flags)
87*03ce13f7SAndroid Build Coastguard Worker {
88*03ce13f7SAndroid Build Coastguard Worker 	uint64_t usage = 0;
89*03ce13f7SAndroid Build Coastguard Worker 
90*03ce13f7SAndroid Build Coastguard Worker 	if(flags & VK_BUFFER_USAGE_TRANSFER_SRC_BIT)
91*03ce13f7SAndroid Build Coastguard Worker 	{
92*03ce13f7SAndroid Build Coastguard Worker 		usage |= AHARDWAREBUFFER_USAGE_CPU_READ_MASK;
93*03ce13f7SAndroid Build Coastguard Worker 	}
94*03ce13f7SAndroid Build Coastguard Worker 
95*03ce13f7SAndroid Build Coastguard Worker 	if(flags & VK_BUFFER_USAGE_TRANSFER_DST_BIT)
96*03ce13f7SAndroid Build Coastguard Worker 	{
97*03ce13f7SAndroid Build Coastguard Worker 		usage |= AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK;
98*03ce13f7SAndroid Build Coastguard Worker 	}
99*03ce13f7SAndroid Build Coastguard Worker 
100*03ce13f7SAndroid Build Coastguard Worker 	return usage;
101*03ce13f7SAndroid Build Coastguard Worker }
102*03ce13f7SAndroid Build Coastguard Worker 
GetAHBUsageFromVkImageFlags(VkImageCreateFlags createFlags,VkImageUsageFlags usageFlags)103*03ce13f7SAndroid Build Coastguard Worker uint64_t GetAHBUsageFromVkImageFlags(VkImageCreateFlags createFlags, VkImageUsageFlags usageFlags)
104*03ce13f7SAndroid Build Coastguard Worker {
105*03ce13f7SAndroid Build Coastguard Worker 	uint64_t ahbUsage = 0;
106*03ce13f7SAndroid Build Coastguard Worker 
107*03ce13f7SAndroid Build Coastguard Worker 	if(usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT)
108*03ce13f7SAndroid Build Coastguard Worker 	{
109*03ce13f7SAndroid Build Coastguard Worker 		ahbUsage |= AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN;
110*03ce13f7SAndroid Build Coastguard Worker 	}
111*03ce13f7SAndroid Build Coastguard Worker 	if(usageFlags & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)
112*03ce13f7SAndroid Build Coastguard Worker 	{
113*03ce13f7SAndroid Build Coastguard Worker 		ahbUsage |= AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN;
114*03ce13f7SAndroid Build Coastguard Worker 	}
115*03ce13f7SAndroid Build Coastguard Worker 	if(usageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
116*03ce13f7SAndroid Build Coastguard Worker 	{
117*03ce13f7SAndroid Build Coastguard Worker 		ahbUsage |= AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
118*03ce13f7SAndroid Build Coastguard Worker 	}
119*03ce13f7SAndroid Build Coastguard Worker 
120*03ce13f7SAndroid Build Coastguard Worker 	if(createFlags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT)
121*03ce13f7SAndroid Build Coastguard Worker 	{
122*03ce13f7SAndroid Build Coastguard Worker 		ahbUsage |= AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP;
123*03ce13f7SAndroid Build Coastguard Worker 	}
124*03ce13f7SAndroid Build Coastguard Worker 	if(createFlags & VK_IMAGE_CREATE_PROTECTED_BIT)
125*03ce13f7SAndroid Build Coastguard Worker 	{
126*03ce13f7SAndroid Build Coastguard Worker 		ahbUsage |= AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT;
127*03ce13f7SAndroid Build Coastguard Worker 	}
128*03ce13f7SAndroid Build Coastguard Worker 
129*03ce13f7SAndroid Build Coastguard Worker 	// No usage bits set - set at least one GPU usage
130*03ce13f7SAndroid Build Coastguard Worker 	if(ahbUsage == 0)
131*03ce13f7SAndroid Build Coastguard Worker 	{
132*03ce13f7SAndroid Build Coastguard Worker 		ahbUsage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
133*03ce13f7SAndroid Build Coastguard Worker 		           AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
134*03ce13f7SAndroid Build Coastguard Worker 	}
135*03ce13f7SAndroid Build Coastguard Worker 
136*03ce13f7SAndroid Build Coastguard Worker 	return ahbUsage;
137*03ce13f7SAndroid Build Coastguard Worker }
138*03ce13f7SAndroid Build Coastguard Worker 
GetAHBUsageFromVkBufferFlags(VkBufferCreateFlags,VkBufferUsageFlags)139*03ce13f7SAndroid Build Coastguard Worker uint64_t GetAHBUsageFromVkBufferFlags(VkBufferCreateFlags /*createFlags*/, VkBufferUsageFlags /*usageFlags*/)
140*03ce13f7SAndroid Build Coastguard Worker {
141*03ce13f7SAndroid Build Coastguard Worker 	uint64_t ahbUsage = 0;
142*03ce13f7SAndroid Build Coastguard Worker 
143*03ce13f7SAndroid Build Coastguard Worker 	// TODO(b/141698760): needs fleshing out.
144*03ce13f7SAndroid Build Coastguard Worker 	ahbUsage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
145*03ce13f7SAndroid Build Coastguard Worker 
146*03ce13f7SAndroid Build Coastguard Worker 	return ahbUsage;
147*03ce13f7SAndroid Build Coastguard Worker }
148*03ce13f7SAndroid Build Coastguard Worker 
GetVkFormatFeaturesFromAHBFormat(uint32_t ahbFormat)149*03ce13f7SAndroid Build Coastguard Worker VkFormatFeatureFlags GetVkFormatFeaturesFromAHBFormat(uint32_t ahbFormat)
150*03ce13f7SAndroid Build Coastguard Worker {
151*03ce13f7SAndroid Build Coastguard Worker 	VkFormatFeatureFlags features = 0;
152*03ce13f7SAndroid Build Coastguard Worker 
153*03ce13f7SAndroid Build Coastguard Worker 	VkFormat format = AHardwareBufferExternalMemory::GetVkFormatFromAHBFormat(ahbFormat);
154*03ce13f7SAndroid Build Coastguard Worker 	VkFormatProperties formatProperties;
155*03ce13f7SAndroid Build Coastguard Worker 	vk::PhysicalDevice::GetFormatProperties(vk::Format(format), &formatProperties);
156*03ce13f7SAndroid Build Coastguard Worker 
157*03ce13f7SAndroid Build Coastguard Worker 	formatProperties.optimalTilingFeatures |= VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT;
158*03ce13f7SAndroid Build Coastguard Worker 
159*03ce13f7SAndroid Build Coastguard Worker 	// TODO: b/167896057
160*03ce13f7SAndroid Build Coastguard Worker 	//   The correct formatFeatureFlags depends on consumer and format
161*03ce13f7SAndroid Build Coastguard Worker 	//   So this solution is incomplete without more information
162*03ce13f7SAndroid Build Coastguard Worker 	features |= formatProperties.linearTilingFeatures |
163*03ce13f7SAndroid Build Coastguard Worker 	            formatProperties.optimalTilingFeatures |
164*03ce13f7SAndroid Build Coastguard Worker 	            formatProperties.bufferFeatures;
165*03ce13f7SAndroid Build Coastguard Worker 
166*03ce13f7SAndroid Build Coastguard Worker 	return features;
167*03ce13f7SAndroid Build Coastguard Worker }
168*03ce13f7SAndroid Build Coastguard Worker 
169*03ce13f7SAndroid Build Coastguard Worker }  // namespace
170*03ce13f7SAndroid Build Coastguard Worker 
AllocateInfo(const vk::DeviceMemory::ExtendedAllocationInfo & extendedAllocationInfo)171*03ce13f7SAndroid Build Coastguard Worker AHardwareBufferExternalMemory::AllocateInfo::AllocateInfo(const vk::DeviceMemory::ExtendedAllocationInfo &extendedAllocationInfo)
172*03ce13f7SAndroid Build Coastguard Worker {
173*03ce13f7SAndroid Build Coastguard Worker 	if(extendedAllocationInfo.importAndroidHardwareBufferInfo)
174*03ce13f7SAndroid Build Coastguard Worker 	{
175*03ce13f7SAndroid Build Coastguard Worker 		importAhb = true;
176*03ce13f7SAndroid Build Coastguard Worker 		ahb = extendedAllocationInfo.importAndroidHardwareBufferInfo->buffer;
177*03ce13f7SAndroid Build Coastguard Worker 	}
178*03ce13f7SAndroid Build Coastguard Worker 
179*03ce13f7SAndroid Build Coastguard Worker 	if(extendedAllocationInfo.exportMemoryAllocateInfo)
180*03ce13f7SAndroid Build Coastguard Worker 	{
181*03ce13f7SAndroid Build Coastguard Worker 		if(extendedAllocationInfo.exportMemoryAllocateInfo->handleTypes == VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
182*03ce13f7SAndroid Build Coastguard Worker 		{
183*03ce13f7SAndroid Build Coastguard Worker 			exportAhb = true;
184*03ce13f7SAndroid Build Coastguard Worker 		}
185*03ce13f7SAndroid Build Coastguard Worker 		else
186*03ce13f7SAndroid Build Coastguard Worker 		{
187*03ce13f7SAndroid Build Coastguard Worker 			UNSUPPORTED("VkExportMemoryAllocateInfo::handleTypes %d", int(extendedAllocationInfo.exportMemoryAllocateInfo->handleTypes));
188*03ce13f7SAndroid Build Coastguard Worker 		}
189*03ce13f7SAndroid Build Coastguard Worker 	}
190*03ce13f7SAndroid Build Coastguard Worker 
191*03ce13f7SAndroid Build Coastguard Worker 	if(extendedAllocationInfo.dedicatedAllocateInfo)
192*03ce13f7SAndroid Build Coastguard Worker 	{
193*03ce13f7SAndroid Build Coastguard Worker 		dedicatedImageHandle = vk::Cast(extendedAllocationInfo.dedicatedAllocateInfo->image);
194*03ce13f7SAndroid Build Coastguard Worker 		dedicatedBufferHandle = vk::Cast(extendedAllocationInfo.dedicatedAllocateInfo->buffer);
195*03ce13f7SAndroid Build Coastguard Worker 	}
196*03ce13f7SAndroid Build Coastguard Worker }
197*03ce13f7SAndroid Build Coastguard Worker 
AHardwareBufferExternalMemory(const VkMemoryAllocateInfo * pCreateInfo,void * mem,const DeviceMemory::ExtendedAllocationInfo & extendedAllocationInfo,vk::Device * pDevice)198*03ce13f7SAndroid Build Coastguard Worker AHardwareBufferExternalMemory::AHardwareBufferExternalMemory(const VkMemoryAllocateInfo *pCreateInfo, void *mem, const DeviceMemory::ExtendedAllocationInfo &extendedAllocationInfo, vk::Device *pDevice)
199*03ce13f7SAndroid Build Coastguard Worker     : vk::DeviceMemory(pCreateInfo, extendedAllocationInfo, pDevice)
200*03ce13f7SAndroid Build Coastguard Worker     , allocateInfo(extendedAllocationInfo)
201*03ce13f7SAndroid Build Coastguard Worker {
202*03ce13f7SAndroid Build Coastguard Worker }
203*03ce13f7SAndroid Build Coastguard Worker 
~AHardwareBufferExternalMemory()204*03ce13f7SAndroid Build Coastguard Worker AHardwareBufferExternalMemory::~AHardwareBufferExternalMemory()
205*03ce13f7SAndroid Build Coastguard Worker {
206*03ce13f7SAndroid Build Coastguard Worker 	freeBuffer();
207*03ce13f7SAndroid Build Coastguard Worker }
208*03ce13f7SAndroid Build Coastguard Worker 
209*03ce13f7SAndroid Build Coastguard Worker // vkAllocateMemory
allocateBuffer()210*03ce13f7SAndroid Build Coastguard Worker VkResult AHardwareBufferExternalMemory::allocateBuffer()
211*03ce13f7SAndroid Build Coastguard Worker {
212*03ce13f7SAndroid Build Coastguard Worker 	if(allocateInfo.importAhb)
213*03ce13f7SAndroid Build Coastguard Worker 	{
214*03ce13f7SAndroid Build Coastguard Worker 		return importAndroidHardwareBuffer(allocateInfo.ahb, &buffer);
215*03ce13f7SAndroid Build Coastguard Worker 	}
216*03ce13f7SAndroid Build Coastguard Worker 	else
217*03ce13f7SAndroid Build Coastguard Worker 	{
218*03ce13f7SAndroid Build Coastguard Worker 		ASSERT(allocateInfo.exportAhb);
219*03ce13f7SAndroid Build Coastguard Worker 		return allocateAndroidHardwareBuffer(allocationSize, &buffer);
220*03ce13f7SAndroid Build Coastguard Worker 	}
221*03ce13f7SAndroid Build Coastguard Worker }
222*03ce13f7SAndroid Build Coastguard Worker 
freeBuffer()223*03ce13f7SAndroid Build Coastguard Worker void AHardwareBufferExternalMemory::freeBuffer()
224*03ce13f7SAndroid Build Coastguard Worker {
225*03ce13f7SAndroid Build Coastguard Worker 	if(ahb != nullptr)
226*03ce13f7SAndroid Build Coastguard Worker 	{
227*03ce13f7SAndroid Build Coastguard Worker 		unlockAndroidHardwareBuffer();
228*03ce13f7SAndroid Build Coastguard Worker 
229*03ce13f7SAndroid Build Coastguard Worker 		AHardwareBuffer_release(ahb);
230*03ce13f7SAndroid Build Coastguard Worker 		ahb = nullptr;
231*03ce13f7SAndroid Build Coastguard Worker 	}
232*03ce13f7SAndroid Build Coastguard Worker }
233*03ce13f7SAndroid Build Coastguard Worker 
importAndroidHardwareBuffer(AHardwareBuffer * buffer,void ** pBuffer)234*03ce13f7SAndroid Build Coastguard Worker VkResult AHardwareBufferExternalMemory::importAndroidHardwareBuffer(AHardwareBuffer *buffer, void **pBuffer)
235*03ce13f7SAndroid Build Coastguard Worker {
236*03ce13f7SAndroid Build Coastguard Worker 	ahb = buffer;
237*03ce13f7SAndroid Build Coastguard Worker 
238*03ce13f7SAndroid Build Coastguard Worker 	AHardwareBuffer_acquire(ahb);
239*03ce13f7SAndroid Build Coastguard Worker 	AHardwareBuffer_describe(ahb, &ahbDesc);
240*03ce13f7SAndroid Build Coastguard Worker 
241*03ce13f7SAndroid Build Coastguard Worker 	return lockAndroidHardwareBuffer(pBuffer);
242*03ce13f7SAndroid Build Coastguard Worker }
243*03ce13f7SAndroid Build Coastguard Worker 
allocateAndroidHardwareBuffer(size_t size,void ** pBuffer)244*03ce13f7SAndroid Build Coastguard Worker VkResult AHardwareBufferExternalMemory::allocateAndroidHardwareBuffer(size_t size, void **pBuffer)
245*03ce13f7SAndroid Build Coastguard Worker {
246*03ce13f7SAndroid Build Coastguard Worker 	if(allocateInfo.dedicatedImageHandle)
247*03ce13f7SAndroid Build Coastguard Worker 	{
248*03ce13f7SAndroid Build Coastguard Worker 		vk::Image *image = allocateInfo.dedicatedImageHandle;
249*03ce13f7SAndroid Build Coastguard Worker 		ASSERT(image->getArrayLayers() == 1);
250*03ce13f7SAndroid Build Coastguard Worker 
251*03ce13f7SAndroid Build Coastguard Worker 		VkExtent3D extent = image->getExtent();
252*03ce13f7SAndroid Build Coastguard Worker 
253*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.width = extent.width;
254*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.height = extent.height;
255*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.layers = image->getArrayLayers();
256*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.format = GetAHBFormatFromVkFormat(image->getFormat());
257*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.usage = GetAHBUsageFromVkImageFlags(image->getFlags(), image->getUsage());
258*03ce13f7SAndroid Build Coastguard Worker 	}
259*03ce13f7SAndroid Build Coastguard Worker 	else if(allocateInfo.dedicatedBufferHandle)
260*03ce13f7SAndroid Build Coastguard Worker 	{
261*03ce13f7SAndroid Build Coastguard Worker 		vk::Buffer *buffer = allocateInfo.dedicatedBufferHandle;
262*03ce13f7SAndroid Build Coastguard Worker 
263*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.width = static_cast<uint32_t>(buffer->getSize());
264*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.height = 1;
265*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.layers = 1;
266*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.format = AHARDWAREBUFFER_FORMAT_BLOB;
267*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.usage = GetAHBUsageFromVkBufferFlags(buffer->getFlags(), buffer->getUsage());
268*03ce13f7SAndroid Build Coastguard Worker 	}
269*03ce13f7SAndroid Build Coastguard Worker 	else
270*03ce13f7SAndroid Build Coastguard Worker 	{
271*03ce13f7SAndroid Build Coastguard Worker 		// Android Hardware Buffer Buffer Resources: "Android hardware buffers with a format of
272*03ce13f7SAndroid Build Coastguard Worker 		// AHARDWAREBUFFER_FORMAT_BLOB and usage that includes AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER can
273*03ce13f7SAndroid Build Coastguard Worker 		// be used as the backing store for VkBuffer objects. Such Android hardware buffers have a size
274*03ce13f7SAndroid Build Coastguard Worker 		// in bytes specified by their width; height and layers are both 1."
275*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.width = static_cast<uint32_t>(size);
276*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.height = 1;
277*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.layers = 1;
278*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.format = AHARDWAREBUFFER_FORMAT_BLOB;
279*03ce13f7SAndroid Build Coastguard Worker 		ahbDesc.usage = AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER | AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
280*03ce13f7SAndroid Build Coastguard Worker 	}
281*03ce13f7SAndroid Build Coastguard Worker 
282*03ce13f7SAndroid Build Coastguard Worker 	int ret = AHardwareBuffer_allocate(&ahbDesc, &ahb);
283*03ce13f7SAndroid Build Coastguard Worker 	if(ret != 0)
284*03ce13f7SAndroid Build Coastguard Worker 	{
285*03ce13f7SAndroid Build Coastguard Worker 		return VK_ERROR_OUT_OF_HOST_MEMORY;
286*03ce13f7SAndroid Build Coastguard Worker 	}
287*03ce13f7SAndroid Build Coastguard Worker 
288*03ce13f7SAndroid Build Coastguard Worker 	AHardwareBuffer_describe(ahb, &ahbDesc);
289*03ce13f7SAndroid Build Coastguard Worker 
290*03ce13f7SAndroid Build Coastguard Worker 	return lockAndroidHardwareBuffer(pBuffer);
291*03ce13f7SAndroid Build Coastguard Worker }
292*03ce13f7SAndroid Build Coastguard Worker 
lockAndroidHardwareBuffer(void ** pBuffer)293*03ce13f7SAndroid Build Coastguard Worker VkResult AHardwareBufferExternalMemory::lockAndroidHardwareBuffer(void **pBuffer)
294*03ce13f7SAndroid Build Coastguard Worker {
295*03ce13f7SAndroid Build Coastguard Worker 	uint64_t usage = 0;
296*03ce13f7SAndroid Build Coastguard Worker 	if(allocateInfo.dedicatedImageHandle)
297*03ce13f7SAndroid Build Coastguard Worker 	{
298*03ce13f7SAndroid Build Coastguard Worker 		usage = GetAHBLockUsageFromVkImageUsageFlags(allocateInfo.dedicatedImageHandle->getUsage());
299*03ce13f7SAndroid Build Coastguard Worker 	}
300*03ce13f7SAndroid Build Coastguard Worker 	else if(allocateInfo.dedicatedBufferHandle)
301*03ce13f7SAndroid Build Coastguard Worker 	{
302*03ce13f7SAndroid Build Coastguard Worker 		usage = GetAHBLockUsageFromVkBufferUsageFlags(allocateInfo.dedicatedBufferHandle->getUsage());
303*03ce13f7SAndroid Build Coastguard Worker 	}
304*03ce13f7SAndroid Build Coastguard Worker 	else
305*03ce13f7SAndroid Build Coastguard Worker 	{
306*03ce13f7SAndroid Build Coastguard Worker 		usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
307*03ce13f7SAndroid Build Coastguard Worker 	}
308*03ce13f7SAndroid Build Coastguard Worker 
309*03ce13f7SAndroid Build Coastguard Worker 	// Empty fence, lock immedietly.
310*03ce13f7SAndroid Build Coastguard Worker 	int32_t fence = -1;
311*03ce13f7SAndroid Build Coastguard Worker 
312*03ce13f7SAndroid Build Coastguard Worker 	// Empty rect, lock entire buffer.
313*03ce13f7SAndroid Build Coastguard Worker 	ARect *rect = nullptr;
314*03ce13f7SAndroid Build Coastguard Worker 
315*03ce13f7SAndroid Build Coastguard Worker 	int ret = AHardwareBuffer_lockPlanes(ahb, usage, fence, rect, &ahbPlanes);
316*03ce13f7SAndroid Build Coastguard Worker 	if(ret != 0)
317*03ce13f7SAndroid Build Coastguard Worker 	{
318*03ce13f7SAndroid Build Coastguard Worker 		return VK_ERROR_OUT_OF_HOST_MEMORY;
319*03ce13f7SAndroid Build Coastguard Worker 	}
320*03ce13f7SAndroid Build Coastguard Worker 
321*03ce13f7SAndroid Build Coastguard Worker 	*pBuffer = ahbPlanes.planes[0].data;
322*03ce13f7SAndroid Build Coastguard Worker 
323*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
324*03ce13f7SAndroid Build Coastguard Worker }
325*03ce13f7SAndroid Build Coastguard Worker 
unlockAndroidHardwareBuffer()326*03ce13f7SAndroid Build Coastguard Worker VkResult AHardwareBufferExternalMemory::unlockAndroidHardwareBuffer()
327*03ce13f7SAndroid Build Coastguard Worker {
328*03ce13f7SAndroid Build Coastguard Worker 	int ret = AHardwareBuffer_unlock(ahb, /*fence=*/nullptr);
329*03ce13f7SAndroid Build Coastguard Worker 	if(ret != 0)
330*03ce13f7SAndroid Build Coastguard Worker 	{
331*03ce13f7SAndroid Build Coastguard Worker 		return VK_ERROR_UNKNOWN;
332*03ce13f7SAndroid Build Coastguard Worker 	}
333*03ce13f7SAndroid Build Coastguard Worker 
334*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
335*03ce13f7SAndroid Build Coastguard Worker }
336*03ce13f7SAndroid Build Coastguard Worker 
exportAndroidHardwareBuffer(AHardwareBuffer ** pAhb) const337*03ce13f7SAndroid Build Coastguard Worker VkResult AHardwareBufferExternalMemory::exportAndroidHardwareBuffer(AHardwareBuffer **pAhb) const
338*03ce13f7SAndroid Build Coastguard Worker {
339*03ce13f7SAndroid Build Coastguard Worker 	if(getFlagBit() != VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
340*03ce13f7SAndroid Build Coastguard Worker 	{
341*03ce13f7SAndroid Build Coastguard Worker 		return VK_ERROR_OUT_OF_HOST_MEMORY;
342*03ce13f7SAndroid Build Coastguard Worker 	}
343*03ce13f7SAndroid Build Coastguard Worker 
344*03ce13f7SAndroid Build Coastguard Worker 	// Each call to vkGetMemoryAndroidHardwareBufferANDROID *must* return an Android hardware buffer with a new reference
345*03ce13f7SAndroid Build Coastguard Worker 	// acquired in addition to the reference held by the VkDeviceMemory. To avoid leaking resources, the application *must*
346*03ce13f7SAndroid Build Coastguard Worker 	// release the reference by calling AHardwareBuffer_release when it is no longer needed.
347*03ce13f7SAndroid Build Coastguard Worker 	AHardwareBuffer_acquire(ahb);
348*03ce13f7SAndroid Build Coastguard Worker 	*pAhb = ahb;
349*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
350*03ce13f7SAndroid Build Coastguard Worker }
351*03ce13f7SAndroid Build Coastguard Worker 
GetVkFormatFromAHBFormat(uint32_t ahbFormat)352*03ce13f7SAndroid Build Coastguard Worker VkFormat AHardwareBufferExternalMemory::GetVkFormatFromAHBFormat(uint32_t ahbFormat)
353*03ce13f7SAndroid Build Coastguard Worker {
354*03ce13f7SAndroid Build Coastguard Worker 	switch(ahbFormat)
355*03ce13f7SAndroid Build Coastguard Worker 	{
356*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_BLOB:
357*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_UNDEFINED;
358*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_D16_UNORM:
359*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_D16_UNORM;
360*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_D24_UNORM:
361*03ce13f7SAndroid Build Coastguard Worker 		UNSUPPORTED("AHardwareBufferExternalMemory::AndroidHardwareBuffer_Format AHARDWAREBUFFER_FORMAT_D24_UNORM");
362*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_X8_D24_UNORM_PACK32;
363*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT:
364*03ce13f7SAndroid Build Coastguard Worker 		UNSUPPORTED("AHardwareBufferExternalMemory::AndroidHardwareBuffer_Format AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT");
365*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_X8_D24_UNORM_PACK32;
366*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_D32_FLOAT:
367*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_D32_SFLOAT;
368*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT:
369*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_D32_SFLOAT_S8_UINT;
370*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
371*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
372*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
373*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_R16G16B16A16_SFLOAT;
374*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
375*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_R5G6B5_UNORM_PACK16;
376*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_R8_UNORM:
377*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_R8_UNORM;
378*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
379*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_R8G8B8A8_UNORM;
380*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM:
381*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_R8G8B8A8_UNORM;
382*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
383*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_R8G8B8_UNORM;
384*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_S8_UINT:
385*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_S8_UINT;
386*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420:
387*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_YV12:
388*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
389*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_YCbCr_P010:
390*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16;
391*03ce13f7SAndroid Build Coastguard Worker 	default:
392*03ce13f7SAndroid Build Coastguard Worker 		UNSUPPORTED("AHardwareBufferExternalMemory::AHardwareBuffer_Format %d", int(ahbFormat));
393*03ce13f7SAndroid Build Coastguard Worker 		return VK_FORMAT_UNDEFINED;
394*03ce13f7SAndroid Build Coastguard Worker 	}
395*03ce13f7SAndroid Build Coastguard Worker }
396*03ce13f7SAndroid Build Coastguard Worker 
GetAndroidHardwareBufferFormatProperties(const AHardwareBuffer_Desc & ahbDesc,VkAndroidHardwareBufferFormatPropertiesANDROID * pFormat)397*03ce13f7SAndroid Build Coastguard Worker VkResult AHardwareBufferExternalMemory::GetAndroidHardwareBufferFormatProperties(const AHardwareBuffer_Desc &ahbDesc, VkAndroidHardwareBufferFormatPropertiesANDROID *pFormat)
398*03ce13f7SAndroid Build Coastguard Worker {
399*03ce13f7SAndroid Build Coastguard Worker 	pFormat->sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID;
400*03ce13f7SAndroid Build Coastguard Worker 	pFormat->pNext = nullptr;
401*03ce13f7SAndroid Build Coastguard Worker 	pFormat->format = GetVkFormatFromAHBFormat(ahbDesc.format);
402*03ce13f7SAndroid Build Coastguard Worker 	pFormat->externalFormat = ahbDesc.format;
403*03ce13f7SAndroid Build Coastguard Worker 	pFormat->formatFeatures = GetVkFormatFeaturesFromAHBFormat(ahbDesc.format);
404*03ce13f7SAndroid Build Coastguard Worker 	pFormat->samplerYcbcrConversionComponents = { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY };
405*03ce13f7SAndroid Build Coastguard Worker 	pFormat->suggestedYcbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601;
406*03ce13f7SAndroid Build Coastguard Worker 	pFormat->suggestedYcbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_NARROW;
407*03ce13f7SAndroid Build Coastguard Worker 	pFormat->suggestedXChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN;
408*03ce13f7SAndroid Build Coastguard Worker 	pFormat->suggestedYChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN;
409*03ce13f7SAndroid Build Coastguard Worker 
410*03ce13f7SAndroid Build Coastguard Worker 	// YUV formats are not listed in the AHardwareBuffer Format Equivalence table in the Vulkan spec.
411*03ce13f7SAndroid Build Coastguard Worker 	// Clients must use VkExternalFormatANDROID.
412*03ce13f7SAndroid Build Coastguard Worker 	if(pFormat->format == VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM ||
413*03ce13f7SAndroid Build Coastguard Worker 	   pFormat->format == VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16)
414*03ce13f7SAndroid Build Coastguard Worker 	{
415*03ce13f7SAndroid Build Coastguard Worker 		pFormat->format = VK_FORMAT_UNDEFINED;
416*03ce13f7SAndroid Build Coastguard Worker 	}
417*03ce13f7SAndroid Build Coastguard Worker 
418*03ce13f7SAndroid Build Coastguard Worker 	return VK_SUCCESS;
419*03ce13f7SAndroid Build Coastguard Worker }
420*03ce13f7SAndroid Build Coastguard Worker 
GetAndroidHardwareBufferProperties(VkDevice & device,const AHardwareBuffer * buffer,VkAndroidHardwareBufferPropertiesANDROID * pProperties)421*03ce13f7SAndroid Build Coastguard Worker VkResult AHardwareBufferExternalMemory::GetAndroidHardwareBufferProperties(VkDevice &device, const AHardwareBuffer *buffer, VkAndroidHardwareBufferPropertiesANDROID *pProperties)
422*03ce13f7SAndroid Build Coastguard Worker {
423*03ce13f7SAndroid Build Coastguard Worker 	VkResult result = VK_SUCCESS;
424*03ce13f7SAndroid Build Coastguard Worker 
425*03ce13f7SAndroid Build Coastguard Worker 	AHardwareBuffer_Desc ahbDesc;
426*03ce13f7SAndroid Build Coastguard Worker 	AHardwareBuffer_describe(buffer, &ahbDesc);
427*03ce13f7SAndroid Build Coastguard Worker 
428*03ce13f7SAndroid Build Coastguard Worker 	if(pProperties->pNext != nullptr)
429*03ce13f7SAndroid Build Coastguard Worker 	{
430*03ce13f7SAndroid Build Coastguard Worker 		result = GetAndroidHardwareBufferFormatProperties(ahbDesc, (VkAndroidHardwareBufferFormatPropertiesANDROID *)pProperties->pNext);
431*03ce13f7SAndroid Build Coastguard Worker 		if(result != VK_SUCCESS)
432*03ce13f7SAndroid Build Coastguard Worker 		{
433*03ce13f7SAndroid Build Coastguard Worker 			return result;
434*03ce13f7SAndroid Build Coastguard Worker 		}
435*03ce13f7SAndroid Build Coastguard Worker 	}
436*03ce13f7SAndroid Build Coastguard Worker 
437*03ce13f7SAndroid Build Coastguard Worker 	const VkPhysicalDeviceMemoryProperties phyDeviceMemProps = vk::PhysicalDevice::GetMemoryProperties();
438*03ce13f7SAndroid Build Coastguard Worker 	pProperties->memoryTypeBits = phyDeviceMemProps.memoryTypes[0].propertyFlags;
439*03ce13f7SAndroid Build Coastguard Worker 
440*03ce13f7SAndroid Build Coastguard Worker 	if(ahbDesc.format == AHARDWAREBUFFER_FORMAT_BLOB)
441*03ce13f7SAndroid Build Coastguard Worker 	{
442*03ce13f7SAndroid Build Coastguard Worker 		pProperties->allocationSize = ahbDesc.width;
443*03ce13f7SAndroid Build Coastguard Worker 	}
444*03ce13f7SAndroid Build Coastguard Worker 	else
445*03ce13f7SAndroid Build Coastguard Worker 	{
446*03ce13f7SAndroid Build Coastguard Worker 		VkImageCreateInfo info = {};
447*03ce13f7SAndroid Build Coastguard Worker 		info.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
448*03ce13f7SAndroid Build Coastguard Worker 		info.pNext = nullptr;
449*03ce13f7SAndroid Build Coastguard Worker 		info.flags = 0;
450*03ce13f7SAndroid Build Coastguard Worker 		info.imageType = VK_IMAGE_TYPE_2D;
451*03ce13f7SAndroid Build Coastguard Worker 		info.format = GetVkFormatFromAHBFormat(ahbDesc.format);
452*03ce13f7SAndroid Build Coastguard Worker 		info.extent.width = ahbDesc.width;
453*03ce13f7SAndroid Build Coastguard Worker 		info.extent.height = ahbDesc.height;
454*03ce13f7SAndroid Build Coastguard Worker 		info.extent.depth = 1;
455*03ce13f7SAndroid Build Coastguard Worker 		info.mipLevels = 1;
456*03ce13f7SAndroid Build Coastguard Worker 		info.arrayLayers = 1;
457*03ce13f7SAndroid Build Coastguard Worker 		info.samples = VK_SAMPLE_COUNT_1_BIT;
458*03ce13f7SAndroid Build Coastguard Worker 		info.tiling = VK_IMAGE_TILING_OPTIMAL;
459*03ce13f7SAndroid Build Coastguard Worker 		info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
460*03ce13f7SAndroid Build Coastguard Worker 
461*03ce13f7SAndroid Build Coastguard Worker 		VkImage Image;
462*03ce13f7SAndroid Build Coastguard Worker 
463*03ce13f7SAndroid Build Coastguard Worker 		result = vk::Image::Create(vk::NULL_ALLOCATION_CALLBACKS, &info, &Image, vk::Cast(device));
464*03ce13f7SAndroid Build Coastguard Worker 		if(result != VK_SUCCESS)
465*03ce13f7SAndroid Build Coastguard Worker 		{
466*03ce13f7SAndroid Build Coastguard Worker 			return result;
467*03ce13f7SAndroid Build Coastguard Worker 		}
468*03ce13f7SAndroid Build Coastguard Worker 
469*03ce13f7SAndroid Build Coastguard Worker 		pProperties->allocationSize = vk::Cast(Image)->getMemoryRequirements().size;
470*03ce13f7SAndroid Build Coastguard Worker 		vk::destroy(Image, vk::NULL_ALLOCATION_CALLBACKS);
471*03ce13f7SAndroid Build Coastguard Worker 	}
472*03ce13f7SAndroid Build Coastguard Worker 
473*03ce13f7SAndroid Build Coastguard Worker 	return result;
474*03ce13f7SAndroid Build Coastguard Worker }
475*03ce13f7SAndroid Build Coastguard Worker 
externalImageRowPitchBytes(VkImageAspectFlagBits aspect) const476*03ce13f7SAndroid Build Coastguard Worker int AHardwareBufferExternalMemory::externalImageRowPitchBytes(VkImageAspectFlagBits aspect) const
477*03ce13f7SAndroid Build Coastguard Worker {
478*03ce13f7SAndroid Build Coastguard Worker 	ASSERT(allocateInfo.dedicatedImageHandle != nullptr);
479*03ce13f7SAndroid Build Coastguard Worker 
480*03ce13f7SAndroid Build Coastguard Worker 	switch(ahbDesc.format)
481*03ce13f7SAndroid Build Coastguard Worker 	{
482*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420:
483*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_YV12:
484*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_YCbCr_P010:
485*03ce13f7SAndroid Build Coastguard Worker 		switch(aspect)
486*03ce13f7SAndroid Build Coastguard Worker 		{
487*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_ASPECT_PLANE_0_BIT:
488*03ce13f7SAndroid Build Coastguard Worker 			return static_cast<int>(ahbPlanes.planes[0].rowStride);
489*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_ASPECT_PLANE_1_BIT:
490*03ce13f7SAndroid Build Coastguard Worker 			return static_cast<int>(ahbPlanes.planes[1].rowStride);
491*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_ASPECT_PLANE_2_BIT:
492*03ce13f7SAndroid Build Coastguard Worker 			return static_cast<int>(ahbPlanes.planes[2].rowStride);
493*03ce13f7SAndroid Build Coastguard Worker 		default:
494*03ce13f7SAndroid Build Coastguard Worker 			UNSUPPORTED("Unsupported aspect %d for AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420", int(aspect));
495*03ce13f7SAndroid Build Coastguard Worker 			return 0;
496*03ce13f7SAndroid Build Coastguard Worker 		}
497*03ce13f7SAndroid Build Coastguard Worker 		break;
498*03ce13f7SAndroid Build Coastguard Worker 	default:
499*03ce13f7SAndroid Build Coastguard Worker 		break;
500*03ce13f7SAndroid Build Coastguard Worker 	}
501*03ce13f7SAndroid Build Coastguard Worker 	return static_cast<int>(ahbPlanes.planes[0].rowStride);
502*03ce13f7SAndroid Build Coastguard Worker }
503*03ce13f7SAndroid Build Coastguard Worker 
504*03ce13f7SAndroid Build Coastguard Worker // TODO(b/208505033): Treat each image plane data pointer as a separate address instead of an offset.
externalImageMemoryOffset(VkImageAspectFlagBits aspect) const505*03ce13f7SAndroid Build Coastguard Worker VkDeviceSize AHardwareBufferExternalMemory::externalImageMemoryOffset(VkImageAspectFlagBits aspect) const
506*03ce13f7SAndroid Build Coastguard Worker {
507*03ce13f7SAndroid Build Coastguard Worker 	ASSERT(allocateInfo.dedicatedImageHandle != nullptr);
508*03ce13f7SAndroid Build Coastguard Worker 
509*03ce13f7SAndroid Build Coastguard Worker 	switch(ahbDesc.format)
510*03ce13f7SAndroid Build Coastguard Worker 	{
511*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420:
512*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_YV12:
513*03ce13f7SAndroid Build Coastguard Worker 	case AHARDWAREBUFFER_FORMAT_YCbCr_P010:
514*03ce13f7SAndroid Build Coastguard Worker 		switch(aspect)
515*03ce13f7SAndroid Build Coastguard Worker 		{
516*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_ASPECT_PLANE_0_BIT:
517*03ce13f7SAndroid Build Coastguard Worker 			return 0;
518*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_ASPECT_PLANE_1_BIT:
519*03ce13f7SAndroid Build Coastguard Worker 			return reinterpret_cast<const char *>(ahbPlanes.planes[1].data) -
520*03ce13f7SAndroid Build Coastguard Worker 			       reinterpret_cast<const char *>(ahbPlanes.planes[0].data);
521*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_ASPECT_PLANE_2_BIT:
522*03ce13f7SAndroid Build Coastguard Worker 			return reinterpret_cast<const char *>(ahbPlanes.planes[2].data) -
523*03ce13f7SAndroid Build Coastguard Worker 			       reinterpret_cast<const char *>(ahbPlanes.planes[0].data);
524*03ce13f7SAndroid Build Coastguard Worker 		default:
525*03ce13f7SAndroid Build Coastguard Worker 			UNSUPPORTED("Unsupported aspect %d for AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420", int(aspect));
526*03ce13f7SAndroid Build Coastguard Worker 			return 0;
527*03ce13f7SAndroid Build Coastguard Worker 		}
528*03ce13f7SAndroid Build Coastguard Worker 		break;
529*03ce13f7SAndroid Build Coastguard Worker 	default:
530*03ce13f7SAndroid Build Coastguard Worker 		break;
531*03ce13f7SAndroid Build Coastguard Worker 	}
532*03ce13f7SAndroid Build Coastguard Worker 	return 0;
533*03ce13f7SAndroid Build Coastguard Worker }
534*03ce13f7SAndroid Build Coastguard Worker 
535*03ce13f7SAndroid Build Coastguard Worker #ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
getMemoryObjectId() const536*03ce13f7SAndroid Build Coastguard Worker uint64_t AHardwareBufferExternalMemory::getMemoryObjectId() const
537*03ce13f7SAndroid Build Coastguard Worker {
538*03ce13f7SAndroid Build Coastguard Worker 	uint64_t id = 0;
539*03ce13f7SAndroid Build Coastguard Worker 	int ret = AHardwareBuffer_getId(ahb, &id);
540*03ce13f7SAndroid Build Coastguard Worker 	ASSERT(ret == 0);
541*03ce13f7SAndroid Build Coastguard Worker 	return id;
542*03ce13f7SAndroid Build Coastguard Worker }
543*03ce13f7SAndroid Build Coastguard Worker #endif  // SWIFTSHADER_DEVICE_MEMORY_REPORT
544