ISurfaceComposer.cpp revision c4f471e75a8ec64ec34e3f2944a5a756215d0bec
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> 37c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza#include <ui/HdrCapabilities.h> 38582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 39134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/Log.h> 409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 45d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass IDisplayEventConnection; 46d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer> 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project BpSurfaceComposer(const sp<IBinder>& impl) 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpInterface<ISurfaceComposer>(impl) 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 55d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza virtual ~BpSurfaceComposer(); 56d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 577e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian virtual sp<ISurfaceComposerClient> createConnection() 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply); 627e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 659a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc() 669a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis { 679a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis Parcel data, reply; 689a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 699a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply); 709a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder()); 719a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis } 729a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 738b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian virtual void setTransactionState( 748b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<ComposerState>& state, 758b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<DisplayState>& displays, 768b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian uint32_t flags) 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 80d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 81d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(static_cast<uint32_t>(state.size())); 82d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (const auto& s : state) { 83d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza s.write(data); 848b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 85d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 86d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(static_cast<uint32_t>(displays.size())); 87d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (const auto& d : displays) { 88d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza d.write(data); 89698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 90d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 91d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(flags); 92b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply); 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void bootFinished() 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply); 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1022a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian virtual status_t captureScreen(const sp<IBinder>& display, 1032a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian const sp<IGraphicBufferProducer>& producer, 104c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 105c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza uint32_t minLayerZ, uint32_t maxLayerZ, 106c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews bool useIdentityTransform, 107c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews ISurfaceComposer::Rotation rotation) 1082a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian { 1092a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian Parcel data, reply; 1102a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1112a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeStrongBinder(display); 1122ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen data.writeStrongBinder(IInterface::asBinder(producer)); 113c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza data.write(sourceCrop); 114d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(reqWidth); 115d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(reqHeight); 116d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(minLayerZ); 117d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(maxLayerZ); 118c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza data.writeInt32(static_cast<int32_t>(useIdentityTransform)); 119c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews data.writeInt32(static_cast<int32_t>(rotation)); 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 } 1362ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen err = data.writeStrongBinder(IInterface::asBinder(bufferProducer)); 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 2072c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani virtual void setPowerMode(const sp<IBinder>& display, int mode) 2088e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross { 2098e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross Parcel data, reply; 2108e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 211c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden data.writeStrongBinder(display); 2122c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani data.writeInt32(mode); 2132c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply); 2148e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross } 2153094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian 2167f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual status_t getDisplayConfigs(const sp<IBinder>& display, 2177f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Vector<DisplayInfo>* configs) 218c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian { 219c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian Parcel data, reply; 220c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2219d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown data.writeStrongBinder(display); 2227f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply); 2237f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = reply.readInt32(); 2247f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza if (result == NO_ERROR) { 225d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza size_t numConfigs = reply.readUint32(); 2267f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza configs->clear(); 2277f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza configs->resize(numConfigs); 2287f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza for (size_t c = 0; c < numConfigs; ++c) { 2297f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza memcpy(&(configs->editItemAt(c)), 2307f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza reply.readInplace(sizeof(DisplayInfo)), 2317f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza sizeof(DisplayInfo)); 2327f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 2337f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 2347f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return result; 2357f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 2367f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 23767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar virtual status_t getDisplayStats(const sp<IBinder>& display, 23867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar DisplayStatInfo* stats) 23967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar { 24067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar Parcel data, reply; 24167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 24267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar data.writeStrongBinder(display); 24367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply); 24467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar status_t result = reply.readInt32(); 24567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar if (result == NO_ERROR) { 24667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar memcpy(stats, 24767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar reply.readInplace(sizeof(DisplayStatInfo)), 24867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar sizeof(DisplayStatInfo)); 24967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 25067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar return result; 25167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 25267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar 2537f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual int getActiveConfig(const sp<IBinder>& display) 2547f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza { 2557f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Parcel data, reply; 2567f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2577f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeStrongBinder(display); 2587f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply); 2597f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return reply.readInt32(); 2607f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 2617f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 2627f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual status_t setActiveConfig(const sp<IBinder>& display, int id) 2637f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza { 2647f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Parcel data, reply; 2657f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2667f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeStrongBinder(display); 2677f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeInt32(id); 2687f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply); 269c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian return reply.readInt32(); 270c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian } 271d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 272d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav virtual status_t clearAnimationFrameStats() { 273d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav Parcel data, reply; 274d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 275d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply); 276d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return reply.readInt32(); 277d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 278d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 279d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav virtual status_t getAnimationFrameStats(FrameStats* outStats) const { 280d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav Parcel data, reply; 281d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 282d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply); 283d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply.read(*outStats); 284d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return reply.readInt32(); 285d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 286c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza 287c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza virtual status_t getHdrCapabilities(const sp<IBinder>& display, 288c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza HdrCapabilities* outCapabilities) const { 289c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza Parcel data, reply; 290c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 291c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza status_t result = data.writeStrongBinder(display); 292c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result != NO_ERROR) { 293c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza ALOGE("getHdrCapabilities failed to writeStrongBinder: %d", result); 294c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return result; 295c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 296c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza result = remote()->transact(BnSurfaceComposer::GET_HDR_CAPABILITIES, 297c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza data, &reply); 298c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result != NO_ERROR) { 299c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza ALOGE("getHdrCapabilities failed to transact: %d", result); 300c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return result; 301c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 302c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza result = reply.readInt32(); 303c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result == NO_ERROR) { 304c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza result = reply.readParcelable(outCapabilities); 305c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 306c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return result; 307c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 310d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this 311d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// translation unit (see clang warning -Wweak-vtables) 312d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan StozaBpSurfaceComposer::~BpSurfaceComposer() {} 313d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer"); 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact( 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CREATE_CONNECTION: { 32383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 3242ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen sp<IBinder> b = IInterface::asBinder(createConnection()); 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(b); 3266c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3276c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 3289a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis case CREATE_GRAPHIC_BUFFER_ALLOC: { 3299a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis CHECK_INTERFACE(ISurfaceComposer, data, reply); 3302ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen sp<IBinder> b = IInterface::asBinder(createGraphicBufferAlloc()); 3319a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis reply->writeStrongBinder(b); 3326c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3336c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 334698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian case SET_TRANSACTION_STATE: { 33583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 336d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 337d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza size_t count = data.readUint32(); 3388afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (count > data.dataSize()) { 3398afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 3408afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 341698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 342698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> state; 343698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.setCapacity(count); 344d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (size_t i = 0; i < count; i++) { 3458afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (s.read(data) == BAD_VALUE) { 3468afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 3478afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 348698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.add(s); 349698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 350d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 351d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza count = data.readUint32(); 3528afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (count > data.dataSize()) { 3538afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 3548afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 3558b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian DisplayState d; 3568b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState> displays; 3578b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian displays.setCapacity(count); 358d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (size_t i = 0; i < count; i++) { 3598afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (d.read(data) == BAD_VALUE) { 3608afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 3618afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 3628b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian displays.add(d); 3638b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 364d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 365d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza uint32_t stateFlags = data.readUint32(); 366d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza setTransactionState(state, displays, stateFlags); 3676c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3686c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case BOOT_FINISHED: { 37083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bootFinished(); 3726c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3736c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 3742a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian case CAPTURE_SCREEN: { 3752a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 3762a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian sp<IBinder> display = data.readStrongBinder(); 3772a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian sp<IGraphicBufferProducer> producer = 3782a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 37960d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos Rect sourceCrop(Rect::EMPTY_RECT); 380c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza data.read(sourceCrop); 381d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza uint32_t reqWidth = data.readUint32(); 382d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza uint32_t reqHeight = data.readUint32(); 383d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza uint32_t minLayerZ = data.readUint32(); 384d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza uint32_t maxLayerZ = data.readUint32(); 385c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform = static_cast<bool>(data.readInt32()); 386d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza int32_t rotation = data.readInt32(); 387c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 3882a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian status_t res = captureScreen(display, producer, 389c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, 390c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews useIdentityTransform, 391c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews static_cast<ISurfaceComposer::Rotation>(rotation)); 3922a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian reply->writeInt32(res); 3936c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 3946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 395134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis case AUTHENTICATE_SURFACE: { 396134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis CHECK_INTERFACE(ISurfaceComposer, data, reply); 3972adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden sp<IGraphicBufferProducer> bufferProducer = 3982adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 3992adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0; 400134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis reply->writeInt32(result); 4016c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 4026c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 403d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian case CREATE_DISPLAY_EVENT_CONNECTION: { 404d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 405d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian sp<IDisplayEventConnection> connection(createDisplayEventConnection()); 4062ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(connection)); 407d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return NO_ERROR; 4086c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 409e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian case CREATE_DISPLAY: { 410e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 4118dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden String8 displayName = data.readString8(); 412dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool secure = bool(data.readInt32()); 413dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis sp<IBinder> display(createDisplay(displayName, secure)); 414e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian reply->writeStrongBinder(display); 415e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return NO_ERROR; 4166c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 4176c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall case DESTROY_DISPLAY: { 4186c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall CHECK_INTERFACE(ISurfaceComposer, data, reply); 4196c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall sp<IBinder> display = data.readStrongBinder(); 4206c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall destroyDisplay(display); 4216c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 4226c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 423e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian case GET_BUILT_IN_DISPLAY: { 424e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 425e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian int32_t id = data.readInt32(); 426e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<IBinder> display(getBuiltInDisplay(id)); 427e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian reply->writeStrongBinder(display); 428e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return NO_ERROR; 4296c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 4307f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza case GET_DISPLAY_CONFIGS: { 4317f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza CHECK_INTERFACE(ISurfaceComposer, data, reply); 4327f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Vector<DisplayInfo> configs; 4337f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza sp<IBinder> display = data.readStrongBinder(); 4347f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = getDisplayConfigs(display, &configs); 4357f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza reply->writeInt32(result); 4367f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza if (result == NO_ERROR) { 437d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza reply->writeUint32(static_cast<uint32_t>(configs.size())); 4387f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza for (size_t c = 0; c < configs.size(); ++c) { 4397f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza memcpy(reply->writeInplace(sizeof(DisplayInfo)), 4407f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza &configs[c], sizeof(DisplayInfo)); 4417f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 4427f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 4437f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return NO_ERROR; 4447f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 44567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar case GET_DISPLAY_STATS: { 44667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar CHECK_INTERFACE(ISurfaceComposer, data, reply); 44767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar DisplayStatInfo stats; 44867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar sp<IBinder> display = data.readStrongBinder(); 44967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar status_t result = getDisplayStats(display, &stats); 45067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar reply->writeInt32(result); 45167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar if (result == NO_ERROR) { 45267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar memcpy(reply->writeInplace(sizeof(DisplayStatInfo)), 45367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar &stats, sizeof(DisplayStatInfo)); 45467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 45567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar return NO_ERROR; 45667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 4577f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza case GET_ACTIVE_CONFIG: { 4587f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza CHECK_INTERFACE(ISurfaceComposer, data, reply); 4597f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza sp<IBinder> display = data.readStrongBinder(); 4607f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza int id = getActiveConfig(display); 4617f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza reply->writeInt32(id); 4627f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return NO_ERROR; 4637f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 4647f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza case SET_ACTIVE_CONFIG: { 465c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 4669d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown sp<IBinder> display = data.readStrongBinder(); 4677f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza int id = data.readInt32(); 4687f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = setActiveConfig(display, id); 469c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian reply->writeInt32(result); 4706c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 4716c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 472d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav case CLEAR_ANIMATION_FRAME_STATS: { 473d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav CHECK_INTERFACE(ISurfaceComposer, data, reply); 474d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav status_t result = clearAnimationFrameStats(); 475d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->writeInt32(result); 476d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_ERROR; 477d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 478d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav case GET_ANIMATION_FRAME_STATS: { 479d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav CHECK_INTERFACE(ISurfaceComposer, data, reply); 480d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav FrameStats stats; 481d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav status_t result = getAnimationFrameStats(&stats); 482d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->write(stats); 483d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->writeInt32(result); 484d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_ERROR; 485d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 4862c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani case SET_POWER_MODE: { 4872c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani CHECK_INTERFACE(ISurfaceComposer, data, reply); 4882c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani sp<IBinder> display = data.readStrongBinder(); 4892c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani int32_t mode = data.readInt32(); 4902c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani setPowerMode(display, mode); 4912c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return NO_ERROR; 4922c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani } 493c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza case GET_HDR_CAPABILITIES: { 494c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza CHECK_INTERFACE(ISurfaceComposer, data, reply); 495c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza sp<IBinder> display = nullptr; 496c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza status_t result = data.readStrongBinder(&display); 497c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result != NO_ERROR) { 498c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza ALOGE("getHdrCapabilities failed to readStrongBinder: %d", 499c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza result); 500c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return result; 501c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 502c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza HdrCapabilities capabilities; 503c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza result = getHdrCapabilities(display, &capabilities); 504c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza reply->writeInt32(result); 505c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result == NO_ERROR) { 506c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza reply->writeParcelable(capabilities); 507c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 508c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return NO_ERROR; 509c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 5106c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall default: { 51183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 5126c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 519