16950e428feaccc8164b989ef64e771a99948797aMathias Agopian/* 26950e428feaccc8164b989ef64e771a99948797aMathias Agopian * Copyright (C) 2007 The Android Open Source Project 36950e428feaccc8164b989ef64e771a99948797aMathias Agopian * 46950e428feaccc8164b989ef64e771a99948797aMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 56950e428feaccc8164b989ef64e771a99948797aMathias Agopian * you may not use this file except in compliance with the License. 66950e428feaccc8164b989ef64e771a99948797aMathias Agopian * You may obtain a copy of the License at 76950e428feaccc8164b989ef64e771a99948797aMathias Agopian * 86950e428feaccc8164b989ef64e771a99948797aMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 96950e428feaccc8164b989ef64e771a99948797aMathias Agopian * 106950e428feaccc8164b989ef64e771a99948797aMathias Agopian * Unless required by applicable law or agreed to in writing, software 116950e428feaccc8164b989ef64e771a99948797aMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 126950e428feaccc8164b989ef64e771a99948797aMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136950e428feaccc8164b989ef64e771a99948797aMathias Agopian * See the License for the specific language governing permissions and 146950e428feaccc8164b989ef64e771a99948797aMathias Agopian * limitations under the License. 156950e428feaccc8164b989ef64e771a99948797aMathias Agopian */ 166950e428feaccc8164b989ef64e771a99948797aMathias Agopian 17c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian#define LOG_TAG "GraphicBuffer" 18c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 196950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <stdlib.h> 206950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <stdint.h> 216950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <sys/types.h> 226950e428feaccc8164b989ef64e771a99948797aMathias Agopian 236950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <utils/Errors.h> 246950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <utils/Log.h> 256950e428feaccc8164b989ef64e771a99948797aMathias Agopian 266950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <ui/GraphicBuffer.h> 276950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <ui/GraphicBufferAllocator.h> 286950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <ui/GraphicBufferMapper.h> 296950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <ui/PixelFormat.h> 306950e428feaccc8164b989ef64e771a99948797aMathias Agopian 316950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <pixelflinger/pixelflinger.h> 326950e428feaccc8164b989ef64e771a99948797aMathias Agopian 336950e428feaccc8164b989ef64e771a99948797aMathias Agopiannamespace android { 346950e428feaccc8164b989ef64e771a99948797aMathias Agopian 356950e428feaccc8164b989ef64e771a99948797aMathias Agopian// =========================================================================== 366950e428feaccc8164b989ef64e771a99948797aMathias Agopian// Buffer and implementation of android_native_buffer_t 376950e428feaccc8164b989ef64e771a99948797aMathias Agopian// =========================================================================== 386950e428feaccc8164b989ef64e771a99948797aMathias Agopian 396950e428feaccc8164b989ef64e771a99948797aMathias AgopianGraphicBuffer::GraphicBuffer() 409042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian : BASE(), mOwner(ownData), mBufferMapper(GraphicBufferMapper::get()), 417623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian mInitCheck(NO_ERROR), mIndex(-1) 426950e428feaccc8164b989ef64e771a99948797aMathias Agopian{ 436950e428feaccc8164b989ef64e771a99948797aMathias Agopian width = 446950e428feaccc8164b989ef64e771a99948797aMathias Agopian height = 456950e428feaccc8164b989ef64e771a99948797aMathias Agopian stride = 466950e428feaccc8164b989ef64e771a99948797aMathias Agopian format = 476950e428feaccc8164b989ef64e771a99948797aMathias Agopian usage = 0; 4848e723a0ee9b625825d23642f843b91fa276ab7cMathias Agopian transform = 0; 496950e428feaccc8164b989ef64e771a99948797aMathias Agopian handle = NULL; 506950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 516950e428feaccc8164b989ef64e771a99948797aMathias Agopian 526950e428feaccc8164b989ef64e771a99948797aMathias AgopianGraphicBuffer::GraphicBuffer(uint32_t w, uint32_t h, 536950e428feaccc8164b989ef64e771a99948797aMathias Agopian PixelFormat reqFormat, uint32_t reqUsage) 549042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian : BASE(), mOwner(ownData), mBufferMapper(GraphicBufferMapper::get()), 557623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian mInitCheck(NO_ERROR), mIndex(-1) 566950e428feaccc8164b989ef64e771a99948797aMathias Agopian{ 576950e428feaccc8164b989ef64e771a99948797aMathias Agopian width = 586950e428feaccc8164b989ef64e771a99948797aMathias Agopian height = 596950e428feaccc8164b989ef64e771a99948797aMathias Agopian stride = 606950e428feaccc8164b989ef64e771a99948797aMathias Agopian format = 6148e723a0ee9b625825d23642f843b91fa276ab7cMathias Agopian usage = 6248e723a0ee9b625825d23642f843b91fa276ab7cMathias Agopian transform = 0; 636950e428feaccc8164b989ef64e771a99948797aMathias Agopian handle = NULL; 646950e428feaccc8164b989ef64e771a99948797aMathias Agopian mInitCheck = initSize(w, h, reqFormat, reqUsage); 656950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 666950e428feaccc8164b989ef64e771a99948797aMathias Agopian 679042b4564de5477b18e680c7dce13b587a681dd9Mathias AgopianGraphicBuffer::GraphicBuffer(uint32_t w, uint32_t h, 689042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian PixelFormat inFormat, uint32_t inUsage, 699042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian uint32_t inStride, native_handle_t* inHandle, bool keepOwnership) 709042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian : BASE(), mOwner(keepOwnership ? ownHandle : ownNone), 719042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian mBufferMapper(GraphicBufferMapper::get()), 727623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian mInitCheck(NO_ERROR), mIndex(-1) 739042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian{ 749042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian width = w; 759042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian height = h; 769042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian stride = inStride; 779042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian format = inFormat; 789042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian usage = inUsage; 7948e723a0ee9b625825d23642f843b91fa276ab7cMathias Agopian transform = 0; 809042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian handle = inHandle; 819042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian} 829042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 83c86727f5805f28fbd25da141c50fb6843f364f3aMathias AgopianGraphicBuffer::~GraphicBuffer() 846950e428feaccc8164b989ef64e771a99948797aMathias Agopian{ 85c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian if (handle) { 86c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian free_handle(); 876950e428feaccc8164b989ef64e771a99948797aMathias Agopian } 886950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 896950e428feaccc8164b989ef64e771a99948797aMathias Agopian 90c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopianvoid GraphicBuffer::free_handle() 916950e428feaccc8164b989ef64e771a99948797aMathias Agopian{ 92c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian if (mOwner == ownHandle) { 93c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian native_handle_close(handle); 94c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian native_handle_delete(const_cast<native_handle*>(handle)); 95c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian } else if (mOwner == ownData) { 96c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian GraphicBufferAllocator& allocator(GraphicBufferAllocator::get()); 97c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian allocator.free(handle); 986950e428feaccc8164b989ef64e771a99948797aMathias Agopian } 996950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 1006950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1016950e428feaccc8164b989ef64e771a99948797aMathias Agopianstatus_t GraphicBuffer::initCheck() const { 1026950e428feaccc8164b989ef64e771a99948797aMathias Agopian return mInitCheck; 1036950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 1046950e428feaccc8164b989ef64e771a99948797aMathias Agopian 105e869aee382cfe01d42dffba4912458a16bb791fbMathias Agopianvoid GraphicBuffer::dumpAllocationsToSystemLog() 106e869aee382cfe01d42dffba4912458a16bb791fbMathias Agopian{ 107e869aee382cfe01d42dffba4912458a16bb791fbMathias Agopian GraphicBufferAllocator::dumpToSystemLog(); 108e869aee382cfe01d42dffba4912458a16bb791fbMathias Agopian} 109e869aee382cfe01d42dffba4912458a16bb791fbMathias Agopian 1106950e428feaccc8164b989ef64e771a99948797aMathias Agopianandroid_native_buffer_t* GraphicBuffer::getNativeBuffer() const 1116950e428feaccc8164b989ef64e771a99948797aMathias Agopian{ 1126950e428feaccc8164b989ef64e771a99948797aMathias Agopian return static_cast<android_native_buffer_t*>( 1136950e428feaccc8164b989ef64e771a99948797aMathias Agopian const_cast<GraphicBuffer*>(this)); 1146950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 1156950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1166950e428feaccc8164b989ef64e771a99948797aMathias Agopianstatus_t GraphicBuffer::reallocate(uint32_t w, uint32_t h, PixelFormat f, 1176950e428feaccc8164b989ef64e771a99948797aMathias Agopian uint32_t reqUsage) 1186950e428feaccc8164b989ef64e771a99948797aMathias Agopian{ 1199042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian if (mOwner != ownData) 1209042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian return INVALID_OPERATION; 1219042b4564de5477b18e680c7dce13b587a681dd9Mathias Agopian 1225e14010b1fc066dfcbc0a577d59492687c99667dMathias Agopian if (handle && w==width && h==height && f==format && reqUsage==usage) 1235e14010b1fc066dfcbc0a577d59492687c99667dMathias Agopian return NO_ERROR; 1245e14010b1fc066dfcbc0a577d59492687c99667dMathias Agopian 1256950e428feaccc8164b989ef64e771a99948797aMathias Agopian if (handle) { 1266950e428feaccc8164b989ef64e771a99948797aMathias Agopian GraphicBufferAllocator& allocator(GraphicBufferAllocator::get()); 1276950e428feaccc8164b989ef64e771a99948797aMathias Agopian allocator.free(handle); 1286950e428feaccc8164b989ef64e771a99948797aMathias Agopian handle = 0; 1296950e428feaccc8164b989ef64e771a99948797aMathias Agopian } 1306950e428feaccc8164b989ef64e771a99948797aMathias Agopian return initSize(w, h, f, reqUsage); 1316950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 1326950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1336950e428feaccc8164b989ef64e771a99948797aMathias Agopianstatus_t GraphicBuffer::initSize(uint32_t w, uint32_t h, PixelFormat format, 1346950e428feaccc8164b989ef64e771a99948797aMathias Agopian uint32_t reqUsage) 1356950e428feaccc8164b989ef64e771a99948797aMathias Agopian{ 1366950e428feaccc8164b989ef64e771a99948797aMathias Agopian GraphicBufferAllocator& allocator = GraphicBufferAllocator::get(); 1376950e428feaccc8164b989ef64e771a99948797aMathias Agopian status_t err = allocator.alloc(w, h, format, reqUsage, &handle, &stride); 1386950e428feaccc8164b989ef64e771a99948797aMathias Agopian if (err == NO_ERROR) { 1396950e428feaccc8164b989ef64e771a99948797aMathias Agopian this->width = w; 1406950e428feaccc8164b989ef64e771a99948797aMathias Agopian this->height = h; 1416950e428feaccc8164b989ef64e771a99948797aMathias Agopian this->format = format; 1426950e428feaccc8164b989ef64e771a99948797aMathias Agopian this->usage = reqUsage; 1436950e428feaccc8164b989ef64e771a99948797aMathias Agopian } 1446950e428feaccc8164b989ef64e771a99948797aMathias Agopian return err; 1456950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 1466950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1476950e428feaccc8164b989ef64e771a99948797aMathias Agopianstatus_t GraphicBuffer::lock(uint32_t usage, void** vaddr) 1486950e428feaccc8164b989ef64e771a99948797aMathias Agopian{ 1496950e428feaccc8164b989ef64e771a99948797aMathias Agopian const Rect lockBounds(width, height); 1506950e428feaccc8164b989ef64e771a99948797aMathias Agopian status_t res = lock(usage, lockBounds, vaddr); 1516950e428feaccc8164b989ef64e771a99948797aMathias Agopian return res; 1526950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 1536950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1546950e428feaccc8164b989ef64e771a99948797aMathias Agopianstatus_t GraphicBuffer::lock(uint32_t usage, const Rect& rect, void** vaddr) 1556950e428feaccc8164b989ef64e771a99948797aMathias Agopian{ 1566950e428feaccc8164b989ef64e771a99948797aMathias Agopian if (rect.left < 0 || rect.right > this->width || 1576950e428feaccc8164b989ef64e771a99948797aMathias Agopian rect.top < 0 || rect.bottom > this->height) { 1586950e428feaccc8164b989ef64e771a99948797aMathias Agopian LOGE("locking pixels (%d,%d,%d,%d) outside of buffer (w=%d, h=%d)", 1596950e428feaccc8164b989ef64e771a99948797aMathias Agopian rect.left, rect.top, rect.right, rect.bottom, 1606950e428feaccc8164b989ef64e771a99948797aMathias Agopian this->width, this->height); 1616950e428feaccc8164b989ef64e771a99948797aMathias Agopian return BAD_VALUE; 1626950e428feaccc8164b989ef64e771a99948797aMathias Agopian } 1636950e428feaccc8164b989ef64e771a99948797aMathias Agopian status_t res = getBufferMapper().lock(handle, usage, rect, vaddr); 1646950e428feaccc8164b989ef64e771a99948797aMathias Agopian return res; 1656950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 1666950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1676950e428feaccc8164b989ef64e771a99948797aMathias Agopianstatus_t GraphicBuffer::unlock() 1686950e428feaccc8164b989ef64e771a99948797aMathias Agopian{ 1696950e428feaccc8164b989ef64e771a99948797aMathias Agopian status_t res = getBufferMapper().unlock(handle); 1706950e428feaccc8164b989ef64e771a99948797aMathias Agopian return res; 1716950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 1726950e428feaccc8164b989ef64e771a99948797aMathias Agopian 1736950e428feaccc8164b989ef64e771a99948797aMathias Agopianstatus_t GraphicBuffer::lock(GGLSurface* sur, uint32_t usage) 1746950e428feaccc8164b989ef64e771a99948797aMathias Agopian{ 1756950e428feaccc8164b989ef64e771a99948797aMathias Agopian void* vaddr; 1766950e428feaccc8164b989ef64e771a99948797aMathias Agopian status_t res = GraphicBuffer::lock(usage, &vaddr); 1776950e428feaccc8164b989ef64e771a99948797aMathias Agopian if (res == NO_ERROR && sur) { 1786950e428feaccc8164b989ef64e771a99948797aMathias Agopian sur->version = sizeof(GGLSurface); 1796950e428feaccc8164b989ef64e771a99948797aMathias Agopian sur->width = width; 1806950e428feaccc8164b989ef64e771a99948797aMathias Agopian sur->height = height; 1816950e428feaccc8164b989ef64e771a99948797aMathias Agopian sur->stride = stride; 1826950e428feaccc8164b989ef64e771a99948797aMathias Agopian sur->format = format; 1836950e428feaccc8164b989ef64e771a99948797aMathias Agopian sur->data = static_cast<GGLubyte*>(vaddr); 1846950e428feaccc8164b989ef64e771a99948797aMathias Agopian } 1856950e428feaccc8164b989ef64e771a99948797aMathias Agopian return res; 1866950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 1876950e428feaccc8164b989ef64e771a99948797aMathias Agopian 18848e723a0ee9b625825d23642f843b91fa276ab7cMathias Agopianconst int kFlattenFdsOffset = 9; 18948e723a0ee9b625825d23642f843b91fa276ab7cMathias Agopian 190c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopiansize_t GraphicBuffer::getFlattenedSize() const { 19148e723a0ee9b625825d23642f843b91fa276ab7cMathias Agopian return (kFlattenFdsOffset + (handle ? handle->numInts : 0))*sizeof(int); 192c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian} 193c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 194c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopiansize_t GraphicBuffer::getFdCount() const { 195c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian return handle ? handle->numFds : 0; 196c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian} 1976950e428feaccc8164b989ef64e771a99948797aMathias Agopian 198c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopianstatus_t GraphicBuffer::flatten(void* buffer, size_t size, 199c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian int fds[], size_t count) const 2006950e428feaccc8164b989ef64e771a99948797aMathias Agopian{ 201c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian size_t sizeNeeded = GraphicBuffer::getFlattenedSize(); 202c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian if (size < sizeNeeded) return NO_MEMORY; 203c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 204c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian size_t fdCountNeeded = GraphicBuffer::getFdCount(); 205c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian if (count < fdCountNeeded) return NO_MEMORY; 206c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 207c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian int* buf = static_cast<int*>(buffer); 208c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian buf[0] = 'GBFR'; 209c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian buf[1] = width; 210c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian buf[2] = height; 211c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian buf[3] = stride; 212c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian buf[4] = format; 213c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian buf[5] = usage; 214c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian buf[6] = 0; 215c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian buf[7] = 0; 21648e723a0ee9b625825d23642f843b91fa276ab7cMathias Agopian buf[8] = transform; 2176950e428feaccc8164b989ef64e771a99948797aMathias Agopian 218c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian if (handle) { 219c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian buf[6] = handle->numFds; 220c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian buf[7] = handle->numInts; 221c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian native_handle_t const* const h = handle; 222c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian memcpy(fds, h->data, h->numFds*sizeof(int)); 22348e723a0ee9b625825d23642f843b91fa276ab7cMathias Agopian memcpy(&buf[kFlattenFdsOffset], h->data + h->numFds, h->numInts*sizeof(int)); 224c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian } 225c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 226c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian return NO_ERROR; 227c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian} 228c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 229c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopianstatus_t GraphicBuffer::unflatten(void const* buffer, size_t size, 230c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian int fds[], size_t count) 231c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian{ 23248e723a0ee9b625825d23642f843b91fa276ab7cMathias Agopian if (size < kFlattenFdsOffset*sizeof(int)) return NO_MEMORY; 233c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 234c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian int const* buf = static_cast<int const*>(buffer); 235c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian if (buf[0] != 'GBFR') return BAD_TYPE; 236c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 237c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian const size_t numFds = buf[6]; 238c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian const size_t numInts = buf[7]; 2396950e428feaccc8164b989ef64e771a99948797aMathias Agopian 24048e723a0ee9b625825d23642f843b91fa276ab7cMathias Agopian const size_t sizeNeeded = (kFlattenFdsOffset + numInts) * sizeof(int); 241c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian if (size < sizeNeeded) return NO_MEMORY; 242c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 243c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian size_t fdCountNeeded = 0; 244c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian if (count < fdCountNeeded) return NO_MEMORY; 245c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 246c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian if (handle) { 247c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian // free previous handle if any 248c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian free_handle(); 249c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian } 250c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 251c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian if (numFds || numInts) { 252c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian width = buf[1]; 253c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian height = buf[2]; 254c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian stride = buf[3]; 255c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian format = buf[4]; 256c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian usage = buf[5]; 25748e723a0ee9b625825d23642f843b91fa276ab7cMathias Agopian transform = buf[8]; 258c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian native_handle* h = native_handle_create(numFds, numInts); 259c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian memcpy(h->data, fds, numFds*sizeof(int)); 26048e723a0ee9b625825d23642f843b91fa276ab7cMathias Agopian memcpy(h->data + numFds, &buf[kFlattenFdsOffset], numInts*sizeof(int)); 261c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian handle = h; 2626950e428feaccc8164b989ef64e771a99948797aMathias Agopian } else { 263c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian width = height = stride = format = usage = 0; 264c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian handle = NULL; 2656950e428feaccc8164b989ef64e771a99948797aMathias Agopian } 266c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian 267c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian mOwner = ownHandle; 268c86727f5805f28fbd25da141c50fb6843f364f3aMathias Agopian return NO_ERROR; 2696950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 2706950e428feaccc8164b989ef64e771a99948797aMathias Agopian 2716950e428feaccc8164b989ef64e771a99948797aMathias Agopian 2726950e428feaccc8164b989ef64e771a99948797aMathias Agopianvoid GraphicBuffer::setIndex(int index) { 2736950e428feaccc8164b989ef64e771a99948797aMathias Agopian mIndex = index; 2746950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 2756950e428feaccc8164b989ef64e771a99948797aMathias Agopian 2766950e428feaccc8164b989ef64e771a99948797aMathias Agopianint GraphicBuffer::getIndex() const { 2776950e428feaccc8164b989ef64e771a99948797aMathias Agopian return mIndex; 2786950e428feaccc8164b989ef64e771a99948797aMathias Agopian} 2796950e428feaccc8164b989ef64e771a99948797aMathias Agopian 2806950e428feaccc8164b989ef64e771a99948797aMathias Agopian// --------------------------------------------------------------------------- 2816950e428feaccc8164b989ef64e771a99948797aMathias Agopian 2826950e428feaccc8164b989ef64e771a99948797aMathias Agopian}; // namespace android 283