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> 3667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar#include <ui/DisplayStatInfo.h> 37582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 38134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/Log.h> 399cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass IDisplayEventConnection; 45d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer> 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project BpSurfaceComposer(const sp<IBinder>& impl) 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpInterface<ISurfaceComposer>(impl) 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 547e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian virtual sp<ISurfaceComposerClient> createConnection() 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t n; 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply); 607e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 639a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc() 649a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis { 659a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis uint32_t n; 669a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis Parcel data, reply; 679a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 689a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply); 699a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder()); 709a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis } 719a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 728b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian virtual void setTransactionState( 738b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<ComposerState>& state, 748b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<DisplayState>& displays, 758b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian uint32_t flags) 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 798b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian { 808b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<ComposerState>::const_iterator b(state.begin()); 818b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<ComposerState>::const_iterator e(state.end()); 828b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian data.writeInt32(state.size()); 838b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian for ( ; b != e ; ++b ) { 848b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian b->write(data); 858b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 868b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 878b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian { 888b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState>::const_iterator b(displays.begin()); 898b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState>::const_iterator e(displays.end()); 908b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian data.writeInt32(displays.size()); 918b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian for ( ; b != e ; ++b ) { 928b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian b->write(data); 938b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 94698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 9528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis data.writeInt32(flags); 96b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply); 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void bootFinished() 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 remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply); 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1062a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian virtual status_t captureScreen(const sp<IBinder>& display, 1072a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian const sp<IGraphicBufferProducer>& producer, 108c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 109c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza uint32_t minLayerZ, uint32_t maxLayerZ, 110c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews bool useIdentityTransform, 111c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews ISurfaceComposer::Rotation rotation) 1122a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian { 1132a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian Parcel data, reply; 1142a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1152a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeStrongBinder(display); 1162a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeStrongBinder(producer->asBinder()); 117c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza data.write(sourceCrop); 1182a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeInt32(reqWidth); 1192a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeInt32(reqHeight); 1202a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeInt32(minLayerZ); 1212a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeInt32(maxLayerZ); 122c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza data.writeInt32(static_cast<int32_t>(useIdentityTransform)); 123c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews data.writeInt32(static_cast<int32_t>(rotation)); 1242a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply); 1252a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian return reply.readInt32(); 1262a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian } 1272a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian 128582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis virtual bool authenticateSurfaceTexture( 1292adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer) const 130134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis { 131134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis Parcel data, reply; 132134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int err = NO_ERROR; 133134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = data.writeInterfaceToken( 134134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ISurfaceComposer::getInterfaceDescriptor()); 135134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 136e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 137134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis "interface descriptor: %s (%d)", strerror(-err), -err); 138134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 139134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 1402adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden err = data.writeStrongBinder(bufferProducer->asBinder()); 141134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 142e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 143582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "strong binder to parcel: %s (%d)", strerror(-err), -err); 144134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 145134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 146134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data, 147134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis &reply); 148134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 149e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 150582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "performing transaction: %s (%d)", strerror(-err), -err); 151134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 152134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 153134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int32_t result = 0; 154134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = reply.readInt32(&result); 155134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 156e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 157582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "retrieving result: %s (%d)", strerror(-err), -err); 158134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 159134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 160134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return result != 0; 161134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 162d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 163d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian virtual sp<IDisplayEventConnection> createDisplayEventConnection() 164d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian { 165d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian Parcel data, reply; 166d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian sp<IDisplayEventConnection> result; 167d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian int err = data.writeInterfaceToken( 168d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian ISurfaceComposer::getInterfaceDescriptor()); 169d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian if (err != NO_ERROR) { 170d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 171d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 172d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian err = remote()->transact( 173d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION, 174d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian data, &reply); 175d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian if (err != NO_ERROR) { 176e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing " 177d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian "transaction: %s (%d)", strerror(-err), -err); 178d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 179d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 180d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder()); 181d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 182d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 1838e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross 184dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis virtual sp<IBinder> createDisplay(const String8& displayName, bool secure) 185e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian { 186e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Parcel data, reply; 187e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1888dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden data.writeString8(displayName); 189dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis data.writeInt32(secure ? 1 : 0); 190e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply); 191e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return reply.readStrongBinder(); 192e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 193e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall virtual void destroyDisplay(const sp<IBinder>& display) 1956c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall { 1966c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall Parcel data, reply; 1976c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1986c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall data.writeStrongBinder(display); 1996c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply); 2006c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 2016c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall 202e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian virtual sp<IBinder> getBuiltInDisplay(int32_t id) 203e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian { 204e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Parcel data, reply; 205e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 206e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian data.writeInt32(id); 207e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply); 208e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return reply.readStrongBinder(); 209e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 210e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 2112c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani virtual void setPowerMode(const sp<IBinder>& display, int mode) 2128e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross { 2138e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross Parcel data, reply; 2148e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 215c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden data.writeStrongBinder(display); 2162c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani data.writeInt32(mode); 2172c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply); 2188e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross } 2193094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian 2207f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual status_t getDisplayConfigs(const sp<IBinder>& display, 2217f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Vector<DisplayInfo>* configs) 222c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian { 223c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian Parcel data, reply; 224c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2259d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown data.writeStrongBinder(display); 2267f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply); 2277f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = reply.readInt32(); 2287f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza if (result == NO_ERROR) { 2297f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza size_t numConfigs = static_cast<size_t>(reply.readInt32()); 2307f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza configs->clear(); 2317f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza configs->resize(numConfigs); 2327f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza for (size_t c = 0; c < numConfigs; ++c) { 2337f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza memcpy(&(configs->editItemAt(c)), 2347f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza reply.readInplace(sizeof(DisplayInfo)), 2357f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza sizeof(DisplayInfo)); 2367f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 2377f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 2387f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return result; 2397f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 2407f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 24167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar virtual status_t getDisplayStats(const sp<IBinder>& display, 24267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar DisplayStatInfo* stats) 24367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar { 24467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar Parcel data, reply; 24567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 24667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar data.writeStrongBinder(display); 24767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply); 24867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar status_t result = reply.readInt32(); 24967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar if (result == NO_ERROR) { 25067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar memcpy(stats, 25167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar reply.readInplace(sizeof(DisplayStatInfo)), 25267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar sizeof(DisplayStatInfo)); 25367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 25467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar return result; 25567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 25667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar 2577f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual int getActiveConfig(const sp<IBinder>& display) 2587f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza { 2597f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Parcel data, reply; 2607f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2617f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeStrongBinder(display); 2627f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply); 2637f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return reply.readInt32(); 2647f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 2657f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 2667f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual status_t setActiveConfig(const sp<IBinder>& display, int id) 2677f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza { 2687f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Parcel data, reply; 2697f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2707f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeStrongBinder(display); 2717f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeInt32(id); 2727f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply); 273c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian return reply.readInt32(); 274c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian } 275d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 276d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav virtual status_t clearAnimationFrameStats() { 277d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav Parcel data, reply; 278d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 279d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply); 280d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return reply.readInt32(); 281d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 282d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 283d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav virtual status_t getAnimationFrameStats(FrameStats* outStats) const { 284d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav Parcel data, reply; 285d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 286d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply); 287d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply.read(*outStats); 288d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return reply.readInt32(); 289d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer"); 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact( 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CREATE_CONNECTION: { 30183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IBinder> b = createConnection()->asBinder(); 303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(b); 3046c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3056c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 3069a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis case CREATE_GRAPHIC_BUFFER_ALLOC: { 3079a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis CHECK_INTERFACE(ISurfaceComposer, data, reply); 3089a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis sp<IBinder> b = createGraphicBufferAlloc()->asBinder(); 3099a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis reply->writeStrongBinder(b); 3106c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3116c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 312698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian case SET_TRANSACTION_STATE: { 31383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 314698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian size_t count = data.readInt32(); 3158afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (count > data.dataSize()) { 3168afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 3178afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 318698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 319698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> state; 320698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.setCapacity(count); 321698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian for (size_t i=0 ; i<count ; i++) { 3228afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (s.read(data) == BAD_VALUE) { 3238afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 3248afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 325698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.add(s); 326698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 3278b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian count = data.readInt32(); 3288afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (count > data.dataSize()) { 3298afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 3308afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 3318b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian DisplayState d; 3328b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState> displays; 3338b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian displays.setCapacity(count); 3348b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian for (size_t i=0 ; i<count ; i++) { 3358afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (d.read(data) == BAD_VALUE) { 3368afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 3378afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 3388b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian displays.add(d); 3398b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 34028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t flags = data.readInt32(); 3418b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian setTransactionState(state, displays, flags); 3426c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3436c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case BOOT_FINISHED: { 34583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bootFinished(); 3476c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3486c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 3492a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian case CAPTURE_SCREEN: { 3502a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 3512a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian sp<IBinder> display = data.readStrongBinder(); 3522a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian sp<IGraphicBufferProducer> producer = 3532a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 354c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop; 355c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza data.read(sourceCrop); 3562a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian uint32_t reqWidth = data.readInt32(); 3572a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian uint32_t reqHeight = data.readInt32(); 3582a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian uint32_t minLayerZ = data.readInt32(); 3592a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian uint32_t maxLayerZ = data.readInt32(); 360c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform = static_cast<bool>(data.readInt32()); 361c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews uint32_t rotation = data.readInt32(); 362c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 3632a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian status_t res = captureScreen(display, producer, 364c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, 365c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews useIdentityTransform, 366c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews static_cast<ISurfaceComposer::Rotation>(rotation)); 3672a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian reply->writeInt32(res); 3686c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3696c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 370134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis case AUTHENTICATE_SURFACE: { 371134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis CHECK_INTERFACE(ISurfaceComposer, data, reply); 3722adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden sp<IGraphicBufferProducer> bufferProducer = 3732adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 3742adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0; 375134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis reply->writeInt32(result); 3766c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3776c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 378d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian case CREATE_DISPLAY_EVENT_CONNECTION: { 379d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 380d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian sp<IDisplayEventConnection> connection(createDisplayEventConnection()); 381d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian reply->writeStrongBinder(connection->asBinder()); 382d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return NO_ERROR; 3836c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 384e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian case CREATE_DISPLAY: { 385e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 3868dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden String8 displayName = data.readString8(); 387dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool secure = bool(data.readInt32()); 388dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis sp<IBinder> display(createDisplay(displayName, secure)); 389e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian reply->writeStrongBinder(display); 390e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return NO_ERROR; 3916c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 3926c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall case DESTROY_DISPLAY: { 3936c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall CHECK_INTERFACE(ISurfaceComposer, data, reply); 3946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall sp<IBinder> display = data.readStrongBinder(); 3956c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall destroyDisplay(display); 3966c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3976c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 398e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian case GET_BUILT_IN_DISPLAY: { 399e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 400e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian int32_t id = data.readInt32(); 401e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<IBinder> display(getBuiltInDisplay(id)); 402e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian reply->writeStrongBinder(display); 403e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return NO_ERROR; 4046c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 4057f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza case GET_DISPLAY_CONFIGS: { 4067f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza CHECK_INTERFACE(ISurfaceComposer, data, reply); 4077f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Vector<DisplayInfo> configs; 4087f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza sp<IBinder> display = data.readStrongBinder(); 4097f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = getDisplayConfigs(display, &configs); 4107f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza reply->writeInt32(result); 4117f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza if (result == NO_ERROR) { 4127f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza reply->writeInt32(static_cast<int32_t>(configs.size())); 4137f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza for (size_t c = 0; c < configs.size(); ++c) { 4147f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza memcpy(reply->writeInplace(sizeof(DisplayInfo)), 4157f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza &configs[c], sizeof(DisplayInfo)); 4167f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 4177f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 4187f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return NO_ERROR; 4197f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 42067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar case GET_DISPLAY_STATS: { 42167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar CHECK_INTERFACE(ISurfaceComposer, data, reply); 42267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar DisplayStatInfo stats; 42367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar sp<IBinder> display = data.readStrongBinder(); 42467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar status_t result = getDisplayStats(display, &stats); 42567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar reply->writeInt32(result); 42667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar if (result == NO_ERROR) { 42767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar memcpy(reply->writeInplace(sizeof(DisplayStatInfo)), 42867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar &stats, sizeof(DisplayStatInfo)); 42967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 43067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar return NO_ERROR; 43167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 4327f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza case GET_ACTIVE_CONFIG: { 4337f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza CHECK_INTERFACE(ISurfaceComposer, data, reply); 4347f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza sp<IBinder> display = data.readStrongBinder(); 4357f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza int id = getActiveConfig(display); 4367f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza reply->writeInt32(id); 4377f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return NO_ERROR; 4387f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 4397f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza case SET_ACTIVE_CONFIG: { 440c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 4419d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown sp<IBinder> display = data.readStrongBinder(); 4427f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza int id = data.readInt32(); 4437f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = setActiveConfig(display, id); 444c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian reply->writeInt32(result); 4456c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 4466c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 447d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav case CLEAR_ANIMATION_FRAME_STATS: { 448d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav CHECK_INTERFACE(ISurfaceComposer, data, reply); 449d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav status_t result = clearAnimationFrameStats(); 450d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->writeInt32(result); 451d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_ERROR; 452d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 453d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav case GET_ANIMATION_FRAME_STATS: { 454d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav CHECK_INTERFACE(ISurfaceComposer, data, reply); 455d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav FrameStats stats; 456d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav status_t result = getAnimationFrameStats(&stats); 457d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->write(stats); 458d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->writeInt32(result); 459d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_ERROR; 460d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 4612c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani case SET_POWER_MODE: { 4622c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani CHECK_INTERFACE(ISurfaceComposer, data, reply); 4632c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani sp<IBinder> display = data.readStrongBinder(); 4642c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani int32_t mode = data.readInt32(); 4652c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani setPowerMode(display, mode); 4662c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return NO_ERROR; 4672c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani } 4686c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall default: { 46983c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 4706c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 4726c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall // should be unreachable 473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 479