ISurfaceComposer.cpp revision a52f0295622a42849f5ef81c44589b816b2ccacb
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
10340482ff650751819d4104c10a30974838168438cChavi Weingarten    virtual status_t captureScreen(const sp<IBinder>& display, sp<GraphicBuffer>* outBuffer,
10440482ff650751819d4104c10a30974838168438cChavi Weingarten                                   Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
10540482ff650751819d4104c10a30974838168438cChavi Weingarten                                   int32_t minLayerZ, int32_t maxLayerZ, bool useIdentityTransform,
10640482ff650751819d4104c10a30974838168438cChavi Weingarten                                   ISurfaceComposer::Rotation rotation) {
1072a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        Parcel data, reply;
1082a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1092a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeStrongBinder(display);
110c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza        data.write(sourceCrop);
111d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(reqWidth);
112d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(reqHeight);
113ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr        data.writeInt32(minLayerZ);
114ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr        data.writeInt32(maxLayerZ);
115c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        data.writeInt32(static_cast<int32_t>(useIdentityTransform));
116c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        data.writeInt32(static_cast<int32_t>(rotation));
11740482ff650751819d4104c10a30974838168438cChavi Weingarten        status_t err = remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
11840482ff650751819d4104c10a30974838168438cChavi Weingarten
11940482ff650751819d4104c10a30974838168438cChavi Weingarten        if (err != NO_ERROR) {
12040482ff650751819d4104c10a30974838168438cChavi Weingarten            return err;
12140482ff650751819d4104c10a30974838168438cChavi Weingarten        }
12240482ff650751819d4104c10a30974838168438cChavi Weingarten
12340482ff650751819d4104c10a30974838168438cChavi Weingarten        err = reply.readInt32();
12440482ff650751819d4104c10a30974838168438cChavi Weingarten        if (err != NO_ERROR) {
12540482ff650751819d4104c10a30974838168438cChavi Weingarten            return err;
12640482ff650751819d4104c10a30974838168438cChavi Weingarten        }
12740482ff650751819d4104c10a30974838168438cChavi Weingarten
12840482ff650751819d4104c10a30974838168438cChavi Weingarten        *outBuffer = new GraphicBuffer();
12940482ff650751819d4104c10a30974838168438cChavi Weingarten        reply.read(**outBuffer);
13040482ff650751819d4104c10a30974838168438cChavi Weingarten        return err;
1312a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    }
1322a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian
133a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    virtual status_t captureLayers(const sp<IBinder>& layerHandleBinder,
13440482ff650751819d4104c10a30974838168438cChavi Weingarten                                   sp<GraphicBuffer>* outBuffer, const Rect& sourceCrop,
135578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr                                   float frameScale, bool childrenOnly) {
136a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        Parcel data, reply;
137a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
138a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        data.writeStrongBinder(layerHandleBinder);
1397206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw        data.write(sourceCrop);
1407206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw        data.writeFloat(frameScale);
141578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr        data.writeBool(childrenOnly);
14240482ff650751819d4104c10a30974838168438cChavi Weingarten        status_t err = remote()->transact(BnSurfaceComposer::CAPTURE_LAYERS, data, &reply);
14340482ff650751819d4104c10a30974838168438cChavi Weingarten
14440482ff650751819d4104c10a30974838168438cChavi Weingarten        if (err != NO_ERROR) {
14540482ff650751819d4104c10a30974838168438cChavi Weingarten            return err;
14640482ff650751819d4104c10a30974838168438cChavi Weingarten        }
14740482ff650751819d4104c10a30974838168438cChavi Weingarten
14840482ff650751819d4104c10a30974838168438cChavi Weingarten        err = reply.readInt32();
14940482ff650751819d4104c10a30974838168438cChavi Weingarten        if (err != NO_ERROR) {
15040482ff650751819d4104c10a30974838168438cChavi Weingarten            return err;
15140482ff650751819d4104c10a30974838168438cChavi Weingarten        }
15240482ff650751819d4104c10a30974838168438cChavi Weingarten
15340482ff650751819d4104c10a30974838168438cChavi Weingarten        *outBuffer = new GraphicBuffer();
15440482ff650751819d4104c10a30974838168438cChavi Weingarten        reply.read(**outBuffer);
15540482ff650751819d4104c10a30974838168438cChavi Weingarten
15640482ff650751819d4104c10a30974838168438cChavi Weingarten        return err;
157a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw    }
158a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
159582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    virtual bool authenticateSurfaceTexture(
1602adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            const sp<IGraphicBufferProducer>& bufferProducer) const
161134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    {
162134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        Parcel data, reply;
163134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int err = NO_ERROR;
164134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = data.writeInterfaceToken(
165134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                ISurfaceComposer::getInterfaceDescriptor());
166134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
167e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
168134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                    "interface descriptor: %s (%d)", strerror(-err), -err);
169134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
170134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
1712ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen        err = data.writeStrongBinder(IInterface::asBinder(bufferProducer));
172134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
173e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
174582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "strong binder to parcel: %s (%d)", strerror(-err), -err);
175134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
176134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
177134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
178134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                &reply);
179134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
180e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
181582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "performing transaction: %s (%d)", strerror(-err), -err);
182134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
183134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
184134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int32_t result = 0;
185134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = reply.readInt32(&result);
186134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
187e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
188582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "retrieving result: %s (%d)", strerror(-err), -err);
189134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
190134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
191134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        return result != 0;
192134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
193d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
1946b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson    virtual status_t getSupportedFrameTimestamps(
1956b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            std::vector<FrameEvent>* outSupported) const {
1966b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (!outSupported) {
1976b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return UNEXPECTED_NULL;
1986b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
1996b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        outSupported->clear();
2006b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
2016b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        Parcel data, reply;
2026b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
2036b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        status_t err = data.writeInterfaceToken(
2046b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                ISurfaceComposer::getInterfaceDescriptor());
2056b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (err != NO_ERROR) {
2066b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return err;
2076b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
2086b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
2096b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        err = remote()->transact(
2106b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                BnSurfaceComposer::GET_SUPPORTED_FRAME_TIMESTAMPS,
2116b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                data, &reply);
2126b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (err != NO_ERROR) {
2136b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return err;
2146b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
2156b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
2166b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        int32_t result = 0;
2176b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        err = reply.readInt32(&result);
2186b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (err != NO_ERROR) {
2196b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return err;
2206b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
2216b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (result != NO_ERROR) {
2226b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return result;
2236b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
2246b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
2256b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        std::vector<int32_t> supported;
2266b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        err = reply.readInt32Vector(&supported);
2276b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (err != NO_ERROR) {
2286b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return err;
2296b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
2306b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
2316b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        outSupported->reserve(supported.size());
2326b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        for (int32_t s : supported) {
2336b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            outSupported->push_back(static_cast<FrameEvent>(s));
2346b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
2356b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        return NO_ERROR;
2366b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson    }
2376b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
238b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi    virtual sp<IDisplayEventConnection> createDisplayEventConnection(VsyncSource vsyncSource)
239d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    {
240d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        Parcel data, reply;
241d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        sp<IDisplayEventConnection> result;
242d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        int err = data.writeInterfaceToken(
243d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                ISurfaceComposer::getInterfaceDescriptor());
244d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
245d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
246d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
247b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi        data.writeInt32(static_cast<int32_t>(vsyncSource));
248d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        err = remote()->transact(
249d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
250d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                data, &reply);
251d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
252e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
253d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                    "transaction: %s (%d)", strerror(-err), -err);
254d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
255d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
256d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder());
257d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        return result;
258d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    }
2598e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross
260dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    virtual sp<IBinder> createDisplay(const String8& displayName, bool secure)
261e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
262e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
263e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2648dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        data.writeString8(displayName);
265dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        data.writeInt32(secure ? 1 : 0);
266e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply);
267e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
268e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
269e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
2706c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    virtual void destroyDisplay(const sp<IBinder>& display)
2716c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    {
2726c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        Parcel data, reply;
2736c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2746c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        data.writeStrongBinder(display);
2756c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply);
2766c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    }
2776c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall
278e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    virtual sp<IBinder> getBuiltInDisplay(int32_t id)
279e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
280e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
281e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
282e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInt32(id);
283e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply);
284e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
285e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
286e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
2872c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    virtual void setPowerMode(const sp<IBinder>& display, int mode)
2888e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    {
2898e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        Parcel data, reply;
2908e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
291c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden        data.writeStrongBinder(display);
2922c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        data.writeInt32(mode);
2932c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply);
2948e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    }
2953094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian
2967f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual status_t getDisplayConfigs(const sp<IBinder>& display,
2977f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            Vector<DisplayInfo>* configs)
298c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    {
299c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        Parcel data, reply;
300c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
3019d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        data.writeStrongBinder(display);
3027f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply);
3037f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        status_t result = reply.readInt32();
3047f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        if (result == NO_ERROR) {
305d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            size_t numConfigs = reply.readUint32();
3067f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            configs->clear();
3077f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            configs->resize(numConfigs);
3087f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            for (size_t c = 0; c < numConfigs; ++c) {
3097f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                memcpy(&(configs->editItemAt(c)),
3107f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                        reply.readInplace(sizeof(DisplayInfo)),
3117f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                        sizeof(DisplayInfo));
3127f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            }
3137f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
3147f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return result;
3157f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
3167f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
31767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    virtual status_t getDisplayStats(const sp<IBinder>& display,
31867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            DisplayStatInfo* stats)
31967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    {
32067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        Parcel data, reply;
32167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
32267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        data.writeStrongBinder(display);
32367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply);
32467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        status_t result = reply.readInt32();
32567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        if (result == NO_ERROR) {
32667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            memcpy(stats,
32767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                    reply.readInplace(sizeof(DisplayStatInfo)),
32867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                    sizeof(DisplayStatInfo));
32967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        }
33067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        return result;
33167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    }
33267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar
3337f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual int getActiveConfig(const sp<IBinder>& display)
3347f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    {
3357f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        Parcel data, reply;
3367f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
3377f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeStrongBinder(display);
3387f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply);
3397f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return reply.readInt32();
3407f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
3417f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
3427f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual status_t setActiveConfig(const sp<IBinder>& display, int id)
3437f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    {
3447f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        Parcel data, reply;
3457f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
3467f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeStrongBinder(display);
3477f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInt32(id);
3487f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply);
349c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        return reply.readInt32();
350c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    }
351d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
35228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    virtual status_t getDisplayColorModes(const sp<IBinder>& display,
353a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin            Vector<ColorMode>* outColorModes) {
35428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        Parcel data, reply;
35528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
35628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
35728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getDisplayColorModes failed to writeInterfaceToken: %d", result);
35828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
35928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
36028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeStrongBinder(display);
36128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
36228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getDisplayColorModes failed to writeStrongBinder: %d", result);
36328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
36428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
36528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = remote()->transact(BnSurfaceComposer::GET_DISPLAY_COLOR_MODES, data, &reply);
36628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
36728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getDisplayColorModes failed to transact: %d", result);
36828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
36928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
37028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = static_cast<status_t>(reply.readInt32());
37128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result == NO_ERROR) {
37228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            size_t numModes = reply.readUint32();
37328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            outColorModes->clear();
37428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            outColorModes->resize(numModes);
37528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            for (size_t i = 0; i < numModes; ++i) {
376a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin                outColorModes->replaceAt(static_cast<ColorMode>(reply.readInt32()), i);
37728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
37828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
37928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        return result;
38028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
38128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
382a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin    virtual ColorMode getActiveColorMode(const sp<IBinder>& display) {
38328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        Parcel data, reply;
38428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
38528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
38628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getActiveColorMode failed to writeInterfaceToken: %d", result);
387a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin            return static_cast<ColorMode>(result);
38828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
38928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeStrongBinder(display);
39028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
39128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getActiveColorMode failed to writeStrongBinder: %d", result);
392a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin            return static_cast<ColorMode>(result);
39328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
39428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = remote()->transact(BnSurfaceComposer::GET_ACTIVE_COLOR_MODE, data, &reply);
39528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
39628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getActiveColorMode failed to transact: %d", result);
397a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin            return static_cast<ColorMode>(result);
39828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
399a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin        return static_cast<ColorMode>(reply.readInt32());
40028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
40128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
40228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    virtual status_t setActiveColorMode(const sp<IBinder>& display,
403a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin            ColorMode colorMode) {
40428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        Parcel data, reply;
40528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
40628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
40728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to writeInterfaceToken: %d", result);
40828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
40928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
41028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeStrongBinder(display);
41128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
41228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to writeStrongBinder: %d", result);
41328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
41428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
415a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin        result = data.writeInt32(static_cast<int32_t>(colorMode));
41628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
41728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to writeInt32: %d", result);
41828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
41928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
42028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = remote()->transact(BnSurfaceComposer::SET_ACTIVE_COLOR_MODE, data, &reply);
42128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
42228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to transact: %d", result);
42328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
42428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
42528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        return static_cast<status_t>(reply.readInt32());
42628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
42728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
428d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    virtual status_t clearAnimationFrameStats() {
429d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        Parcel data, reply;
430d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
431d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply);
432d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return reply.readInt32();
433d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
434d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
435d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    virtual status_t getAnimationFrameStats(FrameStats* outStats) const {
436d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        Parcel data, reply;
437d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
438d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply);
439d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        reply.read(*outStats);
440d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return reply.readInt32();
441d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
442c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza
443c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza    virtual status_t getHdrCapabilities(const sp<IBinder>& display,
444c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            HdrCapabilities* outCapabilities) const {
445c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        Parcel data, reply;
446c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
447c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        status_t result = data.writeStrongBinder(display);
448c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result != NO_ERROR) {
449c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            ALOGE("getHdrCapabilities failed to writeStrongBinder: %d", result);
450c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return result;
451c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
452c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        result = remote()->transact(BnSurfaceComposer::GET_HDR_CAPABILITIES,
453c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                data, &reply);
454c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result != NO_ERROR) {
455c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            ALOGE("getHdrCapabilities failed to transact: %d", result);
456c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return result;
457c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
458c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        result = reply.readInt32();
459c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result == NO_ERROR) {
460e1f5e6fd7ad07778fa4381059852a94567d77dfcMathias Agopian            result = reply.read(*outCapabilities);
461c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
462c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        return result;
463c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza    }
464c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
465c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    virtual status_t enableVSyncInjections(bool enable) {
466c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        Parcel data, reply;
467c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
468c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
469c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("enableVSyncInjections failed to writeInterfaceToken: %d", result);
470c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
471c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
472c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        result = data.writeBool(enable);
473c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
474c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("enableVSyncInjections failed to writeBool: %d", result);
475c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
476c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
477c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        result = remote()->transact(BnSurfaceComposer::ENABLE_VSYNC_INJECTIONS,
478c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                data, &reply, TF_ONE_WAY);
479c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
480c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("enableVSyncInjections failed to transact: %d", result);
481c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
482c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
483c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        return result;
484c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    }
485c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
486c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    virtual status_t injectVSync(nsecs_t when) {
487c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        Parcel data, reply;
488c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
489c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
490c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("injectVSync failed to writeInterfaceToken: %d", result);
491c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
492c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
493c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        result = data.writeInt64(when);
494c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
495c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("injectVSync failed to writeInt64: %d", result);
496c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
497c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
498c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        result = remote()->transact(BnSurfaceComposer::INJECT_VSYNC, data, &reply, TF_ONE_WAY);
499c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
500c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("injectVSync failed to transact: %d", result);
501c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
502c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
503c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        return result;
504c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    }
505c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
506a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    virtual status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) const
507a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    {
508a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        if (!outLayers) {
509a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            return UNEXPECTED_NULL;
510a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
511a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita
512a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        Parcel data, reply;
513a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita
514a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        status_t err = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
515a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        if (err != NO_ERROR) {
516a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            return err;
517a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
518a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita
519a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        err = remote()->transact(BnSurfaceComposer::GET_LAYER_DEBUG_INFO, data, &reply);
520a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        if (err != NO_ERROR) {
521a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            return err;
522a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
523a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita
524a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        int32_t result = 0;
525a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        err = reply.readInt32(&result);
526a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        if (err != NO_ERROR) {
527a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            return err;
528a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
529a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        if (result != NO_ERROR) {
530a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            return result;
531a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
532a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita
533a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        outLayers->clear();
534a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        return reply.readParcelableVector(outLayers);
535a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita    }
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
538d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this
539d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// translation unit (see clang warning -Wweak-vtables)
540d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan StozaBpSurfaceComposer::~BpSurfaceComposer() {}
541d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact(
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(code) {
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case CREATE_CONNECTION: {
55183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
5522ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            sp<IBinder> b = IInterface::asBinder(createConnection());
553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeStrongBinder(b);
5546c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
5556c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
5561db73f66624e7d151710483dd58e03eed672f064Robert Carr        case CREATE_SCOPED_CONNECTION: {
5571db73f66624e7d151710483dd58e03eed672f064Robert Carr            CHECK_INTERFACE(ISurfaceComposer, data, reply);
5581db73f66624e7d151710483dd58e03eed672f064Robert Carr            sp<IGraphicBufferProducer> bufferProducer =
5591db73f66624e7d151710483dd58e03eed672f064Robert Carr                interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
5601db73f66624e7d151710483dd58e03eed672f064Robert Carr            sp<IBinder> b = IInterface::asBinder(createScopedConnection(bufferProducer));
5611db73f66624e7d151710483dd58e03eed672f064Robert Carr            reply->writeStrongBinder(b);
5621db73f66624e7d151710483dd58e03eed672f064Robert Carr            return NO_ERROR;
5631db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
564698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        case SET_TRANSACTION_STATE: {
56583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
566d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
567d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            size_t count = data.readUint32();
5688afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            if (count > data.dataSize()) {
5698afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                return BAD_VALUE;
5708afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            }
571698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ComposerState s;
572698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            Vector<ComposerState> state;
573698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            state.setCapacity(count);
574d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            for (size_t i = 0; i < count; i++) {
5758afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                if (s.read(data) == BAD_VALUE) {
5768afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                    return BAD_VALUE;
5778afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                }
578698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian                state.add(s);
579698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            }
580d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
581d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            count = data.readUint32();
5828afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            if (count > data.dataSize()) {
5838afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                return BAD_VALUE;
5848afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            }
5858b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            DisplayState d;
5868b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            Vector<DisplayState> displays;
5878b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            displays.setCapacity(count);
588d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            for (size_t i = 0; i < count; i++) {
5898afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                if (d.read(data) == BAD_VALUE) {
5908afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                    return BAD_VALUE;
5918afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                }
5928b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian                displays.add(d);
5938b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            }
594d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
595d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t stateFlags = data.readUint32();
596d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            setTransactionState(state, displays, stateFlags);
5976c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
5986c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case BOOT_FINISHED: {
60083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bootFinished();
6026c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
6036c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
6042a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        case CAPTURE_SCREEN: {
6052a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6062a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            sp<IBinder> display = data.readStrongBinder();
60740482ff650751819d4104c10a30974838168438cChavi Weingarten            sp<GraphicBuffer> outBuffer;
60860d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            Rect sourceCrop(Rect::EMPTY_RECT);
609c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza            data.read(sourceCrop);
610d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t reqWidth = data.readUint32();
611d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t reqHeight = data.readUint32();
612ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            int32_t minLayerZ = data.readInt32();
613ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            int32_t maxLayerZ = data.readInt32();
614c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza            bool useIdentityTransform = static_cast<bool>(data.readInt32());
615d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            int32_t rotation = data.readInt32();
616c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
61740482ff650751819d4104c10a30974838168438cChavi Weingarten            status_t res = captureScreen(display, &outBuffer, sourceCrop, reqWidth, reqHeight,
61840482ff650751819d4104c10a30974838168438cChavi Weingarten                                         minLayerZ, maxLayerZ, useIdentityTransform,
61940482ff650751819d4104c10a30974838168438cChavi Weingarten                                         static_cast<ISurfaceComposer::Rotation>(rotation));
6202a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            reply->writeInt32(res);
62140482ff650751819d4104c10a30974838168438cChavi Weingarten            if (res == NO_ERROR) {
62240482ff650751819d4104c10a30974838168438cChavi Weingarten                reply->write(*outBuffer);
62340482ff650751819d4104c10a30974838168438cChavi Weingarten            }
6246c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
6256c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
626a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        case CAPTURE_LAYERS: {
627a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            CHECK_INTERFACE(ISurfaceComposer, data, reply);
628a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            sp<IBinder> layerHandleBinder = data.readStrongBinder();
62940482ff650751819d4104c10a30974838168438cChavi Weingarten            sp<GraphicBuffer> outBuffer;
6307206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw            Rect sourceCrop(Rect::EMPTY_RECT);
6317206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw            data.read(sourceCrop);
6327206d49b2963ce2e926a5f25fe94aca9c06471e6chaviw            float frameScale = data.readFloat();
633578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr            bool childrenOnly = data.readBool();
634a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw
635578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr            status_t res = captureLayers(layerHandleBinder, &outBuffer, sourceCrop, frameScale,
636578038fc49f83c4c8c4accdce49df404ecd6ad02Robert Carr                                         childrenOnly);
637a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            reply->writeInt32(res);
63840482ff650751819d4104c10a30974838168438cChavi Weingarten            if (res == NO_ERROR) {
63940482ff650751819d4104c10a30974838168438cChavi Weingarten                reply->write(*outBuffer);
64040482ff650751819d4104c10a30974838168438cChavi Weingarten            }
641a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw            return NO_ERROR;
642a76b271f0e14325fa0ebb98e1cac0a15adfea1cbchaviw        }
643134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        case AUTHENTICATE_SURFACE: {
644134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6452adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            sp<IGraphicBufferProducer> bufferProducer =
6462adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
6472adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0;
648134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            reply->writeInt32(result);
6496c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
6506c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
6516b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        case GET_SUPPORTED_FRAME_TIMESTAMPS: {
6526b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6536b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            std::vector<FrameEvent> supportedTimestamps;
6546b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            status_t result = getSupportedFrameTimestamps(&supportedTimestamps);
6556b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            status_t err = reply->writeInt32(result);
6566b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            if (err != NO_ERROR) {
6576b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                return err;
6586b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            }
6596b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            if (result != NO_ERROR) {
6606b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                return result;
6616b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            }
6626b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
6636b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            std::vector<int32_t> supported;
6646b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            supported.reserve(supportedTimestamps.size());
6656b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            for (FrameEvent s : supportedTimestamps) {
6666b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                supported.push_back(static_cast<int32_t>(s));
6676b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            }
6686b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return reply->writeInt32Vector(supported);
6696b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
670d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        case CREATE_DISPLAY_EVENT_CONNECTION: {
671d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
672b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi            sp<IDisplayEventConnection> connection(createDisplayEventConnection(
673b1e2f8deb38353e4bcc9d3ef06bc15bd5e417425Jorim Jaggi                    static_cast<ISurfaceComposer::VsyncSource>(data.readInt32())));
6742ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(connection));
675d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return NO_ERROR;
6766c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
677e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case CREATE_DISPLAY: {
678e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6798dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            String8 displayName = data.readString8();
680dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            bool secure = bool(data.readInt32());
681dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            sp<IBinder> display(createDisplay(displayName, secure));
682e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
683e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
6846c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
6856c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        case DESTROY_DISPLAY: {
6866c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6876c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            sp<IBinder> display = data.readStrongBinder();
6886c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            destroyDisplay(display);
6896c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
6906c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
691e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case GET_BUILT_IN_DISPLAY: {
692e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
693e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            int32_t id = data.readInt32();
694e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            sp<IBinder> display(getBuiltInDisplay(id));
695e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
696e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
6976c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
6987f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case GET_DISPLAY_CONFIGS: {
6997f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
7007f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            Vector<DisplayInfo> configs;
7017f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            sp<IBinder> display = data.readStrongBinder();
7027f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            status_t result = getDisplayConfigs(display, &configs);
7037f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            reply->writeInt32(result);
7047f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            if (result == NO_ERROR) {
705d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza                reply->writeUint32(static_cast<uint32_t>(configs.size()));
7067f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                for (size_t c = 0; c < configs.size(); ++c) {
7077f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                    memcpy(reply->writeInplace(sizeof(DisplayInfo)),
7087f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                            &configs[c], sizeof(DisplayInfo));
7097f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                }
7107f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            }
7117f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            return NO_ERROR;
7127f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
71367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        case GET_DISPLAY_STATS: {
71467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            CHECK_INTERFACE(ISurfaceComposer, data, reply);
71567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            DisplayStatInfo stats;
71667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            sp<IBinder> display = data.readStrongBinder();
71767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            status_t result = getDisplayStats(display, &stats);
71867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            reply->writeInt32(result);
71967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            if (result == NO_ERROR) {
72067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                memcpy(reply->writeInplace(sizeof(DisplayStatInfo)),
72167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                        &stats, sizeof(DisplayStatInfo));
72267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            }
72367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            return NO_ERROR;
72467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        }
7257f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case GET_ACTIVE_CONFIG: {
7267f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
7277f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            sp<IBinder> display = data.readStrongBinder();
7287f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            int id = getActiveConfig(display);
7297f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            reply->writeInt32(id);
7307f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            return NO_ERROR;
7317f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
7327f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case SET_ACTIVE_CONFIG: {
733c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
7349d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown            sp<IBinder> display = data.readStrongBinder();
7357f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            int id = data.readInt32();
7367f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            status_t result = setActiveConfig(display, id);
737c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            reply->writeInt32(result);
7386c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
7396c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
74028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        case GET_DISPLAY_COLOR_MODES: {
74128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            CHECK_INTERFACE(ISurfaceComposer, data, reply);
742a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin            Vector<ColorMode> colorModes;
74328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            sp<IBinder> display = nullptr;
74428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            status_t result = data.readStrongBinder(&display);
74528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
74628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("getDisplayColorModes failed to readStrongBinder: %d", result);
74728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
74828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
74928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = getDisplayColorModes(display, &colorModes);
75028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            reply->writeInt32(result);
75128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result == NO_ERROR) {
75228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                reply->writeUint32(static_cast<uint32_t>(colorModes.size()));
75328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                for (size_t i = 0; i < colorModes.size(); ++i) {
754a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin                    reply->writeInt32(static_cast<int32_t>(colorModes[i]));
75528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                }
75628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
75728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return NO_ERROR;
75828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
75928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        case GET_ACTIVE_COLOR_MODE: {
76028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            CHECK_INTERFACE(ISurfaceComposer, data, reply);
76128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            sp<IBinder> display = nullptr;
76228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            status_t result = data.readStrongBinder(&display);
76328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
76428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("getActiveColorMode failed to readStrongBinder: %d", result);
76528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
76628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
767a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin            ColorMode colorMode = getActiveColorMode(display);
76828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = reply->writeInt32(static_cast<int32_t>(colorMode));
76928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
77028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
77128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        case SET_ACTIVE_COLOR_MODE: {
77228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            CHECK_INTERFACE(ISurfaceComposer, data, reply);
77328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            sp<IBinder> display = nullptr;
77428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            status_t result = data.readStrongBinder(&display);
77528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
77628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("getActiveColorMode failed to readStrongBinder: %d", result);
77728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
77828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
77928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            int32_t colorModeInt = 0;
78028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = data.readInt32(&colorModeInt);
78128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
78228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("setActiveColorMode failed to readInt32: %d", result);
78328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
78428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
78528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = setActiveColorMode(display,
786a52f0295622a42849f5ef81c44589b816b2ccacbPeiyong Lin                    static_cast<ColorMode>(colorModeInt));
78728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = reply->writeInt32(result);
78828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
78928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
790d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        case CLEAR_ANIMATION_FRAME_STATS: {
791d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            CHECK_INTERFACE(ISurfaceComposer, data, reply);
792d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            status_t result = clearAnimationFrameStats();
793d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->writeInt32(result);
794d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            return NO_ERROR;
795d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        }
796d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        case GET_ANIMATION_FRAME_STATS: {
797d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            CHECK_INTERFACE(ISurfaceComposer, data, reply);
798d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            FrameStats stats;
799d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            status_t result = getAnimationFrameStats(&stats);
800d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->write(stats);
801d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->writeInt32(result);
802d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            return NO_ERROR;
803d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        }
8042c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        case SET_POWER_MODE: {
8052c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            CHECK_INTERFACE(ISurfaceComposer, data, reply);
8062c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            sp<IBinder> display = data.readStrongBinder();
8072c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            int32_t mode = data.readInt32();
8082c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            setPowerMode(display, mode);
8092c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            return NO_ERROR;
8102c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        }
811c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        case GET_HDR_CAPABILITIES: {
812c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
813c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            sp<IBinder> display = nullptr;
814c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            status_t result = data.readStrongBinder(&display);
815c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            if (result != NO_ERROR) {
816c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                ALOGE("getHdrCapabilities failed to readStrongBinder: %d",
817c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                        result);
818c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                return result;
819c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            }
820c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            HdrCapabilities capabilities;
821c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            result = getHdrCapabilities(display, &capabilities);
822c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            reply->writeInt32(result);
823c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            if (result == NO_ERROR) {
824e1f5e6fd7ad07778fa4381059852a94567d77dfcMathias Agopian                reply->write(capabilities);
825c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            }
826c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return NO_ERROR;
827c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
828c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        case ENABLE_VSYNC_INJECTIONS: {
829c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            CHECK_INTERFACE(ISurfaceComposer, data, reply);
830c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            bool enable = false;
831c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            status_t result = data.readBool(&enable);
832c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            if (result != NO_ERROR) {
833c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                ALOGE("enableVSyncInjections failed to readBool: %d", result);
834c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                return result;
835c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            }
836c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return enableVSyncInjections(enable);
837c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
838c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        case INJECT_VSYNC: {
839c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            CHECK_INTERFACE(ISurfaceComposer, data, reply);
840c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            int64_t when = 0;
841c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            status_t result = data.readInt64(&when);
842c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            if (result != NO_ERROR) {
843c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                ALOGE("enableVSyncInjections failed to readInt64: %d", result);
844c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                return result;
845c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            }
846c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return injectVSync(when);
847c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
848a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        case GET_LAYER_DEBUG_INFO: {
849a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            CHECK_INTERFACE(ISurfaceComposer, data, reply);
850a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            std::vector<LayerDebugInfo> outLayers;
851a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            status_t result = getLayerDebugInfo(&outLayers);
852a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            reply->writeInt32(result);
853a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            if (result == NO_ERROR)
854a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            {
855a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita                result = reply->writeParcelableVector(outLayers);
856a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            }
857a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita            return result;
858a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita        }
8596c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        default: {
86083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            return BBinder::onTransact(code, data, reply, flags);
8616c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
868