ISurfaceComposer.cpp revision 770492cb2b19f6a36ad748cd05fbedfbb9a67dfa
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// tag as surfaceflinger 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "SurfaceFlinger" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 230795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/Parcel.h> 240795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IMemory.h> 250795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IPCThreadState.h> 260795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IServiceManager.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/DisplayInfo.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <surfaceflinger/ISurfaceComposer.h> 31000479f9e325b4e426a67033abd92d47da412725Mathias Agopian 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer> 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BpSurfaceComposer(const sp<IBinder>& impl) 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : BpInterface<ISurfaceComposer>(impl) 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49770492cb2b19f6a36ad748cd05fbedfbb9a67dfaMathias Agopian virtual sp<ISurfaceComposerClient> createConnection() 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t n; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply); 55770492cb2b19f6a36ad748cd05fbedfbb9a67dfaMathias Agopian return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian virtual sp<IMemoryHeap> getCblk() const 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(BnSurfaceComposer::GET_CBLK, data, &reply); 63d763b5d9197e01662cafa376e1227e53e0463a3cMathias Agopian return interface_cast<IMemoryHeap>(reply.readStrongBinder()); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void openGlobalTransaction() 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(BnSurfaceComposer::OPEN_GLOBAL_TRANSACTION, data, &reply); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void closeGlobalTransaction() 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(BnSurfaceComposer::CLOSE_GLOBAL_TRANSACTION, data, &reply); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags) 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(dpy); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(flags); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(BnSurfaceComposer::FREEZE_DISPLAY, data, &reply); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags) 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(dpy); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(flags); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(BnSurfaceComposer::UNFREEZE_DISPLAY, data, &reply); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 100eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags) 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(dpy); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(orientation); 106eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian data.writeInt32(flags); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(BnSurfaceComposer::SET_ORIENTATION, data, &reply); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readInt32(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void bootFinished() 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void signal() const 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(BnSurfaceComposer::SIGNAL, data, &reply, IBinder::FLAG_ONEWAY); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer"); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------- 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact( 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(code) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CREATE_CONNECTION: { 135aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> b = createConnection()->asBinder(); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeStrongBinder(b); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case OPEN_GLOBAL_TRANSACTION: { 140aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project openGlobalTransaction(); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CLOSE_GLOBAL_TRANSACTION: { 144aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project closeGlobalTransaction(); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SET_ORIENTATION: { 148aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayID dpy = data.readInt32(); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int orientation = data.readInt32(); 151eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian uint32_t flags = data.readInt32(); 152eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian reply->writeInt32( setOrientation(dpy, orientation, flags) ); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FREEZE_DISPLAY: { 155aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayID dpy = data.readInt32(); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags = data.readInt32(); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( freezeDisplay(dpy, flags) ); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UNFREEZE_DISPLAY: { 161aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayID dpy = data.readInt32(); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags = data.readInt32(); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32( unfreezeDisplay(dpy, flags) ); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOT_FINISHED: { 167aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bootFinished(); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SIGNAL: { 171aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project signal(); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_CBLK: { 175aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> b = getCblk()->asBinder(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeStrongBinder(b); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 180aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 188