ISurfaceComposer.cpp revision 28f24d0ab481bd9c6fd5618414fee694e837c5c6
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/IMemory.h>
25c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IPCThreadState.h>
26c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IServiceManager.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/BitTube.h>
29d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/IDisplayEventConnection.h>
3090ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h>
312adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/IGraphicBufferProducer.h>
32d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
3390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright#include <system/graphics.h>
3628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
3790ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <ui/DisplayInfo.h>
3867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar#include <ui/DisplayStatInfo.h>
39c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza#include <ui/HdrCapabilities.h>
40582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
41134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/Log.h>
429cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass IDisplayEventConnection;
48d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer>
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    BpSurfaceComposer(const sp<IBinder>& impl)
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        : BpInterface<ISurfaceComposer>(impl)
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
57d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza    virtual ~BpSurfaceComposer();
58d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
597e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    virtual sp<ISurfaceComposerClient> createConnection()
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
647e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
679a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc()
689a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    {
699a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        Parcel data, reply;
709a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
719a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply);
729a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder());
739a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    }
749a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis
758b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian    virtual void setTransactionState(
768b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            const Vector<ComposerState>& state,
778b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            const Vector<DisplayState>& displays,
788b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            uint32_t flags)
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
82d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
83d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(static_cast<uint32_t>(state.size()));
84d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        for (const auto& s : state) {
85d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            s.write(data);
868b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian        }
87d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
88d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(static_cast<uint32_t>(displays.size()));
89d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        for (const auto& d : displays) {
90d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            d.write(data);
91698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        }
92d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
93d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(flags);
94b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis        remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void bootFinished()
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply);
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1042a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    virtual status_t captureScreen(const sp<IBinder>& display,
1052a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            const sp<IGraphicBufferProducer>& producer,
106c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza            Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
107c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza            uint32_t minLayerZ, uint32_t maxLayerZ,
108c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            bool useIdentityTransform,
109c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            ISurfaceComposer::Rotation rotation)
1102a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    {
1112a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        Parcel data, reply;
1122a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1132a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeStrongBinder(display);
1142ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(producer));
115c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza        data.write(sourceCrop);
116d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(reqWidth);
117d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(reqHeight);
118d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(minLayerZ);
119d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(maxLayerZ);
120c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        data.writeInt32(static_cast<int32_t>(useIdentityTransform));
121c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        data.writeInt32(static_cast<int32_t>(rotation));
1222a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
1232a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        return reply.readInt32();
1242a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    }
1252a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian
126582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    virtual bool authenticateSurfaceTexture(
1272adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            const sp<IGraphicBufferProducer>& bufferProducer) const
128134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    {
129134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        Parcel data, reply;
130134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int err = NO_ERROR;
131134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = data.writeInterfaceToken(
132134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                ISurfaceComposer::getInterfaceDescriptor());
133134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
134e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
135134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                    "interface descriptor: %s (%d)", strerror(-err), -err);
136134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
137134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
1382ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen        err = data.writeStrongBinder(IInterface::asBinder(bufferProducer));
139134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
140e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
141582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "strong binder to parcel: %s (%d)", strerror(-err), -err);
142134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
143134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
144134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
145134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                &reply);
146134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
147e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
148582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "performing transaction: %s (%d)", strerror(-err), -err);
149134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
150134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
151134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int32_t result = 0;
152134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = reply.readInt32(&result);
153134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
154e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
155582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "retrieving result: %s (%d)", strerror(-err), -err);
156134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
157134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
158134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        return result != 0;
159134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
160d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
161d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    virtual sp<IDisplayEventConnection> createDisplayEventConnection()
162d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    {
163d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        Parcel data, reply;
164d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        sp<IDisplayEventConnection> result;
165d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        int err = data.writeInterfaceToken(
166d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                ISurfaceComposer::getInterfaceDescriptor());
167d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
168d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
169d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
170d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        err = remote()->transact(
171d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
172d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                data, &reply);
173d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
174e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
175d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                    "transaction: %s (%d)", strerror(-err), -err);
176d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
177d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
178d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder());
179d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        return result;
180d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    }
1818e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross
182dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    virtual sp<IBinder> createDisplay(const String8& displayName, bool secure)
183e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
184e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
185e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1868dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        data.writeString8(displayName);
187dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        data.writeInt32(secure ? 1 : 0);
188e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply);
189e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
190e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
191e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
1926c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    virtual void destroyDisplay(const sp<IBinder>& display)
1936c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    {
1946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        Parcel data, reply;
1956c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1966c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        data.writeStrongBinder(display);
1976c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply);
1986c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    }
1996c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall
200e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    virtual sp<IBinder> getBuiltInDisplay(int32_t id)
201e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
202e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
203e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
204e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInt32(id);
205e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply);
206e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
207e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
208e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
2092c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    virtual void setPowerMode(const sp<IBinder>& display, int mode)
2108e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    {
2118e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        Parcel data, reply;
2128e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
213c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden        data.writeStrongBinder(display);
2142c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        data.writeInt32(mode);
2152c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply);
2168e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    }
2173094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian
2187f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual status_t getDisplayConfigs(const sp<IBinder>& display,
2197f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            Vector<DisplayInfo>* configs)
220c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    {
221c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        Parcel data, reply;
222c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2239d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        data.writeStrongBinder(display);
2247f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply);
2257f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        status_t result = reply.readInt32();
2267f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        if (result == NO_ERROR) {
227d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            size_t numConfigs = reply.readUint32();
2287f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            configs->clear();
2297f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            configs->resize(numConfigs);
2307f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            for (size_t c = 0; c < numConfigs; ++c) {
2317f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                memcpy(&(configs->editItemAt(c)),
2327f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                        reply.readInplace(sizeof(DisplayInfo)),
2337f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                        sizeof(DisplayInfo));
2347f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            }
2357f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
2367f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return result;
2377f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
2387f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
23967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    virtual status_t getDisplayStats(const sp<IBinder>& display,
24067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            DisplayStatInfo* stats)
24167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    {
24267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        Parcel data, reply;
24367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
24467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        data.writeStrongBinder(display);
24567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply);
24667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        status_t result = reply.readInt32();
24767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        if (result == NO_ERROR) {
24867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            memcpy(stats,
24967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                    reply.readInplace(sizeof(DisplayStatInfo)),
25067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                    sizeof(DisplayStatInfo));
25167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        }
25267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        return result;
25367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    }
25467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar
2557f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual int getActiveConfig(const sp<IBinder>& display)
2567f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    {
2577f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        Parcel data, reply;
2587f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2597f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeStrongBinder(display);
2607f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply);
2617f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return reply.readInt32();
2627f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
2637f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
2647f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual status_t setActiveConfig(const sp<IBinder>& display, int id)
2657f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    {
2667f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        Parcel data, reply;
2677f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2687f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeStrongBinder(display);
2697f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInt32(id);
2707f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply);
271c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        return reply.readInt32();
272c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    }
273d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
27428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    virtual status_t getDisplayColorModes(const sp<IBinder>& display,
27528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            Vector<android_color_mode_t>* outColorModes) {
27628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        Parcel data, reply;
27728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
27828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
27928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getDisplayColorModes failed to writeInterfaceToken: %d", result);
28028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
28128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
28228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeStrongBinder(display);
28328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
28428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getDisplayColorModes failed to writeStrongBinder: %d", result);
28528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
28628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
28728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = remote()->transact(BnSurfaceComposer::GET_DISPLAY_COLOR_MODES, data, &reply);
28828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
28928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getDisplayColorModes failed to transact: %d", result);
29028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
29128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
29228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = static_cast<status_t>(reply.readInt32());
29328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result == NO_ERROR) {
29428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            size_t numModes = reply.readUint32();
29528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            outColorModes->clear();
29628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            outColorModes->resize(numModes);
29728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            for (size_t i = 0; i < numModes; ++i) {
29828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                outColorModes->replaceAt(static_cast<android_color_mode_t>(reply.readInt32()), i);
29928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
30028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
30128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        return result;
30228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
30328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
30428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    virtual android_color_mode_t getActiveColorMode(const sp<IBinder>& display) {
30528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        Parcel data, reply;
30628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
30728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
30828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getActiveColorMode failed to writeInterfaceToken: %d", result);
30928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return static_cast<android_color_mode_t>(result);
31028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
31128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeStrongBinder(display);
31228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
31328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getActiveColorMode failed to writeStrongBinder: %d", result);
31428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return static_cast<android_color_mode_t>(result);
31528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
31628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = remote()->transact(BnSurfaceComposer::GET_ACTIVE_COLOR_MODE, data, &reply);
31728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
31828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getActiveColorMode failed to transact: %d", result);
31928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return static_cast<android_color_mode_t>(result);
32028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
32128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        return static_cast<android_color_mode_t>(reply.readInt32());
32228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
32328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
32428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    virtual status_t setActiveColorMode(const sp<IBinder>& display,
32528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            android_color_mode_t colorMode) {
32628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        Parcel data, reply;
32728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
32828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
32928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to writeInterfaceToken: %d", result);
33028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
33128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
33228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeStrongBinder(display);
33328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
33428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to writeStrongBinder: %d", result);
33528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
33628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
33728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeInt32(colorMode);
33828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
33928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to writeInt32: %d", result);
34028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
34128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
34228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = remote()->transact(BnSurfaceComposer::SET_ACTIVE_COLOR_MODE, data, &reply);
34328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
34428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to transact: %d", result);
34528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
34628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
34728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        return static_cast<status_t>(reply.readInt32());
34828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
34928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
350d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    virtual status_t clearAnimationFrameStats() {
351d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        Parcel data, reply;
352d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
353d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply);
354d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return reply.readInt32();
355d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
356d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
357d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    virtual status_t getAnimationFrameStats(FrameStats* outStats) const {
358d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        Parcel data, reply;
359d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
360d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply);
361d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        reply.read(*outStats);
362d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return reply.readInt32();
363d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
364c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza
365c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza    virtual status_t getHdrCapabilities(const sp<IBinder>& display,
366c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            HdrCapabilities* outCapabilities) const {
367c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        Parcel data, reply;
368c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
369c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        status_t result = data.writeStrongBinder(display);
370c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result != NO_ERROR) {
371c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            ALOGE("getHdrCapabilities failed to writeStrongBinder: %d", result);
372c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return result;
373c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
374c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        result = remote()->transact(BnSurfaceComposer::GET_HDR_CAPABILITIES,
375c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                data, &reply);
376c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result != NO_ERROR) {
377c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            ALOGE("getHdrCapabilities failed to transact: %d", result);
378c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return result;
379c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
380c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        result = reply.readInt32();
381c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result == NO_ERROR) {
382c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            result = reply.readParcelable(outCapabilities);
383c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
384c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        return result;
385c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza    }
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
388d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this
389d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// translation unit (see clang warning -Wweak-vtables)
390d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan StozaBpSurfaceComposer::~BpSurfaceComposer() {}
391d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact(
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(code) {
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case CREATE_CONNECTION: {
40183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4022ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            sp<IBinder> b = IInterface::asBinder(createConnection());
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeStrongBinder(b);
4046c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
4056c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
4069a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        case CREATE_GRAPHIC_BUFFER_ALLOC: {
4079a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4082ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            sp<IBinder> b = IInterface::asBinder(createGraphicBufferAlloc());
4099a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis            reply->writeStrongBinder(b);
4106c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
4116c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
412698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        case SET_TRANSACTION_STATE: {
41383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
414d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
415d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            size_t count = data.readUint32();
4168afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            if (count > data.dataSize()) {
4178afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                return BAD_VALUE;
4188afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            }
419698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ComposerState s;
420698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            Vector<ComposerState> state;
421698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            state.setCapacity(count);
422d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            for (size_t i = 0; i < count; i++) {
4238afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                if (s.read(data) == BAD_VALUE) {
4248afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                    return BAD_VALUE;
4258afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                }
426698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian                state.add(s);
427698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            }
428d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
429d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            count = data.readUint32();
4308afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            if (count > data.dataSize()) {
4318afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                return BAD_VALUE;
4328afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            }
4338b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            DisplayState d;
4348b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            Vector<DisplayState> displays;
4358b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            displays.setCapacity(count);
436d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            for (size_t i = 0; i < count; i++) {
4378afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                if (d.read(data) == BAD_VALUE) {
4388afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                    return BAD_VALUE;
4398afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                }
4408b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian                displays.add(d);
4418b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            }
442d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
443d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t stateFlags = data.readUint32();
444d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            setTransactionState(state, displays, stateFlags);
4456c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
4466c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case BOOT_FINISHED: {
44883c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bootFinished();
4506c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
4516c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
4522a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        case CAPTURE_SCREEN: {
4532a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4542a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            sp<IBinder> display = data.readStrongBinder();
4552a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            sp<IGraphicBufferProducer> producer =
4562a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
45760d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            Rect sourceCrop(Rect::EMPTY_RECT);
458c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza            data.read(sourceCrop);
459d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t reqWidth = data.readUint32();
460d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t reqHeight = data.readUint32();
461d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t minLayerZ = data.readUint32();
462d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t maxLayerZ = data.readUint32();
463c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza            bool useIdentityTransform = static_cast<bool>(data.readInt32());
464d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            int32_t rotation = data.readInt32();
465c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
4662a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            status_t res = captureScreen(display, producer,
467c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza                    sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
468c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews                    useIdentityTransform,
469c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews                    static_cast<ISurfaceComposer::Rotation>(rotation));
4702a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            reply->writeInt32(res);
4716c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
4726c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
473134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        case AUTHENTICATE_SURFACE: {
474134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4752adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            sp<IGraphicBufferProducer> bufferProducer =
4762adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
4772adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0;
478134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            reply->writeInt32(result);
4796c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
4806c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
481d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        case CREATE_DISPLAY_EVENT_CONNECTION: {
482d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
483d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            sp<IDisplayEventConnection> connection(createDisplayEventConnection());
4842ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(connection));
485d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return NO_ERROR;
4866c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
487e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case CREATE_DISPLAY: {
488e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4898dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            String8 displayName = data.readString8();
490dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            bool secure = bool(data.readInt32());
491dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            sp<IBinder> display(createDisplay(displayName, secure));
492e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
493e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
4946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
4956c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        case DESTROY_DISPLAY: {
4966c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4976c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            sp<IBinder> display = data.readStrongBinder();
4986c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            destroyDisplay(display);
4996c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
5006c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
501e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case GET_BUILT_IN_DISPLAY: {
502e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
503e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            int32_t id = data.readInt32();
504e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            sp<IBinder> display(getBuiltInDisplay(id));
505e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
506e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
5076c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
5087f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case GET_DISPLAY_CONFIGS: {
5097f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
5107f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            Vector<DisplayInfo> configs;
5117f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            sp<IBinder> display = data.readStrongBinder();
5127f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            status_t result = getDisplayConfigs(display, &configs);
5137f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            reply->writeInt32(result);
5147f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            if (result == NO_ERROR) {
515d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza                reply->writeUint32(static_cast<uint32_t>(configs.size()));
5167f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                for (size_t c = 0; c < configs.size(); ++c) {
5177f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                    memcpy(reply->writeInplace(sizeof(DisplayInfo)),
5187f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                            &configs[c], sizeof(DisplayInfo));
5197f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                }
5207f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            }
5217f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            return NO_ERROR;
5227f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
52367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        case GET_DISPLAY_STATS: {
52467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            CHECK_INTERFACE(ISurfaceComposer, data, reply);
52567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            DisplayStatInfo stats;
52667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            sp<IBinder> display = data.readStrongBinder();
52767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            status_t result = getDisplayStats(display, &stats);
52867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            reply->writeInt32(result);
52967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            if (result == NO_ERROR) {
53067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                memcpy(reply->writeInplace(sizeof(DisplayStatInfo)),
53167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                        &stats, sizeof(DisplayStatInfo));
53267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            }
53367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            return NO_ERROR;
53467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        }
5357f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case GET_ACTIVE_CONFIG: {
5367f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
5377f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            sp<IBinder> display = data.readStrongBinder();
5387f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            int id = getActiveConfig(display);
5397f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            reply->writeInt32(id);
5407f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            return NO_ERROR;
5417f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
5427f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case SET_ACTIVE_CONFIG: {
543c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
5449d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown            sp<IBinder> display = data.readStrongBinder();
5457f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            int id = data.readInt32();
5467f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            status_t result = setActiveConfig(display, id);
547c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            reply->writeInt32(result);
5486c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
5496c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
55028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        case GET_DISPLAY_COLOR_MODES: {
55128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            CHECK_INTERFACE(ISurfaceComposer, data, reply);
55228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            Vector<android_color_mode_t> colorModes;
55328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            sp<IBinder> display = nullptr;
55428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            status_t result = data.readStrongBinder(&display);
55528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
55628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("getDisplayColorModes failed to readStrongBinder: %d", result);
55728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
55828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
55928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = getDisplayColorModes(display, &colorModes);
56028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            reply->writeInt32(result);
56128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result == NO_ERROR) {
56228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                reply->writeUint32(static_cast<uint32_t>(colorModes.size()));
56328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                for (size_t i = 0; i < colorModes.size(); ++i) {
56428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                    reply->writeInt32(colorModes[i]);
56528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                }
56628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
56728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return NO_ERROR;
56828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
56928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        case GET_ACTIVE_COLOR_MODE: {
57028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            CHECK_INTERFACE(ISurfaceComposer, data, reply);
57128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            sp<IBinder> display = nullptr;
57228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            status_t result = data.readStrongBinder(&display);
57328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
57428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("getActiveColorMode failed to readStrongBinder: %d", result);
57528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
57628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
57728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            android_color_mode_t colorMode = getActiveColorMode(display);
57828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = reply->writeInt32(static_cast<int32_t>(colorMode));
57928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
58028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
58128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        case SET_ACTIVE_COLOR_MODE: {
58228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            CHECK_INTERFACE(ISurfaceComposer, data, reply);
58328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            sp<IBinder> display = nullptr;
58428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            status_t result = data.readStrongBinder(&display);
58528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
58628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("getActiveColorMode failed to readStrongBinder: %d", result);
58728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
58828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
58928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            int32_t colorModeInt = 0;
59028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = data.readInt32(&colorModeInt);
59128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
59228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("setActiveColorMode failed to readInt32: %d", result);
59328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
59428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
59528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = setActiveColorMode(display,
59628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                    static_cast<android_color_mode_t>(colorModeInt));
59728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = reply->writeInt32(result);
59828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
59928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
600d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        case CLEAR_ANIMATION_FRAME_STATS: {
601d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            CHECK_INTERFACE(ISurfaceComposer, data, reply);
602d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            status_t result = clearAnimationFrameStats();
603d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->writeInt32(result);
604d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            return NO_ERROR;
605d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        }
606d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        case GET_ANIMATION_FRAME_STATS: {
607d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            CHECK_INTERFACE(ISurfaceComposer, data, reply);
608d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            FrameStats stats;
609d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            status_t result = getAnimationFrameStats(&stats);
610d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->write(stats);
611d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->writeInt32(result);
612d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            return NO_ERROR;
613d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        }
6142c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        case SET_POWER_MODE: {
6152c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6162c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            sp<IBinder> display = data.readStrongBinder();
6172c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            int32_t mode = data.readInt32();
6182c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            setPowerMode(display, mode);
6192c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            return NO_ERROR;
6202c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        }
621c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        case GET_HDR_CAPABILITIES: {
622c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
623c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            sp<IBinder> display = nullptr;
624c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            status_t result = data.readStrongBinder(&display);
625c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            if (result != NO_ERROR) {
626c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                ALOGE("getHdrCapabilities failed to readStrongBinder: %d",
627c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                        result);
628c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                return result;
629c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            }
630c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            HdrCapabilities capabilities;
631c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            result = getHdrCapabilities(display, &capabilities);
632c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            reply->writeInt32(result);
633c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            if (result == NO_ERROR) {
634c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                reply->writeParcelable(capabilities);
635c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            }
636c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return NO_ERROR;
637c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
6386c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        default: {
63983c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            return BBinder::onTransact(code, data, reply, flags);
6406c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
647