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> 31d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 3290ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/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 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer> 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 49e2347b7953f70232541bdc1b392230d6231aaeb9Chih-Hung Hsieh explicit BpSurfaceComposer(const sp<IBinder>& impl) 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpInterface<ISurfaceComposer>(impl) 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 54d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza virtual ~BpSurfaceComposer(); 55d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 567e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian virtual sp<ISurfaceComposerClient> createConnection() 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply); 617e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 641db73f66624e7d151710483dd58e03eed672f064Robert Carr virtual sp<ISurfaceComposerClient> createScopedConnection( 651db73f66624e7d151710483dd58e03eed672f064Robert Carr const sp<IGraphicBufferProducer>& parent) 661db73f66624e7d151710483dd58e03eed672f064Robert Carr { 671db73f66624e7d151710483dd58e03eed672f064Robert Carr Parcel data, reply; 681db73f66624e7d151710483dd58e03eed672f064Robert Carr data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 691db73f66624e7d151710483dd58e03eed672f064Robert Carr data.writeStrongBinder(IInterface::asBinder(parent)); 701db73f66624e7d151710483dd58e03eed672f064Robert Carr remote()->transact(BnSurfaceComposer::CREATE_SCOPED_CONNECTION, data, &reply); 711db73f66624e7d151710483dd58e03eed672f064Robert Carr return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 721db73f66624e7d151710483dd58e03eed672f064Robert Carr } 731db73f66624e7d151710483dd58e03eed672f064Robert Carr 748b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian virtual void setTransactionState( 758b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<ComposerState>& state, 768b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<DisplayState>& displays, 778b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian uint32_t flags) 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 81d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 82d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(static_cast<uint32_t>(state.size())); 83d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (const auto& s : state) { 84d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza s.write(data); 858b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 86d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 87d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(static_cast<uint32_t>(displays.size())); 88d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (const auto& d : displays) { 89d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza d.write(data); 90698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 91d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 92d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(flags); 93b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply); 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void bootFinished() 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply); 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1032a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian virtual status_t captureScreen(const sp<IBinder>& display, 1042a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian const sp<IGraphicBufferProducer>& producer, 105c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 106ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr int32_t minLayerZ, int32_t maxLayerZ, 107c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews bool useIdentityTransform, 108c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews ISurfaceComposer::Rotation rotation) 1092a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian { 1102a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian Parcel data, reply; 1112a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1122a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian data.writeStrongBinder(display); 1132ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen data.writeStrongBinder(IInterface::asBinder(producer)); 114c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza data.write(sourceCrop); 115d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(reqWidth); 116d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza data.writeUint32(reqHeight); 117ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr data.writeInt32(minLayerZ); 118ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr data.writeInt32(maxLayerZ); 119c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza data.writeInt32(static_cast<int32_t>(useIdentityTransform)); 120c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews data.writeInt32(static_cast<int32_t>(rotation)); 1212a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply); 1222a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian return reply.readInt32(); 1232a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian } 1242a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian 125582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis virtual bool authenticateSurfaceTexture( 1262adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden const sp<IGraphicBufferProducer>& bufferProducer) const 127134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis { 128134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis Parcel data, reply; 129134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int err = NO_ERROR; 130134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = data.writeInterfaceToken( 131134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ISurfaceComposer::getInterfaceDescriptor()); 132134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 133e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 134134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis "interface descriptor: %s (%d)", strerror(-err), -err); 135134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 136134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 1372ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen err = data.writeStrongBinder(IInterface::asBinder(bufferProducer)); 138134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 139e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 140582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "strong binder to parcel: %s (%d)", strerror(-err), -err); 141134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 142134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 143134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data, 144134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis &reply); 145134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 146e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 147582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "performing transaction: %s (%d)", strerror(-err), -err); 148134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 149134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 150134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int32_t result = 0; 151134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = reply.readInt32(&result); 152134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 153e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 154582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "retrieving result: %s (%d)", strerror(-err), -err); 155134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 156134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 157134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return result != 0; 158134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 159d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 1606b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson virtual status_t getSupportedFrameTimestamps( 1616b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson std::vector<FrameEvent>* outSupported) const { 1626b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (!outSupported) { 1636b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return UNEXPECTED_NULL; 1646b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 1656b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson outSupported->clear(); 1666b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 1676b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson Parcel data, reply; 1686b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 1696b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson status_t err = data.writeInterfaceToken( 1706b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson ISurfaceComposer::getInterfaceDescriptor()); 1716b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (err != NO_ERROR) { 1726b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return err; 1736b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 1746b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 1756b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson err = remote()->transact( 1766b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson BnSurfaceComposer::GET_SUPPORTED_FRAME_TIMESTAMPS, 1776b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson data, &reply); 1786b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (err != NO_ERROR) { 1796b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return err; 1806b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 1816b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 1826b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson int32_t result = 0; 1836b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson err = reply.readInt32(&result); 1846b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (err != NO_ERROR) { 1856b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return err; 1866b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 1876b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (result != NO_ERROR) { 1886b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return result; 1896b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 1906b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 1916b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson std::vector<int32_t> supported; 1926b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson err = reply.readInt32Vector(&supported); 1936b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (err != NO_ERROR) { 1946b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return err; 1956b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 1966b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 1976b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson outSupported->reserve(supported.size()); 1986b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson for (int32_t s : supported) { 1996b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson outSupported->push_back(static_cast<FrameEvent>(s)); 2006b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 2016b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return NO_ERROR; 2026b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 2036b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 2043e30d2f7c5d26f3a924c7a67ffe3d0ee9ac3c7c1Jorim Jaggi virtual sp<IDisplayEventConnection> createDisplayEventConnection(VsyncSource vsyncSource) 205d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian { 206d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian Parcel data, reply; 207d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian sp<IDisplayEventConnection> result; 208d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian int err = data.writeInterfaceToken( 209d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian ISurfaceComposer::getInterfaceDescriptor()); 210d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian if (err != NO_ERROR) { 211d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 212d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 2133e30d2f7c5d26f3a924c7a67ffe3d0ee9ac3c7c1Jorim Jaggi data.writeInt32(static_cast<int32_t>(vsyncSource)); 214d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian err = remote()->transact( 215d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION, 216d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian data, &reply); 217d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian if (err != NO_ERROR) { 218e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing " 219d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian "transaction: %s (%d)", strerror(-err), -err); 220d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 221d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 222d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder()); 223d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 224d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 2258e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross 226dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis virtual sp<IBinder> createDisplay(const String8& displayName, bool secure) 227e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian { 228e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Parcel data, reply; 229e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2308dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden data.writeString8(displayName); 231dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis data.writeInt32(secure ? 1 : 0); 232e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply); 233e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return reply.readStrongBinder(); 234e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 235e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 2366c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall virtual void destroyDisplay(const sp<IBinder>& display) 2376c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall { 2386c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall Parcel data, reply; 2396c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2406c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall data.writeStrongBinder(display); 2416c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply); 2426c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 2436c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall 244e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian virtual sp<IBinder> getBuiltInDisplay(int32_t id) 245e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian { 246e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Parcel data, reply; 247e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 248e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian data.writeInt32(id); 249e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply); 250e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return reply.readStrongBinder(); 251e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 252e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 2532c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani virtual void setPowerMode(const sp<IBinder>& display, int mode) 2548e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross { 2558e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross Parcel data, reply; 2568e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 257c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden data.writeStrongBinder(display); 2582c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani data.writeInt32(mode); 2592c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply); 2608e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross } 2613094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian 2627f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual status_t getDisplayConfigs(const sp<IBinder>& display, 2637f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Vector<DisplayInfo>* configs) 264c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian { 265c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian Parcel data, reply; 266c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2679d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown data.writeStrongBinder(display); 2687f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply); 2697f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = reply.readInt32(); 2707f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza if (result == NO_ERROR) { 271d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza size_t numConfigs = reply.readUint32(); 2727f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza configs->clear(); 2737f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza configs->resize(numConfigs); 2747f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza for (size_t c = 0; c < numConfigs; ++c) { 2757f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza memcpy(&(configs->editItemAt(c)), 2767f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza reply.readInplace(sizeof(DisplayInfo)), 2777f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza sizeof(DisplayInfo)); 2787f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 2797f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 2807f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return result; 2817f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 2827f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 28367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar virtual status_t getDisplayStats(const sp<IBinder>& display, 28467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar DisplayStatInfo* stats) 28567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar { 28667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar Parcel data, reply; 28767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 28867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar data.writeStrongBinder(display); 28967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply); 29067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar status_t result = reply.readInt32(); 29167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar if (result == NO_ERROR) { 29267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar memcpy(stats, 29367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar reply.readInplace(sizeof(DisplayStatInfo)), 29467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar sizeof(DisplayStatInfo)); 29567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 29667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar return result; 29767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 29867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar 2997f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual int getActiveConfig(const sp<IBinder>& display) 3007f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza { 3017f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Parcel data, reply; 3027f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 3037f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeStrongBinder(display); 3047f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply); 3057f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return reply.readInt32(); 3067f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 3077f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza 3087f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza virtual status_t setActiveConfig(const sp<IBinder>& display, int id) 3097f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza { 3107f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Parcel data, reply; 3117f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 3127f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeStrongBinder(display); 3137f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza data.writeInt32(id); 3147f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply); 315c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian return reply.readInt32(); 316c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian } 317d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 31828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright virtual status_t getDisplayColorModes(const sp<IBinder>& display, 31928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright Vector<android_color_mode_t>* outColorModes) { 32028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright Parcel data, reply; 32128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 32228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 32328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getDisplayColorModes failed to writeInterfaceToken: %d", result); 32428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 32528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 32628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = data.writeStrongBinder(display); 32728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 32828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getDisplayColorModes failed to writeStrongBinder: %d", result); 32928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 33028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 33128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = remote()->transact(BnSurfaceComposer::GET_DISPLAY_COLOR_MODES, data, &reply); 33228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 33328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getDisplayColorModes failed to transact: %d", result); 33428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 33528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 33628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = static_cast<status_t>(reply.readInt32()); 33728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result == NO_ERROR) { 33828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright size_t numModes = reply.readUint32(); 33928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright outColorModes->clear(); 34028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright outColorModes->resize(numModes); 34128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright for (size_t i = 0; i < numModes; ++i) { 34228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright outColorModes->replaceAt(static_cast<android_color_mode_t>(reply.readInt32()), i); 34328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 34428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 34528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 34628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 34728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 34828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright virtual android_color_mode_t getActiveColorMode(const sp<IBinder>& display) { 34928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright Parcel data, reply; 35028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 35128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 35228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getActiveColorMode failed to writeInterfaceToken: %d", result); 35328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return static_cast<android_color_mode_t>(result); 35428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 35528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = data.writeStrongBinder(display); 35628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 35728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getActiveColorMode failed to writeStrongBinder: %d", result); 35828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return static_cast<android_color_mode_t>(result); 35928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 36028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = remote()->transact(BnSurfaceComposer::GET_ACTIVE_COLOR_MODE, data, &reply); 36128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 36228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getActiveColorMode failed to transact: %d", result); 36328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return static_cast<android_color_mode_t>(result); 36428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 36528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return static_cast<android_color_mode_t>(reply.readInt32()); 36628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 36728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 36828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright virtual status_t setActiveColorMode(const sp<IBinder>& display, 36928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright android_color_mode_t colorMode) { 37028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright Parcel data, reply; 37128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 37228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 37328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("setActiveColorMode failed to writeInterfaceToken: %d", result); 37428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 37528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 37628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = data.writeStrongBinder(display); 37728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 37828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("setActiveColorMode failed to writeStrongBinder: %d", result); 37928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 38028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 38128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = data.writeInt32(colorMode); 38228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 38328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("setActiveColorMode failed to writeInt32: %d", result); 38428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 38528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 38628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = remote()->transact(BnSurfaceComposer::SET_ACTIVE_COLOR_MODE, data, &reply); 38728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 38828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("setActiveColorMode failed to transact: %d", result); 38928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 39028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 39128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return static_cast<status_t>(reply.readInt32()); 39228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 39328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright 394d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav virtual status_t clearAnimationFrameStats() { 395d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav Parcel data, reply; 396d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 397d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply); 398d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return reply.readInt32(); 399d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 400d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 401d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav virtual status_t getAnimationFrameStats(FrameStats* outStats) const { 402d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav Parcel data, reply; 403d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 404d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply); 405d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply.read(*outStats); 406d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return reply.readInt32(); 407d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 408c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza 409c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza virtual status_t getHdrCapabilities(const sp<IBinder>& display, 410c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza HdrCapabilities* outCapabilities) const { 411c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza Parcel data, reply; 412c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 413c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza status_t result = data.writeStrongBinder(display); 414c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result != NO_ERROR) { 415c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza ALOGE("getHdrCapabilities failed to writeStrongBinder: %d", result); 416c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return result; 417c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 418c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza result = remote()->transact(BnSurfaceComposer::GET_HDR_CAPABILITIES, 419c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza data, &reply); 420c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result != NO_ERROR) { 421c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza ALOGE("getHdrCapabilities failed to transact: %d", result); 422c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return result; 423c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 424c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza result = reply.readInt32(); 425c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result == NO_ERROR) { 426e1f5e6fd7ad07778fa4381059852a94567d77dfcMathias Agopian result = reply.read(*outCapabilities); 427c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 428c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return result; 429c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 430c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 431c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju virtual status_t enableVSyncInjections(bool enable) { 432c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Parcel data, reply; 433c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 434c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 435c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("enableVSyncInjections failed to writeInterfaceToken: %d", result); 436c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 437c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 438c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju result = data.writeBool(enable); 439c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 440c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("enableVSyncInjections failed to writeBool: %d", result); 441c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 442c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 443c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju result = remote()->transact(BnSurfaceComposer::ENABLE_VSYNC_INJECTIONS, 444c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju data, &reply, TF_ONE_WAY); 445c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 446c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("enableVSyncInjections failed to transact: %d", result); 447c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 448c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 449c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 450c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 451c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 452c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju virtual status_t injectVSync(nsecs_t when) { 453c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Parcel data, reply; 454c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 455c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 456c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("injectVSync failed to writeInterfaceToken: %d", result); 457c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 458c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 459c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju result = data.writeInt64(when); 460c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 461c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("injectVSync failed to writeInt64: %d", result); 462c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 463c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 464c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju result = remote()->transact(BnSurfaceComposer::INJECT_VSYNC, data, &reply, TF_ONE_WAY); 465c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 466c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("injectVSync failed to transact: %d", result); 467c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 468c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 469c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 470c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 471c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 474d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this 475d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// translation unit (see clang warning -Wweak-vtables) 476d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan StozaBpSurfaceComposer::~BpSurfaceComposer() {} 477d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer"); 479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact( 483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CREATE_CONNECTION: { 48783c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 4882ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen sp<IBinder> b = IInterface::asBinder(createConnection()); 489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(b); 4906c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 4916c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 4921db73f66624e7d151710483dd58e03eed672f064Robert Carr case CREATE_SCOPED_CONNECTION: { 4931db73f66624e7d151710483dd58e03eed672f064Robert Carr CHECK_INTERFACE(ISurfaceComposer, data, reply); 4941db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<IGraphicBufferProducer> bufferProducer = 4951db73f66624e7d151710483dd58e03eed672f064Robert Carr interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 4961db73f66624e7d151710483dd58e03eed672f064Robert Carr sp<IBinder> b = IInterface::asBinder(createScopedConnection(bufferProducer)); 4971db73f66624e7d151710483dd58e03eed672f064Robert Carr reply->writeStrongBinder(b); 4981db73f66624e7d151710483dd58e03eed672f064Robert Carr return NO_ERROR; 4991db73f66624e7d151710483dd58e03eed672f064Robert Carr } 500698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian case SET_TRANSACTION_STATE: { 50183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 502d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 503d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza size_t count = data.readUint32(); 5048afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (count > data.dataSize()) { 5058afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 5068afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 507698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 508698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> state; 509698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.setCapacity(count); 510d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (size_t i = 0; i < count; i++) { 5118afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (s.read(data) == BAD_VALUE) { 5128afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 5138afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 514698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.add(s); 515698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 516d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 517d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza count = data.readUint32(); 5188afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (count > data.dataSize()) { 5198afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 5208afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 5218b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian DisplayState d; 5228b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState> displays; 5238b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian displays.setCapacity(count); 524d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza for (size_t i = 0; i < count; i++) { 5258afa1c4ab86d724feb7716e153b7835385534590Michael Lentine if (d.read(data) == BAD_VALUE) { 5268afa1c4ab86d724feb7716e153b7835385534590Michael Lentine return BAD_VALUE; 5278afa1c4ab86d724feb7716e153b7835385534590Michael Lentine } 5288b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian displays.add(d); 5298b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 530d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza 531d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza uint32_t stateFlags = data.readUint32(); 532d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza setTransactionState(state, displays, stateFlags); 5336c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 5346c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case BOOT_FINISHED: { 53683c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bootFinished(); 5386c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 5396c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 5402a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian case CAPTURE_SCREEN: { 5412a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 5422a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian sp<IBinder> display = data.readStrongBinder(); 5432a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian sp<IGraphicBufferProducer> producer = 5442a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 54560d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos Rect sourceCrop(Rect::EMPTY_RECT); 546c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza data.read(sourceCrop); 547d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza uint32_t reqWidth = data.readUint32(); 548d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza uint32_t reqHeight = data.readUint32(); 549ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr int32_t minLayerZ = data.readInt32(); 550ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr int32_t maxLayerZ = data.readInt32(); 551c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform = static_cast<bool>(data.readInt32()); 552d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza int32_t rotation = data.readInt32(); 553c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 5542a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian status_t res = captureScreen(display, producer, 555c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, 556c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews useIdentityTransform, 557c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews static_cast<ISurfaceComposer::Rotation>(rotation)); 5582a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian reply->writeInt32(res); 5596c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 5606c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 561134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis case AUTHENTICATE_SURFACE: { 562134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis CHECK_INTERFACE(ISurfaceComposer, data, reply); 5632adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden sp<IGraphicBufferProducer> bufferProducer = 5642adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 5652adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0; 566134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis reply->writeInt32(result); 5676c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 5686c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 5696b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson case GET_SUPPORTED_FRAME_TIMESTAMPS: { 5706b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson CHECK_INTERFACE(ISurfaceComposer, data, reply); 5716b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson std::vector<FrameEvent> supportedTimestamps; 5726b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson status_t result = getSupportedFrameTimestamps(&supportedTimestamps); 5736b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson status_t err = reply->writeInt32(result); 5746b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (err != NO_ERROR) { 5756b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return err; 5766b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 5776b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson if (result != NO_ERROR) { 5786b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return result; 5796b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 5806b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson 5816b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson std::vector<int32_t> supported; 5826b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson supported.reserve(supportedTimestamps.size()); 5836b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson for (FrameEvent s : supportedTimestamps) { 5846b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson supported.push_back(static_cast<int32_t>(s)); 5856b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 5866b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson return reply->writeInt32Vector(supported); 5876b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson } 588d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian case CREATE_DISPLAY_EVENT_CONNECTION: { 589d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 5903e30d2f7c5d26f3a924c7a67ffe3d0ee9ac3c7c1Jorim Jaggi sp<IDisplayEventConnection> connection(createDisplayEventConnection( 5913e30d2f7c5d26f3a924c7a67ffe3d0ee9ac3c7c1Jorim Jaggi static_cast<ISurfaceComposer::VsyncSource>(data.readInt32()))); 5922ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen reply->writeStrongBinder(IInterface::asBinder(connection)); 593d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return NO_ERROR; 5946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 595e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian case CREATE_DISPLAY: { 596e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 5978dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden String8 displayName = data.readString8(); 598dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool secure = bool(data.readInt32()); 599dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis sp<IBinder> display(createDisplay(displayName, secure)); 600e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian reply->writeStrongBinder(display); 601e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return NO_ERROR; 6026c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 6036c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall case DESTROY_DISPLAY: { 6046c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall CHECK_INTERFACE(ISurfaceComposer, data, reply); 6056c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall sp<IBinder> display = data.readStrongBinder(); 6066c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall destroyDisplay(display); 6076c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 6086c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 609e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian case GET_BUILT_IN_DISPLAY: { 610e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 611e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian int32_t id = data.readInt32(); 612e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<IBinder> display(getBuiltInDisplay(id)); 613e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian reply->writeStrongBinder(display); 614e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return NO_ERROR; 6156c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 6167f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza case GET_DISPLAY_CONFIGS: { 6177f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza CHECK_INTERFACE(ISurfaceComposer, data, reply); 6187f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza Vector<DisplayInfo> configs; 6197f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza sp<IBinder> display = data.readStrongBinder(); 6207f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = getDisplayConfigs(display, &configs); 6217f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza reply->writeInt32(result); 6227f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza if (result == NO_ERROR) { 623d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza reply->writeUint32(static_cast<uint32_t>(configs.size())); 6247f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza for (size_t c = 0; c < configs.size(); ++c) { 6257f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza memcpy(reply->writeInplace(sizeof(DisplayInfo)), 6267f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza &configs[c], sizeof(DisplayInfo)); 6277f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 6287f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 6297f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return NO_ERROR; 6307f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 63167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar case GET_DISPLAY_STATS: { 63267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar CHECK_INTERFACE(ISurfaceComposer, data, reply); 63367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar DisplayStatInfo stats; 63467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar sp<IBinder> display = data.readStrongBinder(); 63567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar status_t result = getDisplayStats(display, &stats); 63667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar reply->writeInt32(result); 63767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar if (result == NO_ERROR) { 63867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar memcpy(reply->writeInplace(sizeof(DisplayStatInfo)), 63967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar &stats, sizeof(DisplayStatInfo)); 64067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 64167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar return NO_ERROR; 64267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar } 6437f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza case GET_ACTIVE_CONFIG: { 6447f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza CHECK_INTERFACE(ISurfaceComposer, data, reply); 6457f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza sp<IBinder> display = data.readStrongBinder(); 6467f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza int id = getActiveConfig(display); 6477f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza reply->writeInt32(id); 6487f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza return NO_ERROR; 6497f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza } 6507f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza case SET_ACTIVE_CONFIG: { 651c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 6529d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown sp<IBinder> display = data.readStrongBinder(); 6537f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza int id = data.readInt32(); 6547f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza status_t result = setActiveConfig(display, id); 655c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian reply->writeInt32(result); 6566c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall return NO_ERROR; 6576c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 65828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright case GET_DISPLAY_COLOR_MODES: { 65928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright CHECK_INTERFACE(ISurfaceComposer, data, reply); 66028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright Vector<android_color_mode_t> colorModes; 66128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright sp<IBinder> display = nullptr; 66228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright status_t result = data.readStrongBinder(&display); 66328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 66428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getDisplayColorModes failed to readStrongBinder: %d", result); 66528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 66628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 66728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = getDisplayColorModes(display, &colorModes); 66828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright reply->writeInt32(result); 66928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result == NO_ERROR) { 67028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright reply->writeUint32(static_cast<uint32_t>(colorModes.size())); 67128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright for (size_t i = 0; i < colorModes.size(); ++i) { 67228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright reply->writeInt32(colorModes[i]); 67328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 67428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 67528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return NO_ERROR; 67628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 67728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright case GET_ACTIVE_COLOR_MODE: { 67828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright CHECK_INTERFACE(ISurfaceComposer, data, reply); 67928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright sp<IBinder> display = nullptr; 68028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright status_t result = data.readStrongBinder(&display); 68128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 68228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getActiveColorMode failed to readStrongBinder: %d", result); 68328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 68428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 68528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright android_color_mode_t colorMode = getActiveColorMode(display); 68628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = reply->writeInt32(static_cast<int32_t>(colorMode)); 68728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 68828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 68928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright case SET_ACTIVE_COLOR_MODE: { 69028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright CHECK_INTERFACE(ISurfaceComposer, data, reply); 69128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright sp<IBinder> display = nullptr; 69228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright status_t result = data.readStrongBinder(&display); 69328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 69428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("getActiveColorMode failed to readStrongBinder: %d", result); 69528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 69628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 69728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright int32_t colorModeInt = 0; 69828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = data.readInt32(&colorModeInt); 69928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright if (result != NO_ERROR) { 70028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright ALOGE("setActiveColorMode failed to readInt32: %d", result); 70128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 70228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 70328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = setActiveColorMode(display, 70428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright static_cast<android_color_mode_t>(colorModeInt)); 70528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright result = reply->writeInt32(result); 70628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright return result; 70728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright } 708d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav case CLEAR_ANIMATION_FRAME_STATS: { 709d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav CHECK_INTERFACE(ISurfaceComposer, data, reply); 710d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav status_t result = clearAnimationFrameStats(); 711d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->writeInt32(result); 712d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_ERROR; 713d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 714d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav case GET_ANIMATION_FRAME_STATS: { 715d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav CHECK_INTERFACE(ISurfaceComposer, data, reply); 716d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav FrameStats stats; 717d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav status_t result = getAnimationFrameStats(&stats); 718d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->write(stats); 719d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav reply->writeInt32(result); 720d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav return NO_ERROR; 721d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav } 7222c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani case SET_POWER_MODE: { 7232c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani CHECK_INTERFACE(ISurfaceComposer, data, reply); 7242c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani sp<IBinder> display = data.readStrongBinder(); 7252c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani int32_t mode = data.readInt32(); 7262c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani setPowerMode(display, mode); 7272c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani return NO_ERROR; 7282c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani } 729c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza case GET_HDR_CAPABILITIES: { 730c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza CHECK_INTERFACE(ISurfaceComposer, data, reply); 731c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza sp<IBinder> display = nullptr; 732c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza status_t result = data.readStrongBinder(&display); 733c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result != NO_ERROR) { 734c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza ALOGE("getHdrCapabilities failed to readStrongBinder: %d", 735c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza result); 736c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return result; 737c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 738c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza HdrCapabilities capabilities; 739c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza result = getHdrCapabilities(display, &capabilities); 740c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza reply->writeInt32(result); 741c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza if (result == NO_ERROR) { 742e1f5e6fd7ad07778fa4381059852a94567d77dfcMathias Agopian reply->write(capabilities); 743c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 744c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza return NO_ERROR; 745c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza } 746c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case ENABLE_VSYNC_INJECTIONS: { 747c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju CHECK_INTERFACE(ISurfaceComposer, data, reply); 748c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju bool enable = false; 749c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t result = data.readBool(&enable); 750c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 751c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("enableVSyncInjections failed to readBool: %d", result); 752c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 753c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 754c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return enableVSyncInjections(enable); 755c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 756c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case INJECT_VSYNC: { 757c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju CHECK_INTERFACE(ISurfaceComposer, data, reply); 758c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju int64_t when = 0; 759c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju status_t result = data.readInt64(&when); 760c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (result != NO_ERROR) { 761c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju ALOGE("enableVSyncInjections failed to readInt64: %d", result); 762c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return result; 763c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 764c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return injectVSync(when); 765c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 7666c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall default: { 76783c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 7686c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall } 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 775