ISurfaceComposer.cpp revision c3ebe66b49cfba035e1fd0e160a13db38eb81b0e
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>
36582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
37134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/Log.h>
389cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass IDisplayEventConnection;
44d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer>
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    BpSurfaceComposer(const sp<IBinder>& impl)
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        : BpInterface<ISurfaceComposer>(impl)
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
537e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    virtual sp<ISurfaceComposerClient> createConnection()
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t n;
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
597e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
629a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc()
639a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    {
649a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        uint32_t n;
659a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        Parcel data, reply;
669a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
679a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply);
689a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder());
699a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    }
709a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis
718b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian    virtual void setTransactionState(
728b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            const Vector<ComposerState>& state,
738b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            const Vector<DisplayState>& displays,
748b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            uint32_t flags)
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
788b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian        {
798b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            Vector<ComposerState>::const_iterator b(state.begin());
808b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            Vector<ComposerState>::const_iterator e(state.end());
818b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            data.writeInt32(state.size());
828b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            for ( ; b != e ; ++b ) {
838b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian                b->write(data);
848b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            }
858b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian        }
868b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian        {
878b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            Vector<DisplayState>::const_iterator b(displays.begin());
888b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            Vector<DisplayState>::const_iterator e(displays.end());
898b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            data.writeInt32(displays.size());
908b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            for ( ; b != e ; ++b ) {
918b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian                b->write(data);
928b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            }
93698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        }
9428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        data.writeInt32(flags);
95b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis        remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void bootFinished()
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply);
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1052a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    virtual status_t captureScreen(const sp<IBinder>& display,
1062a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            const sp<IGraphicBufferProducer>& producer,
107c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza            Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
108c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza            uint32_t minLayerZ, uint32_t maxLayerZ,
109c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            bool useIdentityTransform,
110c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            ISurfaceComposer::Rotation rotation)
1112a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    {
1122a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        Parcel data, reply;
1132a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1142a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeStrongBinder(display);
1152a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeStrongBinder(producer->asBinder());
116c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza        data.write(sourceCrop);
1172a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInt32(reqWidth);
1182a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInt32(reqHeight);
1192a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInt32(minLayerZ);
1202a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInt32(maxLayerZ);
121c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        data.writeInt32(static_cast<int32_t>(useIdentityTransform));
122c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        data.writeInt32(static_cast<int32_t>(rotation));
1232a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
1242a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        return reply.readInt32();
1252a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    }
1262a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian
127582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    virtual bool authenticateSurfaceTexture(
1282adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            const sp<IGraphicBufferProducer>& bufferProducer) const
129134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    {
130134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        Parcel data, reply;
131134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int err = NO_ERROR;
132134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = data.writeInterfaceToken(
133134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                ISurfaceComposer::getInterfaceDescriptor());
134134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
135e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
136134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                    "interface descriptor: %s (%d)", strerror(-err), -err);
137134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
138134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
1392adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        err = data.writeStrongBinder(bufferProducer->asBinder());
140134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
141e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
142582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "strong binder to parcel: %s (%d)", strerror(-err), -err);
143134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
144134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
145134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
146134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                &reply);
147134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
148e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
149582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "performing transaction: %s (%d)", strerror(-err), -err);
150134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
151134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
152134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int32_t result = 0;
153134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = reply.readInt32(&result);
154134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
155e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
156582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "retrieving result: %s (%d)", strerror(-err), -err);
157134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
158134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
159134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        return result != 0;
160134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
161d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
162d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    virtual sp<IDisplayEventConnection> createDisplayEventConnection()
163d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    {
164d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        Parcel data, reply;
165d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        sp<IDisplayEventConnection> result;
166d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        int err = data.writeInterfaceToken(
167d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                ISurfaceComposer::getInterfaceDescriptor());
168d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
169d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
170d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
171d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        err = remote()->transact(
172d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
173d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                data, &reply);
174d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
175e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
176d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                    "transaction: %s (%d)", strerror(-err), -err);
177d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
178d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
179d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder());
180d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        return result;
181d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    }
1828e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross
183dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    virtual sp<IBinder> createDisplay(const String8& displayName, bool secure)
184e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
185e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
186e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1878dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        data.writeString8(displayName);
188dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        data.writeInt32(secure ? 1 : 0);
189e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply);
190e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
191e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
192e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
1936c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    virtual void destroyDisplay(const sp<IBinder>& display)
1946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    {
1956c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        Parcel data, reply;
1966c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1976c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        data.writeStrongBinder(display);
1986c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply);
1996c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    }
2006c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall
201e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    virtual sp<IBinder> getBuiltInDisplay(int32_t id)
202e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
203e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
204e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
205e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInt32(id);
206e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply);
207e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
208e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
209e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
2102c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    virtual void setPowerMode(const sp<IBinder>& display, int mode)
2118e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    {
2128e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        Parcel data, reply;
2138e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
214c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden        data.writeStrongBinder(display);
2152c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        data.writeInt32(mode);
2162c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply);
2178e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    }
2183094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian
2197f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual status_t getDisplayConfigs(const sp<IBinder>& display,
2207f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            Vector<DisplayInfo>* configs)
221c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    {
222c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        Parcel data, reply;
223c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2249d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        data.writeStrongBinder(display);
2257f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply);
2267f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        status_t result = reply.readInt32();
2277f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        if (result == NO_ERROR) {
2287f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            size_t numConfigs = static_cast<size_t>(reply.readInt32());
2297f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            configs->clear();
2307f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            configs->resize(numConfigs);
2317f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            for (size_t c = 0; c < numConfigs; ++c) {
2327f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                memcpy(&(configs->editItemAt(c)),
2337f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                        reply.readInplace(sizeof(DisplayInfo)),
2347f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                        sizeof(DisplayInfo));
2357f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            }
2367f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
2377f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return result;
2387f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
2397f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
2407f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual int getActiveConfig(const sp<IBinder>& display)
2417f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    {
2427f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        Parcel data, reply;
2437f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2447f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeStrongBinder(display);
2457f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply);
2467f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return reply.readInt32();
2477f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
2487f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
2497f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual status_t setActiveConfig(const sp<IBinder>& display, int id)
2507f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    {
2517f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        Parcel data, reply;
2527f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2537f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeStrongBinder(display);
2547f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInt32(id);
2557f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply);
256c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        return reply.readInt32();
257c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    }
258d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
259d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    virtual status_t clearAnimationFrameStats() {
260d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        Parcel data, reply;
261d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
262d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply);
263d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return reply.readInt32();
264d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
265d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
266d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    virtual status_t getAnimationFrameStats(FrameStats* outStats) const {
267d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        Parcel data, reply;
268d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
269d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply);
270d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        reply.read(*outStats);
271d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return reply.readInt32();
272d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact(
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(code) {
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case CREATE_CONNECTION: {
28483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            sp<IBinder> b = createConnection()->asBinder();
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeStrongBinder(b);
2876c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
2886c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
2899a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        case CREATE_GRAPHIC_BUFFER_ALLOC: {
2909a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis            CHECK_INTERFACE(ISurfaceComposer, data, reply);
2919a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis            sp<IBinder> b = createGraphicBufferAlloc()->asBinder();
2929a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis            reply->writeStrongBinder(b);
2936c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
2946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
295698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        case SET_TRANSACTION_STATE: {
29683c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
297698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            size_t count = data.readInt32();
298698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ComposerState s;
299698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            Vector<ComposerState> state;
300698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            state.setCapacity(count);
301698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            for (size_t i=0 ; i<count ; i++) {
302698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian                s.read(data);
303698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian                state.add(s);
304698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            }
3058b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            count = data.readInt32();
3068b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            DisplayState d;
3078b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            Vector<DisplayState> displays;
3088b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            displays.setCapacity(count);
3098b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            for (size_t i=0 ; i<count ; i++) {
3108b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian                d.read(data);
3118b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian                displays.add(d);
3128b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            }
31328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis            uint32_t flags = data.readInt32();
3148b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            setTransactionState(state, displays, flags);
3156c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
3166c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case BOOT_FINISHED: {
31883c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bootFinished();
3206c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
3216c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
3222a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        case CAPTURE_SCREEN: {
3232a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
3242a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            sp<IBinder> display = data.readStrongBinder();
3252a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            sp<IGraphicBufferProducer> producer =
3262a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
327c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza            Rect sourceCrop;
328c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza            data.read(sourceCrop);
3292a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            uint32_t reqWidth = data.readInt32();
3302a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            uint32_t reqHeight = data.readInt32();
3312a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            uint32_t minLayerZ = data.readInt32();
3322a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            uint32_t maxLayerZ = data.readInt32();
333c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza            bool useIdentityTransform = static_cast<bool>(data.readInt32());
334c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            uint32_t rotation = data.readInt32();
335c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
3362a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            status_t res = captureScreen(display, producer,
337c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza                    sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
338c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews                    useIdentityTransform,
339c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews                    static_cast<ISurfaceComposer::Rotation>(rotation));
3402a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            reply->writeInt32(res);
3416c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
3426c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
343134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        case AUTHENTICATE_SURFACE: {
344134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            CHECK_INTERFACE(ISurfaceComposer, data, reply);
3452adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            sp<IGraphicBufferProducer> bufferProducer =
3462adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
3472adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0;
348134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            reply->writeInt32(result);
3496c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
3506c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
351d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        case CREATE_DISPLAY_EVENT_CONNECTION: {
352d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
353d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            sp<IDisplayEventConnection> connection(createDisplayEventConnection());
354d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            reply->writeStrongBinder(connection->asBinder());
355d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return NO_ERROR;
3566c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
357e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case CREATE_DISPLAY: {
358e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
3598dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            String8 displayName = data.readString8();
360dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            bool secure = bool(data.readInt32());
361dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            sp<IBinder> display(createDisplay(displayName, secure));
362e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
363e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
3646c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
3656c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        case DESTROY_DISPLAY: {
3666c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            CHECK_INTERFACE(ISurfaceComposer, data, reply);
3676c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            sp<IBinder> display = data.readStrongBinder();
3686c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            destroyDisplay(display);
3696c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
3706c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
371e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case GET_BUILT_IN_DISPLAY: {
372e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
373e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            int32_t id = data.readInt32();
374e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            sp<IBinder> display(getBuiltInDisplay(id));
375e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
376e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
3776c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
3787f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case GET_DISPLAY_CONFIGS: {
3797f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
3807f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            Vector<DisplayInfo> configs;
3817f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            sp<IBinder> display = data.readStrongBinder();
3827f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            status_t result = getDisplayConfigs(display, &configs);
3837f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            reply->writeInt32(result);
3847f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            if (result == NO_ERROR) {
3857f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                reply->writeInt32(static_cast<int32_t>(configs.size()));
3867f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                for (size_t c = 0; c < configs.size(); ++c) {
3877f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                    memcpy(reply->writeInplace(sizeof(DisplayInfo)),
3887f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                            &configs[c], sizeof(DisplayInfo));
3897f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                }
3907f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            }
3917f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            return NO_ERROR;
3927f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
3937f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case GET_ACTIVE_CONFIG: {
3947f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
3957f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            sp<IBinder> display = data.readStrongBinder();
3967f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            int id = getActiveConfig(display);
3977f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            reply->writeInt32(id);
3987f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            return NO_ERROR;
3997f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
4007f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case SET_ACTIVE_CONFIG: {
401c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4029d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown            sp<IBinder> display = data.readStrongBinder();
4037f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            int id = data.readInt32();
4047f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            status_t result = setActiveConfig(display, id);
405c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            reply->writeInt32(result);
4066c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
4076c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
408d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        case CLEAR_ANIMATION_FRAME_STATS: {
409d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            CHECK_INTERFACE(ISurfaceComposer, data, reply);
410d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            status_t result = clearAnimationFrameStats();
411d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->writeInt32(result);
412d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            return NO_ERROR;
413d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        }
414d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        case GET_ANIMATION_FRAME_STATS: {
415d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            CHECK_INTERFACE(ISurfaceComposer, data, reply);
416d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            FrameStats stats;
417d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            status_t result = getAnimationFrameStats(&stats);
418d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->write(stats);
419d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->writeInt32(result);
420d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            return NO_ERROR;
421d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        }
4222c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        case SET_POWER_MODE: {
4232c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4242c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            sp<IBinder> display = data.readStrongBinder();
4252c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            int32_t mode = data.readInt32();
4262c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            setPowerMode(display, mode);
4272c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            return NO_ERROR;
4282c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        }
4296c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        default: {
43083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            return BBinder::onTransact(code, data, reply, flags);
4316c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
4336c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    // should be unreachable
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
440