ISurfaceComposer.cpp revision d87f162026454f5a3e6437ed0c9ef51651a6b939
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 <surfaceflinger/ISurfaceComposer.h>
29
30#include <ui/DisplayInfo.h>
31
32#include <utils/Log.h>
33
34// ---------------------------------------------------------------------------
35
36#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
37#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
38
39// ---------------------------------------------------------------------------
40
41namespace android {
42
43class BpSurfaceComposer : public BpInterface<ISurfaceComposer>
44{
45public:
46    BpSurfaceComposer(const sp<IBinder>& impl)
47        : BpInterface<ISurfaceComposer>(impl)
48    {
49    }
50
51    virtual sp<ISurfaceComposerClient> createConnection()
52    {
53        uint32_t n;
54        Parcel data, reply;
55        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
56        remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
57        return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
58    }
59
60    virtual sp<ISurfaceComposerClient> createClientConnection()
61    {
62        uint32_t n;
63        Parcel data, reply;
64        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
65        remote()->transact(BnSurfaceComposer::CREATE_CLIENT_CONNECTION, data, &reply);
66        return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
67    }
68
69    virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc()
70    {
71        uint32_t n;
72        Parcel data, reply;
73        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
74        remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply);
75        return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder());
76    }
77
78    virtual sp<IMemoryHeap> getCblk() const
79    {
80        Parcel data, reply;
81        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
82        remote()->transact(BnSurfaceComposer::GET_CBLK, data, &reply);
83        return interface_cast<IMemoryHeap>(reply.readStrongBinder());
84    }
85
86    virtual void openGlobalTransaction()
87    {
88        Parcel data, reply;
89        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
90        remote()->transact(BnSurfaceComposer::OPEN_GLOBAL_TRANSACTION, data, &reply);
91    }
92
93    virtual void closeGlobalTransaction()
94    {
95        Parcel data, reply;
96        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
97        remote()->transact(BnSurfaceComposer::CLOSE_GLOBAL_TRANSACTION, data, &reply);
98    }
99
100    virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags)
101    {
102        Parcel data, reply;
103        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
104        data.writeInt32(dpy);
105        data.writeInt32(flags);
106        remote()->transact(BnSurfaceComposer::FREEZE_DISPLAY, data, &reply);
107        return reply.readInt32();
108    }
109
110    virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags)
111    {
112        Parcel data, reply;
113        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
114        data.writeInt32(dpy);
115        data.writeInt32(flags);
116        remote()->transact(BnSurfaceComposer::UNFREEZE_DISPLAY, data, &reply);
117        return reply.readInt32();
118    }
119
120    virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags)
121    {
122        Parcel data, reply;
123        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
124        data.writeInt32(dpy);
125        data.writeInt32(orientation);
126        data.writeInt32(flags);
127        remote()->transact(BnSurfaceComposer::SET_ORIENTATION, data, &reply);
128        return reply.readInt32();
129    }
130
131    virtual void bootFinished()
132    {
133        Parcel data, reply;
134        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
135        remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply);
136    }
137
138    virtual status_t captureScreen(DisplayID dpy,
139            sp<IMemoryHeap>* heap,
140            uint32_t* width, uint32_t* height, PixelFormat* format,
141            uint32_t reqWidth, uint32_t reqHeight,
142            uint32_t minLayerZ, uint32_t maxLayerZ)
143    {
144        Parcel data, reply;
145        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
146        data.writeInt32(dpy);
147        data.writeInt32(reqWidth);
148        data.writeInt32(reqHeight);
149        data.writeInt32(minLayerZ);
150        data.writeInt32(maxLayerZ);
151        remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
152        *heap = interface_cast<IMemoryHeap>(reply.readStrongBinder());
153        *width = reply.readInt32();
154        *height = reply.readInt32();
155        *format = reply.readInt32();
156        return reply.readInt32();
157    }
158
159    virtual status_t turnElectronBeamOff(int32_t mode)
160    {
161        Parcel data, reply;
162        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
163        data.writeInt32(mode);
164        remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_OFF, data, &reply);
165        return reply.readInt32();
166    }
167
168    virtual status_t turnElectronBeamOn(int32_t mode)
169    {
170        Parcel data, reply;
171        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
172        data.writeInt32(mode);
173        remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_ON, data, &reply);
174        return reply.readInt32();
175    }
176
177    virtual void signal() const
178    {
179        Parcel data, reply;
180        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
181        remote()->transact(BnSurfaceComposer::SIGNAL, data, &reply, IBinder::FLAG_ONEWAY);
182    }
183
184    virtual bool authenticateSurface(const sp<ISurface>& surface) const
185    {
186        Parcel data, reply;
187        int err = NO_ERROR;
188        err = data.writeInterfaceToken(
189                ISurfaceComposer::getInterfaceDescriptor());
190        if (err != NO_ERROR) {
191            LOGE("ISurfaceComposer::authenticateSurface: error writing "
192                    "interface descriptor: %s (%d)", strerror(-err), -err);
193            return false;
194        }
195        err = data.writeStrongBinder(surface->asBinder());
196        if (err != NO_ERROR) {
197            LOGE("ISurfaceComposer::authenticateSurface: error writing strong "
198                    "binder to parcel: %s (%d)", strerror(-err), -err);
199            return false;
200        }
201        err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
202                &reply);
203        if (err != NO_ERROR) {
204            LOGE("ISurfaceComposer::authenticateSurface: error performing "
205                    "transaction: %s (%d)", strerror(-err), -err);
206            return false;
207        }
208        int32_t result = 0;
209        err = reply.readInt32(&result);
210        if (err != NO_ERROR) {
211            LOGE("ISurfaceComposer::authenticateSurface: error retrieving "
212                    "result: %s (%d)", strerror(-err), -err);
213            return false;
214        }
215        return result != 0;
216    }
217};
218
219IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
220
221// ----------------------------------------------------------------------
222
223status_t BnSurfaceComposer::onTransact(
224    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
225{
226    switch(code) {
227        case CREATE_CONNECTION: {
228            CHECK_INTERFACE(ISurfaceComposer, data, reply);
229            sp<IBinder> b = createConnection()->asBinder();
230            reply->writeStrongBinder(b);
231        } break;
232        case CREATE_CLIENT_CONNECTION: {
233            CHECK_INTERFACE(ISurfaceComposer, data, reply);
234            sp<IBinder> b = createClientConnection()->asBinder();
235            reply->writeStrongBinder(b);
236        } break;
237        case CREATE_GRAPHIC_BUFFER_ALLOC: {
238            CHECK_INTERFACE(ISurfaceComposer, data, reply);
239            sp<IBinder> b = createGraphicBufferAlloc()->asBinder();
240            reply->writeStrongBinder(b);
241        } break;
242        case OPEN_GLOBAL_TRANSACTION: {
243            CHECK_INTERFACE(ISurfaceComposer, data, reply);
244            openGlobalTransaction();
245        } break;
246        case CLOSE_GLOBAL_TRANSACTION: {
247            CHECK_INTERFACE(ISurfaceComposer, data, reply);
248            closeGlobalTransaction();
249        } break;
250        case SET_ORIENTATION: {
251            CHECK_INTERFACE(ISurfaceComposer, data, reply);
252            DisplayID dpy = data.readInt32();
253            int orientation = data.readInt32();
254            uint32_t flags = data.readInt32();
255            reply->writeInt32( setOrientation(dpy, orientation, flags) );
256        } break;
257        case FREEZE_DISPLAY: {
258            CHECK_INTERFACE(ISurfaceComposer, data, reply);
259            DisplayID dpy = data.readInt32();
260            uint32_t flags = data.readInt32();
261            reply->writeInt32( freezeDisplay(dpy, flags) );
262        } break;
263        case UNFREEZE_DISPLAY: {
264            CHECK_INTERFACE(ISurfaceComposer, data, reply);
265            DisplayID dpy = data.readInt32();
266            uint32_t flags = data.readInt32();
267            reply->writeInt32( unfreezeDisplay(dpy, flags) );
268        } break;
269        case BOOT_FINISHED: {
270            CHECK_INTERFACE(ISurfaceComposer, data, reply);
271            bootFinished();
272        } break;
273        case SIGNAL: {
274            CHECK_INTERFACE(ISurfaceComposer, data, reply);
275            signal();
276        } break;
277        case GET_CBLK: {
278            CHECK_INTERFACE(ISurfaceComposer, data, reply);
279            sp<IBinder> b = getCblk()->asBinder();
280            reply->writeStrongBinder(b);
281        } break;
282        case CAPTURE_SCREEN: {
283            CHECK_INTERFACE(ISurfaceComposer, data, reply);
284            DisplayID dpy = data.readInt32();
285            uint32_t reqWidth = data.readInt32();
286            uint32_t reqHeight = data.readInt32();
287            uint32_t minLayerZ = data.readInt32();
288            uint32_t maxLayerZ = data.readInt32();
289            sp<IMemoryHeap> heap;
290            uint32_t w, h;
291            PixelFormat f;
292            status_t res = captureScreen(dpy, &heap, &w, &h, &f,
293                    reqWidth, reqHeight, minLayerZ, maxLayerZ);
294            reply->writeStrongBinder(heap->asBinder());
295            reply->writeInt32(w);
296            reply->writeInt32(h);
297            reply->writeInt32(f);
298            reply->writeInt32(res);
299        } break;
300        case TURN_ELECTRON_BEAM_OFF: {
301            CHECK_INTERFACE(ISurfaceComposer, data, reply);
302            int32_t mode = data.readInt32();
303            status_t res = turnElectronBeamOff(mode);
304            reply->writeInt32(res);
305        } break;
306        case TURN_ELECTRON_BEAM_ON: {
307            CHECK_INTERFACE(ISurfaceComposer, data, reply);
308            int32_t mode = data.readInt32();
309            status_t res = turnElectronBeamOn(mode);
310            reply->writeInt32(res);
311        } break;
312        case AUTHENTICATE_SURFACE: {
313            CHECK_INTERFACE(ISurfaceComposer, data, reply);
314            sp<ISurface> surface = interface_cast<ISurface>(data.readStrongBinder());
315            int32_t result = authenticateSurface(surface) ? 1 : 0;
316            reply->writeInt32(result);
317        } break;
318        default:
319            return BBinder::onTransact(code, data, reply, flags);
320    }
321    return NO_ERROR;
322}
323
324// ----------------------------------------------------------------------------
325
326};
327