ISurfaceComposer.cpp revision d85084b2b65828442eafaff9b811e9b6c9ca9fad
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 28d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/BitTube.h> 29d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/IDisplayEventConnection.h> 3090ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h> 312adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/IGraphicBufferProducer.h> 32d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 3390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3590ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <ui/DisplayInfo.h> 36582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 37134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/Log.h> 389cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass IDisplayEventConnection; 44d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer> 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project BpSurfaceComposer(const sp<IBinder>& impl) 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpInterface<ISurfaceComposer>(impl) 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 537e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian virtual sp<ISurfaceComposerClient> createConnection() 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t n; 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply); 597e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 629a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc() 639a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis { 649a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis uint32_t n; 659a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis Parcel data, reply; 669a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 679a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply); 689a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder()); 699a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis } 709a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 718b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian virtual void setTransactionState( 728b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<ComposerState>& state, 738b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<DisplayState>& displays, 748b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian uint32_t flags) 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 788b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian { 798b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<ComposerState>::const_iterator b(state.begin()); 808b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<ComposerState>::const_iterator e(state.end()); 818b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian data.writeInt32(state.size()); 828b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian for ( ; b != e ; ++b ) { 838b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian b->write(data); 848b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 858b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 868b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian { 878b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState>::const_iterator b(displays.begin()); 888b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState>::const_iterator e(displays.end()); 898b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian data.writeInt32(displays.size()); 908b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian for ( ; b != e ; ++b ) { 918b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian b->write(data); 928b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 93698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 9428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis data.writeInt32(flags); 95b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply); 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void bootFinished() 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply); 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1052a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian virtual status_t captureScreen(const sp<IBinder>& display, 1062a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian const sp<IGraphicBufferProducer>& producer, 1072a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian uint32_t reqWidth, uint32_t reqHeight, 108c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza uint32_t minLayerZ, uint32_t maxLayerZ, 109c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) 1102a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian { 1112a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian Parcel data, reply; 1122a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1132a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeStrongBinder(display); 1142a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeStrongBinder(producer->asBinder()); 1152a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeInt32(reqWidth); 1162a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeInt32(reqHeight); 1172a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeInt32(minLayerZ); 1182a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeInt32(maxLayerZ); 119c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza data.writeInt32(static_cast<int32_t>(useIdentityTransform)); 1202a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply); 1212a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian return reply.readInt32(); 1222a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian } 1232a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian 124582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis virtual bool authenticateSurfaceTexture( 1252adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer) const 126134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis { 127134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis Parcel data, reply; 128134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int err = NO_ERROR; 129134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = data.writeInterfaceToken( 130134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ISurfaceComposer::getInterfaceDescriptor()); 131134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 132e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 133134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis "interface descriptor: %s (%d)", strerror(-err), -err); 134134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 135134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 1362adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden err = data.writeStrongBinder(bufferProducer->asBinder()); 137134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 138e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 139582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "strong binder to parcel: %s (%d)", strerror(-err), -err); 140134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 141134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 142134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data, 143134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis &reply); 144134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 145e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 146582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "performing transaction: %s (%d)", strerror(-err), -err); 147134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 148134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 149134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int32_t result = 0; 150134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = reply.readInt32(&result); 151134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 152e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 153582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "retrieving result: %s (%d)", strerror(-err), -err); 154134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 155134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 156134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return result != 0; 157134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 158d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 159d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian virtual sp<IDisplayEventConnection> createDisplayEventConnection() 160d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian { 161d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian Parcel data, reply; 162d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian sp<IDisplayEventConnection> result; 163d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian int err = data.writeInterfaceToken( 164d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian ISurfaceComposer::getInterfaceDescriptor()); 165d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian if (err != NO_ERROR) { 166d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 167d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 168d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian err = remote()->transact( 169d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION, 170d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian data, &reply); 171d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian if (err != NO_ERROR) { 172e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing " 173d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian "transaction: %s (%d)", strerror(-err), -err); 174d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 175d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 176d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder()); 177d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 178d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 1798e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross 180dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis virtual sp<IBinder> createDisplay(const String8& displayName, bool secure) 181e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian { 182e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Parcel data, reply; 183e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1848dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden data.writeString8(displayName); 185dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis data.writeInt32(secure ? 1 : 0); 186e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply); 187e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return reply.readStrongBinder(); 188e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 189e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1906c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall virtual void destroyDisplay(const sp<IBinder>& display) 1916c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall { 1926c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall Parcel data, reply; 1936c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall data.writeStrongBinder(display); 1956c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply); 1966c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 1976c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall 198e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian virtual sp<IBinder> getBuiltInDisplay(int32_t id) 199e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian { 200e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Parcel data, reply; 201e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 202e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian data.writeInt32(id); 203e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply); 204e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return reply.readStrongBinder(); 205e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 206e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 207c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden virtual void blank(const sp<IBinder>& display) 2088e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross { 2098e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross Parcel data, reply; 2108e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 211c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden data.writeStrongBinder(display); 2128e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross remote()->transact(BnSurfaceComposer::BLANK, data, &reply); 2138e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross } 2148e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross 215c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden virtual void unblank(const sp<IBinder>& display) 2168e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross { 2178e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross Parcel data, reply; 2188e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 219c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden data.writeStrongBinder(display); 2208e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross remote()->transact(BnSurfaceComposer::UNBLANK, data, &reply); 2218e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross } 2223094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian 2239d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown virtual status_t getDisplayInfo(const sp<IBinder>& display, DisplayInfo* info) 224c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian { 225c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian Parcel data, reply; 226c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2279d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown data.writeStrongBinder(display); 228c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian remote()->transact(BnSurfaceComposer::GET_DISPLAY_INFO, data, &reply); 229c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian memcpy(info, reply.readInplace(sizeof(DisplayInfo)), sizeof(DisplayInfo)); 230c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian return reply.readInt32(); 231c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian } 232d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 233d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav virtual status_t clearAnimationFrameStats() { 234d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav Parcel data, reply; 235d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 236d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply); 237d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return reply.readInt32(); 238d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 239d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 240d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav virtual status_t getAnimationFrameStats(FrameStats* outStats) const { 241d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav Parcel data, reply; 242d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 243d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply); 244d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply.read(*outStats); 245d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return reply.readInt32(); 246d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer"); 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact( 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CREATE_CONNECTION: { 25883c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IBinder> b = createConnection()->asBinder(); 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(b); 2616c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 2626c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 2639a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis case CREATE_GRAPHIC_BUFFER_ALLOC: { 2649a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis CHECK_INTERFACE(ISurfaceComposer, data, reply); 2659a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis sp<IBinder> b = createGraphicBufferAlloc()->asBinder(); 2669a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis reply->writeStrongBinder(b); 2676c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 2686c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 269698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian case SET_TRANSACTION_STATE: { 27083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 271698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian size_t count = data.readInt32(); 272698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 273698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> state; 274698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.setCapacity(count); 275698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian for (size_t i=0 ; i<count ; i++) { 276698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.read(data); 277698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.add(s); 278698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 2798b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian count = data.readInt32(); 2808b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian DisplayState d; 2818b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState> displays; 2828b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian displays.setCapacity(count); 2838b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian for (size_t i=0 ; i<count ; i++) { 2848b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian d.read(data); 2858b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian displays.add(d); 2868b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 28728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t flags = data.readInt32(); 2888b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian setTransactionState(state, displays, flags); 2896c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 2906c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case BOOT_FINISHED: { 29283c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bootFinished(); 2946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 2956c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 2962a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian case CAPTURE_SCREEN: { 2972a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 2982a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian sp<IBinder> display = data.readStrongBinder(); 2992a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian sp<IGraphicBufferProducer> producer = 3002a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 3012a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian uint32_t reqWidth = data.readInt32(); 3022a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian uint32_t reqHeight = data.readInt32(); 3032a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian uint32_t minLayerZ = data.readInt32(); 3042a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian uint32_t maxLayerZ = data.readInt32(); 305c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform = static_cast<bool>(data.readInt32()); 306c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 3072a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian status_t res = captureScreen(display, producer, 308c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza reqWidth, reqHeight, minLayerZ, maxLayerZ, 309c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza useIdentityTransform); 3102a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian reply->writeInt32(res); 3116c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3126c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 313134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis case AUTHENTICATE_SURFACE: { 314134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis CHECK_INTERFACE(ISurfaceComposer, data, reply); 3152adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden sp<IGraphicBufferProducer> bufferProducer = 3162adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 3172adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0; 318134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis reply->writeInt32(result); 3196c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3206c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 321d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian case CREATE_DISPLAY_EVENT_CONNECTION: { 322d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 323d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian sp<IDisplayEventConnection> connection(createDisplayEventConnection()); 324d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian reply->writeStrongBinder(connection->asBinder()); 325d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return NO_ERROR; 3266c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 327e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian case CREATE_DISPLAY: { 328e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 3298dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden String8 displayName = data.readString8(); 330dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool secure = bool(data.readInt32()); 331dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis sp<IBinder> display(createDisplay(displayName, secure)); 332e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian reply->writeStrongBinder(display); 333e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return NO_ERROR; 3346c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 3356c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall case DESTROY_DISPLAY: { 3366c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall CHECK_INTERFACE(ISurfaceComposer, data, reply); 3376c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall sp<IBinder> display = data.readStrongBinder(); 3386c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall destroyDisplay(display); 3396c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3406c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 341e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian case GET_BUILT_IN_DISPLAY: { 342e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 343e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian int32_t id = data.readInt32(); 344e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<IBinder> display(getBuiltInDisplay(id)); 345e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian reply->writeStrongBinder(display); 346e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return NO_ERROR; 3476c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 3488e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross case BLANK: { 3498e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross CHECK_INTERFACE(ISurfaceComposer, data, reply); 350c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden sp<IBinder> display = data.readStrongBinder(); 351c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden blank(display); 3526c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3536c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 3548e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross case UNBLANK: { 3558e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross CHECK_INTERFACE(ISurfaceComposer, data, reply); 356c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden sp<IBinder> display = data.readStrongBinder(); 357c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden unblank(display); 3586c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3596c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 360c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian case GET_DISPLAY_INFO: { 361c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 362c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian DisplayInfo info; 3639d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown sp<IBinder> display = data.readStrongBinder(); 3649d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown status_t result = getDisplayInfo(display, &info); 365c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian memcpy(reply->writeInplace(sizeof(DisplayInfo)), &info, sizeof(DisplayInfo)); 366c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian reply->writeInt32(result); 3676c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3686c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 369d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav case CLEAR_ANIMATION_FRAME_STATS: { 370d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav CHECK_INTERFACE(ISurfaceComposer, data, reply); 371d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav status_t result = clearAnimationFrameStats(); 372d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->writeInt32(result); 373d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_ERROR; 374d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 375d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav case GET_ANIMATION_FRAME_STATS: { 376d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav CHECK_INTERFACE(ISurfaceComposer, data, reply); 377d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav FrameStats stats; 378d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav status_t result = getAnimationFrameStats(&stats); 379d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->write(stats); 380d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->writeInt32(result); 381d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_ERROR; 382d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 3836c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall default: { 38483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 3856c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 3876c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall // should be unreachable 388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 394