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 #include <ui/DisplayStatInfo.h> 37 38 #include <utils/Log.h> 39 40 // --------------------------------------------------------------------------- 41 42 namespace android { 43 44 class IDisplayEventConnection; 45 46 class BpSurfaceComposer : public BpInterface<ISurfaceComposer> 47 { 48 public: 49 BpSurfaceComposer(const sp<IBinder>& impl) 50 : BpInterface<ISurfaceComposer>(impl) 51 { 52 } 53 54 virtual sp<ISurfaceComposerClient> createConnection() 55 { 56 uint32_t n; 57 Parcel data, reply; 58 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 59 remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply); 60 return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 61 } 62 63 virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc() 64 { 65 uint32_t n; 66 Parcel data, reply; 67 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 68 remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply); 69 return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder()); 70 } 71 72 virtual void setTransactionState( 73 const Vector<ComposerState>& state, 74 const Vector<DisplayState>& displays, 75 uint32_t flags) 76 { 77 Parcel data, reply; 78 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 79 { 80 Vector<ComposerState>::const_iterator b(state.begin()); 81 Vector<ComposerState>::const_iterator e(state.end()); 82 data.writeInt32(state.size()); 83 for ( ; b != e ; ++b ) { 84 b->write(data); 85 } 86 } 87 { 88 Vector<DisplayState>::const_iterator b(displays.begin()); 89 Vector<DisplayState>::const_iterator e(displays.end()); 90 data.writeInt32(displays.size()); 91 for ( ; b != e ; ++b ) { 92 b->write(data); 93 } 94 } 95 data.writeInt32(flags); 96 remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply); 97 } 98 99 virtual void bootFinished() 100 { 101 Parcel data, reply; 102 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 103 remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply); 104 } 105 106 virtual status_t captureScreen(const sp<IBinder>& display, 107 const sp<IGraphicBufferProducer>& producer, 108 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 109 uint32_t minLayerZ, uint32_t maxLayerZ, 110 bool useIdentityTransform, 111 ISurfaceComposer::Rotation rotation) 112 { 113 Parcel data, reply; 114 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 115 data.writeStrongBinder(display); 116 data.writeStrongBinder(producer->asBinder()); 117 data.write(sourceCrop); 118 data.writeInt32(reqWidth); 119 data.writeInt32(reqHeight); 120 data.writeInt32(minLayerZ); 121 data.writeInt32(maxLayerZ); 122 data.writeInt32(static_cast<int32_t>(useIdentityTransform)); 123 data.writeInt32(static_cast<int32_t>(rotation)); 124 remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply); 125 return reply.readInt32(); 126 } 127 128 virtual bool authenticateSurfaceTexture( 129 const sp<IGraphicBufferProducer>& bufferProducer) const 130 { 131 Parcel data, reply; 132 int err = NO_ERROR; 133 err = data.writeInterfaceToken( 134 ISurfaceComposer::getInterfaceDescriptor()); 135 if (err != NO_ERROR) { 136 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 137 "interface descriptor: %s (%d)", strerror(-err), -err); 138 return false; 139 } 140 err = data.writeStrongBinder(bufferProducer->asBinder()); 141 if (err != NO_ERROR) { 142 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 143 "strong binder to parcel: %s (%d)", strerror(-err), -err); 144 return false; 145 } 146 err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data, 147 &reply); 148 if (err != NO_ERROR) { 149 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 150 "performing transaction: %s (%d)", strerror(-err), -err); 151 return false; 152 } 153 int32_t result = 0; 154 err = reply.readInt32(&result); 155 if (err != NO_ERROR) { 156 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 157 "retrieving result: %s (%d)", strerror(-err), -err); 158 return false; 159 } 160 return result != 0; 161 } 162 163 virtual sp<IDisplayEventConnection> createDisplayEventConnection() 164 { 165 Parcel data, reply; 166 sp<IDisplayEventConnection> result; 167 int err = data.writeInterfaceToken( 168 ISurfaceComposer::getInterfaceDescriptor()); 169 if (err != NO_ERROR) { 170 return result; 171 } 172 err = remote()->transact( 173 BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION, 174 data, &reply); 175 if (err != NO_ERROR) { 176 ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing " 177 "transaction: %s (%d)", strerror(-err), -err); 178 return result; 179 } 180 result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder()); 181 return result; 182 } 183 184 virtual sp<IBinder> createDisplay(const String8& displayName, bool secure) 185 { 186 Parcel data, reply; 187 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 188 data.writeString8(displayName); 189 data.writeInt32(secure ? 1 : 0); 190 remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply); 191 return reply.readStrongBinder(); 192 } 193 194 virtual void destroyDisplay(const sp<IBinder>& display) 195 { 196 Parcel data, reply; 197 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 198 data.writeStrongBinder(display); 199 remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply); 200 } 201 202 virtual sp<IBinder> getBuiltInDisplay(int32_t id) 203 { 204 Parcel data, reply; 205 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 206 data.writeInt32(id); 207 remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply); 208 return reply.readStrongBinder(); 209 } 210 211 virtual void setPowerMode(const sp<IBinder>& display, int mode) 212 { 213 Parcel data, reply; 214 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 215 data.writeStrongBinder(display); 216 data.writeInt32(mode); 217 remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply); 218 } 219 220 virtual status_t getDisplayConfigs(const sp<IBinder>& display, 221 Vector<DisplayInfo>* configs) 222 { 223 Parcel data, reply; 224 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 225 data.writeStrongBinder(display); 226 remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply); 227 status_t result = reply.readInt32(); 228 if (result == NO_ERROR) { 229 size_t numConfigs = static_cast<size_t>(reply.readInt32()); 230 configs->clear(); 231 configs->resize(numConfigs); 232 for (size_t c = 0; c < numConfigs; ++c) { 233 memcpy(&(configs->editItemAt(c)), 234 reply.readInplace(sizeof(DisplayInfo)), 235 sizeof(DisplayInfo)); 236 } 237 } 238 return result; 239 } 240 241 virtual status_t getDisplayStats(const sp<IBinder>& display, 242 DisplayStatInfo* stats) 243 { 244 Parcel data, reply; 245 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 246 data.writeStrongBinder(display); 247 remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply); 248 status_t result = reply.readInt32(); 249 if (result == NO_ERROR) { 250 memcpy(stats, 251 reply.readInplace(sizeof(DisplayStatInfo)), 252 sizeof(DisplayStatInfo)); 253 } 254 return result; 255 } 256 257 virtual int getActiveConfig(const sp<IBinder>& display) 258 { 259 Parcel data, reply; 260 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 261 data.writeStrongBinder(display); 262 remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply); 263 return reply.readInt32(); 264 } 265 266 virtual status_t setActiveConfig(const sp<IBinder>& display, int id) 267 { 268 Parcel data, reply; 269 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 270 data.writeStrongBinder(display); 271 data.writeInt32(id); 272 remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply); 273 return reply.readInt32(); 274 } 275 276 virtual status_t clearAnimationFrameStats() { 277 Parcel data, reply; 278 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 279 remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply); 280 return reply.readInt32(); 281 } 282 283 virtual status_t getAnimationFrameStats(FrameStats* outStats) const { 284 Parcel data, reply; 285 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 286 remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply); 287 reply.read(*outStats); 288 return reply.readInt32(); 289 } 290 }; 291 292 IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer"); 293 294 // ---------------------------------------------------------------------- 295 296 status_t BnSurfaceComposer::onTransact( 297 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 298 { 299 switch(code) { 300 case CREATE_CONNECTION: { 301 CHECK_INTERFACE(ISurfaceComposer, data, reply); 302 sp<IBinder> b = createConnection()->asBinder(); 303 reply->writeStrongBinder(b); 304 return NO_ERROR; 305 } 306 case CREATE_GRAPHIC_BUFFER_ALLOC: { 307 CHECK_INTERFACE(ISurfaceComposer, data, reply); 308 sp<IBinder> b = createGraphicBufferAlloc()->asBinder(); 309 reply->writeStrongBinder(b); 310 return NO_ERROR; 311 } 312 case SET_TRANSACTION_STATE: { 313 CHECK_INTERFACE(ISurfaceComposer, data, reply); 314 size_t count = data.readInt32(); 315 if (count > data.dataSize()) { 316 return BAD_VALUE; 317 } 318 ComposerState s; 319 Vector<ComposerState> state; 320 state.setCapacity(count); 321 for (size_t i=0 ; i<count ; i++) { 322 if (s.read(data) == BAD_VALUE) { 323 return BAD_VALUE; 324 } 325 state.add(s); 326 } 327 count = data.readInt32(); 328 if (count > data.dataSize()) { 329 return BAD_VALUE; 330 } 331 DisplayState d; 332 Vector<DisplayState> displays; 333 displays.setCapacity(count); 334 for (size_t i=0 ; i<count ; i++) { 335 if (d.read(data) == BAD_VALUE) { 336 return BAD_VALUE; 337 } 338 displays.add(d); 339 } 340 uint32_t flags = data.readInt32(); 341 setTransactionState(state, displays, flags); 342 return NO_ERROR; 343 } 344 case BOOT_FINISHED: { 345 CHECK_INTERFACE(ISurfaceComposer, data, reply); 346 bootFinished(); 347 return NO_ERROR; 348 } 349 case CAPTURE_SCREEN: { 350 CHECK_INTERFACE(ISurfaceComposer, data, reply); 351 sp<IBinder> display = data.readStrongBinder(); 352 sp<IGraphicBufferProducer> producer = 353 interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 354 Rect sourceCrop; 355 data.read(sourceCrop); 356 uint32_t reqWidth = data.readInt32(); 357 uint32_t reqHeight = data.readInt32(); 358 uint32_t minLayerZ = data.readInt32(); 359 uint32_t maxLayerZ = data.readInt32(); 360 bool useIdentityTransform = static_cast<bool>(data.readInt32()); 361 uint32_t rotation = data.readInt32(); 362 363 status_t res = captureScreen(display, producer, 364 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, 365 useIdentityTransform, 366 static_cast<ISurfaceComposer::Rotation>(rotation)); 367 reply->writeInt32(res); 368 return NO_ERROR; 369 } 370 case AUTHENTICATE_SURFACE: { 371 CHECK_INTERFACE(ISurfaceComposer, data, reply); 372 sp<IGraphicBufferProducer> bufferProducer = 373 interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 374 int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0; 375 reply->writeInt32(result); 376 return NO_ERROR; 377 } 378 case CREATE_DISPLAY_EVENT_CONNECTION: { 379 CHECK_INTERFACE(ISurfaceComposer, data, reply); 380 sp<IDisplayEventConnection> connection(createDisplayEventConnection()); 381 reply->writeStrongBinder(connection->asBinder()); 382 return NO_ERROR; 383 } 384 case CREATE_DISPLAY: { 385 CHECK_INTERFACE(ISurfaceComposer, data, reply); 386 String8 displayName = data.readString8(); 387 bool secure = bool(data.readInt32()); 388 sp<IBinder> display(createDisplay(displayName, secure)); 389 reply->writeStrongBinder(display); 390 return NO_ERROR; 391 } 392 case DESTROY_DISPLAY: { 393 CHECK_INTERFACE(ISurfaceComposer, data, reply); 394 sp<IBinder> display = data.readStrongBinder(); 395 destroyDisplay(display); 396 return NO_ERROR; 397 } 398 case GET_BUILT_IN_DISPLAY: { 399 CHECK_INTERFACE(ISurfaceComposer, data, reply); 400 int32_t id = data.readInt32(); 401 sp<IBinder> display(getBuiltInDisplay(id)); 402 reply->writeStrongBinder(display); 403 return NO_ERROR; 404 } 405 case GET_DISPLAY_CONFIGS: { 406 CHECK_INTERFACE(ISurfaceComposer, data, reply); 407 Vector<DisplayInfo> configs; 408 sp<IBinder> display = data.readStrongBinder(); 409 status_t result = getDisplayConfigs(display, &configs); 410 reply->writeInt32(result); 411 if (result == NO_ERROR) { 412 reply->writeInt32(static_cast<int32_t>(configs.size())); 413 for (size_t c = 0; c < configs.size(); ++c) { 414 memcpy(reply->writeInplace(sizeof(DisplayInfo)), 415 &configs[c], sizeof(DisplayInfo)); 416 } 417 } 418 return NO_ERROR; 419 } 420 case GET_DISPLAY_STATS: { 421 CHECK_INTERFACE(ISurfaceComposer, data, reply); 422 DisplayStatInfo stats; 423 sp<IBinder> display = data.readStrongBinder(); 424 status_t result = getDisplayStats(display, &stats); 425 reply->writeInt32(result); 426 if (result == NO_ERROR) { 427 memcpy(reply->writeInplace(sizeof(DisplayStatInfo)), 428 &stats, sizeof(DisplayStatInfo)); 429 } 430 return NO_ERROR; 431 } 432 case GET_ACTIVE_CONFIG: { 433 CHECK_INTERFACE(ISurfaceComposer, data, reply); 434 sp<IBinder> display = data.readStrongBinder(); 435 int id = getActiveConfig(display); 436 reply->writeInt32(id); 437 return NO_ERROR; 438 } 439 case SET_ACTIVE_CONFIG: { 440 CHECK_INTERFACE(ISurfaceComposer, data, reply); 441 sp<IBinder> display = data.readStrongBinder(); 442 int id = data.readInt32(); 443 status_t result = setActiveConfig(display, id); 444 reply->writeInt32(result); 445 return NO_ERROR; 446 } 447 case CLEAR_ANIMATION_FRAME_STATS: { 448 CHECK_INTERFACE(ISurfaceComposer, data, reply); 449 status_t result = clearAnimationFrameStats(); 450 reply->writeInt32(result); 451 return NO_ERROR; 452 } 453 case GET_ANIMATION_FRAME_STATS: { 454 CHECK_INTERFACE(ISurfaceComposer, data, reply); 455 FrameStats stats; 456 status_t result = getAnimationFrameStats(&stats); 457 reply->write(stats); 458 reply->writeInt32(result); 459 return NO_ERROR; 460 } 461 case SET_POWER_MODE: { 462 CHECK_INTERFACE(ISurfaceComposer, data, reply); 463 sp<IBinder> display = data.readStrongBinder(); 464 int32_t mode = data.readInt32(); 465 setPowerMode(display, mode); 466 return NO_ERROR; 467 } 468 default: { 469 return BBinder::onTransact(code, data, reply, flags); 470 } 471 } 472 // should be unreachable 473 return NO_ERROR; 474 } 475 476 // ---------------------------------------------------------------------------- 477 478 }; 479