ISurfaceComposer.cpp revision 99ed22412db547c59d3da08114d9d5a586442b30
1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// tag as surfaceflinger
18#define LOG_TAG "SurfaceFlinger"
19
20#include <stdint.h>
21#include <sys/types.h>
22
23#include <binder/Parcel.h>
24#include <binder/IMemory.h>
25#include <binder/IPCThreadState.h>
26#include <binder/IServiceManager.h>
27
28#include <private/surfaceflinger/LayerState.h>
29
30#include <surfaceflinger/ISurfaceComposer.h>
31
32#include <gui/BitTube.h>
33#include <gui/IDisplayEventConnection.h>
34
35#include <ui/DisplayInfo.h>
36
37#include <gui/ISurfaceTexture.h>
38
39#include <utils/Log.h>
40
41// ---------------------------------------------------------------------------
42
43namespace android {
44
45class IDisplayEventConnection;
46
47class BpSurfaceComposer : public BpInterface<ISurfaceComposer>
48{
49public:
50    BpSurfaceComposer(const sp<IBinder>& impl)
51        : BpInterface<ISurfaceComposer>(impl)
52    {
53    }
54
55    virtual sp<ISurfaceComposerClient> createConnection()
56    {
57        uint32_t n;
58        Parcel data, reply;
59        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
60        remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
61        return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
62    }
63
64    virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc()
65    {
66        uint32_t n;
67        Parcel data, reply;
68        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
69        remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply);
70        return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder());
71    }
72
73    virtual sp<IMemoryHeap> getCblk() const
74    {
75        Parcel data, reply;
76        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
77        remote()->transact(BnSurfaceComposer::GET_CBLK, data, &reply);
78        return interface_cast<IMemoryHeap>(reply.readStrongBinder());
79    }
80
81    virtual void setTransactionState(const Vector<ComposerState>& state,
82            int orientation, uint32_t flags)
83    {
84        Parcel data, reply;
85        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
86        Vector<ComposerState>::const_iterator b(state.begin());
87        Vector<ComposerState>::const_iterator e(state.end());
88        data.writeInt32(state.size());
89        for ( ; b != e ; ++b ) {
90            b->write(data);
91        }
92        data.writeInt32(orientation);
93        data.writeInt32(flags);
94        remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
95    }
96
97    virtual void bootFinished()
98    {
99        Parcel data, reply;
100        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
101        remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply);
102    }
103
104    virtual status_t captureScreen(DisplayID dpy,
105            sp<IMemoryHeap>* heap,
106            uint32_t* width, uint32_t* height, PixelFormat* format,
107            uint32_t reqWidth, uint32_t reqHeight,
108            uint32_t minLayerZ, uint32_t maxLayerZ)
109    {
110        Parcel data, reply;
111        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
112        data.writeInt32(dpy);
113        data.writeInt32(reqWidth);
114        data.writeInt32(reqHeight);
115        data.writeInt32(minLayerZ);
116        data.writeInt32(maxLayerZ);
117        remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
118        *heap = interface_cast<IMemoryHeap>(reply.readStrongBinder());
119        *width = reply.readInt32();
120        *height = reply.readInt32();
121        *format = reply.readInt32();
122        return reply.readInt32();
123    }
124
125    virtual status_t turnElectronBeamOff(int32_t mode)
126    {
127        Parcel data, reply;
128        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
129        data.writeInt32(mode);
130        remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_OFF, data, &reply);
131        return reply.readInt32();
132    }
133
134    virtual status_t turnElectronBeamOn(int32_t mode)
135    {
136        Parcel data, reply;
137        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
138        data.writeInt32(mode);
139        remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_ON, data, &reply);
140        return reply.readInt32();
141    }
142
143    virtual bool authenticateSurfaceTexture(
144            const sp<ISurfaceTexture>& surfaceTexture) const
145    {
146        Parcel data, reply;
147        int err = NO_ERROR;
148        err = data.writeInterfaceToken(
149                ISurfaceComposer::getInterfaceDescriptor());
150        if (err != NO_ERROR) {
151            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
152                    "interface descriptor: %s (%d)", strerror(-err), -err);
153            return false;
154        }
155        err = data.writeStrongBinder(surfaceTexture->asBinder());
156        if (err != NO_ERROR) {
157            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
158                    "strong binder to parcel: %s (%d)", strerror(-err), -err);
159            return false;
160        }
161        err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
162                &reply);
163        if (err != NO_ERROR) {
164            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
165                    "performing transaction: %s (%d)", strerror(-err), -err);
166            return false;
167        }
168        int32_t result = 0;
169        err = reply.readInt32(&result);
170        if (err != NO_ERROR) {
171            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
172                    "retrieving result: %s (%d)", strerror(-err), -err);
173            return false;
174        }
175        return result != 0;
176    }
177
178    virtual sp<IDisplayEventConnection> createDisplayEventConnection()
179    {
180        Parcel data, reply;
181        sp<IDisplayEventConnection> result;
182        int err = data.writeInterfaceToken(
183                ISurfaceComposer::getInterfaceDescriptor());
184        if (err != NO_ERROR) {
185            return result;
186        }
187        err = remote()->transact(
188                BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
189                data, &reply);
190        if (err != NO_ERROR) {
191            LOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
192                    "transaction: %s (%d)", strerror(-err), -err);
193            return result;
194        }
195        result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder());
196        return result;
197    }
198};
199
200IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
201
202// ----------------------------------------------------------------------
203
204status_t BnSurfaceComposer::onTransact(
205    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
206{
207    switch(code) {
208        case CREATE_CONNECTION: {
209            CHECK_INTERFACE(ISurfaceComposer, data, reply);
210            sp<IBinder> b = createConnection()->asBinder();
211            reply->writeStrongBinder(b);
212        } break;
213        case CREATE_GRAPHIC_BUFFER_ALLOC: {
214            CHECK_INTERFACE(ISurfaceComposer, data, reply);
215            sp<IBinder> b = createGraphicBufferAlloc()->asBinder();
216            reply->writeStrongBinder(b);
217        } break;
218        case SET_TRANSACTION_STATE: {
219            CHECK_INTERFACE(ISurfaceComposer, data, reply);
220            size_t count = data.readInt32();
221            ComposerState s;
222            Vector<ComposerState> state;
223            state.setCapacity(count);
224            for (size_t i=0 ; i<count ; i++) {
225                s.read(data);
226                state.add(s);
227            }
228            int orientation = data.readInt32();
229            uint32_t flags = data.readInt32();
230            setTransactionState(state, orientation, flags);
231        } break;
232        case BOOT_FINISHED: {
233            CHECK_INTERFACE(ISurfaceComposer, data, reply);
234            bootFinished();
235        } break;
236        case GET_CBLK: {
237            CHECK_INTERFACE(ISurfaceComposer, data, reply);
238            sp<IBinder> b = getCblk()->asBinder();
239            reply->writeStrongBinder(b);
240        } break;
241        case CAPTURE_SCREEN: {
242            CHECK_INTERFACE(ISurfaceComposer, data, reply);
243            DisplayID dpy = data.readInt32();
244            uint32_t reqWidth = data.readInt32();
245            uint32_t reqHeight = data.readInt32();
246            uint32_t minLayerZ = data.readInt32();
247            uint32_t maxLayerZ = data.readInt32();
248            sp<IMemoryHeap> heap;
249            uint32_t w, h;
250            PixelFormat f;
251            status_t res = captureScreen(dpy, &heap, &w, &h, &f,
252                    reqWidth, reqHeight, minLayerZ, maxLayerZ);
253            reply->writeStrongBinder(heap->asBinder());
254            reply->writeInt32(w);
255            reply->writeInt32(h);
256            reply->writeInt32(f);
257            reply->writeInt32(res);
258        } break;
259        case TURN_ELECTRON_BEAM_OFF: {
260            CHECK_INTERFACE(ISurfaceComposer, data, reply);
261            int32_t mode = data.readInt32();
262            status_t res = turnElectronBeamOff(mode);
263            reply->writeInt32(res);
264        } break;
265        case TURN_ELECTRON_BEAM_ON: {
266            CHECK_INTERFACE(ISurfaceComposer, data, reply);
267            int32_t mode = data.readInt32();
268            status_t res = turnElectronBeamOn(mode);
269            reply->writeInt32(res);
270        } break;
271        case AUTHENTICATE_SURFACE: {
272            CHECK_INTERFACE(ISurfaceComposer, data, reply);
273            sp<ISurfaceTexture> surfaceTexture =
274                    interface_cast<ISurfaceTexture>(data.readStrongBinder());
275            int32_t result = authenticateSurfaceTexture(surfaceTexture) ? 1 : 0;
276            reply->writeInt32(result);
277        } break;
278        case CREATE_DISPLAY_EVENT_CONNECTION: {
279            CHECK_INTERFACE(ISurfaceComposer, data, reply);
280            sp<IDisplayEventConnection> connection(createDisplayEventConnection());
281            reply->writeStrongBinder(connection->asBinder());
282            return NO_ERROR;
283        } break;
284        default:
285            return BBinder::onTransact(code, data, reply, flags);
286    }
287    return NO_ERROR;
288}
289
290// ----------------------------------------------------------------------------
291
292};
293