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 <gui/BitTube.h> 29 #include <gui/IDisplayEventConnection.h> 30 #include <gui/ISurfaceComposer.h> 31 #include <gui/IGraphicBufferProducer.h> 32 33 #include <private/gui/LayerState.h> 34 35 #include <ui/DisplayInfo.h> 36 37 #include <utils/Log.h> 38 39 // --------------------------------------------------------------------------- 40 41 namespace android { 42 43 class IDisplayEventConnection; 44 45 class BpSurfaceComposer : public BpInterface<ISurfaceComposer> 46 { 47 public: 48 BpSurfaceComposer(const sp<IBinder>& impl) 49 : BpInterface<ISurfaceComposer>(impl) 50 { 51 } 52 53 virtual sp<ISurfaceComposerClient> createConnection() 54 { 55 uint32_t n; 56 Parcel data, reply; 57 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 58 remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply); 59 return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 60 } 61 62 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 71 virtual void setTransactionState( 72 const Vector<ComposerState>& state, 73 const Vector<DisplayState>& displays, 74 uint32_t flags) 75 { 76 Parcel data, reply; 77 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 78 { 79 Vector<ComposerState>::const_iterator b(state.begin()); 80 Vector<ComposerState>::const_iterator e(state.end()); 81 data.writeInt32(state.size()); 82 for ( ; b != e ; ++b ) { 83 b->write(data); 84 } 85 } 86 { 87 Vector<DisplayState>::const_iterator b(displays.begin()); 88 Vector<DisplayState>::const_iterator e(displays.end()); 89 data.writeInt32(displays.size()); 90 for ( ; b != e ; ++b ) { 91 b->write(data); 92 } 93 } 94 data.writeInt32(flags); 95 remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply); 96 } 97 98 virtual void bootFinished() 99 { 100 Parcel data, reply; 101 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 102 remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply); 103 } 104 105 virtual status_t captureScreen(const sp<IBinder>& display, 106 const sp<IGraphicBufferProducer>& producer, 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.writeStrongBinder(display); 113 data.writeStrongBinder(producer->asBinder()); 114 data.writeInt32(reqWidth); 115 data.writeInt32(reqHeight); 116 data.writeInt32(minLayerZ); 117 data.writeInt32(maxLayerZ); 118 remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply); 119 return reply.readInt32(); 120 } 121 122 virtual bool authenticateSurfaceTexture( 123 const sp<IGraphicBufferProducer>& bufferProducer) const 124 { 125 Parcel data, reply; 126 int err = NO_ERROR; 127 err = data.writeInterfaceToken( 128 ISurfaceComposer::getInterfaceDescriptor()); 129 if (err != NO_ERROR) { 130 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 131 "interface descriptor: %s (%d)", strerror(-err), -err); 132 return false; 133 } 134 err = data.writeStrongBinder(bufferProducer->asBinder()); 135 if (err != NO_ERROR) { 136 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 137 "strong binder to parcel: %s (%d)", strerror(-err), -err); 138 return false; 139 } 140 err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data, 141 &reply); 142 if (err != NO_ERROR) { 143 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 144 "performing transaction: %s (%d)", strerror(-err), -err); 145 return false; 146 } 147 int32_t result = 0; 148 err = reply.readInt32(&result); 149 if (err != NO_ERROR) { 150 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 151 "retrieving result: %s (%d)", strerror(-err), -err); 152 return false; 153 } 154 return result != 0; 155 } 156 157 virtual sp<IDisplayEventConnection> createDisplayEventConnection() 158 { 159 Parcel data, reply; 160 sp<IDisplayEventConnection> result; 161 int err = data.writeInterfaceToken( 162 ISurfaceComposer::getInterfaceDescriptor()); 163 if (err != NO_ERROR) { 164 return result; 165 } 166 err = remote()->transact( 167 BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION, 168 data, &reply); 169 if (err != NO_ERROR) { 170 ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing " 171 "transaction: %s (%d)", strerror(-err), -err); 172 return result; 173 } 174 result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder()); 175 return result; 176 } 177 178 virtual sp<IBinder> createDisplay(const String8& displayName, bool secure) 179 { 180 Parcel data, reply; 181 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 182 data.writeString8(displayName); 183 data.writeInt32(secure ? 1 : 0); 184 remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply); 185 return reply.readStrongBinder(); 186 } 187 188 virtual void destroyDisplay(const sp<IBinder>& display) 189 { 190 Parcel data, reply; 191 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 192 data.writeStrongBinder(display); 193 remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply); 194 } 195 196 virtual sp<IBinder> getBuiltInDisplay(int32_t id) 197 { 198 Parcel data, reply; 199 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 200 data.writeInt32(id); 201 remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply); 202 return reply.readStrongBinder(); 203 } 204 205 virtual void blank(const sp<IBinder>& display) 206 { 207 Parcel data, reply; 208 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 209 data.writeStrongBinder(display); 210 remote()->transact(BnSurfaceComposer::BLANK, data, &reply); 211 } 212 213 virtual void unblank(const sp<IBinder>& display) 214 { 215 Parcel data, reply; 216 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 217 data.writeStrongBinder(display); 218 remote()->transact(BnSurfaceComposer::UNBLANK, data, &reply); 219 } 220 221 virtual status_t getDisplayInfo(const sp<IBinder>& display, DisplayInfo* info) 222 { 223 Parcel data, reply; 224 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 225 data.writeStrongBinder(display); 226 remote()->transact(BnSurfaceComposer::GET_DISPLAY_INFO, data, &reply); 227 memcpy(info, reply.readInplace(sizeof(DisplayInfo)), sizeof(DisplayInfo)); 228 return reply.readInt32(); 229 } 230 }; 231 232 IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer"); 233 234 // ---------------------------------------------------------------------- 235 236 status_t BnSurfaceComposer::onTransact( 237 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 238 { 239 switch(code) { 240 case CREATE_CONNECTION: { 241 CHECK_INTERFACE(ISurfaceComposer, data, reply); 242 sp<IBinder> b = createConnection()->asBinder(); 243 reply->writeStrongBinder(b); 244 return NO_ERROR; 245 } 246 case CREATE_GRAPHIC_BUFFER_ALLOC: { 247 CHECK_INTERFACE(ISurfaceComposer, data, reply); 248 sp<IBinder> b = createGraphicBufferAlloc()->asBinder(); 249 reply->writeStrongBinder(b); 250 return NO_ERROR; 251 } 252 case SET_TRANSACTION_STATE: { 253 CHECK_INTERFACE(ISurfaceComposer, data, reply); 254 size_t count = data.readInt32(); 255 ComposerState s; 256 Vector<ComposerState> state; 257 state.setCapacity(count); 258 for (size_t i=0 ; i<count ; i++) { 259 s.read(data); 260 state.add(s); 261 } 262 count = data.readInt32(); 263 DisplayState d; 264 Vector<DisplayState> displays; 265 displays.setCapacity(count); 266 for (size_t i=0 ; i<count ; i++) { 267 d.read(data); 268 displays.add(d); 269 } 270 uint32_t flags = data.readInt32(); 271 setTransactionState(state, displays, flags); 272 return NO_ERROR; 273 } 274 case BOOT_FINISHED: { 275 CHECK_INTERFACE(ISurfaceComposer, data, reply); 276 bootFinished(); 277 return NO_ERROR; 278 } 279 case CAPTURE_SCREEN: { 280 CHECK_INTERFACE(ISurfaceComposer, data, reply); 281 sp<IBinder> display = data.readStrongBinder(); 282 sp<IGraphicBufferProducer> producer = 283 interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 284 uint32_t reqWidth = data.readInt32(); 285 uint32_t reqHeight = data.readInt32(); 286 uint32_t minLayerZ = data.readInt32(); 287 uint32_t maxLayerZ = data.readInt32(); 288 status_t res = captureScreen(display, producer, 289 reqWidth, reqHeight, minLayerZ, maxLayerZ); 290 reply->writeInt32(res); 291 return NO_ERROR; 292 } 293 case AUTHENTICATE_SURFACE: { 294 CHECK_INTERFACE(ISurfaceComposer, data, reply); 295 sp<IGraphicBufferProducer> bufferProducer = 296 interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 297 int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0; 298 reply->writeInt32(result); 299 return NO_ERROR; 300 } 301 case CREATE_DISPLAY_EVENT_CONNECTION: { 302 CHECK_INTERFACE(ISurfaceComposer, data, reply); 303 sp<IDisplayEventConnection> connection(createDisplayEventConnection()); 304 reply->writeStrongBinder(connection->asBinder()); 305 return NO_ERROR; 306 } 307 case CREATE_DISPLAY: { 308 CHECK_INTERFACE(ISurfaceComposer, data, reply); 309 String8 displayName = data.readString8(); 310 bool secure = bool(data.readInt32()); 311 sp<IBinder> display(createDisplay(displayName, secure)); 312 reply->writeStrongBinder(display); 313 return NO_ERROR; 314 } 315 case DESTROY_DISPLAY: { 316 CHECK_INTERFACE(ISurfaceComposer, data, reply); 317 sp<IBinder> display = data.readStrongBinder(); 318 destroyDisplay(display); 319 return NO_ERROR; 320 } 321 case GET_BUILT_IN_DISPLAY: { 322 CHECK_INTERFACE(ISurfaceComposer, data, reply); 323 int32_t id = data.readInt32(); 324 sp<IBinder> display(getBuiltInDisplay(id)); 325 reply->writeStrongBinder(display); 326 return NO_ERROR; 327 } 328 case BLANK: { 329 CHECK_INTERFACE(ISurfaceComposer, data, reply); 330 sp<IBinder> display = data.readStrongBinder(); 331 blank(display); 332 return NO_ERROR; 333 } 334 case UNBLANK: { 335 CHECK_INTERFACE(ISurfaceComposer, data, reply); 336 sp<IBinder> display = data.readStrongBinder(); 337 unblank(display); 338 return NO_ERROR; 339 } 340 case GET_DISPLAY_INFO: { 341 CHECK_INTERFACE(ISurfaceComposer, data, reply); 342 DisplayInfo info; 343 sp<IBinder> display = data.readStrongBinder(); 344 status_t result = getDisplayInfo(display, &info); 345 memcpy(reply->writeInplace(sizeof(DisplayInfo)), &info, sizeof(DisplayInfo)); 346 reply->writeInt32(result); 347 return NO_ERROR; 348 } 349 default: { 350 return BBinder::onTransact(code, data, reply, flags); 351 } 352 } 353 // should be unreachable 354 return NO_ERROR; 355 } 356 357 // ---------------------------------------------------------------------------- 358 359 }; 360