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