blob: 8951c3f0453a4f127f338bc3ae02fe4f9b6d50d6 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
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
Mathias Agopian07952722009-05-19 19:08:10 -070023#include <binder/Parcel.h>
24#include <binder/IMemory.h>
25#include <binder/IPCThreadState.h>
26#include <binder/IServiceManager.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080027
Jamie Gennisd2acedf2011-03-08 12:18:54 -080028#include <surfaceflinger/ISurfaceComposer.h>
29
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080030#include <ui/DisplayInfo.h>
31
Jamie Gennisd2acedf2011-03-08 12:18:54 -080032#include <utils/Log.h>
Mathias Agopian000479f2010-02-09 17:46:37 -080033
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080034// ---------------------------------------------------------------------------
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
Mathias Agopian770492c2010-05-28 14:22:23 -070051 virtual sp<ISurfaceComposerClient> createConnection()
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080052 {
53 uint32_t n;
54 Parcel data, reply;
55 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
56 remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
Mathias Agopian770492c2010-05-28 14:22:23 -070057 return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080058 }
59
Mathias Agopian7623da42010-06-01 15:12:58 -070060 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
Jamie Gennisf7acf162011-01-12 18:30:40 -080069 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
Mathias Agopiand763b5d2009-07-02 18:11:53 -070078 virtual sp<IMemoryHeap> getCblk() const
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080079 {
80 Parcel data, reply;
81 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
82 remote()->transact(BnSurfaceComposer::GET_CBLK, data, &reply);
Mathias Agopiand763b5d2009-07-02 18:11:53 -070083 return interface_cast<IMemoryHeap>(reply.readStrongBinder());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080084 }
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
Mathias Agopianeb0c86e2009-03-27 18:11:38 -0700120 virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800121 {
122 Parcel data, reply;
123 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
124 data.writeInt32(dpy);
125 data.writeInt32(orientation);
Mathias Agopianeb0c86e2009-03-27 18:11:38 -0700126 data.writeInt32(flags);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800127 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
Mathias Agopianca5edbe2010-09-24 11:26:58 -0700138 virtual status_t captureScreen(DisplayID dpy,
139 sp<IMemoryHeap>* heap,
Mathias Agopian597c7f62010-09-29 13:02:36 -0700140 uint32_t* width, uint32_t* height, PixelFormat* format,
Mathias Agopian3dd25a62010-12-10 16:22:31 -0800141 uint32_t reqWidth, uint32_t reqHeight,
142 uint32_t minLayerZ, uint32_t maxLayerZ)
Mathias Agopianca5edbe2010-09-24 11:26:58 -0700143 {
144 Parcel data, reply;
145 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
146 data.writeInt32(dpy);
Mathias Agopian597c7f62010-09-29 13:02:36 -0700147 data.writeInt32(reqWidth);
148 data.writeInt32(reqHeight);
Mathias Agopian3dd25a62010-12-10 16:22:31 -0800149 data.writeInt32(minLayerZ);
150 data.writeInt32(maxLayerZ);
Mathias Agopianca5edbe2010-09-24 11:26:58 -0700151 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
Mathias Agopianaab758e2010-10-11 12:37:43 -0700159 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
Mathias Agopian2d2b8032010-10-12 16:05:48 -0700168 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
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800177 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 }
Jamie Gennisd2acedf2011-03-08 12:18:54 -0800183
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 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800217};
218
219IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
220
221// ----------------------------------------------------------------------
222
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800223status_t BnSurfaceComposer::onTransact(
224 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
225{
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800226 switch(code) {
227 case CREATE_CONNECTION: {
Mathias Agopianaaf834a2009-05-22 19:00:22 -0700228 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800229 sp<IBinder> b = createConnection()->asBinder();
230 reply->writeStrongBinder(b);
231 } break;
Mathias Agopian7623da42010-06-01 15:12:58 -0700232 case CREATE_CLIENT_CONNECTION: {
233 CHECK_INTERFACE(ISurfaceComposer, data, reply);
234 sp<IBinder> b = createClientConnection()->asBinder();
235 reply->writeStrongBinder(b);
236 } break;
Jamie Gennisf7acf162011-01-12 18:30:40 -0800237 case CREATE_GRAPHIC_BUFFER_ALLOC: {
238 CHECK_INTERFACE(ISurfaceComposer, data, reply);
239 sp<IBinder> b = createGraphicBufferAlloc()->asBinder();
240 reply->writeStrongBinder(b);
241 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800242 case OPEN_GLOBAL_TRANSACTION: {
Mathias Agopianaaf834a2009-05-22 19:00:22 -0700243 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800244 openGlobalTransaction();
245 } break;
246 case CLOSE_GLOBAL_TRANSACTION: {
Mathias Agopianaaf834a2009-05-22 19:00:22 -0700247 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800248 closeGlobalTransaction();
249 } break;
250 case SET_ORIENTATION: {
Mathias Agopianaaf834a2009-05-22 19:00:22 -0700251 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800252 DisplayID dpy = data.readInt32();
253 int orientation = data.readInt32();
Mathias Agopianeb0c86e2009-03-27 18:11:38 -0700254 uint32_t flags = data.readInt32();
255 reply->writeInt32( setOrientation(dpy, orientation, flags) );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800256 } break;
257 case FREEZE_DISPLAY: {
Mathias Agopianaaf834a2009-05-22 19:00:22 -0700258 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800259 DisplayID dpy = data.readInt32();
260 uint32_t flags = data.readInt32();
261 reply->writeInt32( freezeDisplay(dpy, flags) );
262 } break;
263 case UNFREEZE_DISPLAY: {
Mathias Agopianaaf834a2009-05-22 19:00:22 -0700264 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800265 DisplayID dpy = data.readInt32();
266 uint32_t flags = data.readInt32();
267 reply->writeInt32( unfreezeDisplay(dpy, flags) );
268 } break;
269 case BOOT_FINISHED: {
Mathias Agopianaaf834a2009-05-22 19:00:22 -0700270 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800271 bootFinished();
272 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800273 case SIGNAL: {
Mathias Agopianaaf834a2009-05-22 19:00:22 -0700274 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800275 signal();
276 } break;
277 case GET_CBLK: {
Mathias Agopianaaf834a2009-05-22 19:00:22 -0700278 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800279 sp<IBinder> b = getCblk()->asBinder();
280 reply->writeStrongBinder(b);
281 } break;
Mathias Agopianca5edbe2010-09-24 11:26:58 -0700282 case CAPTURE_SCREEN: {
283 CHECK_INTERFACE(ISurfaceComposer, data, reply);
284 DisplayID dpy = data.readInt32();
Mathias Agopian597c7f62010-09-29 13:02:36 -0700285 uint32_t reqWidth = data.readInt32();
286 uint32_t reqHeight = data.readInt32();
Mathias Agopian3dd25a62010-12-10 16:22:31 -0800287 uint32_t minLayerZ = data.readInt32();
288 uint32_t maxLayerZ = data.readInt32();
Mathias Agopianca5edbe2010-09-24 11:26:58 -0700289 sp<IMemoryHeap> heap;
290 uint32_t w, h;
291 PixelFormat f;
Mathias Agopian597c7f62010-09-29 13:02:36 -0700292 status_t res = captureScreen(dpy, &heap, &w, &h, &f,
Mathias Agopian3dd25a62010-12-10 16:22:31 -0800293 reqWidth, reqHeight, minLayerZ, maxLayerZ);
Mathias Agopianca5edbe2010-09-24 11:26:58 -0700294 reply->writeStrongBinder(heap->asBinder());
295 reply->writeInt32(w);
296 reply->writeInt32(h);
297 reply->writeInt32(f);
298 reply->writeInt32(res);
299 } break;
Mathias Agopianaab758e2010-10-11 12:37:43 -0700300 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);
Jamie Gennis96fceaf2010-12-20 11:05:18 -0800305 } break;
Mathias Agopian2d2b8032010-10-12 16:05:48 -0700306 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);
Jamie Gennis96fceaf2010-12-20 11:05:18 -0800311 } break;
Jamie Gennisd2acedf2011-03-08 12:18:54 -0800312 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;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800318 default:
Mathias Agopianaaf834a2009-05-22 19:00:22 -0700319 return BBinder::onTransact(code, data, reply, flags);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800320 }
321 return NO_ERROR;
322}
323
324// ----------------------------------------------------------------------------
325
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800326};