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