ISurfaceComposer.cpp revision 7e27f05739c8a2655cf0f7faea35614ce0a50278
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/DisplayInfo.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 309cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurfaceComposer.h> 319cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer> 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project BpSurfaceComposer(const sp<IBinder>& impl) 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpInterface<ISurfaceComposer>(impl) 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 497e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian virtual sp<ISurfaceComposerClient> createConnection() 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t n; 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply); 557e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 587303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian virtual sp<IMemoryHeap> getCblk() const 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::GET_CBLK, data, &reply); 637303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian return interface_cast<IMemoryHeap>(reply.readStrongBinder()); 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void openGlobalTransaction() 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::OPEN_GLOBAL_TRANSACTION, data, &reply); 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void closeGlobalTransaction() 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::CLOSE_GLOBAL_TRANSACTION, data, &reply); 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags) 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(dpy); 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(flags); 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::FREEZE_DISPLAY, data, &reply); 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return reply.readInt32(); 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags) 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(dpy); 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(flags); 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::UNFREEZE_DISPLAY, data, &reply); 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return reply.readInt32(); 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 100c08731e756868653d09d3e49b723706df3687070Mathias Agopian virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags) 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(dpy); 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(orientation); 106c08731e756868653d09d3e49b723706df3687070Mathias Agopian data.writeInt32(flags); 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::SET_ORIENTATION, data, &reply); 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return reply.readInt32(); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void bootFinished() 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply); 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void signal() const 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 remote()->transact(BnSurfaceComposer::SIGNAL, data, &reply, IBinder::FLAG_ONEWAY); 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer"); 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact( 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CREATE_CONNECTION: { 13583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IBinder> b = createConnection()->asBinder(); 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(b); 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case OPEN_GLOBAL_TRANSACTION: { 14083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project openGlobalTransaction(); 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CLOSE_GLOBAL_TRANSACTION: { 14483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project closeGlobalTransaction(); 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case SET_ORIENTATION: { 14883c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID dpy = data.readInt32(); 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int orientation = data.readInt32(); 151c08731e756868653d09d3e49b723706df3687070Mathias Agopian uint32_t flags = data.readInt32(); 152c08731e756868653d09d3e49b723706df3687070Mathias Agopian reply->writeInt32( setOrientation(dpy, orientation, flags) ); 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case FREEZE_DISPLAY: { 15583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID dpy = data.readInt32(); 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags = data.readInt32(); 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32( freezeDisplay(dpy, flags) ); 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case UNFREEZE_DISPLAY: { 16183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID dpy = data.readInt32(); 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags = data.readInt32(); 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32( unfreezeDisplay(dpy, flags) ); 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case BOOT_FINISHED: { 16783c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bootFinished(); 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case SIGNAL: { 17183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project signal(); 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GET_CBLK: { 17583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IBinder> b = getCblk()->asBinder(); 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(b); 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 18083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 188