ISurfaceComposer.cpp revision 7206d49b2963ce2e926a5f25fe94aca9c06471e6
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
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
125a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    virtual status_t captureLayers(const sp<IBinder>& layerHandleBinder,
126a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw                                   const sp<IGraphicBufferProducer>& producer,
1277206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw                                   const Rect& sourceCrop, float frameScale) {
128a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        Parcel data, reply;
129a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
130a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        data.writeStrongBinder(layerHandleBinder);
131a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        data.writeStrongBinder(IInterface::asBinder(producer));
1327206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw        data.write(sourceCrop);
1337206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw        data.writeFloat(frameScale);
134a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        remote()->transact(BnSurfaceComposer::CAPTURE_LAYERS, data, &reply);
135a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        return reply.readInt32();
136a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    }
137a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
138582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    virtual bool authenticateSurfaceTexture(
1392adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            const sp<IGraphicBufferProducer>& bufferProducer) const
140134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    {
141134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        Parcel data, reply;
142134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int err = NO_ERROR;
143134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = data.writeInterfaceToken(
144134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                ISurfaceComposer::getInterfaceDescriptor());
145134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
146e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
147134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                    "interface descriptor: %s (%d)", strerror(-err), -err);
148134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
149134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
1502ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen        err = data.writeStrongBinder(IInterface::asBinder(bufferProducer));
151134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
152e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
153582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "strong binder to parcel: %s (%d)", strerror(-err), -err);
154134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
155134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
156134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
157134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                &reply);
158134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
159e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
160582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "performing transaction: %s (%d)", strerror(-err), -err);
161134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
162134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
163134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int32_t result = 0;
164134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = reply.readInt32(&result);
165134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
166e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
167582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "retrieving result: %s (%d)", strerror(-err), -err);
168134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
169134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
170134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        return result != 0;
171134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
172d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
1736b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson    virtual status_t getSupportedFrameTimestamps(
1746b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            std::vector<FrameEvent>* outSupported) const {
1756b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (!outSupported) {
1766b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return UNEXPECTED_NULL;
1776b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
1786b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        outSupported->clear();
1796b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
1806b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        Parcel data, reply;
1816b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
1826b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        status_t err = data.writeInterfaceToken(
1836b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                ISurfaceComposer::getInterfaceDescriptor());
1846b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (err != NO_ERROR) {
1856b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return err;
1866b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
1876b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
1886b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        err = remote()->transact(
1896b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                BnSurfaceComposer::GET_SUPPORTED_FRAME_TIMESTAMPS,
1906b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                data, &reply);
1916b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (err != NO_ERROR) {
1926b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return err;
1936b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
1946b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
1956b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        int32_t result = 0;
1966b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        err = reply.readInt32(&result);
1976b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (err != NO_ERROR) {
1986b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return err;
1996b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
2006b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (result != NO_ERROR) {
2016b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return result;
2026b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
2036b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
2046b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        std::vector<int32_t> supported;
2056b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        err = reply.readInt32Vector(&supported);
2066b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (err != NO_ERROR) {
2076b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return err;
2086b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
2096b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
2106b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        outSupported->reserve(supported.size());
2116b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        for (int32_t s : supported) {
2126b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            outSupported->push_back(static_cast<FrameEvent>(s));
2136b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
2146b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        return NO_ERROR;
2156b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson    }
2166b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
217b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi    virtual sp<IDisplayEventConnection> createDisplayEventConnection(VsyncSource vsyncSource)
218d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    {
219d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        Parcel data, reply;
220d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        sp<IDisplayEventConnection> result;
221d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        int err = data.writeInterfaceToken(
222d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                ISurfaceComposer::getInterfaceDescriptor());
223d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
224d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
225d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
226b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi        data.writeInt32(static_cast<int32_t>(vsyncSource));
227d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        err = remote()->transact(
228d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
229d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                data, &reply);
230d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
231e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
232d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                    "transaction: %s (%d)", strerror(-err), -err);
233d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
234d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
235d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder());
236d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        return result;
237d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    }
2388e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross
239dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    virtual sp<IBinder> createDisplay(const String8& displayName, bool secure)
240e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
241e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
242e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2438dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        data.writeString8(displayName);
244dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        data.writeInt32(secure ? 1 : 0);
245e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply);
246e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
247e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
248e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
2496c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    virtual void destroyDisplay(const sp<IBinder>& display)
2506c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    {
2516c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        Parcel data, reply;
2526c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2536c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        data.writeStrongBinder(display);
2546c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply);
2556c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    }
2566c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall
257e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    virtual sp<IBinder> getBuiltInDisplay(int32_t id)
258e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
259e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
260e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
261e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInt32(id);
262e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply);
263e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
264e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
265e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
2662c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    virtual void setPowerMode(const sp<IBinder>& display, int mode)
2678e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    {
2688e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        Parcel data, reply;
2698e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
270c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden        data.writeStrongBinder(display);
2712c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        data.writeInt32(mode);
2722c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply);
2738e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    }
2743094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian
2757f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual status_t getDisplayConfigs(const sp<IBinder>& display,
2767f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            Vector<DisplayInfo>* configs)
277c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    {
278c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        Parcel data, reply;
279c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2809d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        data.writeStrongBinder(display);
2817f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply);
2827f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        status_t result = reply.readInt32();
2837f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        if (result == NO_ERROR) {
284d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            size_t numConfigs = reply.readUint32();
2857f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            configs->clear();
2867f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            configs->resize(numConfigs);
2877f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            for (size_t c = 0; c < numConfigs; ++c) {
2887f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                memcpy(&(configs->editItemAt(c)),
2897f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                        reply.readInplace(sizeof(DisplayInfo)),
2907f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                        sizeof(DisplayInfo));
2917f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            }
2927f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
2937f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return result;
2947f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
2957f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
29667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    virtual status_t getDisplayStats(const sp<IBinder>& display,
29767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            DisplayStatInfo* stats)
29867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    {
29967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        Parcel data, reply;
30067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
30167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        data.writeStrongBinder(display);
30267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply);
30367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        status_t result = reply.readInt32();
30467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        if (result == NO_ERROR) {
30567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            memcpy(stats,
30667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                    reply.readInplace(sizeof(DisplayStatInfo)),
30767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                    sizeof(DisplayStatInfo));
30867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        }
30967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        return result;
31067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    }
31167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar
3127f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual int getActiveConfig(const sp<IBinder>& display)
3137f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    {
3147f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        Parcel data, reply;
3157f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
3167f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeStrongBinder(display);
3177f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply);
3187f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return reply.readInt32();
3197f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
3207f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
3217f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual status_t setActiveConfig(const sp<IBinder>& display, int id)
3227f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    {
3237f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        Parcel data, reply;
3247f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
3257f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeStrongBinder(display);
3267f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInt32(id);
3277f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply);
328c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        return reply.readInt32();
329c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    }
330d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
33128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    virtual status_t getDisplayColorModes(const sp<IBinder>& display,
33228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            Vector<android_color_mode_t>* outColorModes) {
33328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        Parcel data, reply;
33428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
33528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
33628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getDisplayColorModes failed to writeInterfaceToken: %d", result);
33728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
33828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
33928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeStrongBinder(display);
34028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
34128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getDisplayColorModes failed to writeStrongBinder: %d", result);
34228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
34328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
34428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = remote()->transact(BnSurfaceComposer::GET_DISPLAY_COLOR_MODES, data, &reply);
34528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
34628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getDisplayColorModes failed to transact: %d", result);
34728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
34828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
34928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = static_cast<status_t>(reply.readInt32());
35028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result == NO_ERROR) {
35128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            size_t numModes = reply.readUint32();
35228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            outColorModes->clear();
35328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            outColorModes->resize(numModes);
35428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            for (size_t i = 0; i < numModes; ++i) {
35528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                outColorModes->replaceAt(static_cast<android_color_mode_t>(reply.readInt32()), i);
35628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
35728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
35828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        return result;
35928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
36028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
36128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    virtual android_color_mode_t getActiveColorMode(const sp<IBinder>& display) {
36228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        Parcel data, reply;
36328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
36428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
36528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getActiveColorMode failed to writeInterfaceToken: %d", result);
36628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return static_cast<android_color_mode_t>(result);
36728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
36828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeStrongBinder(display);
36928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
37028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getActiveColorMode failed to writeStrongBinder: %d", result);
37128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return static_cast<android_color_mode_t>(result);
37228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
37328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = remote()->transact(BnSurfaceComposer::GET_ACTIVE_COLOR_MODE, data, &reply);
37428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
37528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getActiveColorMode failed to transact: %d", result);
37628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return static_cast<android_color_mode_t>(result);
37728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
37828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        return static_cast<android_color_mode_t>(reply.readInt32());
37928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
38028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
38128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    virtual status_t setActiveColorMode(const sp<IBinder>& display,
38228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            android_color_mode_t colorMode) {
38328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        Parcel data, reply;
38428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
38528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
38628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to writeInterfaceToken: %d", result);
38728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
38828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
38928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeStrongBinder(display);
39028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
39128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to writeStrongBinder: %d", result);
39228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
39328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
39428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeInt32(colorMode);
39528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
39628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to writeInt32: %d", result);
39728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
39828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
39928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = remote()->transact(BnSurfaceComposer::SET_ACTIVE_COLOR_MODE, data, &reply);
40028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
40128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to transact: %d", result);
40228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
40328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
40428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        return static_cast<status_t>(reply.readInt32());
40528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
40628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
407d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    virtual status_t clearAnimationFrameStats() {
408d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        Parcel data, reply;
409d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
410d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply);
411d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return reply.readInt32();
412d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
413d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
414d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    virtual status_t getAnimationFrameStats(FrameStats* outStats) const {
415d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        Parcel data, reply;
416d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
417d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply);
418d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        reply.read(*outStats);
419d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return reply.readInt32();
420d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
421c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza
422c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza    virtual status_t getHdrCapabilities(const sp<IBinder>& display,
423c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            HdrCapabilities* outCapabilities) const {
424c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        Parcel data, reply;
425c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
426c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        status_t result = data.writeStrongBinder(display);
427c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result != NO_ERROR) {
428c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            ALOGE("getHdrCapabilities failed to writeStrongBinder: %d", result);
429c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return result;
430c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
431c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        result = remote()->transact(BnSurfaceComposer::GET_HDR_CAPABILITIES,
432c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                data, &reply);
433c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result != NO_ERROR) {
434c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            ALOGE("getHdrCapabilities failed to transact: %d", result);
435c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return result;
436c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
437c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        result = reply.readInt32();
438c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result == NO_ERROR) {
439e1f5e6fd7ad07778fa4381059852a94567d77dfcMathias Agopian            result = reply.read(*outCapabilities);
440c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
441c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        return result;
442c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza    }
443c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
444c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    virtual status_t enableVSyncInjections(bool enable) {
445c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        Parcel data, reply;
446c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
447c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
448c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("enableVSyncInjections failed to writeInterfaceToken: %d", result);
449c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
450c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
451c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        result = data.writeBool(enable);
452c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
453c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("enableVSyncInjections failed to writeBool: %d", result);
454c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
455c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
456c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        result = remote()->transact(BnSurfaceComposer::ENABLE_VSYNC_INJECTIONS,
457c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                data, &reply, TF_ONE_WAY);
458c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
459c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("enableVSyncInjections failed to transact: %d", result);
460c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
461c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
462c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        return result;
463c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    }
464c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
465c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    virtual status_t injectVSync(nsecs_t when) {
466c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        Parcel data, reply;
467c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
468c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
469c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("injectVSync failed to writeInterfaceToken: %d", result);
470c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
471c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
472c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        result = data.writeInt64(when);
473c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
474c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("injectVSync failed to writeInt64: %d", result);
475c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
476c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
477c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        result = remote()->transact(BnSurfaceComposer::INJECT_VSYNC, data, &reply, TF_ONE_WAY);
478c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
479c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("injectVSync failed to transact: %d", result);
480c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
481c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
482c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        return result;
483c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    }
484c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
485a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    virtual status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) const
486a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    {
487a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        if (!outLayers) {
488a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            return UNEXPECTED_NULL;
489a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
490a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita
491a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        Parcel data, reply;
492a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita
493a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        status_t err = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
494a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        if (err != NO_ERROR) {
495a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            return err;
496a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
497a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita
498a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        err = remote()->transact(BnSurfaceComposer::GET_LAYER_DEBUG_INFO, data, &reply);
499a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        if (err != NO_ERROR) {
500a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            return err;
501a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
502a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita
503a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        int32_t result = 0;
504a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        err = reply.readInt32(&result);
505a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        if (err != NO_ERROR) {
506a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            return err;
507a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
508a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        if (result != NO_ERROR) {
509a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            return result;
510a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
511a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita
512a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        outLayers->clear();
513a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        return reply.readParcelableVector(outLayers);
514a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    }
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
517d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this
518d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// translation unit (see clang warning -Wweak-vtables)
519d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan StozaBpSurfaceComposer::~BpSurfaceComposer() {}
520d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact(
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(code) {
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case CREATE_CONNECTION: {
53083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
5312ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            sp<IBinder> b = IInterface::asBinder(createConnection());
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeStrongBinder(b);
5336c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
5346c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
5351db73f66624e7d151710483dd58e03eed672f064Robert Carr        case CREATE_SCOPED_CONNECTION: {
5361db73f66624e7d151710483dd58e03eed672f064Robert Carr            CHECK_INTERFACE(ISurfaceComposer, data, reply);
5371db73f66624e7d151710483dd58e03eed672f064Robert Carr            sp<IGraphicBufferProducer> bufferProducer =
5381db73f66624e7d151710483dd58e03eed672f064Robert Carr                interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
5391db73f66624e7d151710483dd58e03eed672f064Robert Carr            sp<IBinder> b = IInterface::asBinder(createScopedConnection(bufferProducer));
5401db73f66624e7d151710483dd58e03eed672f064Robert Carr            reply->writeStrongBinder(b);
5411db73f66624e7d151710483dd58e03eed672f064Robert Carr            return NO_ERROR;
5421db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
543698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        case SET_TRANSACTION_STATE: {
54483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
545d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
546d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            size_t count = data.readUint32();
5478afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            if (count > data.dataSize()) {
5488afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                return BAD_VALUE;
5498afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            }
550698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ComposerState s;
551698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            Vector<ComposerState> state;
552698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            state.setCapacity(count);
553d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            for (size_t i = 0; i < count; i++) {
5548afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                if (s.read(data) == BAD_VALUE) {
5558afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                    return BAD_VALUE;
5568afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                }
557698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian                state.add(s);
558698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            }
559d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
560d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            count = data.readUint32();
5618afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            if (count > data.dataSize()) {
5628afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                return BAD_VALUE;
5638afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            }
5648b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            DisplayState d;
5658b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            Vector<DisplayState> displays;
5668b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            displays.setCapacity(count);
567d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            for (size_t i = 0; i < count; i++) {
5688afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                if (d.read(data) == BAD_VALUE) {
5698afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                    return BAD_VALUE;
5708afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                }
5718b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian                displays.add(d);
5728b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            }
573d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
574d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t stateFlags = data.readUint32();
575d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            setTransactionState(state, displays, stateFlags);
5766c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
5776c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case BOOT_FINISHED: {
57983c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bootFinished();
5816c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
5826c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
5832a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        case CAPTURE_SCREEN: {
5842a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
5852a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            sp<IBinder> display = data.readStrongBinder();
5862a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            sp<IGraphicBufferProducer> producer =
5872a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
58860d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            Rect sourceCrop(Rect::EMPTY_RECT);
589c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza            data.read(sourceCrop);
590d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t reqWidth = data.readUint32();
591d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t reqHeight = data.readUint32();
592ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            int32_t minLayerZ = data.readInt32();
593ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            int32_t maxLayerZ = data.readInt32();
594c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza            bool useIdentityTransform = static_cast<bool>(data.readInt32());
595d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            int32_t rotation = data.readInt32();
596c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
5972a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            status_t res = captureScreen(display, producer,
598c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza                    sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
599c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews                    useIdentityTransform,
600c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews                    static_cast<ISurfaceComposer::Rotation>(rotation));
6012a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            reply->writeInt32(res);
6026c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
6036c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
604a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        case CAPTURE_LAYERS: {
605a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            CHECK_INTERFACE(ISurfaceComposer, data, reply);
606a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            sp<IBinder> layerHandleBinder = data.readStrongBinder();
607a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            sp<IGraphicBufferProducer> producer =
608a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
6097206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw            Rect sourceCrop(Rect::EMPTY_RECT);
6107206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw            data.read(sourceCrop);
6117206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw            float frameScale = data.readFloat();
612a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
6137206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw            status_t res = captureLayers(layerHandleBinder, producer, sourceCrop, frameScale);
614a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            reply->writeInt32(res);
615a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            return NO_ERROR;
616a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        }
617134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        case AUTHENTICATE_SURFACE: {
618134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6192adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            sp<IGraphicBufferProducer> bufferProducer =
6202adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
6212adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0;
622134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            reply->writeInt32(result);
6236c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
6246c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
6256b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        case GET_SUPPORTED_FRAME_TIMESTAMPS: {
6266b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6276b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            std::vector<FrameEvent> supportedTimestamps;
6286b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            status_t result = getSupportedFrameTimestamps(&supportedTimestamps);
6296b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            status_t err = reply->writeInt32(result);
6306b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            if (err != NO_ERROR) {
6316b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                return err;
6326b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            }
6336b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            if (result != NO_ERROR) {
6346b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                return result;
6356b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            }
6366b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
6376b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            std::vector<int32_t> supported;
6386b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            supported.reserve(supportedTimestamps.size());
6396b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            for (FrameEvent s : supportedTimestamps) {
6406b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                supported.push_back(static_cast<int32_t>(s));
6416b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            }
6426b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return reply->writeInt32Vector(supported);
6436b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
644d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        case CREATE_DISPLAY_EVENT_CONNECTION: {
645d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
646b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi            sp<IDisplayEventConnection> connection(createDisplayEventConnection(
647b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi                    static_cast<ISurfaceComposer::VsyncSource>(data.readInt32())));
6482ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(connection));
649d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return NO_ERROR;
6506c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
651e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case CREATE_DISPLAY: {
652e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6538dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            String8 displayName = data.readString8();
654dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            bool secure = bool(data.readInt32());
655dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            sp<IBinder> display(createDisplay(displayName, secure));
656e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
657e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
6586c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
6596c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        case DESTROY_DISPLAY: {
6606c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6616c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            sp<IBinder> display = data.readStrongBinder();
6626c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            destroyDisplay(display);
6636c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
6646c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
665e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case GET_BUILT_IN_DISPLAY: {
666e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
667e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            int32_t id = data.readInt32();
668e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            sp<IBinder> display(getBuiltInDisplay(id));
669e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
670e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
6716c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
6727f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case GET_DISPLAY_CONFIGS: {
6737f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6747f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            Vector<DisplayInfo> configs;
6757f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            sp<IBinder> display = data.readStrongBinder();
6767f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            status_t result = getDisplayConfigs(display, &configs);
6777f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            reply->writeInt32(result);
6787f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            if (result == NO_ERROR) {
679d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza                reply->writeUint32(static_cast<uint32_t>(configs.size()));
6807f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                for (size_t c = 0; c < configs.size(); ++c) {
6817f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                    memcpy(reply->writeInplace(sizeof(DisplayInfo)),
6827f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                            &configs[c], sizeof(DisplayInfo));
6837f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                }
6847f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            }
6857f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            return NO_ERROR;
6867f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
68767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        case GET_DISPLAY_STATS: {
68867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            CHECK_INTERFACE(ISurfaceComposer, data, reply);
68967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            DisplayStatInfo stats;
69067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            sp<IBinder> display = data.readStrongBinder();
69167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            status_t result = getDisplayStats(display, &stats);
69267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            reply->writeInt32(result);
69367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            if (result == NO_ERROR) {
69467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                memcpy(reply->writeInplace(sizeof(DisplayStatInfo)),
69567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                        &stats, sizeof(DisplayStatInfo));
69667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            }
69767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            return NO_ERROR;
69867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        }
6997f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case GET_ACTIVE_CONFIG: {
7007f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
7017f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            sp<IBinder> display = data.readStrongBinder();
7027f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            int id = getActiveConfig(display);
7037f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            reply->writeInt32(id);
7047f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            return NO_ERROR;
7057f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
7067f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case SET_ACTIVE_CONFIG: {
707c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
7089d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown            sp<IBinder> display = data.readStrongBinder();
7097f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            int id = data.readInt32();
7107f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            status_t result = setActiveConfig(display, id);
711c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            reply->writeInt32(result);
7126c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
7136c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
71428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        case GET_DISPLAY_COLOR_MODES: {
71528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            CHECK_INTERFACE(ISurfaceComposer, data, reply);
71628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            Vector<android_color_mode_t> colorModes;
71728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            sp<IBinder> display = nullptr;
71828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            status_t result = data.readStrongBinder(&display);
71928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
72028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("getDisplayColorModes failed to readStrongBinder: %d", result);
72128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
72228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
72328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = getDisplayColorModes(display, &colorModes);
72428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            reply->writeInt32(result);
72528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result == NO_ERROR) {
72628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                reply->writeUint32(static_cast<uint32_t>(colorModes.size()));
72728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                for (size_t i = 0; i < colorModes.size(); ++i) {
72828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                    reply->writeInt32(colorModes[i]);
72928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                }
73028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
73128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return NO_ERROR;
73228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
73328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        case GET_ACTIVE_COLOR_MODE: {
73428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            CHECK_INTERFACE(ISurfaceComposer, data, reply);
73528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            sp<IBinder> display = nullptr;
73628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            status_t result = data.readStrongBinder(&display);
73728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
73828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("getActiveColorMode failed to readStrongBinder: %d", result);
73928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
74028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
74128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            android_color_mode_t colorMode = getActiveColorMode(display);
74228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = reply->writeInt32(static_cast<int32_t>(colorMode));
74328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
74428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
74528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        case SET_ACTIVE_COLOR_MODE: {
74628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            CHECK_INTERFACE(ISurfaceComposer, data, reply);
74728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            sp<IBinder> display = nullptr;
74828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            status_t result = data.readStrongBinder(&display);
74928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
75028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("getActiveColorMode failed to readStrongBinder: %d", result);
75128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
75228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
75328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            int32_t colorModeInt = 0;
75428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = data.readInt32(&colorModeInt);
75528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
75628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("setActiveColorMode failed to readInt32: %d", result);
75728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
75828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
75928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = setActiveColorMode(display,
76028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                    static_cast<android_color_mode_t>(colorModeInt));
76128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = reply->writeInt32(result);
76228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
76328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
764d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        case CLEAR_ANIMATION_FRAME_STATS: {
765d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            CHECK_INTERFACE(ISurfaceComposer, data, reply);
766d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            status_t result = clearAnimationFrameStats();
767d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->writeInt32(result);
768d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            return NO_ERROR;
769d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        }
770d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        case GET_ANIMATION_FRAME_STATS: {
771d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            CHECK_INTERFACE(ISurfaceComposer, data, reply);
772d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            FrameStats stats;
773d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            status_t result = getAnimationFrameStats(&stats);
774d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->write(stats);
775d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->writeInt32(result);
776d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            return NO_ERROR;
777d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        }
7782c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        case SET_POWER_MODE: {
7792c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            CHECK_INTERFACE(ISurfaceComposer, data, reply);
7802c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            sp<IBinder> display = data.readStrongBinder();
7812c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            int32_t mode = data.readInt32();
7822c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            setPowerMode(display, mode);
7832c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            return NO_ERROR;
7842c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        }
785c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        case GET_HDR_CAPABILITIES: {
786c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
787c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            sp<IBinder> display = nullptr;
788c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            status_t result = data.readStrongBinder(&display);
789c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            if (result != NO_ERROR) {
790c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                ALOGE("getHdrCapabilities failed to readStrongBinder: %d",
791c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                        result);
792c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                return result;
793c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            }
794c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            HdrCapabilities capabilities;
795c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            result = getHdrCapabilities(display, &capabilities);
796c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            reply->writeInt32(result);
797c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            if (result == NO_ERROR) {
798e1f5e6fd7ad07778fa4381059852a94567d77dfcMathias Agopian                reply->write(capabilities);
799c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            }
800c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return NO_ERROR;
801c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
802c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        case ENABLE_VSYNC_INJECTIONS: {
803c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            CHECK_INTERFACE(ISurfaceComposer, data, reply);
804c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            bool enable = false;
805c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            status_t result = data.readBool(&enable);
806c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            if (result != NO_ERROR) {
807c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                ALOGE("enableVSyncInjections failed to readBool: %d", result);
808c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                return result;
809c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            }
810c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return enableVSyncInjections(enable);
811c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
812c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        case INJECT_VSYNC: {
813c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            CHECK_INTERFACE(ISurfaceComposer, data, reply);
814c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            int64_t when = 0;
815c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            status_t result = data.readInt64(&when);
816c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            if (result != NO_ERROR) {
817c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                ALOGE("enableVSyncInjections failed to readInt64: %d", result);
818c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                return result;
819c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            }
820c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return injectVSync(when);
821c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
822a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        case GET_LAYER_DEBUG_INFO: {
823a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            CHECK_INTERFACE(ISurfaceComposer, data, reply);
824a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            std::vector<LayerDebugInfo> outLayers;
825a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            status_t result = getLayerDebugInfo(&outLayers);
826a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            reply->writeInt32(result);
827a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            if (result == NO_ERROR)
828a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            {
829a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita                result = reply->writeParcelableVector(outLayers);
830a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            }
831a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            return result;
832a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
8336c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        default: {
83483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            return BBinder::onTransact(code, data, reply, flags);
8356c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
842