ISurfaceComposerClient.cpp revision 698c0873cf2e07bdc7fd1e72169aee2a19fa40d7
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 <stdio.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 24c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/Parcel.h> 25c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IMemory.h> 26c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IPCThreadState.h> 27c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IServiceManager.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Point.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Rect.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 329cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurface.h> 337e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian#include <surfaceflinger/ISurfaceComposerClient.h> 349cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <private/surfaceflinger/LayerState.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian/* ideally AID_GRAPHICS would be in a semi-public header 39a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian * or there would be a way to map a user/group name to its id 40a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian */ 41a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian#ifndef AID_GRAPHICS 42a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian#define AID_GRAPHICS 1003 43a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian#endif 44a1ecca920e15ce04fe56ebf4f1b52ba711f9eb2dMathias Agopian 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectenum { 53a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian CREATE_SURFACE = IBinder::FIRST_CALL_TRANSACTION, 54698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian DESTROY_SURFACE 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 577e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianclass BpSurfaceComposerClient : public BpInterface<ISurfaceComposerClient> 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 607e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian BpSurfaceComposerClient(const sp<IBinder>& impl) 617e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian : BpInterface<ISurfaceComposerClient>(impl) 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual sp<ISurface> createSurface( surface_data_t* params, 66285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const String8& name, 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID display, 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t w, 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t h, 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormat format, 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags) 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 747e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian data.writeInterfaceToken(ISurfaceComposerClient::getInterfaceDescriptor()); 75285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian data.writeString8(name); 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(display); 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(w); 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(h); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(format); 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(flags); 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(CREATE_SURFACE, data, &reply); 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project params->readFromParcel(reply); 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return interface_cast<ISurface>(reply.readStrongBinder()); 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 857e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual status_t destroySurface(SurfaceID sid) 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 897e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian data.writeInterfaceToken(ISurfaceComposerClient::getInterfaceDescriptor()); 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(sid); 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(DESTROY_SURFACE, data, &reply); 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return reply.readInt32(); 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 967e27f05739c8a2655cf0f7faea35614ce0a50278Mathias AgopianIMPLEMENT_META_INTERFACE(SurfaceComposerClient, "android.ui.ISurfaceComposerClient"); 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1007e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatus_t BnSurfaceComposerClient::onTransact( 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CREATE_SURFACE: { 1057e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian CHECK_INTERFACE(ISurfaceComposerClient, data, reply); 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface_data_t params; 107285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian String8 name = data.readString8(); 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID display = data.readInt32(); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t w = data.readInt32(); 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t h = data.readInt32(); 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormat format = data.readInt32(); 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags = data.readInt32(); 1130ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian sp<ISurface> s = createSurface(¶ms, name, display, w, h, 114285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian format, flags); 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project params.writeToParcel(reply); 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(s->asBinder()); 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case DESTROY_SURFACE: { 1207e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian CHECK_INTERFACE(ISurfaceComposerClient, data, reply); 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeInt32( destroySurface( data.readInt32() ) ); 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1317e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatus_t ISurfaceComposerClient::surface_data_t::readFromParcel(const Parcel& parcel) 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1331c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian token = parcel.readInt32(); 1341c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian identity = parcel.readInt32(); 1351c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian width = parcel.readInt32(); 1361c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian height = parcel.readInt32(); 1371c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian format = parcel.readInt32(); 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1417e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatus_t ISurfaceComposerClient::surface_data_t::writeToParcel(Parcel* parcel) const 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project parcel->writeInt32(token); 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project parcel->writeInt32(identity); 1451c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian parcel->writeInt32(width); 1461c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian parcel->writeInt32(height); 1471c97d2ebe1f035beabd90089bfc78326b73d7864Mathias Agopian parcel->writeInt32(format); 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 152