ISurfaceComposer.cpp revision d0566bc26fcf6ca396118701fa11900b627f2c09
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
28698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian#include <private/surfaceflinger/LayerState.h>
29698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian
30134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <surfaceflinger/ISurfaceComposer.h>
31134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
32d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/BitTube.h>
33d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/IDisplayEventConnection.h>
34d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/DisplayInfo.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis#include <gui/ISurfaceTexture.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 Project#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
50d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass IDisplayEventConnection;
51d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer>
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    BpSurfaceComposer(const sp<IBinder>& impl)
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        : BpInterface<ISurfaceComposer>(impl)
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
607e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    virtual sp<ISurfaceComposerClient> createConnection()
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t n;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
667e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
699a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc()
709a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    {
719a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        uint32_t n;
729a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        Parcel data, reply;
739a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
749a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply);
759a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder());
769a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis    }
779a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis
787303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian    virtual sp<IMemoryHeap> getCblk() const
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(BnSurfaceComposer::GET_CBLK, data, &reply);
837303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian        return interface_cast<IMemoryHeap>(reply.readStrongBinder());
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
86b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis    virtual void setTransactionState(const Vector<ComposerState>& state,
8728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis            int orientation, uint32_t flags)
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
91698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        Vector<ComposerState>::const_iterator b(state.begin());
92698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        Vector<ComposerState>::const_iterator e(state.end());
93698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        data.writeInt32(state.size());
94698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        for ( ; b != e ; ++b ) {
95698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            b->write(data);
96698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        }
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInt32(orientation);
9828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis        data.writeInt32(flags);
99b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis        remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void bootFinished()
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply);
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1091b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian    virtual status_t captureScreen(DisplayID dpy,
1101b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            sp<IMemoryHeap>* heap,
111df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian            uint32_t* width, uint32_t* height, PixelFormat* format,
112bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            uint32_t reqWidth, uint32_t reqHeight,
113bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            uint32_t minLayerZ, uint32_t maxLayerZ)
1141b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian    {
1151b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        Parcel data, reply;
1161b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1171b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        data.writeInt32(dpy);
118df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian        data.writeInt32(reqWidth);
119df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian        data.writeInt32(reqHeight);
120bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian        data.writeInt32(minLayerZ);
121bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian        data.writeInt32(maxLayerZ);
1221b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
1231b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        *heap = interface_cast<IMemoryHeap>(reply.readStrongBinder());
1241b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        *width = reply.readInt32();
1251b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        *height = reply.readInt32();
1261b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        *format = reply.readInt32();
1271b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        return reply.readInt32();
1281b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian    }
1291b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian
13059119e658a12279e8fff508f8773843de2d90917Mathias Agopian    virtual status_t turnElectronBeamOff(int32_t mode)
13159119e658a12279e8fff508f8773843de2d90917Mathias Agopian    {
13259119e658a12279e8fff508f8773843de2d90917Mathias Agopian        Parcel data, reply;
13359119e658a12279e8fff508f8773843de2d90917Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
13459119e658a12279e8fff508f8773843de2d90917Mathias Agopian        data.writeInt32(mode);
13559119e658a12279e8fff508f8773843de2d90917Mathias Agopian        remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_OFF, data, &reply);
13659119e658a12279e8fff508f8773843de2d90917Mathias Agopian        return reply.readInt32();
13759119e658a12279e8fff508f8773843de2d90917Mathias Agopian    }
13859119e658a12279e8fff508f8773843de2d90917Mathias Agopian
1399daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian    virtual status_t turnElectronBeamOn(int32_t mode)
1409daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian    {
1419daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian        Parcel data, reply;
1429daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1439daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian        data.writeInt32(mode);
1449daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian        remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_ON, data, &reply);
1459daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian        return reply.readInt32();
1469daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian    }
1479daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian
148582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    virtual bool authenticateSurfaceTexture(
149582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis            const sp<ISurfaceTexture>& surfaceTexture) const
150134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    {
151134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        Parcel data, reply;
152134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int err = NO_ERROR;
153134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = data.writeInterfaceToken(
154134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                ISurfaceComposer::getInterfaceDescriptor());
155134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
156582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
157134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                    "interface descriptor: %s (%d)", strerror(-err), -err);
158134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
159134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
160582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis        err = data.writeStrongBinder(surfaceTexture->asBinder());
161134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
162582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
163582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "strong binder to parcel: %s (%d)", strerror(-err), -err);
164134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
165134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
166134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
167134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                &reply);
168134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
169582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
170582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "performing transaction: %s (%d)", strerror(-err), -err);
171134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
172134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
173134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int32_t result = 0;
174134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = reply.readInt32(&result);
175134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
176582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
177582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "retrieving result: %s (%d)", strerror(-err), -err);
178134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
179134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
180134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        return result != 0;
181134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
182d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
183d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    virtual sp<IDisplayEventConnection> createDisplayEventConnection()
184d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    {
185d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        Parcel data, reply;
186d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        sp<IDisplayEventConnection> result;
187d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        int err = data.writeInterfaceToken(
188d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                ISurfaceComposer::getInterfaceDescriptor());
189d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
190d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
191d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
192d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        err = remote()->transact(
193d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
194d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                data, &reply);
195d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
196d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            LOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
197d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                    "transaction: %s (%d)", strerror(-err), -err);
198d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
199d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
200d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder());
201d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        return result;
202d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    }
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact(
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(code) {
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case CREATE_CONNECTION: {
21483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            sp<IBinder> b = createConnection()->asBinder();
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeStrongBinder(b);
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
2189a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        case CREATE_GRAPHIC_BUFFER_ALLOC: {
2199a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis            CHECK_INTERFACE(ISurfaceComposer, data, reply);
2209a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis            sp<IBinder> b = createGraphicBufferAlloc()->asBinder();
2219a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis            reply->writeStrongBinder(b);
2229a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis        } break;
223698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        case SET_TRANSACTION_STATE: {
22483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
225698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            size_t count = data.readInt32();
226698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ComposerState s;
227698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            Vector<ComposerState> state;
228698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            state.setCapacity(count);
229698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            for (size_t i=0 ; i<count ; i++) {
230698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian                s.read(data);
231698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian                state.add(s);
232698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            }
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int orientation = data.readInt32();
23428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis            uint32_t flags = data.readInt32();
23528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis            setTransactionState(state, orientation, flags);
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case BOOT_FINISHED: {
23883c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bootFinished();
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GET_CBLK: {
24283c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            sp<IBinder> b = getCblk()->asBinder();
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeStrongBinder(b);
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
2461b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        case CAPTURE_SCREEN: {
2471b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
2481b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            DisplayID dpy = data.readInt32();
249df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian            uint32_t reqWidth = data.readInt32();
250df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian            uint32_t reqHeight = data.readInt32();
251bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            uint32_t minLayerZ = data.readInt32();
252bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian            uint32_t maxLayerZ = data.readInt32();
2531b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            sp<IMemoryHeap> heap;
2541b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            uint32_t w, h;
2551b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            PixelFormat f;
256df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian            status_t res = captureScreen(dpy, &heap, &w, &h, &f,
257bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian                    reqWidth, reqHeight, minLayerZ, maxLayerZ);
2581b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            reply->writeStrongBinder(heap->asBinder());
2591b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            reply->writeInt32(w);
2601b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            reply->writeInt32(h);
2611b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            reply->writeInt32(f);
2621b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian            reply->writeInt32(res);
2631b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian        } break;
26459119e658a12279e8fff508f8773843de2d90917Mathias Agopian        case TURN_ELECTRON_BEAM_OFF: {
26559119e658a12279e8fff508f8773843de2d90917Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
26659119e658a12279e8fff508f8773843de2d90917Mathias Agopian            int32_t mode = data.readInt32();
26759119e658a12279e8fff508f8773843de2d90917Mathias Agopian            status_t res = turnElectronBeamOff(mode);
26859119e658a12279e8fff508f8773843de2d90917Mathias Agopian            reply->writeInt32(res);
269151f2f5a6c5c7922c9f4a68c75706000e4a23fddJamie Gennis        } break;
2709daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian        case TURN_ELECTRON_BEAM_ON: {
2719daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
2729daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian            int32_t mode = data.readInt32();
2739daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian            status_t res = turnElectronBeamOn(mode);
2749daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian            reply->writeInt32(res);
275151f2f5a6c5c7922c9f4a68c75706000e4a23fddJamie Gennis        } break;
276134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        case AUTHENTICATE_SURFACE: {
277134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            CHECK_INTERFACE(ISurfaceComposer, data, reply);
278582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis            sp<ISurfaceTexture> surfaceTexture =
279582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    interface_cast<ISurfaceTexture>(data.readStrongBinder());
280582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis            int32_t result = authenticateSurfaceTexture(surfaceTexture) ? 1 : 0;
281134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            reply->writeInt32(result);
282134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        } break;
283d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        case CREATE_DISPLAY_EVENT_CONNECTION: {
284d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
285d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            sp<IDisplayEventConnection> connection(createDisplayEventConnection());
286d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            reply->writeStrongBinder(connection->asBinder());
287d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return NO_ERROR;
288d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        } break;
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
29083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            return BBinder::onTransact(code, data, reply, flags);
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
298