AHardwareBuffer.cpp revision ec3717413332336c7b86545eebcfce8c0681b2dc
1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "AHardwareBuffer"
18
19#include <vndk/hardware_buffer.h>
20
21#include <errno.h>
22#include <sys/socket.h>
23#include <memory>
24
25#include <cutils/native_handle.h>
26#include <log/log.h>
27#include <utils/StrongPointer.h>
28#include <ui/GraphicBuffer.h>
29#include <system/graphics.h>
30#include <hardware/gralloc1.h>
31#include <grallocusage/GrallocUsageConversion.h>
32
33#include <private/android/AHardwareBufferHelpers.h>
34
35
36static constexpr int kFdBufferSize = 128 * sizeof(int);  // 128 ints
37
38using namespace android;
39
40// ----------------------------------------------------------------------------
41// Public functions
42// ----------------------------------------------------------------------------
43
44int AHardwareBuffer_allocate(const AHardwareBuffer_Desc* desc, AHardwareBuffer** outBuffer) {
45    if (!outBuffer || !desc)
46        return BAD_VALUE;
47
48    int format = AHardwareBuffer_convertToPixelFormat(desc->format);
49    if (format == 0) {
50        ALOGE("Invalid pixel format %u", desc->format);
51        return BAD_VALUE;
52    }
53
54    if (desc->format == AHARDWAREBUFFER_FORMAT_BLOB && desc->height != 1) {
55        ALOGE("Height must be 1 when using the AHARDWAREBUFFER_FORMAT_BLOB format");
56        return BAD_VALUE;
57    }
58
59    uint64_t producerUsage = 0;
60    uint64_t consumerUsage = 0;
61    AHardwareBuffer_convertToGrallocUsageBits(&producerUsage, &consumerUsage, desc->usage0,
62            desc->usage1);
63
64    sp<GraphicBuffer> gbuffer(new GraphicBuffer(
65            desc->width, desc->height, format, desc->layers, producerUsage, consumerUsage,
66            std::string("AHardwareBuffer pid [") + std::to_string(getpid()) + "]"));
67
68    status_t err = gbuffer->initCheck();
69    if (err != 0 || gbuffer->handle == 0) {
70        if (err == NO_MEMORY) {
71            GraphicBuffer::dumpAllocationsToSystemLog();
72        }
73        ALOGE("GraphicBuffer(w=%u, h=%u, lc=%u) failed (%s), handle=%p",
74                desc->width, desc->height, desc->layers, strerror(-err), gbuffer->handle);
75        return err;
76    }
77
78    *outBuffer = AHardwareBuffer_from_GraphicBuffer(gbuffer.get());
79
80    // Ensure the buffer doesn't get destroyed when the sp<> goes away.
81    AHardwareBuffer_acquire(*outBuffer);
82    return NO_ERROR;
83}
84
85void AHardwareBuffer_acquire(AHardwareBuffer* buffer) {
86    // incStrong/decStrong token must be the same, doesn't matter what it is
87    AHardwareBuffer_to_GraphicBuffer(buffer)->incStrong((void*)AHardwareBuffer_acquire);
88}
89
90void AHardwareBuffer_release(AHardwareBuffer* buffer) {
91    // incStrong/decStrong token must be the same, doesn't matter what it is
92    AHardwareBuffer_to_GraphicBuffer(buffer)->decStrong((void*)AHardwareBuffer_acquire);
93}
94
95void AHardwareBuffer_describe(const AHardwareBuffer* buffer,
96        AHardwareBuffer_Desc* outDesc) {
97    if (!buffer || !outDesc) return;
98
99    const GraphicBuffer* gbuffer = AHardwareBuffer_to_GraphicBuffer(buffer);
100
101    outDesc->width = gbuffer->getWidth();
102    outDesc->height = gbuffer->getHeight();
103    outDesc->layers = gbuffer->getLayerCount();
104
105    uint64_t producerUsage = 0;
106    uint64_t consumerUsage = 0;
107    android_convertGralloc0To1Usage(gbuffer->getUsage(), &producerUsage, &consumerUsage);
108    AHardwareBuffer_convertFromGrallocUsageBits(&outDesc->usage0, &outDesc->usage1,
109            producerUsage, consumerUsage);
110    outDesc->format = AHardwareBuffer_convertFromPixelFormat(
111            static_cast<uint32_t>(gbuffer->getPixelFormat()));
112}
113
114int AHardwareBuffer_lock(AHardwareBuffer* buffer, uint64_t usage0,
115        int32_t fence, const ARect* rect, void** outVirtualAddress) {
116    if (!buffer) return BAD_VALUE;
117
118    if (usage0 & ~(AHARDWAREBUFFER_USAGE0_CPU_READ_OFTEN |
119                   AHARDWAREBUFFER_USAGE0_CPU_WRITE_OFTEN)) {
120        ALOGE("Invalid usage flags passed to AHardwareBuffer_lock; only "
121                " AHARDWAREBUFFER_USAGE0_CPU_* flags are allowed");
122        return BAD_VALUE;
123    }
124
125    uint64_t producerUsage = 0;
126    uint64_t consumerUsage = 0;
127    AHardwareBuffer_convertToGrallocUsageBits(&producerUsage, &consumerUsage, usage0, 0);
128    GraphicBuffer* gBuffer = AHardwareBuffer_to_GraphicBuffer(buffer);
129    Rect bounds;
130    if (!rect) {
131        bounds.set(Rect(gBuffer->getWidth(), gBuffer->getHeight()));
132    } else {
133        bounds.set(Rect(rect->left, rect->top, rect->right, rect->bottom));
134    }
135    return gBuffer->lockAsync(producerUsage, consumerUsage, bounds,
136            outVirtualAddress, fence);
137}
138
139int AHardwareBuffer_unlock(AHardwareBuffer* buffer, int32_t* fence) {
140    if (!buffer) return BAD_VALUE;
141
142    GraphicBuffer* gBuffer = AHardwareBuffer_to_GraphicBuffer(buffer);
143    return gBuffer->unlockAsync(fence);
144}
145
146int AHardwareBuffer_sendHandleToUnixSocket(const AHardwareBuffer* buffer, int socketFd) {
147    if (!buffer) return BAD_VALUE;
148    const GraphicBuffer* gBuffer = AHardwareBuffer_to_GraphicBuffer(buffer);
149
150    size_t flattenedSize = gBuffer->getFlattenedSize();
151    size_t fdCount = gBuffer->getFdCount();
152
153    std::unique_ptr<uint8_t[]> data(new uint8_t[flattenedSize]);
154    std::unique_ptr<int[]> fds(new int[fdCount]);
155
156    // Make copies of needed items since flatten modifies them, and we don't
157    // want to send anything if there's an error during flatten.
158    size_t flattenedSizeCopy = flattenedSize;
159    size_t fdCountCopy = fdCount;
160    void* dataStart = data.get();
161    int* fdsStart = fds.get();
162    status_t err = gBuffer->flatten(dataStart, flattenedSizeCopy, fdsStart,
163            fdCountCopy);
164    if (err != NO_ERROR) {
165        return err;
166    }
167
168    struct iovec iov[1];
169    iov[0].iov_base = data.get();
170    iov[0].iov_len = flattenedSize;
171
172    char buf[CMSG_SPACE(kFdBufferSize)];
173    struct msghdr msg = {
174            .msg_control = buf,
175            .msg_controllen = sizeof(buf),
176            .msg_iov = &iov[0],
177            .msg_iovlen = 1,
178    };
179
180    struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
181    cmsg->cmsg_level = SOL_SOCKET;
182    cmsg->cmsg_type = SCM_RIGHTS;
183    cmsg->cmsg_len = CMSG_LEN(sizeof(int) * fdCount);
184    int* fdData = reinterpret_cast<int*>(CMSG_DATA(cmsg));
185    memcpy(fdData, fds.get(), sizeof(int) * fdCount);
186    msg.msg_controllen = cmsg->cmsg_len;
187
188    int result = sendmsg(socketFd, &msg, 0);
189    if (result <= 0) {
190        ALOGE("Error writing AHardwareBuffer to socket: error %#x (%s)",
191                result, strerror(errno));
192        return result;
193    }
194    return NO_ERROR;
195}
196
197int AHardwareBuffer_recvHandleFromUnixSocket(int socketFd, AHardwareBuffer** outBuffer) {
198    if (!outBuffer) return BAD_VALUE;
199
200    static constexpr int kMessageBufferSize = 4096 * sizeof(int);
201
202    std::unique_ptr<char[]> dataBuf(new char[kMessageBufferSize]);
203    char fdBuf[CMSG_SPACE(kFdBufferSize)];
204    struct iovec iov[1];
205    iov[0].iov_base = dataBuf.get();
206    iov[0].iov_len = kMessageBufferSize;
207
208    struct msghdr msg = {
209            .msg_control = fdBuf,
210            .msg_controllen = sizeof(fdBuf),
211            .msg_iov = &iov[0],
212            .msg_iovlen = 1,
213    };
214
215    int result = recvmsg(socketFd, &msg, 0);
216    if (result <= 0) {
217        ALOGE("Error reading AHardwareBuffer from socket: error %#x (%s)",
218                result, strerror(errno));
219        return result;
220    }
221
222    if (msg.msg_iovlen != 1) {
223        ALOGE("Error reading AHardwareBuffer from socket: bad data length");
224        return INVALID_OPERATION;
225    }
226
227    if (msg.msg_controllen % sizeof(int) != 0) {
228        ALOGE("Error reading AHardwareBuffer from socket: bad fd length");
229        return INVALID_OPERATION;
230    }
231
232    size_t dataLen = msg.msg_iov[0].iov_len;
233    const void* data = static_cast<const void*>(msg.msg_iov[0].iov_base);
234    if (!data) {
235        ALOGE("Error reading AHardwareBuffer from socket: no buffer data");
236        return INVALID_OPERATION;
237    }
238
239    struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
240    if (!cmsg) {
241        ALOGE("Error reading AHardwareBuffer from socket: no fd header");
242        return INVALID_OPERATION;
243    }
244
245    size_t fdCount = msg.msg_controllen >> 2;
246    const int* fdData = reinterpret_cast<const int*>(CMSG_DATA(cmsg));
247    if (!fdData) {
248        ALOGE("Error reading AHardwareBuffer from socket: no fd data");
249        return INVALID_OPERATION;
250    }
251
252    GraphicBuffer* gBuffer = new GraphicBuffer();
253    status_t err = gBuffer->unflatten(data, dataLen, fdData, fdCount);
254    if (err != NO_ERROR) {
255        return err;
256    }
257    *outBuffer = AHardwareBuffer_from_GraphicBuffer(gBuffer);
258    // Ensure the buffer has a positive ref-count.
259    AHardwareBuffer_acquire(*outBuffer);
260
261    return NO_ERROR;
262}
263
264
265// ----------------------------------------------------------------------------
266// VNDK functions
267// ----------------------------------------------------------------------------
268
269const native_handle_t* AHardwareBuffer_getNativeHandle(
270        const AHardwareBuffer* buffer) {
271    if (!buffer) return nullptr;
272    const GraphicBuffer* gbuffer = AHardwareBuffer_to_GraphicBuffer(buffer);
273    return gbuffer->handle;
274}
275
276
277// ----------------------------------------------------------------------------
278// Helpers implementation
279// ----------------------------------------------------------------------------
280
281namespace android {
282
283// A 1:1 mapping of AHardwaqreBuffer bitmasks to gralloc1 bitmasks.
284struct UsageMaskMapping {
285    uint64_t hardwareBufferMask;
286    uint64_t grallocMask;
287};
288
289static constexpr UsageMaskMapping kUsage0ProducerMapping[] = {
290    { AHARDWAREBUFFER_USAGE0_CPU_WRITE, GRALLOC1_PRODUCER_USAGE_CPU_WRITE },
291    { AHARDWAREBUFFER_USAGE0_CPU_WRITE_OFTEN, GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN },
292    { AHARDWAREBUFFER_USAGE0_GPU_COLOR_OUTPUT, GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET },
293    { AHARDWAREBUFFER_USAGE0_PROTECTED_CONTENT, GRALLOC1_PRODUCER_USAGE_PROTECTED },
294    { AHARDWAREBUFFER_USAGE0_SENSOR_DIRECT_DATA, GRALLOC1_PRODUCER_USAGE_SENSOR_DIRECT_DATA },
295};
296
297static constexpr UsageMaskMapping kUsage1ProducerMapping[] = {
298    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_0, GRALLOC1_PRODUCER_USAGE_PRIVATE_0 },
299    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_1, GRALLOC1_PRODUCER_USAGE_PRIVATE_1 },
300    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_2, GRALLOC1_PRODUCER_USAGE_PRIVATE_2 },
301    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_3, GRALLOC1_PRODUCER_USAGE_PRIVATE_3 },
302    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_4, GRALLOC1_PRODUCER_USAGE_PRIVATE_4 },
303    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_5, GRALLOC1_PRODUCER_USAGE_PRIVATE_5 },
304    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_6, GRALLOC1_PRODUCER_USAGE_PRIVATE_6 },
305    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_7, GRALLOC1_PRODUCER_USAGE_PRIVATE_7 },
306    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_8, GRALLOC1_PRODUCER_USAGE_PRIVATE_8 },
307    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_9, GRALLOC1_PRODUCER_USAGE_PRIVATE_9 },
308    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_10, GRALLOC1_PRODUCER_USAGE_PRIVATE_10 },
309    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_11, GRALLOC1_PRODUCER_USAGE_PRIVATE_11 },
310    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_12, GRALLOC1_PRODUCER_USAGE_PRIVATE_12 },
311    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_13, GRALLOC1_PRODUCER_USAGE_PRIVATE_13 },
312    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_14, GRALLOC1_PRODUCER_USAGE_PRIVATE_14 },
313    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_15, GRALLOC1_PRODUCER_USAGE_PRIVATE_15 },
314    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_16, GRALLOC1_PRODUCER_USAGE_PRIVATE_16 },
315    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_17, GRALLOC1_PRODUCER_USAGE_PRIVATE_17 },
316    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_18, GRALLOC1_PRODUCER_USAGE_PRIVATE_18 },
317    { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_19, GRALLOC1_PRODUCER_USAGE_PRIVATE_19 },
318};
319
320static constexpr UsageMaskMapping kUsage0ConsumerMapping[] = {
321    { AHARDWAREBUFFER_USAGE0_CPU_READ, GRALLOC1_CONSUMER_USAGE_CPU_READ },
322    { AHARDWAREBUFFER_USAGE0_CPU_READ_OFTEN, GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN },
323    { AHARDWAREBUFFER_USAGE0_GPU_SAMPLED_IMAGE, GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE },
324    { AHARDWAREBUFFER_USAGE0_GPU_DATA_BUFFER, GRALLOC1_CONSUMER_USAGE_GPU_DATA_BUFFER },
325    { AHARDWAREBUFFER_USAGE0_VIDEO_ENCODE, GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER },
326};
327
328static constexpr UsageMaskMapping kUsage1ConsumerMapping[] = {
329    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_0, GRALLOC1_CONSUMER_USAGE_PRIVATE_0 },
330    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_1, GRALLOC1_CONSUMER_USAGE_PRIVATE_1 },
331    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_2, GRALLOC1_CONSUMER_USAGE_PRIVATE_2 },
332    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_3, GRALLOC1_CONSUMER_USAGE_PRIVATE_3 },
333    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_4, GRALLOC1_CONSUMER_USAGE_PRIVATE_4 },
334    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_5, GRALLOC1_CONSUMER_USAGE_PRIVATE_5 },
335    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_6, GRALLOC1_CONSUMER_USAGE_PRIVATE_6 },
336    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_7, GRALLOC1_CONSUMER_USAGE_PRIVATE_7 },
337    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_8, GRALLOC1_CONSUMER_USAGE_PRIVATE_8 },
338    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_9, GRALLOC1_CONSUMER_USAGE_PRIVATE_9 },
339    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_10, GRALLOC1_CONSUMER_USAGE_PRIVATE_10 },
340    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_11, GRALLOC1_CONSUMER_USAGE_PRIVATE_11 },
341    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_12, GRALLOC1_CONSUMER_USAGE_PRIVATE_12 },
342    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_13, GRALLOC1_CONSUMER_USAGE_PRIVATE_13 },
343    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_14, GRALLOC1_CONSUMER_USAGE_PRIVATE_14 },
344    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_15, GRALLOC1_CONSUMER_USAGE_PRIVATE_15 },
345    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_16, GRALLOC1_CONSUMER_USAGE_PRIVATE_16 },
346    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_17, GRALLOC1_CONSUMER_USAGE_PRIVATE_17 },
347    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_18, GRALLOC1_CONSUMER_USAGE_PRIVATE_18 },
348    { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_19, GRALLOC1_CONSUMER_USAGE_PRIVATE_19 },
349};
350
351static inline bool containsBits(uint64_t mask, uint64_t bitsToCheck) {
352    return (mask & bitsToCheck) == bitsToCheck && bitsToCheck;
353}
354
355uint32_t AHardwareBuffer_convertFromPixelFormat(uint32_t format) {
356    switch (format) {
357        case HAL_PIXEL_FORMAT_RGBA_8888:    return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
358        case HAL_PIXEL_FORMAT_RGBX_8888:    return AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM;
359        case HAL_PIXEL_FORMAT_RGB_565:      return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM;
360        case HAL_PIXEL_FORMAT_RGB_888:      return AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM;
361        case HAL_PIXEL_FORMAT_RGBA_FP16:    return AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT;
362        case HAL_PIXEL_FORMAT_RGBA_1010102: return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM;
363        case HAL_PIXEL_FORMAT_BLOB:         return AHARDWAREBUFFER_FORMAT_BLOB;
364        default:ALOGE("Unknown pixel format %u", format);
365            return 0;
366    }
367}
368
369uint32_t AHardwareBuffer_convertToPixelFormat(uint32_t format) {
370    switch (format) {
371        case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:         return HAL_PIXEL_FORMAT_RGBA_8888;
372        case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM:         return HAL_PIXEL_FORMAT_RGBX_8888;
373        case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:           return HAL_PIXEL_FORMAT_RGB_565;
374        case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:           return HAL_PIXEL_FORMAT_RGB_888;
375        case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:     return HAL_PIXEL_FORMAT_RGBA_FP16;
376        case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:      return HAL_PIXEL_FORMAT_RGBA_1010102;
377        case AHARDWAREBUFFER_FORMAT_BLOB:                   return HAL_PIXEL_FORMAT_BLOB;
378        default:ALOGE("Unknown AHardwareBuffer format %u", format);
379            return 0;
380    }
381}
382
383void AHardwareBuffer_convertToGrallocUsageBits(uint64_t* outProducerUsage,
384    uint64_t* outConsumerUsage, uint64_t usage0, uint64_t usage1) {
385    *outProducerUsage = 0;
386    *outConsumerUsage = 0;
387    for (const UsageMaskMapping& mapping : kUsage0ProducerMapping) {
388        if (containsBits(usage0, mapping.hardwareBufferMask)) {
389            *outProducerUsage |= mapping.grallocMask;
390        }
391    }
392    for (const UsageMaskMapping& mapping : kUsage1ProducerMapping) {
393        if (containsBits(usage1, mapping.hardwareBufferMask)) {
394            *outProducerUsage |= mapping.grallocMask;
395        }
396    }
397    for (const UsageMaskMapping& mapping : kUsage0ConsumerMapping) {
398        if (containsBits(usage0, mapping.hardwareBufferMask)) {
399            *outConsumerUsage |= mapping.grallocMask;
400        }
401    }
402    for (const UsageMaskMapping& mapping : kUsage1ConsumerMapping) {
403        if (containsBits(usage1, mapping.hardwareBufferMask)) {
404            *outConsumerUsage |= mapping.grallocMask;
405        }
406    }
407}
408
409void AHardwareBuffer_convertFromGrallocUsageBits(uint64_t* outUsage0, uint64_t* outUsage1,
410        uint64_t producerUsage, uint64_t consumerUsage) {
411    *outUsage0 = 0;
412    *outUsage1 = 0;
413    for (const UsageMaskMapping& mapping : kUsage0ProducerMapping) {
414        if (containsBits(producerUsage, mapping.grallocMask)) {
415            *outUsage0 |= mapping.hardwareBufferMask;
416        }
417    }
418    for (const UsageMaskMapping& mapping : kUsage1ProducerMapping) {
419        if (containsBits(producerUsage, mapping.grallocMask)) {
420            *outUsage1 |= mapping.hardwareBufferMask;
421        }
422    }
423    for (const UsageMaskMapping& mapping : kUsage0ConsumerMapping) {
424        if (containsBits(consumerUsage, mapping.grallocMask)) {
425            *outUsage0 |= mapping.hardwareBufferMask;
426        }
427    }
428    for (const UsageMaskMapping& mapping : kUsage1ConsumerMapping) {
429        if (containsBits(consumerUsage, mapping.grallocMask)) {
430            *outUsage1 |= mapping.hardwareBufferMask;
431        }
432    }
433}
434
435const GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(const AHardwareBuffer* buffer) {
436    return reinterpret_cast<const GraphicBuffer*>(buffer);
437}
438
439GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(AHardwareBuffer* buffer) {
440    return reinterpret_cast<GraphicBuffer*>(buffer);
441}
442
443const ANativeWindowBuffer* AHardwareBuffer_to_ANativeWindowBuffer(const AHardwareBuffer* buffer) {
444    return AHardwareBuffer_to_GraphicBuffer(buffer)->getNativeBuffer();
445}
446
447ANativeWindowBuffer* AHardwareBuffer_to_ANativeWindowBuffer(AHardwareBuffer* buffer) {
448    return AHardwareBuffer_to_GraphicBuffer(buffer)->getNativeBuffer();
449}
450
451AHardwareBuffer* AHardwareBuffer_from_GraphicBuffer(GraphicBuffer* buffer) {
452    return reinterpret_cast<AHardwareBuffer*>(buffer);
453}
454
455} // namespace android
456