ISurfaceComposer.cpp revision 2a9fc493dfdba67108e4335bb1fe931bc1e2a025
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
1059d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    virtual status_t captureScreen(
1069d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown            const sp<IBinder>& display, sp<IMemoryHeap>* heap,
107df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian            uint32_t* width, uint32_t* height, PixelFormat* format,
108bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            uint32_t reqWidth, uint32_t reqHeight,
109bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            uint32_t minLayerZ, uint32_t maxLayerZ)
1101b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian    {
1111b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        Parcel data, reply;
1121b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1139d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        data.writeStrongBinder(display);
114df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian        data.writeInt32(reqWidth);
115df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian        data.writeInt32(reqHeight);
116bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian        data.writeInt32(minLayerZ);
117bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian        data.writeInt32(maxLayerZ);
1182a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN_DEPRECATED, data, &reply);
1191b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        *heap = interface_cast<IMemoryHeap>(reply.readStrongBinder());
1201b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        *width = reply.readInt32();
1211b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        *height = reply.readInt32();
1221b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        *format = reply.readInt32();
1231b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        return reply.readInt32();
1241b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian    }
1251b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian
1262a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    virtual status_t captureScreen(const sp<IBinder>& display,
1272a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            const sp<IGraphicBufferProducer>& producer,
1282a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            uint32_t reqWidth, uint32_t reqHeight,
1292a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            uint32_t minLayerZ, uint32_t maxLayerZ)
1302a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    {
1312a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        Parcel data, reply;
1322a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1332a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeStrongBinder(display);
1342a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeStrongBinder(producer->asBinder());
1352a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInt32(reqWidth);
1362a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInt32(reqHeight);
1372a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInt32(minLayerZ);
1382a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInt32(maxLayerZ);
1392a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
1402a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        return reply.readInt32();
1412a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    }
1422a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian
143582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    virtual bool authenticateSurfaceTexture(
1442adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            const sp<IGraphicBufferProducer>& bufferProducer) const
145134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    {
146134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        Parcel data, reply;
147134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int err = NO_ERROR;
148134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = data.writeInterfaceToken(
149134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                ISurfaceComposer::getInterfaceDescriptor());
150134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
151e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
152134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                    "interface descriptor: %s (%d)", strerror(-err), -err);
153134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
154134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
1552adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        err = data.writeStrongBinder(bufferProducer->asBinder());
156134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
157e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
158582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "strong binder to parcel: %s (%d)", strerror(-err), -err);
159134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
160134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
161134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
162134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                &reply);
163134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
164e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
165582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "performing transaction: %s (%d)", strerror(-err), -err);
166134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
167134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
168134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int32_t result = 0;
169134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = reply.readInt32(&result);
170134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
171e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
172582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "retrieving result: %s (%d)", strerror(-err), -err);
173134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
174134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
175134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        return result != 0;
176134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
177d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
178d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    virtual sp<IDisplayEventConnection> createDisplayEventConnection()
179d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    {
180d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        Parcel data, reply;
181d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        sp<IDisplayEventConnection> result;
182d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        int err = data.writeInterfaceToken(
183d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                ISurfaceComposer::getInterfaceDescriptor());
184d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
185d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
186d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
187d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        err = remote()->transact(
188d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
189d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                data, &reply);
190d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
191e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
192d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                    "transaction: %s (%d)", strerror(-err), -err);
193d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
194d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
195d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder());
196d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        return result;
197d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    }
1988e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross
199dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    virtual sp<IBinder> createDisplay(const String8& displayName, bool secure)
200e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
201e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
202e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2038dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        data.writeString8(displayName);
204dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        data.writeInt32(secure ? 1 : 0);
205e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply);
206e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
207e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
208e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
209e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    virtual sp<IBinder> getBuiltInDisplay(int32_t id)
210e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
211e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
212e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
213e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInt32(id);
214e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply);
215e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
216e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
217e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
218c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden    virtual void blank(const sp<IBinder>& display)
2198e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    {
2208e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        Parcel data, reply;
2218e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
222c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden        data.writeStrongBinder(display);
2238e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        remote()->transact(BnSurfaceComposer::BLANK, data, &reply);
2248e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    }
2258e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross
226c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden    virtual void unblank(const sp<IBinder>& display)
2278e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    {
2288e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        Parcel data, reply;
2298e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
230c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden        data.writeStrongBinder(display);
2318e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        remote()->transact(BnSurfaceComposer::UNBLANK, data, &reply);
2328e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    }
2333094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian
2349d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    virtual status_t getDisplayInfo(const sp<IBinder>& display, DisplayInfo* info)
235c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    {
236c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        Parcel data, reply;
237c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2389d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        data.writeStrongBinder(display);
239c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        remote()->transact(BnSurfaceComposer::GET_DISPLAY_INFO, data, &reply);
240c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        memcpy(info, reply.readInplace(sizeof(DisplayInfo)), sizeof(DisplayInfo));
241c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        return reply.readInt32();
242c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    }
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact(
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(code) {
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case CREATE_CONNECTION: {
25483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            sp<IBinder> b = createConnection()->asBinder();
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeStrongBinder(b);
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
2589a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        case CREATE_GRAPHIC_BUFFER_ALLOC: {
2599a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis            CHECK_INTERFACE(ISurfaceComposer, data, reply);
2609a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis            sp<IBinder> b = createGraphicBufferAlloc()->asBinder();
2619a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis            reply->writeStrongBinder(b);
2629a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        } break;
263698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        case SET_TRANSACTION_STATE: {
26483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
265698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            size_t count = data.readInt32();
266698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ComposerState s;
267698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            Vector<ComposerState> state;
268698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            state.setCapacity(count);
269698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            for (size_t i=0 ; i<count ; i++) {
270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian                s.read(data);
271698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian                state.add(s);
272698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            }
2738b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            count = data.readInt32();
2748b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            DisplayState d;
2758b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            Vector<DisplayState> displays;
2768b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            displays.setCapacity(count);
2778b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            for (size_t i=0 ; i<count ; i++) {
2788b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian                d.read(data);
2798b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian                displays.add(d);
2808b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            }
28128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis            uint32_t flags = data.readInt32();
2828b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            setTransactionState(state, displays, flags);
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case BOOT_FINISHED: {
28583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bootFinished();
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
2882a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        case CAPTURE_SCREEN_DEPRECATED: {
2891b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
2909d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown            sp<IBinder> display = data.readStrongBinder();
291df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian            uint32_t reqWidth = data.readInt32();
292df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian            uint32_t reqHeight = data.readInt32();
293bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            uint32_t minLayerZ = data.readInt32();
294bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            uint32_t maxLayerZ = data.readInt32();
2951b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            sp<IMemoryHeap> heap;
2961b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            uint32_t w, h;
2971b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            PixelFormat f;
2989d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown            status_t res = captureScreen(display, &heap, &w, &h, &f,
299bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian                    reqWidth, reqHeight, minLayerZ, maxLayerZ);
3001b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            reply->writeStrongBinder(heap->asBinder());
3011b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            reply->writeInt32(w);
3021b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            reply->writeInt32(h);
3031b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            reply->writeInt32(f);
3041b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            reply->writeInt32(res);
3051b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        } break;
3062a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        case CAPTURE_SCREEN: {
3072a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
3082a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            sp<IBinder> display = data.readStrongBinder();
3092a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            sp<IGraphicBufferProducer> producer =
3102a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
3112a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            uint32_t reqWidth = data.readInt32();
3122a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            uint32_t reqHeight = data.readInt32();
3132a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            uint32_t minLayerZ = data.readInt32();
3142a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            uint32_t maxLayerZ = data.readInt32();
3152a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            status_t res = captureScreen(display, producer,
3162a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian                    reqWidth, reqHeight, minLayerZ, maxLayerZ);
3172a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            reply->writeInt32(res);
3182a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        } break;
319134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        case AUTHENTICATE_SURFACE: {
320134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            CHECK_INTERFACE(ISurfaceComposer, data, reply);
3212adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            sp<IGraphicBufferProducer> bufferProducer =
3222adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
3232adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0;
324134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            reply->writeInt32(result);
325134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        } break;
326d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        case CREATE_DISPLAY_EVENT_CONNECTION: {
327d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
328d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            sp<IDisplayEventConnection> connection(createDisplayEventConnection());
329d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            reply->writeStrongBinder(connection->asBinder());
330d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return NO_ERROR;
331d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        } break;
332e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case CREATE_DISPLAY: {
333e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
3348dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            String8 displayName = data.readString8();
335dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            bool secure = bool(data.readInt32());
336dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            sp<IBinder> display(createDisplay(displayName, secure));
337e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
338e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
339e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        } break;
340e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case GET_BUILT_IN_DISPLAY: {
341e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
342e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            int32_t id = data.readInt32();
343e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            sp<IBinder> display(getBuiltInDisplay(id));
344e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
345e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
346e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        } break;
3478e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        case BLANK: {
3488e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross            CHECK_INTERFACE(ISurfaceComposer, data, reply);
349c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden            sp<IBinder> display = data.readStrongBinder();
350c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden            blank(display);
3518e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        } break;
3528e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        case UNBLANK: {
3538e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross            CHECK_INTERFACE(ISurfaceComposer, data, reply);
354c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden            sp<IBinder> display = data.readStrongBinder();
355c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden            unblank(display);
3568e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        } break;
357c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        case GET_DISPLAY_INFO: {
358c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
359c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            DisplayInfo info;
3609d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown            sp<IBinder> display = data.readStrongBinder();
3619d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown            status_t result = getDisplayInfo(display, &info);
362c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            memcpy(reply->writeInplace(sizeof(DisplayInfo)), &info, sizeof(DisplayInfo));
363c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            reply->writeInt32(result);
364c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        } break;
365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
36683c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            return BBinder::onTransact(code, data, reply, flags);
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
374