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
3590ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <ui/DisplayInfo.h>
3667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar#include <ui/DisplayStatInfo.h>
37c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza#include <ui/HdrCapabilities.h>
38582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
39134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/Log.h>
409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass IDisplayEventConnection;
46d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer>
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    BpSurfaceComposer(const sp<IBinder>& impl)
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        : BpInterface<ISurfaceComposer>(impl)
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
55d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza    virtual ~BpSurfaceComposer();
56d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
577e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    virtual sp<ISurfaceComposerClient> createConnection()
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
627e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
659a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc()
669a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    {
679a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        Parcel data, reply;
689a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
699a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply);
709a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder());
719a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    }
729a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis
738b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian    virtual void setTransactionState(
748b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            const Vector<ComposerState>& state,
758b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            const Vector<DisplayState>& displays,
768b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            uint32_t flags)
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
80d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
81d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(static_cast<uint32_t>(state.size()));
82d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        for (const auto& s : state) {
83d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            s.write(data);
848b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian        }
85d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
86d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(static_cast<uint32_t>(displays.size()));
87d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        for (const auto& d : displays) {
88d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            d.write(data);
89698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        }
90d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
91d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(flags);
92b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis        remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void bootFinished()
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply);
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1022a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    virtual status_t captureScreen(const sp<IBinder>& display,
1032a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            const sp<IGraphicBufferProducer>& producer,
104c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza            Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
105c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza            uint32_t minLayerZ, uint32_t maxLayerZ,
106c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            bool useIdentityTransform,
107c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            ISurfaceComposer::Rotation rotation)
1082a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    {
1092a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        Parcel data, reply;
1102a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1112a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeStrongBinder(display);
1122ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(producer));
113c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza        data.write(sourceCrop);
114d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(reqWidth);
115d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(reqHeight);
116d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(minLayerZ);
117d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(maxLayerZ);
118c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        data.writeInt32(static_cast<int32_t>(useIdentityTransform));
119c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        data.writeInt32(static_cast<int32_t>(rotation));
1202a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
1212a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        return reply.readInt32();
1222a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    }
1232a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian
124582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    virtual bool authenticateSurfaceTexture(
1252adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            const sp<IGraphicBufferProducer>& bufferProducer) const
126134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    {
127134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        Parcel data, reply;
128134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int err = NO_ERROR;
129134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = data.writeInterfaceToken(
130134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                ISurfaceComposer::getInterfaceDescriptor());
131134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
132e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
133134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                    "interface descriptor: %s (%d)", strerror(-err), -err);
134134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
135134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
1362ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen        err = data.writeStrongBinder(IInterface::asBinder(bufferProducer));
137134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
138e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
139582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "strong binder to parcel: %s (%d)", strerror(-err), -err);
140134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
141134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
142134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
143134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                &reply);
144134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
145e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
146582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "performing transaction: %s (%d)", strerror(-err), -err);
147134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
148134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
149134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int32_t result = 0;
150134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = reply.readInt32(&result);
151134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
152e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
153582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "retrieving result: %s (%d)", strerror(-err), -err);
154134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
155134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
156134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        return result != 0;
157134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
158d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
159d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    virtual sp<IDisplayEventConnection> createDisplayEventConnection()
160d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    {
161d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        Parcel data, reply;
162d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        sp<IDisplayEventConnection> result;
163d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        int err = data.writeInterfaceToken(
164d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                ISurfaceComposer::getInterfaceDescriptor());
165d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
166d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
167d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
168d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        err = remote()->transact(
169d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
170d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                data, &reply);
171d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
172e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
173d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                    "transaction: %s (%d)", strerror(-err), -err);
174d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
175d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
176d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder());
177d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        return result;
178d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    }
1798e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross
180dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    virtual sp<IBinder> createDisplay(const String8& displayName, bool secure)
181e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
182e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
183e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1848dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        data.writeString8(displayName);
185dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        data.writeInt32(secure ? 1 : 0);
186e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply);
187e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
188e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
189e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
1906c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    virtual void destroyDisplay(const sp<IBinder>& display)
1916c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    {
1926c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        Parcel data, reply;
1936c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        data.writeStrongBinder(display);
1956c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply);
1966c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    }
1976c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall
198e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    virtual sp<IBinder> getBuiltInDisplay(int32_t id)
199e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
200e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
201e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
202e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInt32(id);
203e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply);
204e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
205e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
206e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
2072c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    virtual void setPowerMode(const sp<IBinder>& display, int mode)
2088e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    {
2098e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        Parcel data, reply;
2108e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
211c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden        data.writeStrongBinder(display);
2122c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        data.writeInt32(mode);
2132c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply);
2148e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    }
2153094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian
2167f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual status_t getDisplayConfigs(const sp<IBinder>& display,
2177f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            Vector<DisplayInfo>* configs)
218c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    {
219c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        Parcel data, reply;
220c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2219d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        data.writeStrongBinder(display);
2227f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply);
2237f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        status_t result = reply.readInt32();
2247f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        if (result == NO_ERROR) {
225d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            size_t numConfigs = reply.readUint32();
2267f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            configs->clear();
2277f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            configs->resize(numConfigs);
2287f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            for (size_t c = 0; c < numConfigs; ++c) {
2297f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                memcpy(&(configs->editItemAt(c)),
2307f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                        reply.readInplace(sizeof(DisplayInfo)),
2317f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                        sizeof(DisplayInfo));
2327f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            }
2337f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
2347f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return result;
2357f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
2367f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
23767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    virtual status_t getDisplayStats(const sp<IBinder>& display,
23867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            DisplayStatInfo* stats)
23967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    {
24067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        Parcel data, reply;
24167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
24267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        data.writeStrongBinder(display);
24367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply);
24467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        status_t result = reply.readInt32();
24567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        if (result == NO_ERROR) {
24667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            memcpy(stats,
24767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                    reply.readInplace(sizeof(DisplayStatInfo)),
24867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                    sizeof(DisplayStatInfo));
24967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        }
25067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        return result;
25167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    }
25267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar
2537f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual int getActiveConfig(const sp<IBinder>& display)
2547f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    {
2557f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        Parcel data, reply;
2567f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2577f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeStrongBinder(display);
2587f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply);
2597f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return reply.readInt32();
2607f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
2617f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
2627f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual status_t setActiveConfig(const sp<IBinder>& display, int id)
2637f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    {
2647f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        Parcel data, reply;
2657f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2667f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeStrongBinder(display);
2677f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInt32(id);
2687f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply);
269c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        return reply.readInt32();
270c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    }
271d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
272d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    virtual status_t clearAnimationFrameStats() {
273d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        Parcel data, reply;
274d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
275d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply);
276d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return reply.readInt32();
277d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
278d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
279d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    virtual status_t getAnimationFrameStats(FrameStats* outStats) const {
280d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        Parcel data, reply;
281d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
282d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply);
283d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        reply.read(*outStats);
284d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return reply.readInt32();
285d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
286c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza
287c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza    virtual status_t getHdrCapabilities(const sp<IBinder>& display,
288c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            HdrCapabilities* outCapabilities) const {
289c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        Parcel data, reply;
290c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
291c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        status_t result = data.writeStrongBinder(display);
292c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result != NO_ERROR) {
293c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            ALOGE("getHdrCapabilities failed to writeStrongBinder: %d", result);
294c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return result;
295c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
296c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        result = remote()->transact(BnSurfaceComposer::GET_HDR_CAPABILITIES,
297c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                data, &reply);
298c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result != NO_ERROR) {
299c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            ALOGE("getHdrCapabilities failed to transact: %d", result);
300c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return result;
301c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
302c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        result = reply.readInt32();
303c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result == NO_ERROR) {
304c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            result = reply.readParcelable(outCapabilities);
305c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
306c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        return result;
307c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza    }
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
310d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this
311d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// translation unit (see clang warning -Wweak-vtables)
312d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan StozaBpSurfaceComposer::~BpSurfaceComposer() {}
313d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact(
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(code) {
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case CREATE_CONNECTION: {
32383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
3242ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            sp<IBinder> b = IInterface::asBinder(createConnection());
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeStrongBinder(b);
3266c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
3276c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
3289a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        case CREATE_GRAPHIC_BUFFER_ALLOC: {
3299a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis            CHECK_INTERFACE(ISurfaceComposer, data, reply);
3302ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            sp<IBinder> b = IInterface::asBinder(createGraphicBufferAlloc());
3319a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis            reply->writeStrongBinder(b);
3326c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
3336c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
334698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        case SET_TRANSACTION_STATE: {
33583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
336d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
337d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            size_t count = data.readUint32();
3388afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            if (count > data.dataSize()) {
3398afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                return BAD_VALUE;
3408afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            }
341698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ComposerState s;
342698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            Vector<ComposerState> state;
343698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            state.setCapacity(count);
344d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            for (size_t i = 0; i < count; i++) {
3458afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                if (s.read(data) == BAD_VALUE) {
3468afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                    return BAD_VALUE;
3478afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                }
348698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian                state.add(s);
349698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            }
350d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
351d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            count = data.readUint32();
3528afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            if (count > data.dataSize()) {
3538afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                return BAD_VALUE;
3548afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            }
3558b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            DisplayState d;
3568b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            Vector<DisplayState> displays;
3578b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            displays.setCapacity(count);
358d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            for (size_t i = 0; i < count; i++) {
3598afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                if (d.read(data) == BAD_VALUE) {
3608afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                    return BAD_VALUE;
3618afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                }
3628b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian                displays.add(d);
3638b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            }
364d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
365d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t stateFlags = data.readUint32();
366d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            setTransactionState(state, displays, stateFlags);
3676c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
3686c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case BOOT_FINISHED: {
37083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bootFinished();
3726c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
3736c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
3742a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        case CAPTURE_SCREEN: {
3752a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
3762a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            sp<IBinder> display = data.readStrongBinder();
3772a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            sp<IGraphicBufferProducer> producer =
3782a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
37960d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            Rect sourceCrop(Rect::EMPTY_RECT);
380c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza            data.read(sourceCrop);
381d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t reqWidth = data.readUint32();
382d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t reqHeight = data.readUint32();
383d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t minLayerZ = data.readUint32();
384d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t maxLayerZ = data.readUint32();
385c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza            bool useIdentityTransform = static_cast<bool>(data.readInt32());
386d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            int32_t rotation = data.readInt32();
387c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
3882a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            status_t res = captureScreen(display, producer,
389c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza                    sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
390c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews                    useIdentityTransform,
391c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews                    static_cast<ISurfaceComposer::Rotation>(rotation));
3922a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            reply->writeInt32(res);
3936c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
3946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
395134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        case AUTHENTICATE_SURFACE: {
396134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            CHECK_INTERFACE(ISurfaceComposer, data, reply);
3972adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            sp<IGraphicBufferProducer> bufferProducer =
3982adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
3992adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0;
400134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            reply->writeInt32(result);
4016c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
4026c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
403d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        case CREATE_DISPLAY_EVENT_CONNECTION: {
404d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
405d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            sp<IDisplayEventConnection> connection(createDisplayEventConnection());
4062ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(connection));
407d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return NO_ERROR;
4086c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
409e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case CREATE_DISPLAY: {
410e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4118dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            String8 displayName = data.readString8();
412dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            bool secure = bool(data.readInt32());
413dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            sp<IBinder> display(createDisplay(displayName, secure));
414e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
415e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
4166c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
4176c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        case DESTROY_DISPLAY: {
4186c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4196c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            sp<IBinder> display = data.readStrongBinder();
4206c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            destroyDisplay(display);
4216c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
4226c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
423e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case GET_BUILT_IN_DISPLAY: {
424e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
425e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            int32_t id = data.readInt32();
426e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            sp<IBinder> display(getBuiltInDisplay(id));
427e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
428e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
4296c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
4307f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case GET_DISPLAY_CONFIGS: {
4317f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4327f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            Vector<DisplayInfo> configs;
4337f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            sp<IBinder> display = data.readStrongBinder();
4347f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            status_t result = getDisplayConfigs(display, &configs);
4357f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            reply->writeInt32(result);
4367f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            if (result == NO_ERROR) {
437d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza                reply->writeUint32(static_cast<uint32_t>(configs.size()));
4387f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                for (size_t c = 0; c < configs.size(); ++c) {
4397f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                    memcpy(reply->writeInplace(sizeof(DisplayInfo)),
4407f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                            &configs[c], sizeof(DisplayInfo));
4417f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                }
4427f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            }
4437f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            return NO_ERROR;
4447f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
44567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        case GET_DISPLAY_STATS: {
44667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            CHECK_INTERFACE(ISurfaceComposer, data, reply);
44767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            DisplayStatInfo stats;
44867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            sp<IBinder> display = data.readStrongBinder();
44967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            status_t result = getDisplayStats(display, &stats);
45067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            reply->writeInt32(result);
45167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            if (result == NO_ERROR) {
45267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                memcpy(reply->writeInplace(sizeof(DisplayStatInfo)),
45367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                        &stats, sizeof(DisplayStatInfo));
45467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            }
45567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            return NO_ERROR;
45667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        }
4577f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case GET_ACTIVE_CONFIG: {
4587f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4597f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            sp<IBinder> display = data.readStrongBinder();
4607f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            int id = getActiveConfig(display);
4617f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            reply->writeInt32(id);
4627f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            return NO_ERROR;
4637f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
4647f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case SET_ACTIVE_CONFIG: {
465c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4669d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown            sp<IBinder> display = data.readStrongBinder();
4677f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            int id = data.readInt32();
4687f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            status_t result = setActiveConfig(display, id);
469c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            reply->writeInt32(result);
4706c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
4716c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
472d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        case CLEAR_ANIMATION_FRAME_STATS: {
473d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            CHECK_INTERFACE(ISurfaceComposer, data, reply);
474d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            status_t result = clearAnimationFrameStats();
475d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->writeInt32(result);
476d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            return NO_ERROR;
477d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        }
478d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        case GET_ANIMATION_FRAME_STATS: {
479d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            CHECK_INTERFACE(ISurfaceComposer, data, reply);
480d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            FrameStats stats;
481d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            status_t result = getAnimationFrameStats(&stats);
482d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->write(stats);
483d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->writeInt32(result);
484d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            return NO_ERROR;
485d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        }
4862c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        case SET_POWER_MODE: {
4872c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4882c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            sp<IBinder> display = data.readStrongBinder();
4892c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            int32_t mode = data.readInt32();
4902c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            setPowerMode(display, mode);
4912c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            return NO_ERROR;
4922c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        }
493c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        case GET_HDR_CAPABILITIES: {
494c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
495c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            sp<IBinder> display = nullptr;
496c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            status_t result = data.readStrongBinder(&display);
497c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            if (result != NO_ERROR) {
498c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                ALOGE("getHdrCapabilities failed to readStrongBinder: %d",
499c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                        result);
500c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                return result;
501c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            }
502c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            HdrCapabilities capabilities;
503c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            result = getHdrCapabilities(display, &capabilities);
504c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            reply->writeInt32(result);
505c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            if (result == NO_ERROR) {
506c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                reply->writeParcelable(capabilities);
507c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            }
508c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return NO_ERROR;
509c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
5106c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        default: {
51183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            return BBinder::onTransact(code, data, reply, flags);
5126c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
519