13330b203039dea366d4981db1408a460134b2d2cMathias Agopian/*
23330b203039dea366d4981db1408a460134b2d2cMathias Agopian * Copyright (C) 2007 The Android Open Source Project
33330b203039dea366d4981db1408a460134b2d2cMathias Agopian *
43330b203039dea366d4981db1408a460134b2d2cMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
53330b203039dea366d4981db1408a460134b2d2cMathias Agopian * you may not use this file except in compliance with the License.
63330b203039dea366d4981db1408a460134b2d2cMathias Agopian * You may obtain a copy of the License at
73330b203039dea366d4981db1408a460134b2d2cMathias Agopian *
83330b203039dea366d4981db1408a460134b2d2cMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
93330b203039dea366d4981db1408a460134b2d2cMathias Agopian *
103330b203039dea366d4981db1408a460134b2d2cMathias Agopian * Unless required by applicable law or agreed to in writing, software
113330b203039dea366d4981db1408a460134b2d2cMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
123330b203039dea366d4981db1408a460134b2d2cMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133330b203039dea366d4981db1408a460134b2d2cMathias Agopian * See the License for the specific language governing permissions and
143330b203039dea366d4981db1408a460134b2d2cMathias Agopian * limitations under the License.
153330b203039dea366d4981db1408a460134b2d2cMathias Agopian */
163330b203039dea366d4981db1408a460134b2d2cMathias Agopian
1798e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian#define LOG_TAG "GraphicBuffer"
1898e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
193330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBuffer.h>
20311b479d7f50bc9e487cf9b4859843d0f4778382Mathias Agopian
21311b479d7f50bc9e487cf9b4859843d0f4778382Mathias Agopian#include <cutils/atomic.h>
22311b479d7f50bc9e487cf9b4859843d0f4778382Mathias Agopian
237992781a574b1c52a203e9271772da16f0f06812Jesse Hall#include <grallocusage/GrallocUsageConversion.h>
247992781a574b1c52a203e9271772da16f0f06812Jesse Hall
255bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu#include <ui/Gralloc2.h>
263330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBufferAllocator.h>
273330b203039dea366d4981db1408a460134b2d2cMathias Agopian#include <ui/GraphicBufferMapper.h>
283330b203039dea366d4981db1408a460134b2d2cMathias Agopian
293330b203039dea366d4981db1408a460134b2d2cMathias Agopiannamespace android {
303330b203039dea366d4981db1408a460134b2d2cMathias Agopian
313330b203039dea366d4981db1408a460134b2d2cMathias Agopian// ===========================================================================
32697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev// Buffer and implementation of ANativeWindowBuffer
333330b203039dea366d4981db1408a460134b2d2cMathias Agopian// ===========================================================================
343330b203039dea366d4981db1408a460134b2d2cMathias Agopian
35b1363d37fc6a661508fad106eb7698c5850a6c17Dan Stozastatic uint64_t getUniqueId() {
36b1363d37fc6a661508fad106eb7698c5850a6c17Dan Stoza    static volatile int32_t nextId = 0;
37b1363d37fc6a661508fad106eb7698c5850a6c17Dan Stoza    uint64_t id = static_cast<uint64_t>(getpid()) << 32;
38b1363d37fc6a661508fad106eb7698c5850a6c17Dan Stoza    id |= static_cast<uint32_t>(android_atomic_inc(&nextId));
39b1363d37fc6a661508fad106eb7698c5850a6c17Dan Stoza    return id;
40b1363d37fc6a661508fad106eb7698c5850a6c17Dan Stoza}
41b1363d37fc6a661508fad106eb7698c5850a6c17Dan Stoza
42f543e5a7110868647e6dc16788b72ad7de80fa38Mathias Agopiansp<GraphicBuffer> GraphicBuffer::from(ANativeWindowBuffer* anwb) {
43f543e5a7110868647e6dc16788b72ad7de80fa38Mathias Agopian    return static_cast<GraphicBuffer *>(anwb);
44f543e5a7110868647e6dc16788b72ad7de80fa38Mathias Agopian}
45f543e5a7110868647e6dc16788b72ad7de80fa38Mathias Agopian
463330b203039dea366d4981db1408a460134b2d2cMathias AgopianGraphicBuffer::GraphicBuffer()
4754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    : BASE(), mOwner(ownData), mBufferMapper(GraphicBufferMapper::get()),
4853390e1e8c33ebee5bb8100e846f5263ba05ff73Pablo Ceballos      mInitCheck(NO_ERROR), mId(getUniqueId()), mGenerationNumber(0)
49b1363d37fc6a661508fad106eb7698c5850a6c17Dan Stoza{
5001049c8321aab30cd431e2febeddd79242ae5a4fDan Stoza    width  =
5101049c8321aab30cd431e2febeddd79242ae5a4fDan Stoza    height =
5201049c8321aab30cd431e2febeddd79242ae5a4fDan Stoza    stride =
5301049c8321aab30cd431e2febeddd79242ae5a4fDan Stoza    format =
543330b203039dea366d4981db1408a460134b2d2cMathias Agopian    usage  = 0;
55841abed655e96e51506ae6a78e6b4dab6740bfd7Mathias Agopian    layerCount = 0;
563330b203039dea366d4981db1408a460134b2d2cMathias Agopian    handle = NULL;
573330b203039dea366d4981db1408a460134b2d2cMathias Agopian}
583330b203039dea366d4981db1408a460134b2d2cMathias Agopian
59b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu// deprecated
60d31824004277f554000417cea349d69f18655e95Dan StozaGraphicBuffer::GraphicBuffer(uint32_t inWidth, uint32_t inHeight,
61024e9313ce69ced1f853d737de680ef9f50ed26dDan Stoza        PixelFormat inFormat, uint32_t inUsage, std::string requestorName)
6282c049843870fc72ff36f48b970dfaf413db0687Chris Forbes    : GraphicBuffer(inWidth, inHeight, inFormat, 1, static_cast<uint64_t>(inUsage),
63b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu            requestorName)
643330b203039dea366d4981db1408a460134b2d2cMathias Agopian{
653330b203039dea366d4981db1408a460134b2d2cMathias Agopian}
663330b203039dea366d4981db1408a460134b2d2cMathias Agopian
67d31824004277f554000417cea349d69f18655e95Dan StozaGraphicBuffer::GraphicBuffer(uint32_t inWidth, uint32_t inHeight,
6882c049843870fc72ff36f48b970dfaf413db0687Chris Forbes        PixelFormat inFormat, uint32_t inLayerCount, uint64_t usage,
6982c049843870fc72ff36f48b970dfaf413db0687Chris Forbes        std::string requestorName)
70b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    : GraphicBuffer()
716ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner{
72b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    mInitCheck = initWithSize(inWidth, inHeight, inFormat, inLayerCount,
7382c049843870fc72ff36f48b970dfaf413db0687Chris Forbes            usage, std::move(requestorName));
746ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner}
756ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner
76b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu// deprecated
776ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig DonnerGraphicBuffer::GraphicBuffer(uint32_t inWidth, uint32_t inHeight,
786ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner        PixelFormat inFormat, uint32_t inLayerCount, uint32_t inUsage,
796ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner        uint32_t inStride, native_handle_t* inHandle, bool keepOwnership)
80b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    : GraphicBuffer(inHandle, keepOwnership ? TAKE_HANDLE : WRAP_HANDLE,
8182c049843870fc72ff36f48b970dfaf413db0687Chris Forbes            inWidth, inHeight, inFormat, inLayerCount, static_cast<uint64_t>(inUsage),
82b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu            inStride)
8354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian{
8454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian}
8554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
86b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I WuGraphicBuffer::GraphicBuffer(const native_handle_t* handle,
87b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu        HandleWrapMethod method, uint32_t width, uint32_t height,
88b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu        PixelFormat format, uint32_t layerCount,
8982c049843870fc72ff36f48b970dfaf413db0687Chris Forbes        uint64_t usage,
90b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu        uint32_t stride)
91b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    : GraphicBuffer()
92b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu{
93b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    mInitCheck = initWithHandle(handle, method, width, height, format,
9482c049843870fc72ff36f48b970dfaf413db0687Chris Forbes            layerCount, usage, stride);
95b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu}
96b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu
9798e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias AgopianGraphicBuffer::~GraphicBuffer()
983330b203039dea366d4981db1408a460134b2d2cMathias Agopian{
9998e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (handle) {
10098e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        free_handle();
1013330b203039dea366d4981db1408a460134b2d2cMathias Agopian    }
1023330b203039dea366d4981db1408a460134b2d2cMathias Agopian}
1033330b203039dea366d4981db1408a460134b2d2cMathias Agopian
10498e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopianvoid GraphicBuffer::free_handle()
1053330b203039dea366d4981db1408a460134b2d2cMathias Agopian{
10698e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (mOwner == ownHandle) {
1075bac7f36ee9d5ed0c2e8a0141909ca94351965a8Chia-I Wu        mBufferMapper.freeBuffer(handle);
10898e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    } else if (mOwner == ownData) {
10998e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        GraphicBufferAllocator& allocator(GraphicBufferAllocator::get());
11098e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        allocator.free(handle);
1113330b203039dea366d4981db1408a460134b2d2cMathias Agopian    }
11222e4cc36cd965046ea1b17376a40bdf3b6e23301Praveen Chavan    handle = NULL;
1133330b203039dea366d4981db1408a460134b2d2cMathias Agopian}
1143330b203039dea366d4981db1408a460134b2d2cMathias Agopian
1153330b203039dea366d4981db1408a460134b2d2cMathias Agopianstatus_t GraphicBuffer::initCheck() const {
116133caacf87423a738f31b6e1f58d0abcb377058dDan Stoza    return static_cast<status_t>(mInitCheck);
1173330b203039dea366d4981db1408a460134b2d2cMathias Agopian}
1183330b203039dea366d4981db1408a460134b2d2cMathias Agopian
119678bdd6349344df254cc0c3377a40fd99e216635Mathias Agopianvoid GraphicBuffer::dumpAllocationsToSystemLog()
120678bdd6349344df254cc0c3377a40fd99e216635Mathias Agopian{
121678bdd6349344df254cc0c3377a40fd99e216635Mathias Agopian    GraphicBufferAllocator::dumpToSystemLog();
122678bdd6349344df254cc0c3377a40fd99e216635Mathias Agopian}
123678bdd6349344df254cc0c3377a40fd99e216635Mathias Agopian
124697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan MalchevANativeWindowBuffer* GraphicBuffer::getNativeBuffer() const
1253330b203039dea366d4981db1408a460134b2d2cMathias Agopian{
12618fae75350bcd5f19ef90afb533e3fbedfd4c83bColin Cross    LOG_ALWAYS_FATAL_IF(this == NULL, "getNativeBuffer() called on NULL GraphicBuffer");
127697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    return static_cast<ANativeWindowBuffer*>(
1283330b203039dea366d4981db1408a460134b2d2cMathias Agopian            const_cast<GraphicBuffer*>(this));
1293330b203039dea366d4981db1408a460134b2d2cMathias Agopian}
1303330b203039dea366d4981db1408a460134b2d2cMathias Agopian
131d31824004277f554000417cea349d69f18655e95Dan Stozastatus_t GraphicBuffer::reallocate(uint32_t inWidth, uint32_t inHeight,
13282c049843870fc72ff36f48b970dfaf413db0687Chris Forbes        PixelFormat inFormat, uint32_t inLayerCount, uint64_t inUsage)
1333330b203039dea366d4981db1408a460134b2d2cMathias Agopian{
13454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    if (mOwner != ownData)
13554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian        return INVALID_OPERATION;
13654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
137d31824004277f554000417cea349d69f18655e95Dan Stoza    if (handle &&
138d31824004277f554000417cea349d69f18655e95Dan Stoza            static_cast<int>(inWidth) == width &&
139d31824004277f554000417cea349d69f18655e95Dan Stoza            static_cast<int>(inHeight) == height &&
140d31824004277f554000417cea349d69f18655e95Dan Stoza            inFormat == format &&
1416ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner            inLayerCount == layerCount &&
142d31824004277f554000417cea349d69f18655e95Dan Stoza            static_cast<int>(inUsage) == usage)
143579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian        return NO_ERROR;
144579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian
1453330b203039dea366d4981db1408a460134b2d2cMathias Agopian    if (handle) {
1463330b203039dea366d4981db1408a460134b2d2cMathias Agopian        GraphicBufferAllocator& allocator(GraphicBufferAllocator::get());
1473330b203039dea366d4981db1408a460134b2d2cMathias Agopian        allocator.free(handle);
1483330b203039dea366d4981db1408a460134b2d2cMathias Agopian        handle = 0;
1493330b203039dea366d4981db1408a460134b2d2cMathias Agopian    }
150b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    return initWithSize(inWidth, inHeight, inFormat, inLayerCount,
15182c049843870fc72ff36f48b970dfaf413db0687Chris Forbes            inUsage, "[Reallocation]");
1523330b203039dea366d4981db1408a460134b2d2cMathias Agopian}
1533330b203039dea366d4981db1408a460134b2d2cMathias Agopian
1549de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stozabool GraphicBuffer::needsReallocation(uint32_t inWidth, uint32_t inHeight,
15582c049843870fc72ff36f48b970dfaf413db0687Chris Forbes        PixelFormat inFormat, uint32_t inLayerCount, uint64_t inUsage)
1569de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza{
1579de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    if (static_cast<int>(inWidth) != width) return true;
1589de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    if (static_cast<int>(inHeight) != height) return true;
1599de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    if (inFormat != format) return true;
1606ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    if (inLayerCount != layerCount) return true;
1619de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    if ((static_cast<uint32_t>(usage) & inUsage) != inUsage) return true;
1629de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    return false;
1639de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza}
1649de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
165b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wustatus_t GraphicBuffer::initWithSize(uint32_t inWidth, uint32_t inHeight,
16682c049843870fc72ff36f48b970dfaf413db0687Chris Forbes        PixelFormat inFormat, uint32_t inLayerCount, uint64_t inUsage,
16782c049843870fc72ff36f48b970dfaf413db0687Chris Forbes        std::string requestorName)
1683330b203039dea366d4981db1408a460134b2d2cMathias Agopian{
1693330b203039dea366d4981db1408a460134b2d2cMathias Agopian    GraphicBufferAllocator& allocator = GraphicBufferAllocator::get();
170d31824004277f554000417cea349d69f18655e95Dan Stoza    uint32_t outStride = 0;
1716ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    status_t err = allocator.allocate(inWidth, inHeight, inFormat, inLayerCount,
17282c049843870fc72ff36f48b970dfaf413db0687Chris Forbes            inUsage, &handle, &outStride, mId,
173e96a325aff9da4e02abeb7b9178592583cf3b78cCraig Donner            std::move(requestorName));
1743330b203039dea366d4981db1408a460134b2d2cMathias Agopian    if (err == NO_ERROR) {
175d31824004277f554000417cea349d69f18655e95Dan Stoza        width = static_cast<int>(inWidth);
176d31824004277f554000417cea349d69f18655e95Dan Stoza        height = static_cast<int>(inHeight);
177d31824004277f554000417cea349d69f18655e95Dan Stoza        format = inFormat;
1786ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner        layerCount = inLayerCount;
17982c049843870fc72ff36f48b970dfaf413db0687Chris Forbes        usage = static_cast<int>(inUsage);
180d31824004277f554000417cea349d69f18655e95Dan Stoza        stride = static_cast<int>(outStride);
1813330b203039dea366d4981db1408a460134b2d2cMathias Agopian    }
1823330b203039dea366d4981db1408a460134b2d2cMathias Agopian    return err;
1833330b203039dea366d4981db1408a460134b2d2cMathias Agopian}
1843330b203039dea366d4981db1408a460134b2d2cMathias Agopian
185b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wustatus_t GraphicBuffer::initWithHandle(const native_handle_t* handle,
186b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu        HandleWrapMethod method, uint32_t width, uint32_t height,
18782c049843870fc72ff36f48b970dfaf413db0687Chris Forbes        PixelFormat format, uint32_t layerCount, uint64_t usage,
188b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu        uint32_t stride)
189b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu{
190b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    ANativeWindowBuffer::width  = static_cast<int>(width);
191b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    ANativeWindowBuffer::height = static_cast<int>(height);
192b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    ANativeWindowBuffer::stride = static_cast<int>(stride);
193b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    ANativeWindowBuffer::format = format;
19482c049843870fc72ff36f48b970dfaf413db0687Chris Forbes    ANativeWindowBuffer::usage  = static_cast<int>(usage);
195b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu
196b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    ANativeWindowBuffer::layerCount = layerCount;
197b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu
198b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    mOwner = (method == WRAP_HANDLE) ? ownNone : ownHandle;
199b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu
200cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu    if (method == TAKE_UNREGISTERED_HANDLE || method == CLONE_HANDLE) {
201cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu        buffer_handle_t importedHandle;
202cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu        status_t err = mBufferMapper.importBuffer(handle, &importedHandle);
203b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu        if (err != NO_ERROR) {
20482c049843870fc72ff36f48b970dfaf413db0687Chris Forbes            initWithHandle(nullptr, WRAP_HANDLE, 0, 0, 0, 0, 0, 0);
205b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu
206b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu            return err;
207b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu        }
208cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu
209cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu        if (method == TAKE_UNREGISTERED_HANDLE) {
210cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu            native_handle_close(handle);
211cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu            native_handle_delete(const_cast<native_handle_t*>(handle));
212cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu        }
213cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu
214cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu        handle = importedHandle;
215b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    }
216b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu
217cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu    ANativeWindowBuffer::handle = handle;
218cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu
219b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    return NO_ERROR;
220b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu}
221b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu
222d31824004277f554000417cea349d69f18655e95Dan Stozastatus_t GraphicBuffer::lock(uint32_t inUsage, void** vaddr)
2233330b203039dea366d4981db1408a460134b2d2cMathias Agopian{
2243330b203039dea366d4981db1408a460134b2d2cMathias Agopian    const Rect lockBounds(width, height);
225d31824004277f554000417cea349d69f18655e95Dan Stoza    status_t res = lock(inUsage, lockBounds, vaddr);
2263330b203039dea366d4981db1408a460134b2d2cMathias Agopian    return res;
2273330b203039dea366d4981db1408a460134b2d2cMathias Agopian}
2283330b203039dea366d4981db1408a460134b2d2cMathias Agopian
229d31824004277f554000417cea349d69f18655e95Dan Stozastatus_t GraphicBuffer::lock(uint32_t inUsage, const Rect& rect, void** vaddr)
2303330b203039dea366d4981db1408a460134b2d2cMathias Agopian{
231d31824004277f554000417cea349d69f18655e95Dan Stoza    if (rect.left < 0 || rect.right  > width ||
232d31824004277f554000417cea349d69f18655e95Dan Stoza        rect.top  < 0 || rect.bottom > height) {
233e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block        ALOGE("locking pixels (%d,%d,%d,%d) outside of buffer (w=%d, h=%d)",
23401049c8321aab30cd431e2febeddd79242ae5a4fDan Stoza                rect.left, rect.top, rect.right, rect.bottom,
235d31824004277f554000417cea349d69f18655e95Dan Stoza                width, height);
2363330b203039dea366d4981db1408a460134b2d2cMathias Agopian        return BAD_VALUE;
2373330b203039dea366d4981db1408a460134b2d2cMathias Agopian    }
238d31824004277f554000417cea349d69f18655e95Dan Stoza    status_t res = getBufferMapper().lock(handle, inUsage, rect, vaddr);
2393330b203039dea366d4981db1408a460134b2d2cMathias Agopian    return res;
2403330b203039dea366d4981db1408a460134b2d2cMathias Agopian}
2413330b203039dea366d4981db1408a460134b2d2cMathias Agopian
242d31824004277f554000417cea349d69f18655e95Dan Stozastatus_t GraphicBuffer::lockYCbCr(uint32_t inUsage, android_ycbcr* ycbcr)
243c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala{
244c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala    const Rect lockBounds(width, height);
245d31824004277f554000417cea349d69f18655e95Dan Stoza    status_t res = lockYCbCr(inUsage, lockBounds, ycbcr);
246c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala    return res;
247c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala}
248c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala
249d31824004277f554000417cea349d69f18655e95Dan Stozastatus_t GraphicBuffer::lockYCbCr(uint32_t inUsage, const Rect& rect,
250d31824004277f554000417cea349d69f18655e95Dan Stoza        android_ycbcr* ycbcr)
251c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala{
252d31824004277f554000417cea349d69f18655e95Dan Stoza    if (rect.left < 0 || rect.right  > width ||
253d31824004277f554000417cea349d69f18655e95Dan Stoza        rect.top  < 0 || rect.bottom > height) {
254c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala        ALOGE("locking pixels (%d,%d,%d,%d) outside of buffer (w=%d, h=%d)",
255c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala                rect.left, rect.top, rect.right, rect.bottom,
256d31824004277f554000417cea349d69f18655e95Dan Stoza                width, height);
257c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala        return BAD_VALUE;
258c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala    }
259d31824004277f554000417cea349d69f18655e95Dan Stoza    status_t res = getBufferMapper().lockYCbCr(handle, inUsage, rect, ycbcr);
260c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala    return res;
261c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala}
262c43946b931de5dafd28f49963f9af78e05390b26Eino-Ville Talvala
2633330b203039dea366d4981db1408a460134b2d2cMathias Agopianstatus_t GraphicBuffer::unlock()
2643330b203039dea366d4981db1408a460134b2d2cMathias Agopian{
2653330b203039dea366d4981db1408a460134b2d2cMathias Agopian    status_t res = getBufferMapper().unlock(handle);
2663330b203039dea366d4981db1408a460134b2d2cMathias Agopian    return res;
2673330b203039dea366d4981db1408a460134b2d2cMathias Agopian}
2683330b203039dea366d4981db1408a460134b2d2cMathias Agopian
269d31824004277f554000417cea349d69f18655e95Dan Stozastatus_t GraphicBuffer::lockAsync(uint32_t inUsage, void** vaddr, int fenceFd)
2708f3960179c56767e5077be8337792bd4e244b7d7Francis Hart{
2718f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    const Rect lockBounds(width, height);
272d31824004277f554000417cea349d69f18655e95Dan Stoza    status_t res = lockAsync(inUsage, lockBounds, vaddr, fenceFd);
2738f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    return res;
2748f3960179c56767e5077be8337792bd4e244b7d7Francis Hart}
2758f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
276d31824004277f554000417cea349d69f18655e95Dan Stozastatus_t GraphicBuffer::lockAsync(uint32_t inUsage, const Rect& rect,
277d31824004277f554000417cea349d69f18655e95Dan Stoza        void** vaddr, int fenceFd)
2788f3960179c56767e5077be8337792bd4e244b7d7Francis Hart{
279e96a325aff9da4e02abeb7b9178592583cf3b78cCraig Donner    return lockAsync(inUsage, inUsage, rect, vaddr, fenceFd);
280e96a325aff9da4e02abeb7b9178592583cf3b78cCraig Donner}
281e96a325aff9da4e02abeb7b9178592583cf3b78cCraig Donner
282e96a325aff9da4e02abeb7b9178592583cf3b78cCraig Donnerstatus_t GraphicBuffer::lockAsync(uint64_t inProducerUsage,
283e96a325aff9da4e02abeb7b9178592583cf3b78cCraig Donner        uint64_t inConsumerUsage, const Rect& rect, void** vaddr, int fenceFd)
284e96a325aff9da4e02abeb7b9178592583cf3b78cCraig Donner{
285d31824004277f554000417cea349d69f18655e95Dan Stoza    if (rect.left < 0 || rect.right  > width ||
286d31824004277f554000417cea349d69f18655e95Dan Stoza        rect.top  < 0 || rect.bottom > height) {
2878f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        ALOGE("locking pixels (%d,%d,%d,%d) outside of buffer (w=%d, h=%d)",
2888f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                rect.left, rect.top, rect.right, rect.bottom,
289d31824004277f554000417cea349d69f18655e95Dan Stoza                width, height);
2908f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        return BAD_VALUE;
2918f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    }
292e96a325aff9da4e02abeb7b9178592583cf3b78cCraig Donner    status_t res = getBufferMapper().lockAsync(handle, inProducerUsage,
293e96a325aff9da4e02abeb7b9178592583cf3b78cCraig Donner            inConsumerUsage, rect, vaddr, fenceFd);
2948f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    return res;
2958f3960179c56767e5077be8337792bd4e244b7d7Francis Hart}
2968f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
297d31824004277f554000417cea349d69f18655e95Dan Stozastatus_t GraphicBuffer::lockAsyncYCbCr(uint32_t inUsage, android_ycbcr* ycbcr,
298d31824004277f554000417cea349d69f18655e95Dan Stoza        int fenceFd)
2998f3960179c56767e5077be8337792bd4e244b7d7Francis Hart{
3008f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    const Rect lockBounds(width, height);
301d31824004277f554000417cea349d69f18655e95Dan Stoza    status_t res = lockAsyncYCbCr(inUsage, lockBounds, ycbcr, fenceFd);
3028f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    return res;
3038f3960179c56767e5077be8337792bd4e244b7d7Francis Hart}
3048f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
305d31824004277f554000417cea349d69f18655e95Dan Stozastatus_t GraphicBuffer::lockAsyncYCbCr(uint32_t inUsage, const Rect& rect,
306d31824004277f554000417cea349d69f18655e95Dan Stoza        android_ycbcr* ycbcr, int fenceFd)
3078f3960179c56767e5077be8337792bd4e244b7d7Francis Hart{
308d31824004277f554000417cea349d69f18655e95Dan Stoza    if (rect.left < 0 || rect.right  > width ||
309d31824004277f554000417cea349d69f18655e95Dan Stoza        rect.top  < 0 || rect.bottom > height) {
3108f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        ALOGE("locking pixels (%d,%d,%d,%d) outside of buffer (w=%d, h=%d)",
3118f3960179c56767e5077be8337792bd4e244b7d7Francis Hart                rect.left, rect.top, rect.right, rect.bottom,
312d31824004277f554000417cea349d69f18655e95Dan Stoza                width, height);
3138f3960179c56767e5077be8337792bd4e244b7d7Francis Hart        return BAD_VALUE;
3148f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    }
315d31824004277f554000417cea349d69f18655e95Dan Stoza    status_t res = getBufferMapper().lockAsyncYCbCr(handle, inUsage, rect,
316d31824004277f554000417cea349d69f18655e95Dan Stoza            ycbcr, fenceFd);
3178f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    return res;
3188f3960179c56767e5077be8337792bd4e244b7d7Francis Hart}
3198f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
3208f3960179c56767e5077be8337792bd4e244b7d7Francis Hartstatus_t GraphicBuffer::unlockAsync(int *fenceFd)
3218f3960179c56767e5077be8337792bd4e244b7d7Francis Hart{
3228f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    status_t res = getBufferMapper().unlockAsync(handle, fenceFd);
3238f3960179c56767e5077be8337792bd4e244b7d7Francis Hart    return res;
3248f3960179c56767e5077be8337792bd4e244b7d7Francis Hart}
3258f3960179c56767e5077be8337792bd4e244b7d7Francis Hart
32698e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopiansize_t GraphicBuffer::getFlattenedSize() const {
3276ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    return static_cast<size_t>(12 + (handle ? handle->numInts : 0)) * sizeof(int);
32898e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian}
32998e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
33098e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopiansize_t GraphicBuffer::getFdCount() const {
331d31824004277f554000417cea349d69f18655e95Dan Stoza    return static_cast<size_t>(handle ? handle->numFds : 0);
33298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian}
3333330b203039dea366d4981db1408a460134b2d2cMathias Agopian
334e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t GraphicBuffer::flatten(void*& buffer, size_t& size, int*& fds, size_t& count) const {
33598e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    size_t sizeNeeded = GraphicBuffer::getFlattenedSize();
33698e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (size < sizeNeeded) return NO_MEMORY;
33798e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
33898e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    size_t fdCountNeeded = GraphicBuffer::getFdCount();
33998e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (count < fdCountNeeded) return NO_MEMORY;
34098e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
341b1363d37fc6a661508fad106eb7698c5850a6c17Dan Stoza    int32_t* buf = static_cast<int32_t*>(buffer);
34298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    buf[0] = 'GBFR';
34398e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    buf[1] = width;
34498e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    buf[2] = height;
34598e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    buf[3] = stride;
34698e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    buf[4] = format;
3476ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    buf[5] = static_cast<int32_t>(layerCount);
3486ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    buf[6] = usage;
3496ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    buf[7] = static_cast<int32_t>(mId >> 32);
3506ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    buf[8] = static_cast<int32_t>(mId & 0xFFFFFFFFull);
3516ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    buf[9] = static_cast<int32_t>(mGenerationNumber);
352812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    buf[10] = 0;
3536ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    buf[11] = 0;
3543330b203039dea366d4981db1408a460134b2d2cMathias Agopian
35598e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (handle) {
3566ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner        buf[10] = handle->numFds;
3576ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner        buf[11] = handle->numInts;
358d31824004277f554000417cea349d69f18655e95Dan Stoza        memcpy(fds, handle->data,
359d31824004277f554000417cea349d69f18655e95Dan Stoza                static_cast<size_t>(handle->numFds) * sizeof(int));
3606ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner        memcpy(&buf[12], handle->data + handle->numFds,
361d31824004277f554000417cea349d69f18655e95Dan Stoza                static_cast<size_t>(handle->numInts) * sizeof(int));
36298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    }
36398e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
364eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    buffer = static_cast<void*>(static_cast<uint8_t*>(buffer) + sizeNeeded);
365e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    size -= sizeNeeded;
366bc96e4714f4cc1ae598f122b3b9f7998c09fe674Andy McFadden    if (handle) {
367bc96e4714f4cc1ae598f122b3b9f7998c09fe674Andy McFadden        fds += handle->numFds;
368d31824004277f554000417cea349d69f18655e95Dan Stoza        count -= static_cast<size_t>(handle->numFds);
369bc96e4714f4cc1ae598f122b3b9f7998c09fe674Andy McFadden    }
370e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian
37198e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    return NO_ERROR;
37298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian}
37398e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
374e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopianstatus_t GraphicBuffer::unflatten(
375e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian        void const*& buffer, size_t& size, int const*& fds, size_t& count) {
3766ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    if (size < 12 * sizeof(int)) return NO_MEMORY;
37798e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
37898e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    int const* buf = static_cast<int const*>(buffer);
37998e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (buf[0] != 'GBFR') return BAD_TYPE;
38098e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
3816ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    const size_t numFds  = static_cast<size_t>(buf[10]);
3826ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    const size_t numInts = static_cast<size_t>(buf[11]);
3833330b203039dea366d4981db1408a460134b2d2cMathias Agopian
384c168b8a5a9dcc0e45e32fc3cd40b9410e0288fb1Michael Lentine    // Limit the maxNumber to be relatively small. The number of fds or ints
385c168b8a5a9dcc0e45e32fc3cd40b9410e0288fb1Michael Lentine    // should not come close to this number, and the number itself was simply
386c168b8a5a9dcc0e45e32fc3cd40b9410e0288fb1Michael Lentine    // chosen to be high enough to not cause issues and low enough to prevent
387c168b8a5a9dcc0e45e32fc3cd40b9410e0288fb1Michael Lentine    // overflow problems.
388c168b8a5a9dcc0e45e32fc3cd40b9410e0288fb1Michael Lentine    const size_t maxNumber = 4096;
3896ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    if (numFds >= maxNumber || numInts >= (maxNumber - 12)) {
3906ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner        width = height = stride = format = layerCount = usage = 0;
39138803268570f90e97452cd9a30ac831661829091Michael Lentine        handle = NULL;
39201049c8321aab30cd431e2febeddd79242ae5a4fDan Stoza        ALOGE("unflatten: numFds or numInts is too large: %zd, %zd",
39338803268570f90e97452cd9a30ac831661829091Michael Lentine                numFds, numInts);
39438803268570f90e97452cd9a30ac831661829091Michael Lentine        return BAD_VALUE;
39538803268570f90e97452cd9a30ac831661829091Michael Lentine    }
39638803268570f90e97452cd9a30ac831661829091Michael Lentine
3976ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    const size_t sizeNeeded = (12 + numInts) * sizeof(int);
39898e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (size < sizeNeeded) return NO_MEMORY;
39998e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
40038803268570f90e97452cd9a30ac831661829091Michael Lentine    size_t fdCountNeeded = numFds;
40198e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (count < fdCountNeeded) return NO_MEMORY;
40298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
40398e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (handle) {
40498e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        // free previous handle if any
40598e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        free_handle();
40698e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    }
40798e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
40898e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    if (numFds || numInts) {
40998e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        width  = buf[1];
41098e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        height = buf[2];
41198e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        stride = buf[3];
41298e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        format = buf[4];
4136ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner        layerCount = static_cast<uintptr_t>(buf[5]);
4146ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner        usage  = buf[6];
415d31824004277f554000417cea349d69f18655e95Dan Stoza        native_handle* h = native_handle_create(
416d31824004277f554000417cea349d69f18655e95Dan Stoza                static_cast<int>(numFds), static_cast<int>(numInts));
41738803268570f90e97452cd9a30ac831661829091Michael Lentine        if (!h) {
4186ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner            width = height = stride = format = layerCount = usage = 0;
41938803268570f90e97452cd9a30ac831661829091Michael Lentine            handle = NULL;
42038803268570f90e97452cd9a30ac831661829091Michael Lentine            ALOGE("unflatten: native_handle_create failed");
42138803268570f90e97452cd9a30ac831661829091Michael Lentine            return NO_MEMORY;
42238803268570f90e97452cd9a30ac831661829091Michael Lentine        }
423d31824004277f554000417cea349d69f18655e95Dan Stoza        memcpy(h->data, fds, numFds * sizeof(int));
4246ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner        memcpy(h->data + numFds, &buf[12], numInts * sizeof(int));
42598e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        handle = h;
4263330b203039dea366d4981db1408a460134b2d2cMathias Agopian    } else {
4276ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner        width = height = stride = format = layerCount = usage = 0;
42898e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian        handle = NULL;
4293330b203039dea366d4981db1408a460134b2d2cMathias Agopian    }
43098e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian
4316ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    mId = static_cast<uint64_t>(buf[7]) << 32;
4326ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    mId |= static_cast<uint32_t>(buf[8]);
433b1363d37fc6a661508fad106eb7698c5850a6c17Dan Stoza
4346ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner    mGenerationNumber = static_cast<uint32_t>(buf[9]);
435812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
43698e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    mOwner = ownHandle;
437309d3bb2f902163356f9d40b6d45c11b435d77a9Jamie Gennis
438309d3bb2f902163356f9d40b6d45c11b435d77a9Jamie Gennis    if (handle != 0) {
439cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu        buffer_handle_t importedHandle;
440cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu        status_t err = mBufferMapper.importBuffer(handle, &importedHandle);
441d69097f936d9780957a51ce77335ae409b32aaa3Jamie Gennis        if (err != NO_ERROR) {
4426ebc46a7c01b22bc19d3c00b493f8d930b15b43aCraig Donner            width = height = stride = format = layerCount = usage = 0;
4432aff7025482cc40d2ebd45f81cdb318ac1c6f868Lingyun Zhu            handle = NULL;
444d69097f936d9780957a51ce77335ae409b32aaa3Jamie Gennis            ALOGE("unflatten: registerBuffer failed: %s (%d)",
445d69097f936d9780957a51ce77335ae409b32aaa3Jamie Gennis                    strerror(-err), err);
446d69097f936d9780957a51ce77335ae409b32aaa3Jamie Gennis            return err;
447d69097f936d9780957a51ce77335ae409b32aaa3Jamie Gennis        }
448cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu
449cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu        native_handle_close(handle);
450cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu        native_handle_delete(const_cast<native_handle_t*>(handle));
451cb8405e7e74398aeafc9ef6ddb59af2d7cc6d2a6Chia-I Wu        handle = importedHandle;
452309d3bb2f902163356f9d40b6d45c11b435d77a9Jamie Gennis    }
453309d3bb2f902163356f9d40b6d45c11b435d77a9Jamie Gennis
454eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    buffer = static_cast<void const*>(static_cast<uint8_t const*>(buffer) + sizeNeeded);
455e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    size -= sizeNeeded;
456e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    fds += numFds;
457e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian    count -= numFds;
458e142428a9c8b9d2380032cd4d7b55ee440fe8770Mathias Agopian
45998e71ddaede9a0bfb681fd237bec1f66c6c53193Mathias Agopian    return NO_ERROR;
4603330b203039dea366d4981db1408a460134b2d2cMathias Agopian}
4613330b203039dea366d4981db1408a460134b2d2cMathias Agopian
4623330b203039dea366d4981db1408a460134b2d2cMathias Agopian// ---------------------------------------------------------------------------
4633330b203039dea366d4981db1408a460134b2d2cMathias Agopian
4643330b203039dea366d4981db1408a460134b2d2cMathias Agopian}; // namespace android
465