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/IPCThreadState.h> 25c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IServiceManager.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/IDisplayEventConnection.h> 282adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/IGraphicBufferProducer.h> 292b5dd4062dd951b2cafc4b80bd3a1813b013d71aMathias Agopian#include <gui/ISurfaceComposer.h> 302b5dd4062dd951b2cafc4b80bd3a1813b013d71aMathias Agopian#include <gui/ISurfaceComposerClient.h> 31a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include <gui/LayerDebugInfo.h> 324cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr#include <gui/LayerState.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright#include <system/graphics.h> 3528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 3690ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <ui/DisplayInfo.h> 3767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar#include <ui/DisplayStatInfo.h> 38c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza#include <ui/HdrCapabilities.h> 39582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 40134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/Log.h> 419cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Linusing ui::ColorMode; 47fd997e0969100418b4df8b8d97d21d497afa76c3Peiyong Lin 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer> 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 51e2347b7953f70232541bdc1b392230d6231aaeb9Chih-Hung Hsieh explicit BpSurfaceComposer(const sp<IBinder>& impl) 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpInterface<ISurfaceComposer>(impl) 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza virtual ~BpSurfaceComposer(); 57d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 587e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian virtual sp<ISurfaceComposerClient> createConnection() 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply); 637e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 661db73f66624e7d151710483dd58e03eed672f064Robert Carr virtual sp<ISurfaceComposerClient> createScopedConnection( 671db73f66624e7d151710483dd58e03eed672f064Robert Carr const sp<IGraphicBufferProducer>& parent) 681db73f66624e7d151710483dd58e03eed672f064Robert Carr { 691db73f66624e7d151710483dd58e03eed672f064Robert Carr Parcel data, reply; 701db73f66624e7d151710483dd58e03eed672f064Robert Carr data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 711db73f66624e7d151710483dd58e03eed672f064Robert Carr data.writeStrongBinder(IInterface::asBinder(parent)); 721db73f66624e7d151710483dd58e03eed672f064Robert Carr remote()->transact(BnSurfaceComposer::CREATE_SCOPED_CONNECTION, data, &reply); 731db73f66624e7d151710483dd58e03eed672f064Robert Carr return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 741db73f66624e7d151710483dd58e03eed672f064Robert Carr } 751db73f66624e7d151710483dd58e03eed672f064Robert Carr 768b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian virtual void setTransactionState( 778b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<ComposerState>& state, 788b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<DisplayState>& displays, 798b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian uint32_t flags) 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 83d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 84d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(static_cast<uint32_t>(state.size())); 85d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (const auto& s : state) { 86d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza s.write(data); 878b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 88d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 89d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(static_cast<uint32_t>(displays.size())); 90d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (const auto& d : displays) { 91d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza d.write(data); 92698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 93d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 94d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(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 10540482ff650751819d4104c10a30974838168438cChavi Weingarten virtual status_t captureScreen(const sp<IBinder>& display, sp<GraphicBuffer>* outBuffer, 10640482ff650751819d4104c10a30974838168438cChavi Weingarten Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 10740482ff650751819d4104c10a30974838168438cChavi Weingarten int32_t minLayerZ, int32_t maxLayerZ, bool useIdentityTransform, 10840482ff650751819d4104c10a30974838168438cChavi Weingarten ISurfaceComposer::Rotation rotation) { 1092a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian Parcel data, reply; 1102a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1112a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeStrongBinder(display); 112c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza data.write(sourceCrop); 113d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(reqWidth); 114d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(reqHeight); 115ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr data.writeInt32(minLayerZ); 116ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr data.writeInt32(maxLayerZ); 117c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza data.writeInt32(static_cast<int32_t>(useIdentityTransform)); 118c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews data.writeInt32(static_cast<int32_t>(rotation)); 11940482ff650751819d4104c10a30974838168438cChavi Weingarten status_t err = remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply); 12040482ff650751819d4104c10a30974838168438cChavi Weingarten 12140482ff650751819d4104c10a30974838168438cChavi Weingarten if (err != NO_ERROR) { 12240482ff650751819d4104c10a30974838168438cChavi Weingarten return err; 12340482ff650751819d4104c10a30974838168438cChavi Weingarten } 12440482ff650751819d4104c10a30974838168438cChavi Weingarten 12540482ff650751819d4104c10a30974838168438cChavi Weingarten err = reply.readInt32(); 12640482ff650751819d4104c10a30974838168438cChavi Weingarten if (err != NO_ERROR) { 12740482ff650751819d4104c10a30974838168438cChavi Weingarten return err; 12840482ff650751819d4104c10a30974838168438cChavi Weingarten } 12940482ff650751819d4104c10a30974838168438cChavi Weingarten 13040482ff650751819d4104c10a30974838168438cChavi Weingarten *outBuffer = new GraphicBuffer(); 13140482ff650751819d4104c10a30974838168438cChavi Weingarten reply.read(**outBuffer); 13240482ff650751819d4104c10a30974838168438cChavi Weingarten return err; 1332a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian } 1342a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian 135a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw virtual status_t captureLayers(const sp<IBinder>& layerHandleBinder, 13640482ff650751819d4104c10a30974838168438cChavi Weingarten sp<GraphicBuffer>* outBuffer, const Rect& sourceCrop, 137578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr float frameScale, bool childrenOnly) { 138a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw Parcel data, reply; 139a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 140a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw data.writeStrongBinder(layerHandleBinder); 1417206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw data.write(sourceCrop); 1427206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw data.writeFloat(frameScale); 143578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr data.writeBool(childrenOnly); 14440482ff650751819d4104c10a30974838168438cChavi Weingarten status_t err = remote()->transact(BnSurfaceComposer::CAPTURE_LAYERS, data, &reply); 14540482ff650751819d4104c10a30974838168438cChavi Weingarten 14640482ff650751819d4104c10a30974838168438cChavi Weingarten if (err != NO_ERROR) { 14740482ff650751819d4104c10a30974838168438cChavi Weingarten return err; 14840482ff650751819d4104c10a30974838168438cChavi Weingarten } 14940482ff650751819d4104c10a30974838168438cChavi Weingarten 15040482ff650751819d4104c10a30974838168438cChavi Weingarten err = reply.readInt32(); 15140482ff650751819d4104c10a30974838168438cChavi Weingarten if (err != NO_ERROR) { 15240482ff650751819d4104c10a30974838168438cChavi Weingarten return err; 15340482ff650751819d4104c10a30974838168438cChavi Weingarten } 15440482ff650751819d4104c10a30974838168438cChavi Weingarten 15540482ff650751819d4104c10a30974838168438cChavi Weingarten *outBuffer = new GraphicBuffer(); 15640482ff650751819d4104c10a30974838168438cChavi Weingarten reply.read(**outBuffer); 15740482ff650751819d4104c10a30974838168438cChavi Weingarten 15840482ff650751819d4104c10a30974838168438cChavi Weingarten return err; 159a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 160a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw 161582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis virtual bool authenticateSurfaceTexture( 1622adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer) const 163134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis { 164134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis Parcel data, reply; 165134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int err = NO_ERROR; 166134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = data.writeInterfaceToken( 167134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ISurfaceComposer::getInterfaceDescriptor()); 168134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 169e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 170134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis "interface descriptor: %s (%d)", strerror(-err), -err); 171134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 172134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 1732ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen err = data.writeStrongBinder(IInterface::asBinder(bufferProducer)); 174134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 175e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 176582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "strong binder to parcel: %s (%d)", strerror(-err), -err); 177134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 178134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 179134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data, 180134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis &reply); 181134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 182e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 183582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "performing transaction: %s (%d)", strerror(-err), -err); 184134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 185134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 186134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int32_t result = 0; 187134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = reply.readInt32(&result); 188134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 189e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 190582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "retrieving result: %s (%d)", strerror(-err), -err); 191134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 192134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 193134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return result != 0; 194134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 195d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 1966b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson virtual status_t getSupportedFrameTimestamps( 1976b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson std::vector<FrameEvent>* outSupported) const { 1986b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (!outSupported) { 1996b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return UNEXPECTED_NULL; 2006b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 2016b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson outSupported->clear(); 2026b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 2036b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson Parcel data, reply; 2046b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 2056b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson status_t err = data.writeInterfaceToken( 2066b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson ISurfaceComposer::getInterfaceDescriptor()); 2076b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (err != NO_ERROR) { 2086b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return err; 2096b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 2106b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 2116b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson err = remote()->transact( 2126b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson BnSurfaceComposer::GET_SUPPORTED_FRAME_TIMESTAMPS, 2136b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson data, &reply); 2146b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (err != NO_ERROR) { 2156b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return err; 2166b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 2176b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 2186b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson int32_t result = 0; 2196b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson err = reply.readInt32(&result); 2206b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (err != NO_ERROR) { 2216b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return err; 2226b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 2236b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (result != NO_ERROR) { 2246b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return result; 2256b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 2266b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 2276b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson std::vector<int32_t> supported; 2286b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson err = reply.readInt32Vector(&supported); 2296b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (err != NO_ERROR) { 2306b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return err; 2316b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 2326b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 2336b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson outSupported->reserve(supported.size()); 2346b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson for (int32_t s : supported) { 2356b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson outSupported->push_back(static_cast<FrameEvent>(s)); 2366b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 2376b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return NO_ERROR; 2386b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 2396b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 240b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi virtual sp<IDisplayEventConnection> createDisplayEventConnection(VsyncSource vsyncSource) 241d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian { 242d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian Parcel data, reply; 243d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian sp<IDisplayEventConnection> result; 244d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian int err = data.writeInterfaceToken( 245d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian ISurfaceComposer::getInterfaceDescriptor()); 246d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian if (err != NO_ERROR) { 247d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 248d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 249b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi data.writeInt32(static_cast<int32_t>(vsyncSource)); 250d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian err = remote()->transact( 251d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION, 252d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian data, &reply); 253d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian if (err != NO_ERROR) { 254e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing " 255d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian "transaction: %s (%d)", strerror(-err), -err); 256d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 257d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 258d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder()); 259d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 260d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 2618e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross 262dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis virtual sp<IBinder> createDisplay(const String8& displayName, bool secure) 263e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian { 264e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Parcel data, reply; 265e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2668dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden data.writeString8(displayName); 267dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis data.writeInt32(secure ? 1 : 0); 268e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply); 269e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return reply.readStrongBinder(); 270e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 271e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 2726c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall virtual void destroyDisplay(const sp<IBinder>& display) 2736c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall { 2746c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall Parcel data, reply; 2756c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2766c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall data.writeStrongBinder(display); 2776c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply); 2786c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 2796c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall 280e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian virtual sp<IBinder> getBuiltInDisplay(int32_t id) 281e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian { 282e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Parcel data, reply; 283e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 284e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian data.writeInt32(id); 285e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply); 286e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return reply.readStrongBinder(); 287e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 288e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 2892c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani virtual void setPowerMode(const sp<IBinder>& display, int mode) 2908e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross { 2918e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross Parcel data, reply; 2928e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 293c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden data.writeStrongBinder(display); 2942c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani data.writeInt32(mode); 2952c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply); 2968e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross } 2973094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian 2987f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual status_t getDisplayConfigs(const sp<IBinder>& display, 2997f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Vector<DisplayInfo>* configs) 300c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian { 301c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian Parcel data, reply; 302c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 3039d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown data.writeStrongBinder(display); 3047f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply); 3057f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = reply.readInt32(); 3067f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza if (result == NO_ERROR) { 307d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza size_t numConfigs = reply.readUint32(); 3087f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza configs->clear(); 3097f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza configs->resize(numConfigs); 3107f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza for (size_t c = 0; c < numConfigs; ++c) { 3117f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza memcpy(&(configs->editItemAt(c)), 3127f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza reply.readInplace(sizeof(DisplayInfo)), 3137f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza sizeof(DisplayInfo)); 3147f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 3157f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 3167f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return result; 3177f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 3187f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 31967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar virtual status_t getDisplayStats(const sp<IBinder>& display, 32067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar DisplayStatInfo* stats) 32167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar { 32267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar Parcel data, reply; 32367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 32467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar data.writeStrongBinder(display); 32567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply); 32667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar status_t result = reply.readInt32(); 32767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar if (result == NO_ERROR) { 32867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar memcpy(stats, 32967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar reply.readInplace(sizeof(DisplayStatInfo)), 33067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar sizeof(DisplayStatInfo)); 33167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 33267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar return result; 33367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 33467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar 3357f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual int getActiveConfig(const sp<IBinder>& display) 3367f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza { 3377f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Parcel data, reply; 3387f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 3397f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeStrongBinder(display); 3407f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply); 3417f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return reply.readInt32(); 3427f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 3437f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 3447f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual status_t setActiveConfig(const sp<IBinder>& display, int id) 3457f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza { 3467f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Parcel data, reply; 3477f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 3487f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeStrongBinder(display); 3497f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeInt32(id); 3507f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply); 351c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian return reply.readInt32(); 352c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian } 353d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 35428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright virtual status_t getDisplayColorModes(const sp<IBinder>& display, 355a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin Vector<ColorMode>* outColorModes) { 35628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright Parcel data, reply; 35728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 35828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 35928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getDisplayColorModes failed to writeInterfaceToken: %d", result); 36028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 36128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 36228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = data.writeStrongBinder(display); 36328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 36428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getDisplayColorModes failed to writeStrongBinder: %d", result); 36528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 36628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 36728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = remote()->transact(BnSurfaceComposer::GET_DISPLAY_COLOR_MODES, data, &reply); 36828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 36928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getDisplayColorModes failed to transact: %d", result); 37028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 37128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 37228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = static_cast<status_t>(reply.readInt32()); 37328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result == NO_ERROR) { 37428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright size_t numModes = reply.readUint32(); 37528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright outColorModes->clear(); 37628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright outColorModes->resize(numModes); 37728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright for (size_t i = 0; i < numModes; ++i) { 378a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin outColorModes->replaceAt(static_cast<ColorMode>(reply.readInt32()), i); 37928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 38028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 38128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 38228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 38328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 384a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin virtual ColorMode getActiveColorMode(const sp<IBinder>& display) { 38528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright Parcel data, reply; 38628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 38728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 38828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getActiveColorMode failed to writeInterfaceToken: %d", result); 389a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin return static_cast<ColorMode>(result); 39028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 39128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = data.writeStrongBinder(display); 39228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 39328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getActiveColorMode failed to writeStrongBinder: %d", result); 394a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin return static_cast<ColorMode>(result); 39528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 39628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = remote()->transact(BnSurfaceComposer::GET_ACTIVE_COLOR_MODE, data, &reply); 39728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 39828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getActiveColorMode failed to transact: %d", result); 399a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin return static_cast<ColorMode>(result); 40028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 401a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin return static_cast<ColorMode>(reply.readInt32()); 40228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 40328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 40428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright virtual status_t setActiveColorMode(const sp<IBinder>& display, 405a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin ColorMode colorMode) { 40628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright Parcel data, reply; 40728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 40828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 40928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("setActiveColorMode failed to writeInterfaceToken: %d", result); 41028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 41128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 41228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = data.writeStrongBinder(display); 41328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 41428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("setActiveColorMode failed to writeStrongBinder: %d", result); 41528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 41628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 417a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin result = data.writeInt32(static_cast<int32_t>(colorMode)); 41828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 41928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("setActiveColorMode failed to writeInt32: %d", result); 42028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 42128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 42228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = remote()->transact(BnSurfaceComposer::SET_ACTIVE_COLOR_MODE, data, &reply); 42328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 42428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("setActiveColorMode failed to transact: %d", result); 42528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 42628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 42728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return static_cast<status_t>(reply.readInt32()); 42828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 42928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 430d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav virtual status_t clearAnimationFrameStats() { 431d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav Parcel data, reply; 432d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 433d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply); 434d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return reply.readInt32(); 435d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 436d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 437d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav virtual status_t getAnimationFrameStats(FrameStats* outStats) const { 438d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav Parcel data, reply; 439d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 440d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply); 441d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply.read(*outStats); 442d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return reply.readInt32(); 443d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 444c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza 445c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza virtual status_t getHdrCapabilities(const sp<IBinder>& display, 446c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza HdrCapabilities* outCapabilities) const { 447c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza Parcel data, reply; 448c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 449c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza status_t result = data.writeStrongBinder(display); 450c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result != NO_ERROR) { 451c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza ALOGE("getHdrCapabilities failed to writeStrongBinder: %d", result); 452c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return result; 453c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 454c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza result = remote()->transact(BnSurfaceComposer::GET_HDR_CAPABILITIES, 455c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza data, &reply); 456c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result != NO_ERROR) { 457c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza ALOGE("getHdrCapabilities failed to transact: %d", result); 458c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return result; 459c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 460c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza result = reply.readInt32(); 461c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result == NO_ERROR) { 462e1f5e6fd7ad07778fa4381059852a94567d77dfcMathias Agopian result = reply.read(*outCapabilities); 463c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 464c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return result; 465c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 466c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 467c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju virtual status_t enableVSyncInjections(bool enable) { 468c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Parcel data, reply; 469c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 470c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 471c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("enableVSyncInjections failed to writeInterfaceToken: %d", result); 472c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 473c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 474c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju result = data.writeBool(enable); 475c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 476c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("enableVSyncInjections failed to writeBool: %d", result); 477c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 478c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 479c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju result = remote()->transact(BnSurfaceComposer::ENABLE_VSYNC_INJECTIONS, 480c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju data, &reply, TF_ONE_WAY); 481c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 482c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("enableVSyncInjections failed to transact: %d", result); 483c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 484c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 485c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 486c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 487c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 488c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju virtual status_t injectVSync(nsecs_t when) { 489c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Parcel data, reply; 490c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 491c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 492c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("injectVSync failed to writeInterfaceToken: %d", result); 493c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 494c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 495c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju result = data.writeInt64(when); 496c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 497c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("injectVSync failed to writeInt64: %d", result); 498c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 499c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 500c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju result = remote()->transact(BnSurfaceComposer::INJECT_VSYNC, data, &reply, TF_ONE_WAY); 501c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 502c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("injectVSync failed to transact: %d", result); 503c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 504c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 505c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 506c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 507c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 508a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita virtual status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) const 509a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita { 510a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita if (!outLayers) { 511a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita return UNEXPECTED_NULL; 512a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 513a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 514a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Parcel data, reply; 515a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 516a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita status_t err = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 517a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita if (err != NO_ERROR) { 518a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita return err; 519a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 520a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 521a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita err = remote()->transact(BnSurfaceComposer::GET_LAYER_DEBUG_INFO, data, &reply); 522a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita if (err != NO_ERROR) { 523a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita return err; 524a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 525a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 526a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita int32_t result = 0; 527a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita err = reply.readInt32(&result); 528a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita if (err != NO_ERROR) { 529a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita return err; 530a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 531a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita if (result != NO_ERROR) { 532a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita return result; 533a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 534a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 535a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita outLayers->clear(); 536a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita return reply.readParcelableVector(outLayers); 537a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 540d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this 541d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// translation unit (see clang warning -Wweak-vtables) 542d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan StozaBpSurfaceComposer::~BpSurfaceComposer() {} 543d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer"); 545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact( 549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CREATE_CONNECTION: { 55383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 5542ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen sp<IBinder> b = IInterface::asBinder(createConnection()); 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(b); 5566c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 5576c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 5581db73f66624e7d151710483dd58e03eed672f064Robert Carr case CREATE_SCOPED_CONNECTION: { 5591db73f66624e7d151710483dd58e03eed672f064Robert Carr CHECK_INTERFACE(ISurfaceComposer, data, reply); 5601db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<IGraphicBufferProducer> bufferProducer = 5611db73f66624e7d151710483dd58e03eed672f064Robert Carr interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 5621db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<IBinder> b = IInterface::asBinder(createScopedConnection(bufferProducer)); 5631db73f66624e7d151710483dd58e03eed672f064Robert Carr reply->writeStrongBinder(b); 5641db73f66624e7d151710483dd58e03eed672f064Robert Carr return NO_ERROR; 5651db73f66624e7d151710483dd58e03eed672f064Robert Carr } 566698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian case SET_TRANSACTION_STATE: { 56783c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 568d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 569d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza size_t count = data.readUint32(); 5708afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (count > data.dataSize()) { 5718afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 5728afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 573698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 574698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> state; 575698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.setCapacity(count); 576d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (size_t i = 0; i < count; i++) { 5778afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (s.read(data) == BAD_VALUE) { 5788afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 5798afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 580698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.add(s); 581698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 582d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 583d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza count = data.readUint32(); 5848afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (count > data.dataSize()) { 5858afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 5868afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 5878b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian DisplayState d; 5888b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState> displays; 5898b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian displays.setCapacity(count); 590d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (size_t i = 0; i < count; i++) { 5918afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (d.read(data) == BAD_VALUE) { 5928afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 5938afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 5948b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian displays.add(d); 5958b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 596d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 597d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza uint32_t stateFlags = data.readUint32(); 598d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza setTransactionState(state, displays, stateFlags); 5996c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 6006c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case BOOT_FINISHED: { 60283c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bootFinished(); 6046c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 6056c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 6062a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian case CAPTURE_SCREEN: { 6072a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 6082a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian sp<IBinder> display = data.readStrongBinder(); 60940482ff650751819d4104c10a30974838168438cChavi Weingarten sp<GraphicBuffer> outBuffer; 61060d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos Rect sourceCrop(Rect::EMPTY_RECT); 611c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza data.read(sourceCrop); 612d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza uint32_t reqWidth = data.readUint32(); 613d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza uint32_t reqHeight = data.readUint32(); 614ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr int32_t minLayerZ = data.readInt32(); 615ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr int32_t maxLayerZ = data.readInt32(); 616c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform = static_cast<bool>(data.readInt32()); 617d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza int32_t rotation = data.readInt32(); 618c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 61940482ff650751819d4104c10a30974838168438cChavi Weingarten status_t res = captureScreen(display, &outBuffer, sourceCrop, reqWidth, reqHeight, 62040482ff650751819d4104c10a30974838168438cChavi Weingarten minLayerZ, maxLayerZ, useIdentityTransform, 62140482ff650751819d4104c10a30974838168438cChavi Weingarten static_cast<ISurfaceComposer::Rotation>(rotation)); 6222a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian reply->writeInt32(res); 62340482ff650751819d4104c10a30974838168438cChavi Weingarten if (res == NO_ERROR) { 62440482ff650751819d4104c10a30974838168438cChavi Weingarten reply->write(*outBuffer); 62540482ff650751819d4104c10a30974838168438cChavi Weingarten } 6266c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 6276c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 628a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw case CAPTURE_LAYERS: { 629a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw CHECK_INTERFACE(ISurfaceComposer, data, reply); 630a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw sp<IBinder> layerHandleBinder = data.readStrongBinder(); 63140482ff650751819d4104c10a30974838168438cChavi Weingarten sp<GraphicBuffer> outBuffer; 6327206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw Rect sourceCrop(Rect::EMPTY_RECT); 6337206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw data.read(sourceCrop); 6347206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw float frameScale = data.readFloat(); 635578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr bool childrenOnly = data.readBool(); 636a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw 637578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr status_t res = captureLayers(layerHandleBinder, &outBuffer, sourceCrop, frameScale, 638578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr childrenOnly); 639a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw reply->writeInt32(res); 64040482ff650751819d4104c10a30974838168438cChavi Weingarten if (res == NO_ERROR) { 64140482ff650751819d4104c10a30974838168438cChavi Weingarten reply->write(*outBuffer); 64240482ff650751819d4104c10a30974838168438cChavi Weingarten } 643a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw return NO_ERROR; 644a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw } 645134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis case AUTHENTICATE_SURFACE: { 646134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis CHECK_INTERFACE(ISurfaceComposer, data, reply); 6472adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden sp<IGraphicBufferProducer> bufferProducer = 6482adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 6492adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0; 650134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis reply->writeInt32(result); 6516c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 6526c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 6536b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson case GET_SUPPORTED_FRAME_TIMESTAMPS: { 6546b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson CHECK_INTERFACE(ISurfaceComposer, data, reply); 6556b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson std::vector<FrameEvent> supportedTimestamps; 6566b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson status_t result = getSupportedFrameTimestamps(&supportedTimestamps); 6576b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson status_t err = reply->writeInt32(result); 6586b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (err != NO_ERROR) { 6596b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return err; 6606b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 6616b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (result != NO_ERROR) { 6626b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return result; 6636b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 6646b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 6656b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson std::vector<int32_t> supported; 6666b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson supported.reserve(supportedTimestamps.size()); 6676b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson for (FrameEvent s : supportedTimestamps) { 6686b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson supported.push_back(static_cast<int32_t>(s)); 6696b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 6706b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return reply->writeInt32Vector(supported); 6716b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 672d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian case CREATE_DISPLAY_EVENT_CONNECTION: { 673d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 674b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi sp<IDisplayEventConnection> connection(createDisplayEventConnection( 675b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi static_cast<ISurfaceComposer::VsyncSource>(data.readInt32()))); 6762ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(connection)); 677d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return NO_ERROR; 6786c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 679e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian case CREATE_DISPLAY: { 680e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 6818dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden String8 displayName = data.readString8(); 682dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool secure = bool(data.readInt32()); 683dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis sp<IBinder> display(createDisplay(displayName, secure)); 684e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian reply->writeStrongBinder(display); 685e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return NO_ERROR; 6866c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 6876c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall case DESTROY_DISPLAY: { 6886c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall CHECK_INTERFACE(ISurfaceComposer, data, reply); 6896c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall sp<IBinder> display = data.readStrongBinder(); 6906c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall destroyDisplay(display); 6916c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 6926c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 693e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian case GET_BUILT_IN_DISPLAY: { 694e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 695e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian int32_t id = data.readInt32(); 696e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<IBinder> display(getBuiltInDisplay(id)); 697e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian reply->writeStrongBinder(display); 698e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return NO_ERROR; 6996c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 7007f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza case GET_DISPLAY_CONFIGS: { 7017f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza CHECK_INTERFACE(ISurfaceComposer, data, reply); 7027f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Vector<DisplayInfo> configs; 7037f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza sp<IBinder> display = data.readStrongBinder(); 7047f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = getDisplayConfigs(display, &configs); 7057f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza reply->writeInt32(result); 7067f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza if (result == NO_ERROR) { 707d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza reply->writeUint32(static_cast<uint32_t>(configs.size())); 7087f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza for (size_t c = 0; c < configs.size(); ++c) { 7097f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza memcpy(reply->writeInplace(sizeof(DisplayInfo)), 7107f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza &configs[c], sizeof(DisplayInfo)); 7117f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 7127f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 7137f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return NO_ERROR; 7147f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 71567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar case GET_DISPLAY_STATS: { 71667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar CHECK_INTERFACE(ISurfaceComposer, data, reply); 71767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar DisplayStatInfo stats; 71867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar sp<IBinder> display = data.readStrongBinder(); 71967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar status_t result = getDisplayStats(display, &stats); 72067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar reply->writeInt32(result); 72167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar if (result == NO_ERROR) { 72267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar memcpy(reply->writeInplace(sizeof(DisplayStatInfo)), 72367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar &stats, sizeof(DisplayStatInfo)); 72467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 72567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar return NO_ERROR; 72667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 7277f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza case GET_ACTIVE_CONFIG: { 7287f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza CHECK_INTERFACE(ISurfaceComposer, data, reply); 7297f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza sp<IBinder> display = data.readStrongBinder(); 7307f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza int id = getActiveConfig(display); 7317f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza reply->writeInt32(id); 7327f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return NO_ERROR; 7337f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 7347f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza case SET_ACTIVE_CONFIG: { 735c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 7369d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown sp<IBinder> display = data.readStrongBinder(); 7377f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza int id = data.readInt32(); 7387f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = setActiveConfig(display, id); 739c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian reply->writeInt32(result); 7406c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 7416c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 74228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright case GET_DISPLAY_COLOR_MODES: { 74328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright CHECK_INTERFACE(ISurfaceComposer, data, reply); 744a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin Vector<ColorMode> colorModes; 74528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright sp<IBinder> display = nullptr; 74628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright status_t result = data.readStrongBinder(&display); 74728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 74828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getDisplayColorModes failed to readStrongBinder: %d", result); 74928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 75028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 75128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = getDisplayColorModes(display, &colorModes); 75228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright reply->writeInt32(result); 75328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result == NO_ERROR) { 75428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright reply->writeUint32(static_cast<uint32_t>(colorModes.size())); 75528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright for (size_t i = 0; i < colorModes.size(); ++i) { 756a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin reply->writeInt32(static_cast<int32_t>(colorModes[i])); 75728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 75828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 75928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return NO_ERROR; 76028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 76128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright case GET_ACTIVE_COLOR_MODE: { 76228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright CHECK_INTERFACE(ISurfaceComposer, data, reply); 76328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright sp<IBinder> display = nullptr; 76428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright status_t result = data.readStrongBinder(&display); 76528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 76628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getActiveColorMode failed to readStrongBinder: %d", result); 76728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 76828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 769a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin ColorMode colorMode = getActiveColorMode(display); 77028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = reply->writeInt32(static_cast<int32_t>(colorMode)); 77128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 77228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 77328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright case SET_ACTIVE_COLOR_MODE: { 77428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright CHECK_INTERFACE(ISurfaceComposer, data, reply); 77528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright sp<IBinder> display = nullptr; 77628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright status_t result = data.readStrongBinder(&display); 77728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 77828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getActiveColorMode failed to readStrongBinder: %d", result); 77928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 78028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 78128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright int32_t colorModeInt = 0; 78228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = data.readInt32(&colorModeInt); 78328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 78428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("setActiveColorMode failed to readInt32: %d", result); 78528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 78628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 78728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = setActiveColorMode(display, 788a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin static_cast<ColorMode>(colorModeInt)); 78928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = reply->writeInt32(result); 79028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 79128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 792d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav case CLEAR_ANIMATION_FRAME_STATS: { 793d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav CHECK_INTERFACE(ISurfaceComposer, data, reply); 794d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav status_t result = clearAnimationFrameStats(); 795d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->writeInt32(result); 796d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_ERROR; 797d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 798d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav case GET_ANIMATION_FRAME_STATS: { 799d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav CHECK_INTERFACE(ISurfaceComposer, data, reply); 800d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav FrameStats stats; 801d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav status_t result = getAnimationFrameStats(&stats); 802d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->write(stats); 803d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->writeInt32(result); 804d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_ERROR; 805d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 8062c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani case SET_POWER_MODE: { 8072c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani CHECK_INTERFACE(ISurfaceComposer, data, reply); 8082c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani sp<IBinder> display = data.readStrongBinder(); 8092c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani int32_t mode = data.readInt32(); 8102c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani setPowerMode(display, mode); 8112c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return NO_ERROR; 8122c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani } 813c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza case GET_HDR_CAPABILITIES: { 814c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza CHECK_INTERFACE(ISurfaceComposer, data, reply); 815c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza sp<IBinder> display = nullptr; 816c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza status_t result = data.readStrongBinder(&display); 817c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result != NO_ERROR) { 818c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza ALOGE("getHdrCapabilities failed to readStrongBinder: %d", 819c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza result); 820c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return result; 821c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 822c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza HdrCapabilities capabilities; 823c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza result = getHdrCapabilities(display, &capabilities); 824c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza reply->writeInt32(result); 825c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result == NO_ERROR) { 826e1f5e6fd7ad07778fa4381059852a94567d77dfcMathias Agopian reply->write(capabilities); 827c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 828c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return NO_ERROR; 829c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 830c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case ENABLE_VSYNC_INJECTIONS: { 831c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju CHECK_INTERFACE(ISurfaceComposer, data, reply); 832c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju bool enable = false; 833c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t result = data.readBool(&enable); 834c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 835c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("enableVSyncInjections failed to readBool: %d", result); 836c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 837c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 838c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return enableVSyncInjections(enable); 839c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 840c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case INJECT_VSYNC: { 841c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju CHECK_INTERFACE(ISurfaceComposer, data, reply); 842c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju int64_t when = 0; 843c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t result = data.readInt64(&when); 844c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 845c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("enableVSyncInjections failed to readInt64: %d", result); 846c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 847c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 848c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return injectVSync(when); 849c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 850a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita case GET_LAYER_DEBUG_INFO: { 851a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita CHECK_INTERFACE(ISurfaceComposer, data, reply); 852a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita std::vector<LayerDebugInfo> outLayers; 853a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita status_t result = getLayerDebugInfo(&outLayers); 854a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita reply->writeInt32(result); 855a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita if (result == NO_ERROR) 856a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita { 857a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita result = reply->writeParcelableVector(outLayers); 858a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 859a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita return result; 860a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita } 8616c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall default: { 86283c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 8636c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 870