ISurfaceComposer.cpp revision 582270d69db94286a248bd829f1ae6f910d45124
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 <ui/DisplayInfo.h>
33
34#include <gui/ISurfaceTexture.h>
35
36#include <utils/Log.h>
37
38// ---------------------------------------------------------------------------
39
40#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
41#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
42
43// ---------------------------------------------------------------------------
44
45namespace android {
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    {
83        Parcel data, reply;
84        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
85        Vector<ComposerState>::const_iterator b(state.begin());
86        Vector<ComposerState>::const_iterator e(state.end());
87        data.writeInt32(state.size());
88        for ( ; b != e ; ++b ) {
89            b->write(data);
90        }
91        remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
92    }
93
94    virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags)
95    {
96        Parcel data, reply;
97        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
98        data.writeInt32(dpy);
99        data.writeInt32(flags);
100        remote()->transact(BnSurfaceComposer::FREEZE_DISPLAY, data, &reply);
101        return reply.readInt32();
102    }
103
104    virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags)
105    {
106        Parcel data, reply;
107        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
108        data.writeInt32(dpy);
109        data.writeInt32(flags);
110        remote()->transact(BnSurfaceComposer::UNFREEZE_DISPLAY, data, &reply);
111        return reply.readInt32();
112    }
113
114    virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags)
115    {
116        Parcel data, reply;
117        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
118        data.writeInt32(dpy);
119        data.writeInt32(orientation);
120        data.writeInt32(flags);
121        remote()->transact(BnSurfaceComposer::SET_ORIENTATION, data, &reply);
122        return reply.readInt32();
123    }
124
125    virtual void bootFinished()
126    {
127        Parcel data, reply;
128        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
129        remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply);
130    }
131
132    virtual status_t captureScreen(DisplayID dpy,
133            sp<IMemoryHeap>* heap,
134            uint32_t* width, uint32_t* height, PixelFormat* format,
135            uint32_t reqWidth, uint32_t reqHeight,
136            uint32_t minLayerZ, uint32_t maxLayerZ)
137    {
138        Parcel data, reply;
139        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
140        data.writeInt32(dpy);
141        data.writeInt32(reqWidth);
142        data.writeInt32(reqHeight);
143        data.writeInt32(minLayerZ);
144        data.writeInt32(maxLayerZ);
145        remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
146        *heap = interface_cast<IMemoryHeap>(reply.readStrongBinder());
147        *width = reply.readInt32();
148        *height = reply.readInt32();
149        *format = reply.readInt32();
150        return reply.readInt32();
151    }
152
153    virtual status_t turnElectronBeamOff(int32_t mode)
154    {
155        Parcel data, reply;
156        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
157        data.writeInt32(mode);
158        remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_OFF, data, &reply);
159        return reply.readInt32();
160    }
161
162    virtual status_t turnElectronBeamOn(int32_t mode)
163    {
164        Parcel data, reply;
165        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
166        data.writeInt32(mode);
167        remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_ON, data, &reply);
168        return reply.readInt32();
169    }
170
171    virtual bool authenticateSurfaceTexture(
172            const sp<ISurfaceTexture>& surfaceTexture) const
173    {
174        Parcel data, reply;
175        int err = NO_ERROR;
176        err = data.writeInterfaceToken(
177                ISurfaceComposer::getInterfaceDescriptor());
178        if (err != NO_ERROR) {
179            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
180                    "interface descriptor: %s (%d)", strerror(-err), -err);
181            return false;
182        }
183        err = data.writeStrongBinder(surfaceTexture->asBinder());
184        if (err != NO_ERROR) {
185            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
186                    "strong binder to parcel: %s (%d)", strerror(-err), -err);
187            return false;
188        }
189        err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
190                &reply);
191        if (err != NO_ERROR) {
192            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
193                    "performing transaction: %s (%d)", strerror(-err), -err);
194            return false;
195        }
196        int32_t result = 0;
197        err = reply.readInt32(&result);
198        if (err != NO_ERROR) {
199            LOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
200                    "retrieving result: %s (%d)", strerror(-err), -err);
201            return false;
202        }
203        return result != 0;
204    }
205};
206
207IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
208
209// ----------------------------------------------------------------------
210
211status_t BnSurfaceComposer::onTransact(
212    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
213{
214    switch(code) {
215        case CREATE_CONNECTION: {
216            CHECK_INTERFACE(ISurfaceComposer, data, reply);
217            sp<IBinder> b = createConnection()->asBinder();
218            reply->writeStrongBinder(b);
219        } break;
220        case CREATE_GRAPHIC_BUFFER_ALLOC: {
221            CHECK_INTERFACE(ISurfaceComposer, data, reply);
222            sp<IBinder> b = createGraphicBufferAlloc()->asBinder();
223            reply->writeStrongBinder(b);
224        } break;
225        case SET_TRANSACTION_STATE: {
226            CHECK_INTERFACE(ISurfaceComposer, data, reply);
227            size_t count = data.readInt32();
228            ComposerState s;
229            Vector<ComposerState> state;
230            state.setCapacity(count);
231            for (size_t i=0 ; i<count ; i++) {
232                s.read(data);
233                state.add(s);
234            }
235            setTransactionState(state);
236        } break;
237        case SET_ORIENTATION: {
238            CHECK_INTERFACE(ISurfaceComposer, data, reply);
239            DisplayID dpy = data.readInt32();
240            int orientation = data.readInt32();
241            uint32_t flags = data.readInt32();
242            reply->writeInt32( setOrientation(dpy, orientation, flags) );
243        } break;
244        case FREEZE_DISPLAY: {
245            CHECK_INTERFACE(ISurfaceComposer, data, reply);
246            DisplayID dpy = data.readInt32();
247            uint32_t flags = data.readInt32();
248            reply->writeInt32( freezeDisplay(dpy, flags) );
249        } break;
250        case UNFREEZE_DISPLAY: {
251            CHECK_INTERFACE(ISurfaceComposer, data, reply);
252            DisplayID dpy = data.readInt32();
253            uint32_t flags = data.readInt32();
254            reply->writeInt32( unfreezeDisplay(dpy, flags) );
255        } break;
256        case BOOT_FINISHED: {
257            CHECK_INTERFACE(ISurfaceComposer, data, reply);
258            bootFinished();
259        } break;
260        case GET_CBLK: {
261            CHECK_INTERFACE(ISurfaceComposer, data, reply);
262            sp<IBinder> b = getCblk()->asBinder();
263            reply->writeStrongBinder(b);
264        } break;
265        case CAPTURE_SCREEN: {
266            CHECK_INTERFACE(ISurfaceComposer, data, reply);
267            DisplayID dpy = data.readInt32();
268            uint32_t reqWidth = data.readInt32();
269            uint32_t reqHeight = data.readInt32();
270            uint32_t minLayerZ = data.readInt32();
271            uint32_t maxLayerZ = data.readInt32();
272            sp<IMemoryHeap> heap;
273            uint32_t w, h;
274            PixelFormat f;
275            status_t res = captureScreen(dpy, &heap, &w, &h, &f,
276                    reqWidth, reqHeight, minLayerZ, maxLayerZ);
277            reply->writeStrongBinder(heap->asBinder());
278            reply->writeInt32(w);
279            reply->writeInt32(h);
280            reply->writeInt32(f);
281            reply->writeInt32(res);
282        } break;
283        case TURN_ELECTRON_BEAM_OFF: {
284            CHECK_INTERFACE(ISurfaceComposer, data, reply);
285            int32_t mode = data.readInt32();
286            status_t res = turnElectronBeamOff(mode);
287            reply->writeInt32(res);
288        } break;
289        case TURN_ELECTRON_BEAM_ON: {
290            CHECK_INTERFACE(ISurfaceComposer, data, reply);
291            int32_t mode = data.readInt32();
292            status_t res = turnElectronBeamOn(mode);
293            reply->writeInt32(res);
294        } break;
295        case AUTHENTICATE_SURFACE: {
296            CHECK_INTERFACE(ISurfaceComposer, data, reply);
297            sp<ISurfaceTexture> surfaceTexture =
298                    interface_cast<ISurfaceTexture>(data.readStrongBinder());
299            int32_t result = authenticateSurfaceTexture(surfaceTexture) ? 1 : 0;
300            reply->writeInt32(result);
301        } break;
302        default:
303            return BBinder::onTransact(code, data, reply, flags);
304    }
305    return NO_ERROR;
306}
307
308// ----------------------------------------------------------------------------
309
310};
311