IGraphicBufferAlloc.cpp revision 4cb18881b55b82a24873ccd8e298bc2d5a9c17e5
1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17// tag as surfaceflinger 18#define LOG_TAG "SurfaceFlinger" 19 20#include <stdint.h> 21#include <sys/types.h> 22 23#include <binder/Parcel.h> 24 25#include <ui/GraphicBuffer.h> 26 27#include <surfaceflinger/IGraphicBufferAlloc.h> 28 29// --------------------------------------------------------------------------- 30 31namespace android { 32 33enum { 34 CREATE_GRAPHIC_BUFFER = IBinder::FIRST_CALL_TRANSACTION, 35}; 36 37class BpGraphicBufferAlloc : public BpInterface<IGraphicBufferAlloc> 38{ 39public: 40 BpGraphicBufferAlloc(const sp<IBinder>& impl) 41 : BpInterface<IGraphicBufferAlloc>(impl) 42 { 43 } 44 45 virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t w, uint32_t h, 46 PixelFormat format, uint32_t usage) { 47 Parcel data, reply; 48 data.writeInterfaceToken(IGraphicBufferAlloc::getInterfaceDescriptor()); 49 data.writeInt32(w); 50 data.writeInt32(h); 51 data.writeInt32(format); 52 data.writeInt32(usage); 53 remote()->transact(CREATE_GRAPHIC_BUFFER, data, &reply); 54 sp<GraphicBuffer> graphicBuffer; 55 bool nonNull = (bool)reply.readInt32(); 56 if (nonNull) { 57 graphicBuffer = new GraphicBuffer(); 58 reply.read(*graphicBuffer); 59 // reply.readStrongBinder(); 60 // here we don't even have to read the BufferReference from 61 // the parcel, it'll die with the parcel. 62 } 63 return graphicBuffer; 64 } 65}; 66 67IMPLEMENT_META_INTERFACE(GraphicBufferAlloc, "android.ui.IGraphicBufferAlloc"); 68 69// ---------------------------------------------------------------------- 70 71status_t BnGraphicBufferAlloc::onTransact( 72 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 73{ 74 // codes that don't require permission check 75 76 /* BufferReference just keeps a strong reference to a 77 * GraphicBuffer until it is destroyed (that is, until 78 * no local or remote process have a reference to it). 79 */ 80 class BufferReference : public BBinder { 81 sp<GraphicBuffer> buffer; 82 public: 83 BufferReference(const sp<GraphicBuffer>& buffer) : buffer(buffer) { } 84 }; 85 86 87 switch(code) { 88 case CREATE_GRAPHIC_BUFFER: { 89 CHECK_INTERFACE(IGraphicBufferAlloc, data, reply); 90 uint32_t w = data.readInt32(); 91 uint32_t h = data.readInt32(); 92 PixelFormat format = data.readInt32(); 93 uint32_t usage = data.readInt32(); 94 sp<GraphicBuffer> result(createGraphicBuffer(w, h, format, usage)); 95 reply->writeInt32(result != 0); 96 if (result != 0) { 97 reply->write(*result); 98 // We add a BufferReference to this parcel to make sure the 99 // buffer stays alive until the GraphicBuffer object on 100 // the other side has been created. 101 // This is needed so that the buffer handle can be 102 // registered before the buffer is destroyed on implementations 103 // that do not use file-descriptors to track their buffers. 104 reply->writeStrongBinder( new BufferReference(result) ); 105 } 106 return NO_ERROR; 107 } break; 108 default: 109 return BBinder::onTransact(code, data, reply, flags); 110 } 111} 112 113}; // namespace android 114