blob: c1156d5c86c599c9dc13fe706ad6d2379f2417b3 [file] [log] [blame]
The Android Open Source Projectedbf3b62009-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 Agopianc5b2c0b2009-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 Projectedbf3b62009-03-03 19:31:44 -080027
Mathias Agopian698c0872011-06-28 19:09:31 -070028#include <private/surfaceflinger/LayerState.h>
29
Jamie Gennis134f0422011-03-08 12:18:54 -080030#include <surfaceflinger/ISurfaceComposer.h>
31
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080032#include <ui/DisplayInfo.h>
33
Jamie Gennis134f0422011-03-08 12:18:54 -080034#include <utils/Log.h>
Mathias Agopian9cce3252010-02-09 17:46:37 -080035
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080036// ---------------------------------------------------------------------------
37
38#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true ))
39#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false ))
40
41// ---------------------------------------------------------------------------
42
43namespace android {
44
45class BpSurfaceComposer : public BpInterface<ISurfaceComposer>
46{
47public:
48 BpSurfaceComposer(const sp<IBinder>& impl)
49 : BpInterface<ISurfaceComposer>(impl)
50 {
51 }
52
Mathias Agopian7e27f052010-05-28 14:22:23 -070053 virtual sp<ISurfaceComposerClient> createConnection()
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080054 {
55 uint32_t n;
56 Parcel data, reply;
57 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
58 remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
Mathias Agopian7e27f052010-05-28 14:22:23 -070059 return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080060 }
61
Jamie Gennis9a78c902011-01-12 18:30:40 -080062 virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc()
63 {
64 uint32_t n;
65 Parcel data, reply;
66 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
67 remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply);
68 return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder());
69 }
70
Mathias Agopian7303c6b2009-07-02 18:11:53 -070071 virtual sp<IMemoryHeap> getCblk() const
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080072 {
73 Parcel data, reply;
74 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
75 remote()->transact(BnSurfaceComposer::GET_CBLK, data, &reply);
Mathias Agopian7303c6b2009-07-02 18:11:53 -070076 return interface_cast<IMemoryHeap>(reply.readStrongBinder());
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080077 }
78
Mathias Agopian698c0872011-06-28 19:09:31 -070079 virtual void setTransactionState(const Vector<ComposerState>& state)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080080 {
81 Parcel data, reply;
82 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
Mathias Agopian698c0872011-06-28 19:09:31 -070083 Vector<ComposerState>::const_iterator b(state.begin());
84 Vector<ComposerState>::const_iterator e(state.end());
85 data.writeInt32(state.size());
86 for ( ; b != e ; ++b ) {
87 b->write(data);
88 }
89 remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080090 }
91
92 virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags)
93 {
94 Parcel data, reply;
95 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
96 data.writeInt32(dpy);
97 data.writeInt32(flags);
98 remote()->transact(BnSurfaceComposer::FREEZE_DISPLAY, data, &reply);
99 return reply.readInt32();
100 }
101
102 virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags)
103 {
104 Parcel data, reply;
105 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
106 data.writeInt32(dpy);
107 data.writeInt32(flags);
108 remote()->transact(BnSurfaceComposer::UNFREEZE_DISPLAY, data, &reply);
109 return reply.readInt32();
110 }
111
Mathias Agopianc08731e2009-03-27 18:11:38 -0700112 virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags)
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800113 {
114 Parcel data, reply;
115 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
116 data.writeInt32(dpy);
117 data.writeInt32(orientation);
Mathias Agopianc08731e2009-03-27 18:11:38 -0700118 data.writeInt32(flags);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800119 remote()->transact(BnSurfaceComposer::SET_ORIENTATION, data, &reply);
120 return reply.readInt32();
121 }
122
123 virtual void bootFinished()
124 {
125 Parcel data, reply;
126 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
127 remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply);
128 }
129
Mathias Agopian1b0b30d2010-09-24 11:26:58 -0700130 virtual status_t captureScreen(DisplayID dpy,
131 sp<IMemoryHeap>* heap,
Mathias Agopiandf85c452010-09-29 13:02:36 -0700132 uint32_t* width, uint32_t* height, PixelFormat* format,
Mathias Agopianbf2c6a62010-12-10 16:22:31 -0800133 uint32_t reqWidth, uint32_t reqHeight,
134 uint32_t minLayerZ, uint32_t maxLayerZ)
Mathias Agopian1b0b30d2010-09-24 11:26:58 -0700135 {
136 Parcel data, reply;
137 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
138 data.writeInt32(dpy);
Mathias Agopiandf85c452010-09-29 13:02:36 -0700139 data.writeInt32(reqWidth);
140 data.writeInt32(reqHeight);
Mathias Agopianbf2c6a62010-12-10 16:22:31 -0800141 data.writeInt32(minLayerZ);
142 data.writeInt32(maxLayerZ);
Mathias Agopian1b0b30d2010-09-24 11:26:58 -0700143 remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
144 *heap = interface_cast<IMemoryHeap>(reply.readStrongBinder());
145 *width = reply.readInt32();
146 *height = reply.readInt32();
147 *format = reply.readInt32();
148 return reply.readInt32();
149 }
150
Mathias Agopian59119e62010-10-11 12:37:43 -0700151 virtual status_t turnElectronBeamOff(int32_t mode)
152 {
153 Parcel data, reply;
154 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
155 data.writeInt32(mode);
156 remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_OFF, data, &reply);
157 return reply.readInt32();
158 }
159
Mathias Agopian9daa5c92010-10-12 16:05:48 -0700160 virtual status_t turnElectronBeamOn(int32_t mode)
161 {
162 Parcel data, reply;
163 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
164 data.writeInt32(mode);
165 remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_ON, data, &reply);
166 return reply.readInt32();
167 }
168
Jamie Gennis134f0422011-03-08 12:18:54 -0800169 virtual bool authenticateSurface(const sp<ISurface>& surface) const
170 {
171 Parcel data, reply;
172 int err = NO_ERROR;
173 err = data.writeInterfaceToken(
174 ISurfaceComposer::getInterfaceDescriptor());
175 if (err != NO_ERROR) {
176 LOGE("ISurfaceComposer::authenticateSurface: error writing "
177 "interface descriptor: %s (%d)", strerror(-err), -err);
178 return false;
179 }
180 err = data.writeStrongBinder(surface->asBinder());
181 if (err != NO_ERROR) {
182 LOGE("ISurfaceComposer::authenticateSurface: error writing strong "
183 "binder to parcel: %s (%d)", strerror(-err), -err);
184 return false;
185 }
186 err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
187 &reply);
188 if (err != NO_ERROR) {
189 LOGE("ISurfaceComposer::authenticateSurface: error performing "
190 "transaction: %s (%d)", strerror(-err), -err);
191 return false;
192 }
193 int32_t result = 0;
194 err = reply.readInt32(&result);
195 if (err != NO_ERROR) {
196 LOGE("ISurfaceComposer::authenticateSurface: error retrieving "
197 "result: %s (%d)", strerror(-err), -err);
198 return false;
199 }
200 return result != 0;
201 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800202};
203
204IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
205
206// ----------------------------------------------------------------------
207
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800208status_t BnSurfaceComposer::onTransact(
209 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
210{
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800211 switch(code) {
212 case CREATE_CONNECTION: {
Mathias Agopian83c04462009-05-22 19:00:22 -0700213 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800214 sp<IBinder> b = createConnection()->asBinder();
215 reply->writeStrongBinder(b);
216 } break;
Jamie Gennis9a78c902011-01-12 18:30:40 -0800217 case CREATE_GRAPHIC_BUFFER_ALLOC: {
218 CHECK_INTERFACE(ISurfaceComposer, data, reply);
219 sp<IBinder> b = createGraphicBufferAlloc()->asBinder();
220 reply->writeStrongBinder(b);
221 } break;
Mathias Agopian698c0872011-06-28 19:09:31 -0700222 case SET_TRANSACTION_STATE: {
Mathias Agopian83c04462009-05-22 19:00:22 -0700223 CHECK_INTERFACE(ISurfaceComposer, data, reply);
Mathias Agopian698c0872011-06-28 19:09:31 -0700224 size_t count = data.readInt32();
225 ComposerState s;
226 Vector<ComposerState> state;
227 state.setCapacity(count);
228 for (size_t i=0 ; i<count ; i++) {
229 s.read(data);
230 state.add(s);
231 }
232 setTransactionState(state);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800233 } break;
234 case SET_ORIENTATION: {
Mathias Agopian83c04462009-05-22 19:00:22 -0700235 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800236 DisplayID dpy = data.readInt32();
237 int orientation = data.readInt32();
Mathias Agopianc08731e2009-03-27 18:11:38 -0700238 uint32_t flags = data.readInt32();
239 reply->writeInt32( setOrientation(dpy, orientation, flags) );
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800240 } break;
241 case FREEZE_DISPLAY: {
Mathias Agopian83c04462009-05-22 19:00:22 -0700242 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800243 DisplayID dpy = data.readInt32();
244 uint32_t flags = data.readInt32();
245 reply->writeInt32( freezeDisplay(dpy, flags) );
246 } break;
247 case UNFREEZE_DISPLAY: {
Mathias Agopian83c04462009-05-22 19:00:22 -0700248 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800249 DisplayID dpy = data.readInt32();
250 uint32_t flags = data.readInt32();
251 reply->writeInt32( unfreezeDisplay(dpy, flags) );
252 } break;
253 case BOOT_FINISHED: {
Mathias Agopian83c04462009-05-22 19:00:22 -0700254 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800255 bootFinished();
256 } break;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800257 case GET_CBLK: {
Mathias Agopian83c04462009-05-22 19:00:22 -0700258 CHECK_INTERFACE(ISurfaceComposer, data, reply);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800259 sp<IBinder> b = getCblk()->asBinder();
260 reply->writeStrongBinder(b);
261 } break;
Mathias Agopian1b0b30d2010-09-24 11:26:58 -0700262 case CAPTURE_SCREEN: {
263 CHECK_INTERFACE(ISurfaceComposer, data, reply);
264 DisplayID dpy = data.readInt32();
Mathias Agopiandf85c452010-09-29 13:02:36 -0700265 uint32_t reqWidth = data.readInt32();
266 uint32_t reqHeight = data.readInt32();
Mathias Agopianbf2c6a62010-12-10 16:22:31 -0800267 uint32_t minLayerZ = data.readInt32();
268 uint32_t maxLayerZ = data.readInt32();
Mathias Agopian1b0b30d2010-09-24 11:26:58 -0700269 sp<IMemoryHeap> heap;
270 uint32_t w, h;
271 PixelFormat f;
Mathias Agopiandf85c452010-09-29 13:02:36 -0700272 status_t res = captureScreen(dpy, &heap, &w, &h, &f,
Mathias Agopianbf2c6a62010-12-10 16:22:31 -0800273 reqWidth, reqHeight, minLayerZ, maxLayerZ);
Mathias Agopian1b0b30d2010-09-24 11:26:58 -0700274 reply->writeStrongBinder(heap->asBinder());
275 reply->writeInt32(w);
276 reply->writeInt32(h);
277 reply->writeInt32(f);
278 reply->writeInt32(res);
279 } break;
Mathias Agopian59119e62010-10-11 12:37:43 -0700280 case TURN_ELECTRON_BEAM_OFF: {
281 CHECK_INTERFACE(ISurfaceComposer, data, reply);
282 int32_t mode = data.readInt32();
283 status_t res = turnElectronBeamOff(mode);
284 reply->writeInt32(res);
Jamie Gennis151f2f52010-12-20 11:05:18 -0800285 } break;
Mathias Agopian9daa5c92010-10-12 16:05:48 -0700286 case TURN_ELECTRON_BEAM_ON: {
287 CHECK_INTERFACE(ISurfaceComposer, data, reply);
288 int32_t mode = data.readInt32();
289 status_t res = turnElectronBeamOn(mode);
290 reply->writeInt32(res);
Jamie Gennis151f2f52010-12-20 11:05:18 -0800291 } break;
Jamie Gennis134f0422011-03-08 12:18:54 -0800292 case AUTHENTICATE_SURFACE: {
293 CHECK_INTERFACE(ISurfaceComposer, data, reply);
294 sp<ISurface> surface = interface_cast<ISurface>(data.readStrongBinder());
295 int32_t result = authenticateSurface(surface) ? 1 : 0;
296 reply->writeInt32(result);
297 } break;
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800298 default:
Mathias Agopian83c04462009-05-22 19:00:22 -0700299 return BBinder::onTransact(code, data, reply, flags);
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800300 }
301 return NO_ERROR;
302}
303
304// ----------------------------------------------------------------------------
305
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800306};