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