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