ISurfaceComposer.cpp revision c5b2c0bf8007562536b822eb060fc54a01f8e08b
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// tag as surfaceflinger 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "SurfaceFlinger" 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/Parcel.h> 24c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IMemory.h> 25c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IPCThreadState.h> 26c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IServiceManager.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/ISurfaceComposer.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/DisplayInfo.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project BpSurfaceComposer(const sp<IBinder>& impl) 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpInterface<ISurfaceComposer>(impl) 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual sp<ISurfaceFlingerClient> createConnection() 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t n; 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply); 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return interface_cast<ISurfaceFlingerClient>(reply.readStrongBinder()); 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual sp<IMemory> getCblk() const 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::GET_CBLK, data, &reply); 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return interface_cast<IMemory>(reply.readStrongBinder()); 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void openGlobalTransaction() 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::OPEN_GLOBAL_TRANSACTION, data, &reply); 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void closeGlobalTransaction() 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::CLOSE_GLOBAL_TRANSACTION, data, &reply); 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags) 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(dpy); 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(flags); 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::FREEZE_DISPLAY, data, &reply); 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return reply.readInt32(); 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags) 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(dpy); 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(flags); 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::UNFREEZE_DISPLAY, data, &reply); 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return reply.readInt32(); 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 99c08731e756868653d09d3e49b723706df3687070Mathias Agopian virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags) 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(dpy); 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(orientation); 105c08731e756868653d09d3e49b723706df3687070Mathias Agopian data.writeInt32(flags); 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::SET_ORIENTATION, data, &reply); 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return reply.readInt32(); 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void bootFinished() 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply); 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual status_t requestGPU( 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<IGPUCallback>& callback, gpu_info_t* gpu) 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeStrongBinder(callback->asBinder()); 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::REQUEST_GPU, data, &reply); 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gpu->regs = interface_cast<IMemory>(reply.readStrongBinder()); 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gpu->count = reply.readInt32(); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // FIXME: for now, we don't dynamically allocate the regions array 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t maxCount = sizeof(gpu->regions)/sizeof(*gpu->regions); 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gpu->count > maxCount) 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BAD_VALUE; 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (size_t i=0 ; i<gpu->count ; i++) { 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gpu->regions[i].region = interface_cast<IMemory>(reply.readStrongBinder()); 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gpu->regions[i].reserved = reply.readInt32(); 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return reply.readInt32(); 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual status_t revokeGPU() 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::REVOKE_GPU, data, &reply); 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return reply.readInt32(); 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void signal() const 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::SIGNAL, data, &reply, IBinder::FLAG_ONEWAY); 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer"); 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define CHECK_INTERFACE(interface, data, reply) \ 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \ 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGW("Call incorrectly routed to " #interface); \ 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return PERMISSION_DENIED; \ 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } } while (0) 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact( 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = BnInterface<ISurfaceComposer>::onTransact(code, data, reply, flags); 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (err == NO_ERROR) 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CHECK_INTERFACE(ISurfaceComposer, data, reply); 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CREATE_CONNECTION: { 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IBinder> b = createConnection()->asBinder(); 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(b); 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case OPEN_GLOBAL_TRANSACTION: { 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project openGlobalTransaction(); 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CLOSE_GLOBAL_TRANSACTION: { 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project closeGlobalTransaction(); 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case SET_ORIENTATION: { 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID dpy = data.readInt32(); 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int orientation = data.readInt32(); 188c08731e756868653d09d3e49b723706df3687070Mathias Agopian uint32_t flags = data.readInt32(); 189c08731e756868653d09d3e49b723706df3687070Mathias Agopian reply->writeInt32( setOrientation(dpy, orientation, flags) ); 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case FREEZE_DISPLAY: { 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID dpy = data.readInt32(); 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags = data.readInt32(); 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32( freezeDisplay(dpy, flags) ); 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case UNFREEZE_DISPLAY: { 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID dpy = data.readInt32(); 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags = data.readInt32(); 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32( unfreezeDisplay(dpy, flags) ); 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case BOOT_FINISHED: { 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bootFinished(); 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case REVOKE_GPU: { 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32( revokeGPU() ); 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case SIGNAL: { 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project signal(); 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GET_CBLK: { 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IBinder> b = getCblk()->asBinder(); 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(b); 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case REQUEST_GPU: { 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: this should be protected by a permission 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gpu_info_t info; 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IGPUCallback> callback 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project = interface_cast<IGPUCallback>(data.readStrongBinder()); 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t res = requestGPU(callback, &info); 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // FIXME: for now, we don't dynamically allocate the regions array 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t maxCount = sizeof(info.regions)/sizeof(*info.regions); 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (info.count > maxCount) 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BAD_VALUE; 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(info.regs->asBinder()); 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32(info.count); 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (size_t i=0 ; i<info.count ; i++) { 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(info.regions[i].region->asBinder()); 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32(info.regions[i].reserved); 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32(res); 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return UNKNOWN_TRANSACTION; 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectenum { 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Note: BOOT_FINISHED must remain this value, it is called by ActivityManagerService. 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GPU_LOST = IBinder::FIRST_CALL_TRANSACTION 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpGPUCallback : public BpInterface<IGPUCallback> 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project BpGPUCallback(const sp<IBinder>& impl) 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpInterface<IGPUCallback>(impl) 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void gpuLost() 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(IGPUCallback::getInterfaceDescriptor()); 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(GPU_LOST, data, &reply, IBinder::FLAG_ONEWAY); 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(GPUCallback, "android.ui.IGPUCallback"); 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnGPUCallback::onTransact( 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GPU_LOST: { 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CHECK_INTERFACE(IGPUCallback, data, reply); 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gpuLost(); 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 280