Home | History | Annotate | Download | only in gui
      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/IRegionSamplingListener.h>
     30 #include <gui/ISurfaceComposer.h>
     31 #include <gui/ISurfaceComposerClient.h>
     32 #include <gui/LayerDebugInfo.h>
     33 #include <gui/LayerState.h>
     34 
     35 #include <system/graphics.h>
     36 
     37 #include <ui/DisplayInfo.h>
     38 #include <ui/DisplayStatInfo.h>
     39 #include <ui/HdrCapabilities.h>
     40 
     41 #include <utils/Log.h>
     42 
     43 // ---------------------------------------------------------------------------
     44 
     45 namespace android {
     46 
     47 using ui::ColorMode;
     48 
     49 class BpSurfaceComposer : public BpInterface<ISurfaceComposer>
     50 {
     51 public:
     52     explicit BpSurfaceComposer(const sp<IBinder>& impl)
     53         : BpInterface<ISurfaceComposer>(impl)
     54     {
     55     }
     56 
     57     virtual ~BpSurfaceComposer();
     58 
     59     virtual sp<ISurfaceComposerClient> createConnection()
     60     {
     61         Parcel data, reply;
     62         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
     63         remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
     64         return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
     65     }
     66 
     67     virtual void setTransactionState(const Vector<ComposerState>& state,
     68                                      const Vector<DisplayState>& displays, uint32_t flags,
     69                                      const sp<IBinder>& applyToken,
     70                                      const InputWindowCommands& commands,
     71                                      int64_t desiredPresentTime,
     72                                      const client_cache_t& uncacheBuffer,
     73                                      const std::vector<ListenerCallbacks>& listenerCallbacks) {
     74         Parcel data, reply;
     75         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
     76 
     77         data.writeUint32(static_cast<uint32_t>(state.size()));
     78         for (const auto& s : state) {
     79             s.write(data);
     80         }
     81 
     82         data.writeUint32(static_cast<uint32_t>(displays.size()));
     83         for (const auto& d : displays) {
     84             d.write(data);
     85         }
     86 
     87         data.writeUint32(flags);
     88         data.writeStrongBinder(applyToken);
     89         commands.write(data);
     90         data.writeInt64(desiredPresentTime);
     91         data.writeWeakBinder(uncacheBuffer.token);
     92         data.writeUint64(uncacheBuffer.id);
     93 
     94         if (data.writeVectorSize(listenerCallbacks) == NO_ERROR) {
     95             for (const auto& [listener, callbackIds] : listenerCallbacks) {
     96                 data.writeStrongBinder(IInterface::asBinder(listener));
     97                 data.writeInt64Vector(callbackIds);
     98             }
     99         }
    100 
    101         remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
    102     }
    103 
    104     virtual void bootFinished()
    105     {
    106         Parcel data, reply;
    107         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    108         remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply);
    109     }
    110 
    111     virtual status_t captureScreen(const sp<IBinder>& display, sp<GraphicBuffer>* outBuffer,
    112                                    bool& outCapturedSecureLayers, const ui::Dataspace reqDataspace,
    113                                    const ui::PixelFormat reqPixelFormat, Rect sourceCrop,
    114                                    uint32_t reqWidth, uint32_t reqHeight, bool useIdentityTransform,
    115                                    ISurfaceComposer::Rotation rotation, bool captureSecureLayers) {
    116         Parcel data, reply;
    117         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    118         data.writeStrongBinder(display);
    119         data.writeInt32(static_cast<int32_t>(reqDataspace));
    120         data.writeInt32(static_cast<int32_t>(reqPixelFormat));
    121         data.write(sourceCrop);
    122         data.writeUint32(reqWidth);
    123         data.writeUint32(reqHeight);
    124         data.writeInt32(static_cast<int32_t>(useIdentityTransform));
    125         data.writeInt32(static_cast<int32_t>(rotation));
    126         data.writeInt32(static_cast<int32_t>(captureSecureLayers));
    127         status_t result = remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
    128         if (result != NO_ERROR) {
    129             ALOGE("captureScreen failed to transact: %d", result);
    130             return result;
    131         }
    132         result = reply.readInt32();
    133         if (result != NO_ERROR) {
    134             ALOGE("captureScreen failed to readInt32: %d", result);
    135             return result;
    136         }
    137 
    138         *outBuffer = new GraphicBuffer();
    139         reply.read(**outBuffer);
    140         outCapturedSecureLayers = reply.readBool();
    141 
    142         return result;
    143     }
    144 
    145     virtual status_t captureScreen(uint64_t displayOrLayerStack, ui::Dataspace* outDataspace,
    146                                    sp<GraphicBuffer>* outBuffer) {
    147         Parcel data, reply;
    148         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    149         data.writeUint64(displayOrLayerStack);
    150         status_t result = remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN_BY_ID, data, &reply);
    151         if (result != NO_ERROR) {
    152             ALOGE("captureScreen failed to transact: %d", result);
    153             return result;
    154         }
    155         result = reply.readInt32();
    156         if (result != NO_ERROR) {
    157             ALOGE("captureScreen failed to readInt32: %d", result);
    158             return result;
    159         }
    160 
    161         *outDataspace = static_cast<ui::Dataspace>(reply.readInt32());
    162         *outBuffer = new GraphicBuffer();
    163         reply.read(**outBuffer);
    164         return result;
    165     }
    166 
    167     virtual status_t captureLayers(
    168             const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer,
    169             const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat,
    170             const Rect& sourceCrop,
    171             const std::unordered_set<sp<IBinder>, SpHash<IBinder>>& excludeLayers, float frameScale,
    172             bool childrenOnly) {
    173         Parcel data, reply;
    174         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    175         data.writeStrongBinder(layerHandleBinder);
    176         data.writeInt32(static_cast<int32_t>(reqDataspace));
    177         data.writeInt32(static_cast<int32_t>(reqPixelFormat));
    178         data.write(sourceCrop);
    179         data.writeInt32(excludeLayers.size());
    180         for (auto el : excludeLayers) {
    181             data.writeStrongBinder(el);
    182         }
    183         data.writeFloat(frameScale);
    184         data.writeBool(childrenOnly);
    185         status_t result = remote()->transact(BnSurfaceComposer::CAPTURE_LAYERS, data, &reply);
    186         if (result != NO_ERROR) {
    187             ALOGE("captureLayers failed to transact: %d", result);
    188             return result;
    189         }
    190         result = reply.readInt32();
    191         if (result != NO_ERROR) {
    192             ALOGE("captureLayers failed to readInt32: %d", result);
    193             return result;
    194         }
    195 
    196         *outBuffer = new GraphicBuffer();
    197         reply.read(**outBuffer);
    198 
    199         return result;
    200     }
    201 
    202     virtual bool authenticateSurfaceTexture(
    203             const sp<IGraphicBufferProducer>& bufferProducer) const
    204     {
    205         Parcel data, reply;
    206         int err = NO_ERROR;
    207         err = data.writeInterfaceToken(
    208                 ISurfaceComposer::getInterfaceDescriptor());
    209         if (err != NO_ERROR) {
    210             ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
    211                     "interface descriptor: %s (%d)", strerror(-err), -err);
    212             return false;
    213         }
    214         err = data.writeStrongBinder(IInterface::asBinder(bufferProducer));
    215         if (err != NO_ERROR) {
    216             ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
    217                     "strong binder to parcel: %s (%d)", strerror(-err), -err);
    218             return false;
    219         }
    220         err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
    221                 &reply);
    222         if (err != NO_ERROR) {
    223             ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
    224                     "performing transaction: %s (%d)", strerror(-err), -err);
    225             return false;
    226         }
    227         int32_t result = 0;
    228         err = reply.readInt32(&result);
    229         if (err != NO_ERROR) {
    230             ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
    231                     "retrieving result: %s (%d)", strerror(-err), -err);
    232             return false;
    233         }
    234         return result != 0;
    235     }
    236 
    237     virtual status_t getSupportedFrameTimestamps(
    238             std::vector<FrameEvent>* outSupported) const {
    239         if (!outSupported) {
    240             return UNEXPECTED_NULL;
    241         }
    242         outSupported->clear();
    243 
    244         Parcel data, reply;
    245 
    246         status_t err = data.writeInterfaceToken(
    247                 ISurfaceComposer::getInterfaceDescriptor());
    248         if (err != NO_ERROR) {
    249             return err;
    250         }
    251 
    252         err = remote()->transact(
    253                 BnSurfaceComposer::GET_SUPPORTED_FRAME_TIMESTAMPS,
    254                 data, &reply);
    255         if (err != NO_ERROR) {
    256             return err;
    257         }
    258 
    259         int32_t result = 0;
    260         err = reply.readInt32(&result);
    261         if (err != NO_ERROR) {
    262             return err;
    263         }
    264         if (result != NO_ERROR) {
    265             return result;
    266         }
    267 
    268         std::vector<int32_t> supported;
    269         err = reply.readInt32Vector(&supported);
    270         if (err != NO_ERROR) {
    271             return err;
    272         }
    273 
    274         outSupported->reserve(supported.size());
    275         for (int32_t s : supported) {
    276             outSupported->push_back(static_cast<FrameEvent>(s));
    277         }
    278         return NO_ERROR;
    279     }
    280 
    281     virtual sp<IDisplayEventConnection> createDisplayEventConnection(VsyncSource vsyncSource)
    282     {
    283         Parcel data, reply;
    284         sp<IDisplayEventConnection> result;
    285         int err = data.writeInterfaceToken(
    286                 ISurfaceComposer::getInterfaceDescriptor());
    287         if (err != NO_ERROR) {
    288             return result;
    289         }
    290         data.writeInt32(static_cast<int32_t>(vsyncSource));
    291         err = remote()->transact(
    292                 BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
    293                 data, &reply);
    294         if (err != NO_ERROR) {
    295             ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
    296                     "transaction: %s (%d)", strerror(-err), -err);
    297             return result;
    298         }
    299         result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder());
    300         return result;
    301     }
    302 
    303     virtual sp<IBinder> createDisplay(const String8& displayName, bool secure)
    304     {
    305         Parcel data, reply;
    306         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    307         data.writeString8(displayName);
    308         data.writeInt32(secure ? 1 : 0);
    309         remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply);
    310         return reply.readStrongBinder();
    311     }
    312 
    313     virtual void destroyDisplay(const sp<IBinder>& display)
    314     {
    315         Parcel data, reply;
    316         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    317         data.writeStrongBinder(display);
    318         remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply);
    319     }
    320 
    321     virtual std::vector<PhysicalDisplayId> getPhysicalDisplayIds() const {
    322         Parcel data, reply;
    323         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    324         if (remote()->transact(BnSurfaceComposer::GET_PHYSICAL_DISPLAY_IDS, data, &reply) ==
    325             NO_ERROR) {
    326             std::vector<PhysicalDisplayId> displayIds;
    327             if (reply.readUint64Vector(&displayIds) == NO_ERROR) {
    328                 return displayIds;
    329             }
    330         }
    331 
    332         return {};
    333     }
    334 
    335     virtual sp<IBinder> getPhysicalDisplayToken(PhysicalDisplayId displayId) const {
    336         Parcel data, reply;
    337         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    338         data.writeUint64(displayId);
    339         remote()->transact(BnSurfaceComposer::GET_PHYSICAL_DISPLAY_TOKEN, data, &reply);
    340         return reply.readStrongBinder();
    341     }
    342 
    343     virtual void setPowerMode(const sp<IBinder>& display, int mode)
    344     {
    345         Parcel data, reply;
    346         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    347         data.writeStrongBinder(display);
    348         data.writeInt32(mode);
    349         remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply);
    350     }
    351 
    352     virtual status_t getDisplayConfigs(const sp<IBinder>& display,
    353             Vector<DisplayInfo>* configs)
    354     {
    355         Parcel data, reply;
    356         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    357         data.writeStrongBinder(display);
    358         remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply);
    359         status_t result = reply.readInt32();
    360         if (result == NO_ERROR) {
    361             size_t numConfigs = reply.readUint32();
    362             configs->clear();
    363             configs->resize(numConfigs);
    364             for (size_t c = 0; c < numConfigs; ++c) {
    365                 memcpy(&(configs->editItemAt(c)),
    366                         reply.readInplace(sizeof(DisplayInfo)),
    367                         sizeof(DisplayInfo));
    368             }
    369         }
    370         return result;
    371     }
    372 
    373     virtual status_t getDisplayStats(const sp<IBinder>& display,
    374             DisplayStatInfo* stats)
    375     {
    376         Parcel data, reply;
    377         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    378         data.writeStrongBinder(display);
    379         remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply);
    380         status_t result = reply.readInt32();
    381         if (result == NO_ERROR) {
    382             memcpy(stats,
    383                     reply.readInplace(sizeof(DisplayStatInfo)),
    384                     sizeof(DisplayStatInfo));
    385         }
    386         return result;
    387     }
    388 
    389     virtual int getActiveConfig(const sp<IBinder>& display)
    390     {
    391         Parcel data, reply;
    392         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    393         data.writeStrongBinder(display);
    394         remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply);
    395         return reply.readInt32();
    396     }
    397 
    398     virtual status_t setActiveConfig(const sp<IBinder>& display, int id)
    399     {
    400         Parcel data, reply;
    401         status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    402         if (result != NO_ERROR) {
    403             ALOGE("setActiveConfig failed to writeInterfaceToken: %d", result);
    404             return result;
    405         }
    406         result = data.writeStrongBinder(display);
    407         if (result != NO_ERROR) {
    408             ALOGE("setActiveConfig failed to writeStrongBinder: %d", result);
    409             return result;
    410         }
    411         result = data.writeInt32(id);
    412         if (result != NO_ERROR) {
    413             ALOGE("setActiveConfig failed to writeInt32: %d", result);
    414             return result;
    415         }
    416         result = remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply);
    417         if (result != NO_ERROR) {
    418             ALOGE("setActiveConfig failed to transact: %d", result);
    419             return result;
    420         }
    421         return reply.readInt32();
    422     }
    423 
    424     virtual status_t getDisplayColorModes(const sp<IBinder>& display,
    425             Vector<ColorMode>* outColorModes) {
    426         Parcel data, reply;
    427         status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    428         if (result != NO_ERROR) {
    429             ALOGE("getDisplayColorModes failed to writeInterfaceToken: %d", result);
    430             return result;
    431         }
    432         result = data.writeStrongBinder(display);
    433         if (result != NO_ERROR) {
    434             ALOGE("getDisplayColorModes failed to writeStrongBinder: %d", result);
    435             return result;
    436         }
    437         result = remote()->transact(BnSurfaceComposer::GET_DISPLAY_COLOR_MODES, data, &reply);
    438         if (result != NO_ERROR) {
    439             ALOGE("getDisplayColorModes failed to transact: %d", result);
    440             return result;
    441         }
    442         result = static_cast<status_t>(reply.readInt32());
    443         if (result == NO_ERROR) {
    444             size_t numModes = reply.readUint32();
    445             outColorModes->clear();
    446             outColorModes->resize(numModes);
    447             for (size_t i = 0; i < numModes; ++i) {
    448                 outColorModes->replaceAt(static_cast<ColorMode>(reply.readInt32()), i);
    449             }
    450         }
    451         return result;
    452     }
    453 
    454     virtual status_t getDisplayNativePrimaries(const sp<IBinder>& display,
    455             ui::DisplayPrimaries& primaries) {
    456         Parcel data, reply;
    457         status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    458         if (result != NO_ERROR) {
    459             ALOGE("getDisplayNativePrimaries failed to writeInterfaceToken: %d", result);
    460             return result;
    461         }
    462         result = data.writeStrongBinder(display);
    463         if (result != NO_ERROR) {
    464             ALOGE("getDisplayNativePrimaries failed to writeStrongBinder: %d", result);
    465             return result;
    466         }
    467         result = remote()->transact(BnSurfaceComposer::GET_DISPLAY_NATIVE_PRIMARIES, data, &reply);
    468         if (result != NO_ERROR) {
    469             ALOGE("getDisplayNativePrimaries failed to transact: %d", result);
    470             return result;
    471         }
    472         result = reply.readInt32();
    473         if (result == NO_ERROR) {
    474             memcpy(&primaries, reply.readInplace(sizeof(ui::DisplayPrimaries)),
    475                     sizeof(ui::DisplayPrimaries));
    476         }
    477         return result;
    478     }
    479 
    480     virtual ColorMode getActiveColorMode(const sp<IBinder>& display) {
    481         Parcel data, reply;
    482         status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    483         if (result != NO_ERROR) {
    484             ALOGE("getActiveColorMode failed to writeInterfaceToken: %d", result);
    485             return static_cast<ColorMode>(result);
    486         }
    487         result = data.writeStrongBinder(display);
    488         if (result != NO_ERROR) {
    489             ALOGE("getActiveColorMode failed to writeStrongBinder: %d", result);
    490             return static_cast<ColorMode>(result);
    491         }
    492         result = remote()->transact(BnSurfaceComposer::GET_ACTIVE_COLOR_MODE, data, &reply);
    493         if (result != NO_ERROR) {
    494             ALOGE("getActiveColorMode failed to transact: %d", result);
    495             return static_cast<ColorMode>(result);
    496         }
    497         return static_cast<ColorMode>(reply.readInt32());
    498     }
    499 
    500     virtual status_t setActiveColorMode(const sp<IBinder>& display,
    501             ColorMode colorMode) {
    502         Parcel data, reply;
    503         status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    504         if (result != NO_ERROR) {
    505             ALOGE("setActiveColorMode failed to writeInterfaceToken: %d", result);
    506             return result;
    507         }
    508         result = data.writeStrongBinder(display);
    509         if (result != NO_ERROR) {
    510             ALOGE("setActiveColorMode failed to writeStrongBinder: %d", result);
    511             return result;
    512         }
    513         result = data.writeInt32(static_cast<int32_t>(colorMode));
    514         if (result != NO_ERROR) {
    515             ALOGE("setActiveColorMode failed to writeInt32: %d", result);
    516             return result;
    517         }
    518         result = remote()->transact(BnSurfaceComposer::SET_ACTIVE_COLOR_MODE, data, &reply);
    519         if (result != NO_ERROR) {
    520             ALOGE("setActiveColorMode failed to transact: %d", result);
    521             return result;
    522         }
    523         return static_cast<status_t>(reply.readInt32());
    524     }
    525 
    526     virtual status_t clearAnimationFrameStats() {
    527         Parcel data, reply;
    528         status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    529         if (result != NO_ERROR) {
    530             ALOGE("clearAnimationFrameStats failed to writeInterfaceToken: %d", result);
    531             return result;
    532         }
    533         result = remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply);
    534         if (result != NO_ERROR) {
    535             ALOGE("clearAnimationFrameStats failed to transact: %d", result);
    536             return result;
    537         }
    538         return reply.readInt32();
    539     }
    540 
    541     virtual status_t getAnimationFrameStats(FrameStats* outStats) const {
    542         Parcel data, reply;
    543         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    544         remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply);
    545         reply.read(*outStats);
    546         return reply.readInt32();
    547     }
    548 
    549     virtual status_t getHdrCapabilities(const sp<IBinder>& display,
    550             HdrCapabilities* outCapabilities) const {
    551         Parcel data, reply;
    552         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    553         status_t result = data.writeStrongBinder(display);
    554         if (result != NO_ERROR) {
    555             ALOGE("getHdrCapabilities failed to writeStrongBinder: %d", result);
    556             return result;
    557         }
    558         result = remote()->transact(BnSurfaceComposer::GET_HDR_CAPABILITIES,
    559                 data, &reply);
    560         if (result != NO_ERROR) {
    561             ALOGE("getHdrCapabilities failed to transact: %d", result);
    562             return result;
    563         }
    564         result = reply.readInt32();
    565         if (result == NO_ERROR) {
    566             result = reply.read(*outCapabilities);
    567         }
    568         return result;
    569     }
    570 
    571     virtual status_t enableVSyncInjections(bool enable) {
    572         Parcel data, reply;
    573         status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    574         if (result != NO_ERROR) {
    575             ALOGE("enableVSyncInjections failed to writeInterfaceToken: %d", result);
    576             return result;
    577         }
    578         result = data.writeBool(enable);
    579         if (result != NO_ERROR) {
    580             ALOGE("enableVSyncInjections failed to writeBool: %d", result);
    581             return result;
    582         }
    583         result = remote()->transact(BnSurfaceComposer::ENABLE_VSYNC_INJECTIONS, data, &reply,
    584                                     IBinder::FLAG_ONEWAY);
    585         if (result != NO_ERROR) {
    586             ALOGE("enableVSyncInjections failed to transact: %d", result);
    587             return result;
    588         }
    589         return result;
    590     }
    591 
    592     virtual status_t injectVSync(nsecs_t when) {
    593         Parcel data, reply;
    594         status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    595         if (result != NO_ERROR) {
    596             ALOGE("injectVSync failed to writeInterfaceToken: %d", result);
    597             return result;
    598         }
    599         result = data.writeInt64(when);
    600         if (result != NO_ERROR) {
    601             ALOGE("injectVSync failed to writeInt64: %d", result);
    602             return result;
    603         }
    604         result = remote()->transact(BnSurfaceComposer::INJECT_VSYNC, data, &reply,
    605                                     IBinder::FLAG_ONEWAY);
    606         if (result != NO_ERROR) {
    607             ALOGE("injectVSync failed to transact: %d", result);
    608             return result;
    609         }
    610         return result;
    611     }
    612 
    613     virtual status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) const
    614     {
    615         if (!outLayers) {
    616             return UNEXPECTED_NULL;
    617         }
    618 
    619         Parcel data, reply;
    620 
    621         status_t err = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    622         if (err != NO_ERROR) {
    623             return err;
    624         }
    625 
    626         err = remote()->transact(BnSurfaceComposer::GET_LAYER_DEBUG_INFO, data, &reply);
    627         if (err != NO_ERROR) {
    628             return err;
    629         }
    630 
    631         int32_t result = 0;
    632         err = reply.readInt32(&result);
    633         if (err != NO_ERROR) {
    634             return err;
    635         }
    636         if (result != NO_ERROR) {
    637             return result;
    638         }
    639 
    640         outLayers->clear();
    641         return reply.readParcelableVector(outLayers);
    642     }
    643 
    644     virtual status_t getCompositionPreference(ui::Dataspace* defaultDataspace,
    645                                               ui::PixelFormat* defaultPixelFormat,
    646                                               ui::Dataspace* wideColorGamutDataspace,
    647                                               ui::PixelFormat* wideColorGamutPixelFormat) const {
    648         Parcel data, reply;
    649         status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    650         if (error != NO_ERROR) {
    651             return error;
    652         }
    653         error = remote()->transact(BnSurfaceComposer::GET_COMPOSITION_PREFERENCE, data, &reply);
    654         if (error != NO_ERROR) {
    655             return error;
    656         }
    657         error = static_cast<status_t>(reply.readInt32());
    658         if (error == NO_ERROR) {
    659             *defaultDataspace = static_cast<ui::Dataspace>(reply.readInt32());
    660             *defaultPixelFormat = static_cast<ui::PixelFormat>(reply.readInt32());
    661             *wideColorGamutDataspace = static_cast<ui::Dataspace>(reply.readInt32());
    662             *wideColorGamutPixelFormat = static_cast<ui::PixelFormat>(reply.readInt32());
    663         }
    664         return error;
    665     }
    666 
    667     virtual status_t getColorManagement(bool* outGetColorManagement) const {
    668         Parcel data, reply;
    669         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    670         remote()->transact(BnSurfaceComposer::GET_COLOR_MANAGEMENT, data, &reply);
    671         bool result;
    672         status_t err = reply.readBool(&result);
    673         if (err == NO_ERROR) {
    674             *outGetColorManagement = result;
    675         }
    676         return err;
    677     }
    678 
    679     virtual status_t getDisplayedContentSamplingAttributes(const sp<IBinder>& display,
    680                                                            ui::PixelFormat* outFormat,
    681                                                            ui::Dataspace* outDataspace,
    682                                                            uint8_t* outComponentMask) const {
    683         if (!outFormat || !outDataspace || !outComponentMask) return BAD_VALUE;
    684         Parcel data, reply;
    685         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    686         data.writeStrongBinder(display);
    687 
    688         status_t error =
    689                 remote()->transact(BnSurfaceComposer::GET_DISPLAYED_CONTENT_SAMPLING_ATTRIBUTES,
    690                                    data, &reply);
    691         if (error != NO_ERROR) {
    692             return error;
    693         }
    694 
    695         uint32_t value = 0;
    696         error = reply.readUint32(&value);
    697         if (error != NO_ERROR) {
    698             return error;
    699         }
    700         *outFormat = static_cast<ui::PixelFormat>(value);
    701 
    702         error = reply.readUint32(&value);
    703         if (error != NO_ERROR) {
    704             return error;
    705         }
    706         *outDataspace = static_cast<ui::Dataspace>(value);
    707 
    708         error = reply.readUint32(&value);
    709         if (error != NO_ERROR) {
    710             return error;
    711         }
    712         *outComponentMask = static_cast<uint8_t>(value);
    713         return error;
    714     }
    715 
    716     virtual status_t setDisplayContentSamplingEnabled(const sp<IBinder>& display, bool enable,
    717                                                       uint8_t componentMask,
    718                                                       uint64_t maxFrames) const {
    719         Parcel data, reply;
    720         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    721         data.writeStrongBinder(display);
    722         data.writeBool(enable);
    723         data.writeByte(static_cast<int8_t>(componentMask));
    724         data.writeUint64(maxFrames);
    725         status_t result =
    726                 remote()->transact(BnSurfaceComposer::SET_DISPLAY_CONTENT_SAMPLING_ENABLED, data,
    727                                    &reply);
    728         return result;
    729     }
    730 
    731     virtual status_t getDisplayedContentSample(const sp<IBinder>& display, uint64_t maxFrames,
    732                                                uint64_t timestamp,
    733                                                DisplayedFrameStats* outStats) const {
    734         if (!outStats) return BAD_VALUE;
    735 
    736         Parcel data, reply;
    737         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    738         data.writeStrongBinder(display);
    739         data.writeUint64(maxFrames);
    740         data.writeUint64(timestamp);
    741 
    742         status_t result =
    743                 remote()->transact(BnSurfaceComposer::GET_DISPLAYED_CONTENT_SAMPLE, data, &reply);
    744 
    745         if (result != NO_ERROR) {
    746             return result;
    747         }
    748 
    749         result = reply.readUint64(&outStats->numFrames);
    750         if (result != NO_ERROR) {
    751             return result;
    752         }
    753 
    754         result = reply.readUint64Vector(&outStats->component_0_sample);
    755         if (result != NO_ERROR) {
    756             return result;
    757         }
    758         result = reply.readUint64Vector(&outStats->component_1_sample);
    759         if (result != NO_ERROR) {
    760             return result;
    761         }
    762         result = reply.readUint64Vector(&outStats->component_2_sample);
    763         if (result != NO_ERROR) {
    764             return result;
    765         }
    766         result = reply.readUint64Vector(&outStats->component_3_sample);
    767         return result;
    768     }
    769 
    770     virtual status_t getProtectedContentSupport(bool* outSupported) const {
    771         Parcel data, reply;
    772         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    773         status_t error =
    774                 remote()->transact(BnSurfaceComposer::GET_PROTECTED_CONTENT_SUPPORT, data, &reply);
    775         if (error != NO_ERROR) {
    776             return error;
    777         }
    778         error = reply.readBool(outSupported);
    779         return error;
    780     }
    781 
    782     virtual status_t isWideColorDisplay(const sp<IBinder>& token,
    783                                         bool* outIsWideColorDisplay) const {
    784         Parcel data, reply;
    785         status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    786         if (error != NO_ERROR) {
    787             return error;
    788         }
    789         error = data.writeStrongBinder(token);
    790         if (error != NO_ERROR) {
    791             return error;
    792         }
    793 
    794         error = remote()->transact(BnSurfaceComposer::IS_WIDE_COLOR_DISPLAY, data, &reply);
    795         if (error != NO_ERROR) {
    796             return error;
    797         }
    798         error = reply.readBool(outIsWideColorDisplay);
    799         return error;
    800     }
    801 
    802     virtual status_t addRegionSamplingListener(const Rect& samplingArea,
    803                                                const sp<IBinder>& stopLayerHandle,
    804                                                const sp<IRegionSamplingListener>& listener) {
    805         Parcel data, reply;
    806         status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    807         if (error != NO_ERROR) {
    808             ALOGE("addRegionSamplingListener: Failed to write interface token");
    809             return error;
    810         }
    811         error = data.write(samplingArea);
    812         if (error != NO_ERROR) {
    813             ALOGE("addRegionSamplingListener: Failed to write sampling area");
    814             return error;
    815         }
    816         error = data.writeStrongBinder(stopLayerHandle);
    817         if (error != NO_ERROR) {
    818             ALOGE("addRegionSamplingListener: Failed to write stop layer handle");
    819             return error;
    820         }
    821         error = data.writeStrongBinder(IInterface::asBinder(listener));
    822         if (error != NO_ERROR) {
    823             ALOGE("addRegionSamplingListener: Failed to write listener");
    824             return error;
    825         }
    826         error = remote()->transact(BnSurfaceComposer::ADD_REGION_SAMPLING_LISTENER, data, &reply);
    827         if (error != NO_ERROR) {
    828             ALOGE("addRegionSamplingListener: Failed to transact");
    829         }
    830         return error;
    831     }
    832 
    833     virtual status_t removeRegionSamplingListener(const sp<IRegionSamplingListener>& listener) {
    834         Parcel data, reply;
    835         status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    836         if (error != NO_ERROR) {
    837             ALOGE("removeRegionSamplingListener: Failed to write interface token");
    838             return error;
    839         }
    840         error = data.writeStrongBinder(IInterface::asBinder(listener));
    841         if (error != NO_ERROR) {
    842             ALOGE("removeRegionSamplingListener: Failed to write listener");
    843             return error;
    844         }
    845         error = remote()->transact(BnSurfaceComposer::REMOVE_REGION_SAMPLING_LISTENER, data,
    846                                    &reply);
    847         if (error != NO_ERROR) {
    848             ALOGE("removeRegionSamplingListener: Failed to transact");
    849         }
    850         return error;
    851     }
    852 
    853     virtual status_t setAllowedDisplayConfigs(const sp<IBinder>& displayToken,
    854                                               const std::vector<int32_t>& allowedConfigs) {
    855         Parcel data, reply;
    856         status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    857         if (result != NO_ERROR) {
    858             ALOGE("setAllowedDisplayConfigs failed to writeInterfaceToken: %d", result);
    859             return result;
    860         }
    861         result = data.writeStrongBinder(displayToken);
    862         if (result != NO_ERROR) {
    863             ALOGE("setAllowedDisplayConfigs failed to writeStrongBinder: %d", result);
    864             return result;
    865         }
    866         result = data.writeInt32Vector(allowedConfigs);
    867         if (result != NO_ERROR) {
    868             ALOGE("setAllowedDisplayConfigs failed to writeInt32Vector: %d", result);
    869             return result;
    870         }
    871         result = remote()->transact(BnSurfaceComposer::SET_ALLOWED_DISPLAY_CONFIGS, data, &reply);
    872         if (result != NO_ERROR) {
    873             ALOGE("setAllowedDisplayConfigs failed to transact: %d", result);
    874             return result;
    875         }
    876         return reply.readInt32();
    877     }
    878 
    879     virtual status_t getAllowedDisplayConfigs(const sp<IBinder>& displayToken,
    880                                               std::vector<int32_t>* outAllowedConfigs) {
    881         if (!outAllowedConfigs) return BAD_VALUE;
    882         Parcel data, reply;
    883         status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    884         if (result != NO_ERROR) {
    885             ALOGE("getAllowedDisplayConfigs failed to writeInterfaceToken: %d", result);
    886             return result;
    887         }
    888         result = data.writeStrongBinder(displayToken);
    889         if (result != NO_ERROR) {
    890             ALOGE("getAllowedDisplayConfigs failed to writeStrongBinder: %d", result);
    891             return result;
    892         }
    893         result = remote()->transact(BnSurfaceComposer::GET_ALLOWED_DISPLAY_CONFIGS, data, &reply);
    894         if (result != NO_ERROR) {
    895             ALOGE("getAllowedDisplayConfigs failed to transact: %d", result);
    896             return result;
    897         }
    898         result = reply.readInt32Vector(outAllowedConfigs);
    899         if (result != NO_ERROR) {
    900             ALOGE("getAllowedDisplayConfigs failed to readInt32Vector: %d", result);
    901             return result;
    902         }
    903         return reply.readInt32();
    904     }
    905 
    906     virtual status_t getDisplayBrightnessSupport(const sp<IBinder>& displayToken,
    907                                                  bool* outSupport) const {
    908         Parcel data, reply;
    909         status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    910         if (error != NO_ERROR) {
    911             ALOGE("getDisplayBrightnessSupport: failed to write interface token: %d", error);
    912             return error;
    913         }
    914         error = data.writeStrongBinder(displayToken);
    915         if (error != NO_ERROR) {
    916             ALOGE("getDisplayBrightnessSupport: failed to write display token: %d", error);
    917             return error;
    918         }
    919         error = remote()->transact(BnSurfaceComposer::GET_DISPLAY_BRIGHTNESS_SUPPORT, data, &reply);
    920         if (error != NO_ERROR) {
    921             ALOGE("getDisplayBrightnessSupport: failed to transact: %d", error);
    922             return error;
    923         }
    924         bool support;
    925         error = reply.readBool(&support);
    926         if (error != NO_ERROR) {
    927             ALOGE("getDisplayBrightnessSupport: failed to read support: %d", error);
    928             return error;
    929         }
    930         *outSupport = support;
    931         return NO_ERROR;
    932     }
    933 
    934     virtual status_t setDisplayBrightness(const sp<IBinder>& displayToken, float brightness) const {
    935         Parcel data, reply;
    936         status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    937         if (error != NO_ERROR) {
    938             ALOGE("setDisplayBrightness: failed to write interface token: %d", error);
    939             return error;
    940         }
    941         error = data.writeStrongBinder(displayToken);
    942         if (error != NO_ERROR) {
    943             ALOGE("setDisplayBrightness: failed to write display token: %d", error);
    944             return error;
    945         }
    946         error = data.writeFloat(brightness);
    947         if (error != NO_ERROR) {
    948             ALOGE("setDisplayBrightness: failed to write brightness: %d", error);
    949             return error;
    950         }
    951         error = remote()->transact(BnSurfaceComposer::SET_DISPLAY_BRIGHTNESS, data, &reply);
    952         if (error != NO_ERROR) {
    953             ALOGE("setDisplayBrightness: failed to transact: %d", error);
    954             return error;
    955         }
    956         return NO_ERROR;
    957     }
    958 
    959     virtual status_t notifyPowerHint(int32_t hintId) {
    960         Parcel data, reply;
    961         status_t error = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    962         if (error != NO_ERROR) {
    963             ALOGE("notifyPowerHint: failed to write interface token: %d", error);
    964             return error;
    965         }
    966         error = data.writeInt32(hintId);
    967         if (error != NO_ERROR) {
    968             ALOGE("notifyPowerHint: failed to write hintId: %d", error);
    969             return error;
    970         }
    971         error = remote()->transact(BnSurfaceComposer::NOTIFY_POWER_HINT, data, &reply,
    972                                    IBinder::FLAG_ONEWAY);
    973         if (error != NO_ERROR) {
    974             ALOGE("notifyPowerHint: failed to transact: %d", error);
    975             return error;
    976         }
    977         return NO_ERROR;
    978     }
    979 };
    980 
    981 // Out-of-line virtual method definition to trigger vtable emission in this
    982 // translation unit (see clang warning -Wweak-vtables)
    983 BpSurfaceComposer::~BpSurfaceComposer() {}
    984 
    985 IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
    986 
    987 // ----------------------------------------------------------------------
    988 
    989 status_t BnSurfaceComposer::onTransact(
    990     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
    991 {
    992     switch(code) {
    993         case CREATE_CONNECTION: {
    994             CHECK_INTERFACE(ISurfaceComposer, data, reply);
    995             sp<IBinder> b = IInterface::asBinder(createConnection());
    996             reply->writeStrongBinder(b);
    997             return NO_ERROR;
    998         }
    999         case SET_TRANSACTION_STATE: {
   1000             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1001 
   1002             size_t count = data.readUint32();
   1003             if (count > data.dataSize()) {
   1004                 return BAD_VALUE;
   1005             }
   1006             Vector<ComposerState> state;
   1007             state.setCapacity(count);
   1008             for (size_t i = 0; i < count; i++) {
   1009                 ComposerState s;
   1010                 if (s.read(data) == BAD_VALUE) {
   1011                     return BAD_VALUE;
   1012                 }
   1013                 state.add(s);
   1014             }
   1015 
   1016             count = data.readUint32();
   1017             if (count > data.dataSize()) {
   1018                 return BAD_VALUE;
   1019             }
   1020             DisplayState d;
   1021             Vector<DisplayState> displays;
   1022             displays.setCapacity(count);
   1023             for (size_t i = 0; i < count; i++) {
   1024                 if (d.read(data) == BAD_VALUE) {
   1025                     return BAD_VALUE;
   1026                 }
   1027                 displays.add(d);
   1028             }
   1029 
   1030             uint32_t stateFlags = data.readUint32();
   1031             sp<IBinder> applyToken = data.readStrongBinder();
   1032             InputWindowCommands inputWindowCommands;
   1033             inputWindowCommands.read(data);
   1034 
   1035             int64_t desiredPresentTime = data.readInt64();
   1036 
   1037             client_cache_t uncachedBuffer;
   1038             uncachedBuffer.token = data.readWeakBinder();
   1039             uncachedBuffer.id = data.readUint64();
   1040 
   1041             std::vector<ListenerCallbacks> listenerCallbacks;
   1042             int32_t listenersSize = data.readInt32();
   1043             for (int32_t i = 0; i < listenersSize; i++) {
   1044                 auto listener =
   1045                         interface_cast<ITransactionCompletedListener>(data.readStrongBinder());
   1046                 std::vector<CallbackId> callbackIds;
   1047                 data.readInt64Vector(&callbackIds);
   1048                 listenerCallbacks.emplace_back(listener, callbackIds);
   1049             }
   1050 
   1051             setTransactionState(state, displays, stateFlags, applyToken, inputWindowCommands,
   1052                                 desiredPresentTime, uncachedBuffer, listenerCallbacks);
   1053             return NO_ERROR;
   1054         }
   1055         case BOOT_FINISHED: {
   1056             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1057             bootFinished();
   1058             return NO_ERROR;
   1059         }
   1060         case CAPTURE_SCREEN: {
   1061             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1062             sp<IBinder> display = data.readStrongBinder();
   1063             ui::Dataspace reqDataspace = static_cast<ui::Dataspace>(data.readInt32());
   1064             ui::PixelFormat reqPixelFormat = static_cast<ui::PixelFormat>(data.readInt32());
   1065             sp<GraphicBuffer> outBuffer;
   1066             Rect sourceCrop(Rect::EMPTY_RECT);
   1067             data.read(sourceCrop);
   1068             uint32_t reqWidth = data.readUint32();
   1069             uint32_t reqHeight = data.readUint32();
   1070             bool useIdentityTransform = static_cast<bool>(data.readInt32());
   1071             int32_t rotation = data.readInt32();
   1072             bool captureSecureLayers = static_cast<bool>(data.readInt32());
   1073 
   1074             bool capturedSecureLayers = false;
   1075             status_t res = captureScreen(display, &outBuffer, capturedSecureLayers, reqDataspace,
   1076                                          reqPixelFormat, sourceCrop, reqWidth, reqHeight,
   1077                                          useIdentityTransform,
   1078                                          static_cast<ISurfaceComposer::Rotation>(rotation),
   1079                                          captureSecureLayers);
   1080 
   1081             reply->writeInt32(res);
   1082             if (res == NO_ERROR) {
   1083                 reply->write(*outBuffer);
   1084                 reply->writeBool(capturedSecureLayers);
   1085             }
   1086             return NO_ERROR;
   1087         }
   1088         case CAPTURE_SCREEN_BY_ID: {
   1089             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1090             uint64_t displayOrLayerStack = data.readUint64();
   1091             ui::Dataspace outDataspace = ui::Dataspace::V0_SRGB;
   1092             sp<GraphicBuffer> outBuffer;
   1093             status_t res = captureScreen(displayOrLayerStack, &outDataspace, &outBuffer);
   1094             reply->writeInt32(res);
   1095             if (res == NO_ERROR) {
   1096                 reply->writeInt32(static_cast<int32_t>(outDataspace));
   1097                 reply->write(*outBuffer);
   1098             }
   1099             return NO_ERROR;
   1100         }
   1101         case CAPTURE_LAYERS: {
   1102             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1103             sp<IBinder> layerHandleBinder = data.readStrongBinder();
   1104             ui::Dataspace reqDataspace = static_cast<ui::Dataspace>(data.readInt32());
   1105             ui::PixelFormat reqPixelFormat = static_cast<ui::PixelFormat>(data.readInt32());
   1106             sp<GraphicBuffer> outBuffer;
   1107             Rect sourceCrop(Rect::EMPTY_RECT);
   1108             data.read(sourceCrop);
   1109 
   1110             std::unordered_set<sp<IBinder>, SpHash<IBinder>> excludeHandles;
   1111             int numExcludeHandles = data.readInt32();
   1112             excludeHandles.reserve(numExcludeHandles);
   1113             for (int i = 0; i < numExcludeHandles; i++) {
   1114                 excludeHandles.emplace(data.readStrongBinder());
   1115             }
   1116 
   1117             float frameScale = data.readFloat();
   1118             bool childrenOnly = data.readBool();
   1119 
   1120             status_t res =
   1121                     captureLayers(layerHandleBinder, &outBuffer, reqDataspace, reqPixelFormat,
   1122                                   sourceCrop, excludeHandles, frameScale, childrenOnly);
   1123             reply->writeInt32(res);
   1124             if (res == NO_ERROR) {
   1125                 reply->write(*outBuffer);
   1126             }
   1127             return NO_ERROR;
   1128         }
   1129         case AUTHENTICATE_SURFACE: {
   1130             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1131             sp<IGraphicBufferProducer> bufferProducer =
   1132                     interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
   1133             int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0;
   1134             reply->writeInt32(result);
   1135             return NO_ERROR;
   1136         }
   1137         case GET_SUPPORTED_FRAME_TIMESTAMPS: {
   1138             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1139             std::vector<FrameEvent> supportedTimestamps;
   1140             status_t result = getSupportedFrameTimestamps(&supportedTimestamps);
   1141             status_t err = reply->writeInt32(result);
   1142             if (err != NO_ERROR) {
   1143                 return err;
   1144             }
   1145             if (result != NO_ERROR) {
   1146                 return result;
   1147             }
   1148 
   1149             std::vector<int32_t> supported;
   1150             supported.reserve(supportedTimestamps.size());
   1151             for (FrameEvent s : supportedTimestamps) {
   1152                 supported.push_back(static_cast<int32_t>(s));
   1153             }
   1154             return reply->writeInt32Vector(supported);
   1155         }
   1156         case CREATE_DISPLAY_EVENT_CONNECTION: {
   1157             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1158             sp<IDisplayEventConnection> connection(createDisplayEventConnection(
   1159                     static_cast<ISurfaceComposer::VsyncSource>(data.readInt32())));
   1160             reply->writeStrongBinder(IInterface::asBinder(connection));
   1161             return NO_ERROR;
   1162         }
   1163         case CREATE_DISPLAY: {
   1164             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1165             String8 displayName = data.readString8();
   1166             bool secure = bool(data.readInt32());
   1167             sp<IBinder> display(createDisplay(displayName, secure));
   1168             reply->writeStrongBinder(display);
   1169             return NO_ERROR;
   1170         }
   1171         case DESTROY_DISPLAY: {
   1172             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1173             sp<IBinder> display = data.readStrongBinder();
   1174             destroyDisplay(display);
   1175             return NO_ERROR;
   1176         }
   1177         case GET_PHYSICAL_DISPLAY_TOKEN: {
   1178             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1179             PhysicalDisplayId displayId = data.readUint64();
   1180             sp<IBinder> display = getPhysicalDisplayToken(displayId);
   1181             reply->writeStrongBinder(display);
   1182             return NO_ERROR;
   1183         }
   1184         case GET_DISPLAY_CONFIGS: {
   1185             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1186             Vector<DisplayInfo> configs;
   1187             sp<IBinder> display = data.readStrongBinder();
   1188             status_t result = getDisplayConfigs(display, &configs);
   1189             reply->writeInt32(result);
   1190             if (result == NO_ERROR) {
   1191                 reply->writeUint32(static_cast<uint32_t>(configs.size()));
   1192                 for (size_t c = 0; c < configs.size(); ++c) {
   1193                     memcpy(reply->writeInplace(sizeof(DisplayInfo)),
   1194                             &configs[c], sizeof(DisplayInfo));
   1195                 }
   1196             }
   1197             return NO_ERROR;
   1198         }
   1199         case GET_DISPLAY_STATS: {
   1200             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1201             DisplayStatInfo stats;
   1202             sp<IBinder> display = data.readStrongBinder();
   1203             status_t result = getDisplayStats(display, &stats);
   1204             reply->writeInt32(result);
   1205             if (result == NO_ERROR) {
   1206                 memcpy(reply->writeInplace(sizeof(DisplayStatInfo)),
   1207                         &stats, sizeof(DisplayStatInfo));
   1208             }
   1209             return NO_ERROR;
   1210         }
   1211         case GET_ACTIVE_CONFIG: {
   1212             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1213             sp<IBinder> display = data.readStrongBinder();
   1214             int id = getActiveConfig(display);
   1215             reply->writeInt32(id);
   1216             return NO_ERROR;
   1217         }
   1218         case SET_ACTIVE_CONFIG: {
   1219             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1220             sp<IBinder> display = data.readStrongBinder();
   1221             int id = data.readInt32();
   1222             status_t result = setActiveConfig(display, id);
   1223             reply->writeInt32(result);
   1224             return NO_ERROR;
   1225         }
   1226         case GET_DISPLAY_COLOR_MODES: {
   1227             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1228             Vector<ColorMode> colorModes;
   1229             sp<IBinder> display = nullptr;
   1230             status_t result = data.readStrongBinder(&display);
   1231             if (result != NO_ERROR) {
   1232                 ALOGE("getDisplayColorModes failed to readStrongBinder: %d", result);
   1233                 return result;
   1234             }
   1235             result = getDisplayColorModes(display, &colorModes);
   1236             reply->writeInt32(result);
   1237             if (result == NO_ERROR) {
   1238                 reply->writeUint32(static_cast<uint32_t>(colorModes.size()));
   1239                 for (size_t i = 0; i < colorModes.size(); ++i) {
   1240                     reply->writeInt32(static_cast<int32_t>(colorModes[i]));
   1241                 }
   1242             }
   1243             return NO_ERROR;
   1244         }
   1245         case GET_DISPLAY_NATIVE_PRIMARIES: {
   1246             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1247             ui::DisplayPrimaries primaries;
   1248             sp<IBinder> display = nullptr;
   1249 
   1250             status_t result = data.readStrongBinder(&display);
   1251             if (result != NO_ERROR) {
   1252                 ALOGE("getDisplayNativePrimaries failed to readStrongBinder: %d", result);
   1253                 return result;
   1254             }
   1255 
   1256             result = getDisplayNativePrimaries(display, primaries);
   1257             reply->writeInt32(result);
   1258             if (result == NO_ERROR) {
   1259                 memcpy(reply->writeInplace(sizeof(ui::DisplayPrimaries)), &primaries,
   1260                         sizeof(ui::DisplayPrimaries));
   1261             }
   1262 
   1263             return NO_ERROR;
   1264         }
   1265         case GET_ACTIVE_COLOR_MODE: {
   1266             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1267             sp<IBinder> display = nullptr;
   1268             status_t result = data.readStrongBinder(&display);
   1269             if (result != NO_ERROR) {
   1270                 ALOGE("getActiveColorMode failed to readStrongBinder: %d", result);
   1271                 return result;
   1272             }
   1273             ColorMode colorMode = getActiveColorMode(display);
   1274             result = reply->writeInt32(static_cast<int32_t>(colorMode));
   1275             return result;
   1276         }
   1277         case SET_ACTIVE_COLOR_MODE: {
   1278             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1279             sp<IBinder> display = nullptr;
   1280             status_t result = data.readStrongBinder(&display);
   1281             if (result != NO_ERROR) {
   1282                 ALOGE("getActiveColorMode failed to readStrongBinder: %d", result);
   1283                 return result;
   1284             }
   1285             int32_t colorModeInt = 0;
   1286             result = data.readInt32(&colorModeInt);
   1287             if (result != NO_ERROR) {
   1288                 ALOGE("setActiveColorMode failed to readInt32: %d", result);
   1289                 return result;
   1290             }
   1291             result = setActiveColorMode(display,
   1292                     static_cast<ColorMode>(colorModeInt));
   1293             result = reply->writeInt32(result);
   1294             return result;
   1295         }
   1296         case CLEAR_ANIMATION_FRAME_STATS: {
   1297             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1298             status_t result = clearAnimationFrameStats();
   1299             reply->writeInt32(result);
   1300             return NO_ERROR;
   1301         }
   1302         case GET_ANIMATION_FRAME_STATS: {
   1303             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1304             FrameStats stats;
   1305             status_t result = getAnimationFrameStats(&stats);
   1306             reply->write(stats);
   1307             reply->writeInt32(result);
   1308             return NO_ERROR;
   1309         }
   1310         case SET_POWER_MODE: {
   1311             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1312             sp<IBinder> display = data.readStrongBinder();
   1313             int32_t mode = data.readInt32();
   1314             setPowerMode(display, mode);
   1315             return NO_ERROR;
   1316         }
   1317         case GET_HDR_CAPABILITIES: {
   1318             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1319             sp<IBinder> display = nullptr;
   1320             status_t result = data.readStrongBinder(&display);
   1321             if (result != NO_ERROR) {
   1322                 ALOGE("getHdrCapabilities failed to readStrongBinder: %d",
   1323                         result);
   1324                 return result;
   1325             }
   1326             HdrCapabilities capabilities;
   1327             result = getHdrCapabilities(display, &capabilities);
   1328             reply->writeInt32(result);
   1329             if (result == NO_ERROR) {
   1330                 reply->write(capabilities);
   1331             }
   1332             return NO_ERROR;
   1333         }
   1334         case ENABLE_VSYNC_INJECTIONS: {
   1335             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1336             bool enable = false;
   1337             status_t result = data.readBool(&enable);
   1338             if (result != NO_ERROR) {
   1339                 ALOGE("enableVSyncInjections failed to readBool: %d", result);
   1340                 return result;
   1341             }
   1342             return enableVSyncInjections(enable);
   1343         }
   1344         case INJECT_VSYNC: {
   1345             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1346             int64_t when = 0;
   1347             status_t result = data.readInt64(&when);
   1348             if (result != NO_ERROR) {
   1349                 ALOGE("enableVSyncInjections failed to readInt64: %d", result);
   1350                 return result;
   1351             }
   1352             return injectVSync(when);
   1353         }
   1354         case GET_LAYER_DEBUG_INFO: {
   1355             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1356             std::vector<LayerDebugInfo> outLayers;
   1357             status_t result = getLayerDebugInfo(&outLayers);
   1358             reply->writeInt32(result);
   1359             if (result == NO_ERROR)
   1360             {
   1361                 result = reply->writeParcelableVector(outLayers);
   1362             }
   1363             return result;
   1364         }
   1365         case GET_COMPOSITION_PREFERENCE: {
   1366             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1367             ui::Dataspace defaultDataspace;
   1368             ui::PixelFormat defaultPixelFormat;
   1369             ui::Dataspace wideColorGamutDataspace;
   1370             ui::PixelFormat wideColorGamutPixelFormat;
   1371             status_t error =
   1372                     getCompositionPreference(&defaultDataspace, &defaultPixelFormat,
   1373                                              &wideColorGamutDataspace, &wideColorGamutPixelFormat);
   1374             reply->writeInt32(error);
   1375             if (error == NO_ERROR) {
   1376                 reply->writeInt32(static_cast<int32_t>(defaultDataspace));
   1377                 reply->writeInt32(static_cast<int32_t>(defaultPixelFormat));
   1378                 reply->writeInt32(static_cast<int32_t>(wideColorGamutDataspace));
   1379                 reply->writeInt32(static_cast<int32_t>(wideColorGamutPixelFormat));
   1380             }
   1381             return error;
   1382         }
   1383         case GET_COLOR_MANAGEMENT: {
   1384             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1385             bool result;
   1386             status_t error = getColorManagement(&result);
   1387             if (error == NO_ERROR) {
   1388                 reply->writeBool(result);
   1389             }
   1390             return error;
   1391         }
   1392         case GET_DISPLAYED_CONTENT_SAMPLING_ATTRIBUTES: {
   1393             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1394 
   1395             sp<IBinder> display = data.readStrongBinder();
   1396             ui::PixelFormat format;
   1397             ui::Dataspace dataspace;
   1398             uint8_t component = 0;
   1399             auto result =
   1400                     getDisplayedContentSamplingAttributes(display, &format, &dataspace, &component);
   1401             if (result == NO_ERROR) {
   1402                 reply->writeUint32(static_cast<uint32_t>(format));
   1403                 reply->writeUint32(static_cast<uint32_t>(dataspace));
   1404                 reply->writeUint32(static_cast<uint32_t>(component));
   1405             }
   1406             return result;
   1407         }
   1408         case SET_DISPLAY_CONTENT_SAMPLING_ENABLED: {
   1409             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1410 
   1411             sp<IBinder> display = nullptr;
   1412             bool enable = false;
   1413             int8_t componentMask = 0;
   1414             uint64_t maxFrames = 0;
   1415             status_t result = data.readStrongBinder(&display);
   1416             if (result != NO_ERROR) {
   1417                 ALOGE("setDisplayContentSamplingEnabled failure in reading Display token: %d",
   1418                       result);
   1419                 return result;
   1420             }
   1421 
   1422             result = data.readBool(&enable);
   1423             if (result != NO_ERROR) {
   1424                 ALOGE("setDisplayContentSamplingEnabled failure in reading enable: %d", result);
   1425                 return result;
   1426             }
   1427 
   1428             result = data.readByte(static_cast<int8_t*>(&componentMask));
   1429             if (result != NO_ERROR) {
   1430                 ALOGE("setDisplayContentSamplingEnabled failure in reading component mask: %d",
   1431                       result);
   1432                 return result;
   1433             }
   1434 
   1435             result = data.readUint64(&maxFrames);
   1436             if (result != NO_ERROR) {
   1437                 ALOGE("setDisplayContentSamplingEnabled failure in reading max frames: %d", result);
   1438                 return result;
   1439             }
   1440 
   1441             return setDisplayContentSamplingEnabled(display, enable,
   1442                                                     static_cast<uint8_t>(componentMask), maxFrames);
   1443         }
   1444         case GET_DISPLAYED_CONTENT_SAMPLE: {
   1445             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1446 
   1447             sp<IBinder> display = data.readStrongBinder();
   1448             uint64_t maxFrames = 0;
   1449             uint64_t timestamp = 0;
   1450 
   1451             status_t result = data.readUint64(&maxFrames);
   1452             if (result != NO_ERROR) {
   1453                 ALOGE("getDisplayedContentSample failure in reading max frames: %d", result);
   1454                 return result;
   1455             }
   1456 
   1457             result = data.readUint64(&timestamp);
   1458             if (result != NO_ERROR) {
   1459                 ALOGE("getDisplayedContentSample failure in reading timestamp: %d", result);
   1460                 return result;
   1461             }
   1462 
   1463             DisplayedFrameStats stats;
   1464             result = getDisplayedContentSample(display, maxFrames, timestamp, &stats);
   1465             if (result == NO_ERROR) {
   1466                 reply->writeUint64(stats.numFrames);
   1467                 reply->writeUint64Vector(stats.component_0_sample);
   1468                 reply->writeUint64Vector(stats.component_1_sample);
   1469                 reply->writeUint64Vector(stats.component_2_sample);
   1470                 reply->writeUint64Vector(stats.component_3_sample);
   1471             }
   1472             return result;
   1473         }
   1474         case GET_PROTECTED_CONTENT_SUPPORT: {
   1475             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1476             bool result;
   1477             status_t error = getProtectedContentSupport(&result);
   1478             if (error == NO_ERROR) {
   1479                 reply->writeBool(result);
   1480             }
   1481             return error;
   1482         }
   1483         case IS_WIDE_COLOR_DISPLAY: {
   1484             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1485             sp<IBinder> display = nullptr;
   1486             status_t error = data.readStrongBinder(&display);
   1487             if (error != NO_ERROR) {
   1488                 return error;
   1489             }
   1490             bool result;
   1491             error = isWideColorDisplay(display, &result);
   1492             if (error == NO_ERROR) {
   1493                 reply->writeBool(result);
   1494             }
   1495             return error;
   1496         }
   1497         case GET_PHYSICAL_DISPLAY_IDS: {
   1498             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1499             return reply->writeUint64Vector(getPhysicalDisplayIds());
   1500         }
   1501         case ADD_REGION_SAMPLING_LISTENER: {
   1502             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1503             Rect samplingArea;
   1504             status_t result = data.read(samplingArea);
   1505             if (result != NO_ERROR) {
   1506                 ALOGE("addRegionSamplingListener: Failed to read sampling area");
   1507                 return result;
   1508             }
   1509             sp<IBinder> stopLayerHandle;
   1510             result = data.readNullableStrongBinder(&stopLayerHandle);
   1511             if (result != NO_ERROR) {
   1512                 ALOGE("addRegionSamplingListener: Failed to read stop layer handle");
   1513                 return result;
   1514             }
   1515             sp<IRegionSamplingListener> listener;
   1516             result = data.readNullableStrongBinder(&listener);
   1517             if (result != NO_ERROR) {
   1518                 ALOGE("addRegionSamplingListener: Failed to read listener");
   1519                 return result;
   1520             }
   1521             return addRegionSamplingListener(samplingArea, stopLayerHandle, listener);
   1522         }
   1523         case REMOVE_REGION_SAMPLING_LISTENER: {
   1524             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1525             sp<IRegionSamplingListener> listener;
   1526             status_t result = data.readNullableStrongBinder(&listener);
   1527             if (result != NO_ERROR) {
   1528                 ALOGE("removeRegionSamplingListener: Failed to read listener");
   1529                 return result;
   1530             }
   1531             return removeRegionSamplingListener(listener);
   1532         }
   1533         case SET_ALLOWED_DISPLAY_CONFIGS: {
   1534             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1535             sp<IBinder> displayToken = data.readStrongBinder();
   1536             std::vector<int32_t> allowedConfigs;
   1537             data.readInt32Vector(&allowedConfigs);
   1538             status_t result = setAllowedDisplayConfigs(displayToken, allowedConfigs);
   1539             reply->writeInt32(result);
   1540             return result;
   1541         }
   1542         case GET_ALLOWED_DISPLAY_CONFIGS: {
   1543             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1544             sp<IBinder> displayToken = data.readStrongBinder();
   1545             std::vector<int32_t> allowedConfigs;
   1546             status_t result = getAllowedDisplayConfigs(displayToken, &allowedConfigs);
   1547             reply->writeInt32Vector(allowedConfigs);
   1548             reply->writeInt32(result);
   1549             return result;
   1550         }
   1551         case GET_DISPLAY_BRIGHTNESS_SUPPORT: {
   1552             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1553             sp<IBinder> displayToken;
   1554             status_t error = data.readNullableStrongBinder(&displayToken);
   1555             if (error != NO_ERROR) {
   1556                 ALOGE("getDisplayBrightnessSupport: failed to read display token: %d", error);
   1557                 return error;
   1558             }
   1559             bool support = false;
   1560             error = getDisplayBrightnessSupport(displayToken, &support);
   1561             reply->writeBool(support);
   1562             return error;
   1563         }
   1564         case SET_DISPLAY_BRIGHTNESS: {
   1565             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1566             sp<IBinder> displayToken;
   1567             status_t error = data.readNullableStrongBinder(&displayToken);
   1568             if (error != NO_ERROR) {
   1569                 ALOGE("setDisplayBrightness: failed to read display token: %d", error);
   1570                 return error;
   1571             }
   1572             float brightness = -1.0f;
   1573             error = data.readFloat(&brightness);
   1574             if (error != NO_ERROR) {
   1575                 ALOGE("setDisplayBrightness: failed to read brightness: %d", error);
   1576                 return error;
   1577             }
   1578             return setDisplayBrightness(displayToken, brightness);
   1579         }
   1580         case NOTIFY_POWER_HINT: {
   1581             CHECK_INTERFACE(ISurfaceComposer, data, reply);
   1582             int32_t hintId;
   1583             status_t error = data.readInt32(&hintId);
   1584             if (error != NO_ERROR) {
   1585                 ALOGE("notifyPowerHint: failed to read hintId: %d", error);
   1586                 return error;
   1587             }
   1588             return notifyPowerHint(hintId);
   1589         }
   1590         default: {
   1591             return BBinder::onTransact(code, data, reply, flags);
   1592         }
   1593     }
   1594 }
   1595 
   1596 } // namespace android
   1597