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/IPCThreadState.h> 25 #include <binder/IServiceManager.h> 26 27 #include <gui/IDisplayEventConnection.h> 28 #include <gui/IGraphicBufferProducer.h> 29 #include <gui/ISurfaceComposer.h> 30 #include <gui/ISurfaceComposerClient.h> 31 32 #include <private/gui/LayerState.h> 33 34 #include <system/graphics.h> 35 36 #include <ui/DisplayInfo.h> 37 #include <ui/DisplayStatInfo.h> 38 #include <ui/HdrCapabilities.h> 39 40 #include <utils/Log.h> 41 42 // --------------------------------------------------------------------------- 43 44 namespace android { 45 46 class BpSurfaceComposer : public BpInterface<ISurfaceComposer> 47 { 48 public: 49 explicit BpSurfaceComposer(const sp<IBinder>& impl) 50 : BpInterface<ISurfaceComposer>(impl) 51 { 52 } 53 54 virtual ~BpSurfaceComposer(); 55 56 virtual sp<ISurfaceComposerClient> createConnection() 57 { 58 Parcel data, reply; 59 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 60 remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply); 61 return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 62 } 63 64 virtual sp<ISurfaceComposerClient> createScopedConnection( 65 const sp<IGraphicBufferProducer>& parent) 66 { 67 Parcel data, reply; 68 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 69 data.writeStrongBinder(IInterface::asBinder(parent)); 70 remote()->transact(BnSurfaceComposer::CREATE_SCOPED_CONNECTION, data, &reply); 71 return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 72 } 73 74 virtual void setTransactionState( 75 const Vector<ComposerState>& state, 76 const Vector<DisplayState>& displays, 77 uint32_t flags) 78 { 79 Parcel data, reply; 80 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 81 82 data.writeUint32(static_cast<uint32_t>(state.size())); 83 for (const auto& s : state) { 84 s.write(data); 85 } 86 87 data.writeUint32(static_cast<uint32_t>(displays.size())); 88 for (const auto& d : displays) { 89 d.write(data); 90 } 91 92 data.writeUint32(flags); 93 remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply); 94 } 95 96 virtual void bootFinished() 97 { 98 Parcel data, reply; 99 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 100 remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply); 101 } 102 103 virtual status_t captureScreen(const sp<IBinder>& display, 104 const sp<IGraphicBufferProducer>& producer, 105 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, 106 int32_t minLayerZ, int32_t maxLayerZ, 107 bool useIdentityTransform, 108 ISurfaceComposer::Rotation rotation) 109 { 110 Parcel data, reply; 111 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 112 data.writeStrongBinder(display); 113 data.writeStrongBinder(IInterface::asBinder(producer)); 114 data.write(sourceCrop); 115 data.writeUint32(reqWidth); 116 data.writeUint32(reqHeight); 117 data.writeInt32(minLayerZ); 118 data.writeInt32(maxLayerZ); 119 data.writeInt32(static_cast<int32_t>(useIdentityTransform)); 120 data.writeInt32(static_cast<int32_t>(rotation)); 121 remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply); 122 return reply.readInt32(); 123 } 124 125 virtual bool authenticateSurfaceTexture( 126 const sp<IGraphicBufferProducer>& bufferProducer) const 127 { 128 Parcel data, reply; 129 int err = NO_ERROR; 130 err = data.writeInterfaceToken( 131 ISurfaceComposer::getInterfaceDescriptor()); 132 if (err != NO_ERROR) { 133 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 134 "interface descriptor: %s (%d)", strerror(-err), -err); 135 return false; 136 } 137 err = data.writeStrongBinder(IInterface::asBinder(bufferProducer)); 138 if (err != NO_ERROR) { 139 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 140 "strong binder to parcel: %s (%d)", strerror(-err), -err); 141 return false; 142 } 143 err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data, 144 &reply); 145 if (err != NO_ERROR) { 146 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 147 "performing transaction: %s (%d)", strerror(-err), -err); 148 return false; 149 } 150 int32_t result = 0; 151 err = reply.readInt32(&result); 152 if (err != NO_ERROR) { 153 ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 154 "retrieving result: %s (%d)", strerror(-err), -err); 155 return false; 156 } 157 return result != 0; 158 } 159 160 virtual status_t getSupportedFrameTimestamps( 161 std::vector<FrameEvent>* outSupported) const { 162 if (!outSupported) { 163 return UNEXPECTED_NULL; 164 } 165 outSupported->clear(); 166 167 Parcel data, reply; 168 169 status_t err = data.writeInterfaceToken( 170 ISurfaceComposer::getInterfaceDescriptor()); 171 if (err != NO_ERROR) { 172 return err; 173 } 174 175 err = remote()->transact( 176 BnSurfaceComposer::GET_SUPPORTED_FRAME_TIMESTAMPS, 177 data, &reply); 178 if (err != NO_ERROR) { 179 return err; 180 } 181 182 int32_t result = 0; 183 err = reply.readInt32(&result); 184 if (err != NO_ERROR) { 185 return err; 186 } 187 if (result != NO_ERROR) { 188 return result; 189 } 190 191 std::vector<int32_t> supported; 192 err = reply.readInt32Vector(&supported); 193 if (err != NO_ERROR) { 194 return err; 195 } 196 197 outSupported->reserve(supported.size()); 198 for (int32_t s : supported) { 199 outSupported->push_back(static_cast<FrameEvent>(s)); 200 } 201 return NO_ERROR; 202 } 203 204 virtual sp<IDisplayEventConnection> createDisplayEventConnection(VsyncSource vsyncSource) 205 { 206 Parcel data, reply; 207 sp<IDisplayEventConnection> result; 208 int err = data.writeInterfaceToken( 209 ISurfaceComposer::getInterfaceDescriptor()); 210 if (err != NO_ERROR) { 211 return result; 212 } 213 data.writeInt32(static_cast<int32_t>(vsyncSource)); 214 err = remote()->transact( 215 BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION, 216 data, &reply); 217 if (err != NO_ERROR) { 218 ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing " 219 "transaction: %s (%d)", strerror(-err), -err); 220 return result; 221 } 222 result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder()); 223 return result; 224 } 225 226 virtual sp<IBinder> createDisplay(const String8& displayName, bool secure) 227 { 228 Parcel data, reply; 229 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 230 data.writeString8(displayName); 231 data.writeInt32(secure ? 1 : 0); 232 remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply); 233 return reply.readStrongBinder(); 234 } 235 236 virtual void destroyDisplay(const sp<IBinder>& display) 237 { 238 Parcel data, reply; 239 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 240 data.writeStrongBinder(display); 241 remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply); 242 } 243 244 virtual sp<IBinder> getBuiltInDisplay(int32_t id) 245 { 246 Parcel data, reply; 247 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 248 data.writeInt32(id); 249 remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply); 250 return reply.readStrongBinder(); 251 } 252 253 virtual void setPowerMode(const sp<IBinder>& display, int mode) 254 { 255 Parcel data, reply; 256 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 257 data.writeStrongBinder(display); 258 data.writeInt32(mode); 259 remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply); 260 } 261 262 virtual status_t getDisplayConfigs(const sp<IBinder>& display, 263 Vector<DisplayInfo>* configs) 264 { 265 Parcel data, reply; 266 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 267 data.writeStrongBinder(display); 268 remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply); 269 status_t result = reply.readInt32(); 270 if (result == NO_ERROR) { 271 size_t numConfigs = reply.readUint32(); 272 configs->clear(); 273 configs->resize(numConfigs); 274 for (size_t c = 0; c < numConfigs; ++c) { 275 memcpy(&(configs->editItemAt(c)), 276 reply.readInplace(sizeof(DisplayInfo)), 277 sizeof(DisplayInfo)); 278 } 279 } 280 return result; 281 } 282 283 virtual status_t getDisplayStats(const sp<IBinder>& display, 284 DisplayStatInfo* stats) 285 { 286 Parcel data, reply; 287 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 288 data.writeStrongBinder(display); 289 remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply); 290 status_t result = reply.readInt32(); 291 if (result == NO_ERROR) { 292 memcpy(stats, 293 reply.readInplace(sizeof(DisplayStatInfo)), 294 sizeof(DisplayStatInfo)); 295 } 296 return result; 297 } 298 299 virtual int getActiveConfig(const sp<IBinder>& display) 300 { 301 Parcel data, reply; 302 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 303 data.writeStrongBinder(display); 304 remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply); 305 return reply.readInt32(); 306 } 307 308 virtual status_t setActiveConfig(const sp<IBinder>& display, int id) 309 { 310 Parcel data, reply; 311 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 312 data.writeStrongBinder(display); 313 data.writeInt32(id); 314 remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply); 315 return reply.readInt32(); 316 } 317 318 virtual status_t getDisplayColorModes(const sp<IBinder>& display, 319 Vector<android_color_mode_t>* outColorModes) { 320 Parcel data, reply; 321 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 322 if (result != NO_ERROR) { 323 ALOGE("getDisplayColorModes failed to writeInterfaceToken: %d", result); 324 return result; 325 } 326 result = data.writeStrongBinder(display); 327 if (result != NO_ERROR) { 328 ALOGE("getDisplayColorModes failed to writeStrongBinder: %d", result); 329 return result; 330 } 331 result = remote()->transact(BnSurfaceComposer::GET_DISPLAY_COLOR_MODES, data, &reply); 332 if (result != NO_ERROR) { 333 ALOGE("getDisplayColorModes failed to transact: %d", result); 334 return result; 335 } 336 result = static_cast<status_t>(reply.readInt32()); 337 if (result == NO_ERROR) { 338 size_t numModes = reply.readUint32(); 339 outColorModes->clear(); 340 outColorModes->resize(numModes); 341 for (size_t i = 0; i < numModes; ++i) { 342 outColorModes->replaceAt(static_cast<android_color_mode_t>(reply.readInt32()), i); 343 } 344 } 345 return result; 346 } 347 348 virtual android_color_mode_t getActiveColorMode(const sp<IBinder>& display) { 349 Parcel data, reply; 350 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 351 if (result != NO_ERROR) { 352 ALOGE("getActiveColorMode failed to writeInterfaceToken: %d", result); 353 return static_cast<android_color_mode_t>(result); 354 } 355 result = data.writeStrongBinder(display); 356 if (result != NO_ERROR) { 357 ALOGE("getActiveColorMode failed to writeStrongBinder: %d", result); 358 return static_cast<android_color_mode_t>(result); 359 } 360 result = remote()->transact(BnSurfaceComposer::GET_ACTIVE_COLOR_MODE, data, &reply); 361 if (result != NO_ERROR) { 362 ALOGE("getActiveColorMode failed to transact: %d", result); 363 return static_cast<android_color_mode_t>(result); 364 } 365 return static_cast<android_color_mode_t>(reply.readInt32()); 366 } 367 368 virtual status_t setActiveColorMode(const sp<IBinder>& display, 369 android_color_mode_t colorMode) { 370 Parcel data, reply; 371 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 372 if (result != NO_ERROR) { 373 ALOGE("setActiveColorMode failed to writeInterfaceToken: %d", result); 374 return result; 375 } 376 result = data.writeStrongBinder(display); 377 if (result != NO_ERROR) { 378 ALOGE("setActiveColorMode failed to writeStrongBinder: %d", result); 379 return result; 380 } 381 result = data.writeInt32(colorMode); 382 if (result != NO_ERROR) { 383 ALOGE("setActiveColorMode failed to writeInt32: %d", result); 384 return result; 385 } 386 result = remote()->transact(BnSurfaceComposer::SET_ACTIVE_COLOR_MODE, data, &reply); 387 if (result != NO_ERROR) { 388 ALOGE("setActiveColorMode failed to transact: %d", result); 389 return result; 390 } 391 return static_cast<status_t>(reply.readInt32()); 392 } 393 394 virtual status_t clearAnimationFrameStats() { 395 Parcel data, reply; 396 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 397 remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply); 398 return reply.readInt32(); 399 } 400 401 virtual status_t getAnimationFrameStats(FrameStats* outStats) const { 402 Parcel data, reply; 403 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 404 remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply); 405 reply.read(*outStats); 406 return reply.readInt32(); 407 } 408 409 virtual status_t getHdrCapabilities(const sp<IBinder>& display, 410 HdrCapabilities* outCapabilities) const { 411 Parcel data, reply; 412 data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 413 status_t result = data.writeStrongBinder(display); 414 if (result != NO_ERROR) { 415 ALOGE("getHdrCapabilities failed to writeStrongBinder: %d", result); 416 return result; 417 } 418 result = remote()->transact(BnSurfaceComposer::GET_HDR_CAPABILITIES, 419 data, &reply); 420 if (result != NO_ERROR) { 421 ALOGE("getHdrCapabilities failed to transact: %d", result); 422 return result; 423 } 424 result = reply.readInt32(); 425 if (result == NO_ERROR) { 426 result = reply.read(*outCapabilities); 427 } 428 return result; 429 } 430 431 virtual status_t enableVSyncInjections(bool enable) { 432 Parcel data, reply; 433 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 434 if (result != NO_ERROR) { 435 ALOGE("enableVSyncInjections failed to writeInterfaceToken: %d", result); 436 return result; 437 } 438 result = data.writeBool(enable); 439 if (result != NO_ERROR) { 440 ALOGE("enableVSyncInjections failed to writeBool: %d", result); 441 return result; 442 } 443 result = remote()->transact(BnSurfaceComposer::ENABLE_VSYNC_INJECTIONS, 444 data, &reply, TF_ONE_WAY); 445 if (result != NO_ERROR) { 446 ALOGE("enableVSyncInjections failed to transact: %d", result); 447 return result; 448 } 449 return result; 450 } 451 452 virtual status_t injectVSync(nsecs_t when) { 453 Parcel data, reply; 454 status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 455 if (result != NO_ERROR) { 456 ALOGE("injectVSync failed to writeInterfaceToken: %d", result); 457 return result; 458 } 459 result = data.writeInt64(when); 460 if (result != NO_ERROR) { 461 ALOGE("injectVSync failed to writeInt64: %d", result); 462 return result; 463 } 464 result = remote()->transact(BnSurfaceComposer::INJECT_VSYNC, data, &reply, TF_ONE_WAY); 465 if (result != NO_ERROR) { 466 ALOGE("injectVSync failed to transact: %d", result); 467 return result; 468 } 469 return result; 470 } 471 472 }; 473 474 // Out-of-line virtual method definition to trigger vtable emission in this 475 // translation unit (see clang warning -Wweak-vtables) 476 BpSurfaceComposer::~BpSurfaceComposer() {} 477 478 IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer"); 479 480 // ---------------------------------------------------------------------- 481 482 status_t BnSurfaceComposer::onTransact( 483 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 484 { 485 switch(code) { 486 case CREATE_CONNECTION: { 487 CHECK_INTERFACE(ISurfaceComposer, data, reply); 488 sp<IBinder> b = IInterface::asBinder(createConnection()); 489 reply->writeStrongBinder(b); 490 return NO_ERROR; 491 } 492 case CREATE_SCOPED_CONNECTION: { 493 CHECK_INTERFACE(ISurfaceComposer, data, reply); 494 sp<IGraphicBufferProducer> bufferProducer = 495 interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 496 sp<IBinder> b = IInterface::asBinder(createScopedConnection(bufferProducer)); 497 reply->writeStrongBinder(b); 498 return NO_ERROR; 499 } 500 case SET_TRANSACTION_STATE: { 501 CHECK_INTERFACE(ISurfaceComposer, data, reply); 502 503 size_t count = data.readUint32(); 504 if (count > data.dataSize()) { 505 return BAD_VALUE; 506 } 507 ComposerState s; 508 Vector<ComposerState> state; 509 state.setCapacity(count); 510 for (size_t i = 0; i < count; i++) { 511 if (s.read(data) == BAD_VALUE) { 512 return BAD_VALUE; 513 } 514 state.add(s); 515 } 516 517 count = data.readUint32(); 518 if (count > data.dataSize()) { 519 return BAD_VALUE; 520 } 521 DisplayState d; 522 Vector<DisplayState> displays; 523 displays.setCapacity(count); 524 for (size_t i = 0; i < count; i++) { 525 if (d.read(data) == BAD_VALUE) { 526 return BAD_VALUE; 527 } 528 displays.add(d); 529 } 530 531 uint32_t stateFlags = data.readUint32(); 532 setTransactionState(state, displays, stateFlags); 533 return NO_ERROR; 534 } 535 case BOOT_FINISHED: { 536 CHECK_INTERFACE(ISurfaceComposer, data, reply); 537 bootFinished(); 538 return NO_ERROR; 539 } 540 case CAPTURE_SCREEN: { 541 CHECK_INTERFACE(ISurfaceComposer, data, reply); 542 sp<IBinder> display = data.readStrongBinder(); 543 sp<IGraphicBufferProducer> producer = 544 interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 545 Rect sourceCrop(Rect::EMPTY_RECT); 546 data.read(sourceCrop); 547 uint32_t reqWidth = data.readUint32(); 548 uint32_t reqHeight = data.readUint32(); 549 int32_t minLayerZ = data.readInt32(); 550 int32_t maxLayerZ = data.readInt32(); 551 bool useIdentityTransform = static_cast<bool>(data.readInt32()); 552 int32_t rotation = data.readInt32(); 553 554 status_t res = captureScreen(display, producer, 555 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, 556 useIdentityTransform, 557 static_cast<ISurfaceComposer::Rotation>(rotation)); 558 reply->writeInt32(res); 559 return NO_ERROR; 560 } 561 case AUTHENTICATE_SURFACE: { 562 CHECK_INTERFACE(ISurfaceComposer, data, reply); 563 sp<IGraphicBufferProducer> bufferProducer = 564 interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 565 int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0; 566 reply->writeInt32(result); 567 return NO_ERROR; 568 } 569 case GET_SUPPORTED_FRAME_TIMESTAMPS: { 570 CHECK_INTERFACE(ISurfaceComposer, data, reply); 571 std::vector<FrameEvent> supportedTimestamps; 572 status_t result = getSupportedFrameTimestamps(&supportedTimestamps); 573 status_t err = reply->writeInt32(result); 574 if (err != NO_ERROR) { 575 return err; 576 } 577 if (result != NO_ERROR) { 578 return result; 579 } 580 581 std::vector<int32_t> supported; 582 supported.reserve(supportedTimestamps.size()); 583 for (FrameEvent s : supportedTimestamps) { 584 supported.push_back(static_cast<int32_t>(s)); 585 } 586 return reply->writeInt32Vector(supported); 587 } 588 case CREATE_DISPLAY_EVENT_CONNECTION: { 589 CHECK_INTERFACE(ISurfaceComposer, data, reply); 590 sp<IDisplayEventConnection> connection(createDisplayEventConnection( 591 static_cast<ISurfaceComposer::VsyncSource>(data.readInt32()))); 592 reply->writeStrongBinder(IInterface::asBinder(connection)); 593 return NO_ERROR; 594 } 595 case CREATE_DISPLAY: { 596 CHECK_INTERFACE(ISurfaceComposer, data, reply); 597 String8 displayName = data.readString8(); 598 bool secure = bool(data.readInt32()); 599 sp<IBinder> display(createDisplay(displayName, secure)); 600 reply->writeStrongBinder(display); 601 return NO_ERROR; 602 } 603 case DESTROY_DISPLAY: { 604 CHECK_INTERFACE(ISurfaceComposer, data, reply); 605 sp<IBinder> display = data.readStrongBinder(); 606 destroyDisplay(display); 607 return NO_ERROR; 608 } 609 case GET_BUILT_IN_DISPLAY: { 610 CHECK_INTERFACE(ISurfaceComposer, data, reply); 611 int32_t id = data.readInt32(); 612 sp<IBinder> display(getBuiltInDisplay(id)); 613 reply->writeStrongBinder(display); 614 return NO_ERROR; 615 } 616 case GET_DISPLAY_CONFIGS: { 617 CHECK_INTERFACE(ISurfaceComposer, data, reply); 618 Vector<DisplayInfo> configs; 619 sp<IBinder> display = data.readStrongBinder(); 620 status_t result = getDisplayConfigs(display, &configs); 621 reply->writeInt32(result); 622 if (result == NO_ERROR) { 623 reply->writeUint32(static_cast<uint32_t>(configs.size())); 624 for (size_t c = 0; c < configs.size(); ++c) { 625 memcpy(reply->writeInplace(sizeof(DisplayInfo)), 626 &configs[c], sizeof(DisplayInfo)); 627 } 628 } 629 return NO_ERROR; 630 } 631 case GET_DISPLAY_STATS: { 632 CHECK_INTERFACE(ISurfaceComposer, data, reply); 633 DisplayStatInfo stats; 634 sp<IBinder> display = data.readStrongBinder(); 635 status_t result = getDisplayStats(display, &stats); 636 reply->writeInt32(result); 637 if (result == NO_ERROR) { 638 memcpy(reply->writeInplace(sizeof(DisplayStatInfo)), 639 &stats, sizeof(DisplayStatInfo)); 640 } 641 return NO_ERROR; 642 } 643 case GET_ACTIVE_CONFIG: { 644 CHECK_INTERFACE(ISurfaceComposer, data, reply); 645 sp<IBinder> display = data.readStrongBinder(); 646 int id = getActiveConfig(display); 647 reply->writeInt32(id); 648 return NO_ERROR; 649 } 650 case SET_ACTIVE_CONFIG: { 651 CHECK_INTERFACE(ISurfaceComposer, data, reply); 652 sp<IBinder> display = data.readStrongBinder(); 653 int id = data.readInt32(); 654 status_t result = setActiveConfig(display, id); 655 reply->writeInt32(result); 656 return NO_ERROR; 657 } 658 case GET_DISPLAY_COLOR_MODES: { 659 CHECK_INTERFACE(ISurfaceComposer, data, reply); 660 Vector<android_color_mode_t> colorModes; 661 sp<IBinder> display = nullptr; 662 status_t result = data.readStrongBinder(&display); 663 if (result != NO_ERROR) { 664 ALOGE("getDisplayColorModes failed to readStrongBinder: %d", result); 665 return result; 666 } 667 result = getDisplayColorModes(display, &colorModes); 668 reply->writeInt32(result); 669 if (result == NO_ERROR) { 670 reply->writeUint32(static_cast<uint32_t>(colorModes.size())); 671 for (size_t i = 0; i < colorModes.size(); ++i) { 672 reply->writeInt32(colorModes[i]); 673 } 674 } 675 return NO_ERROR; 676 } 677 case GET_ACTIVE_COLOR_MODE: { 678 CHECK_INTERFACE(ISurfaceComposer, data, reply); 679 sp<IBinder> display = nullptr; 680 status_t result = data.readStrongBinder(&display); 681 if (result != NO_ERROR) { 682 ALOGE("getActiveColorMode failed to readStrongBinder: %d", result); 683 return result; 684 } 685 android_color_mode_t colorMode = getActiveColorMode(display); 686 result = reply->writeInt32(static_cast<int32_t>(colorMode)); 687 return result; 688 } 689 case SET_ACTIVE_COLOR_MODE: { 690 CHECK_INTERFACE(ISurfaceComposer, data, reply); 691 sp<IBinder> display = nullptr; 692 status_t result = data.readStrongBinder(&display); 693 if (result != NO_ERROR) { 694 ALOGE("getActiveColorMode failed to readStrongBinder: %d", result); 695 return result; 696 } 697 int32_t colorModeInt = 0; 698 result = data.readInt32(&colorModeInt); 699 if (result != NO_ERROR) { 700 ALOGE("setActiveColorMode failed to readInt32: %d", result); 701 return result; 702 } 703 result = setActiveColorMode(display, 704 static_cast<android_color_mode_t>(colorModeInt)); 705 result = reply->writeInt32(result); 706 return result; 707 } 708 case CLEAR_ANIMATION_FRAME_STATS: { 709 CHECK_INTERFACE(ISurfaceComposer, data, reply); 710 status_t result = clearAnimationFrameStats(); 711 reply->writeInt32(result); 712 return NO_ERROR; 713 } 714 case GET_ANIMATION_FRAME_STATS: { 715 CHECK_INTERFACE(ISurfaceComposer, data, reply); 716 FrameStats stats; 717 status_t result = getAnimationFrameStats(&stats); 718 reply->write(stats); 719 reply->writeInt32(result); 720 return NO_ERROR; 721 } 722 case SET_POWER_MODE: { 723 CHECK_INTERFACE(ISurfaceComposer, data, reply); 724 sp<IBinder> display = data.readStrongBinder(); 725 int32_t mode = data.readInt32(); 726 setPowerMode(display, mode); 727 return NO_ERROR; 728 } 729 case GET_HDR_CAPABILITIES: { 730 CHECK_INTERFACE(ISurfaceComposer, data, reply); 731 sp<IBinder> display = nullptr; 732 status_t result = data.readStrongBinder(&display); 733 if (result != NO_ERROR) { 734 ALOGE("getHdrCapabilities failed to readStrongBinder: %d", 735 result); 736 return result; 737 } 738 HdrCapabilities capabilities; 739 result = getHdrCapabilities(display, &capabilities); 740 reply->writeInt32(result); 741 if (result == NO_ERROR) { 742 reply->write(capabilities); 743 } 744 return NO_ERROR; 745 } 746 case ENABLE_VSYNC_INJECTIONS: { 747 CHECK_INTERFACE(ISurfaceComposer, data, reply); 748 bool enable = false; 749 status_t result = data.readBool(&enable); 750 if (result != NO_ERROR) { 751 ALOGE("enableVSyncInjections failed to readBool: %d", result); 752 return result; 753 } 754 return enableVSyncInjections(enable); 755 } 756 case INJECT_VSYNC: { 757 CHECK_INTERFACE(ISurfaceComposer, data, reply); 758 int64_t when = 0; 759 status_t result = data.readInt64(&when); 760 if (result != NO_ERROR) { 761 ALOGE("enableVSyncInjections failed to readInt64: %d", result); 762 return result; 763 } 764 return injectVSync(when); 765 } 766 default: { 767 return BBinder::onTransact(code, data, reply, flags); 768 } 769 } 770 } 771 772 // ---------------------------------------------------------------------------- 773 774 }; 775