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 #define LOG_TAG "SurfaceComposerClient"
     18 
     19 #include <stdint.h>
     20 #include <sys/types.h>
     21 
     22 #include <utils/Errors.h>
     23 #include <utils/Log.h>
     24 #include <utils/SortedVector.h>
     25 #include <utils/String8.h>
     26 #include <utils/threads.h>
     27 
     28 #include <binder/IServiceManager.h>
     29 
     30 #include <system/graphics.h>
     31 
     32 #include <ui/DisplayInfo.h>
     33 
     34 #include <gui/BufferItemConsumer.h>
     35 #include <gui/CpuConsumer.h>
     36 #include <gui/IGraphicBufferProducer.h>
     37 #include <gui/ISurfaceComposer.h>
     38 #include <gui/ISurfaceComposerClient.h>
     39 #include <gui/LayerState.h>
     40 #include <gui/Surface.h>
     41 #include <gui/SurfaceComposerClient.h>
     42 
     43 #include <private/gui/ComposerService.h>
     44 
     45 namespace android {
     46 
     47 using ui::ColorMode;
     48 // ---------------------------------------------------------------------------
     49 
     50 ANDROID_SINGLETON_STATIC_INSTANCE(ComposerService);
     51 
     52 ComposerService::ComposerService()
     53 : Singleton<ComposerService>() {
     54     Mutex::Autolock _l(mLock);
     55     connectLocked();
     56 }
     57 
     58 void ComposerService::connectLocked() {
     59     const String16 name("SurfaceFlinger");
     60     while (getService(name, &mComposerService) != NO_ERROR) {
     61         usleep(250000);
     62     }
     63     assert(mComposerService != NULL);
     64 
     65     // Create the death listener.
     66     class DeathObserver : public IBinder::DeathRecipient {
     67         ComposerService& mComposerService;
     68         virtual void binderDied(const wp<IBinder>& who) {
     69             ALOGW("ComposerService remote (surfaceflinger) died [%p]",
     70                   who.unsafe_get());
     71             mComposerService.composerServiceDied();
     72         }
     73      public:
     74         explicit DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }
     75     };
     76 
     77     mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
     78     IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver);
     79 }
     80 
     81 /*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {
     82     ComposerService& instance = ComposerService::getInstance();
     83     Mutex::Autolock _l(instance.mLock);
     84     if (instance.mComposerService == NULL) {
     85         ComposerService::getInstance().connectLocked();
     86         assert(instance.mComposerService != NULL);
     87         ALOGD("ComposerService reconnected");
     88     }
     89     return instance.mComposerService;
     90 }
     91 
     92 void ComposerService::composerServiceDied()
     93 {
     94     Mutex::Autolock _l(mLock);
     95     mComposerService = NULL;
     96     mDeathObserver = NULL;
     97 }
     98 
     99 // ---------------------------------------------------------------------------
    100 
    101 SurfaceComposerClient::Transaction::Transaction(const Transaction& other) :
    102     mForceSynchronous(other.mForceSynchronous),
    103     mTransactionNestCount(other.mTransactionNestCount),
    104     mAnimation(other.mAnimation),
    105     mEarlyWakeup(other.mEarlyWakeup) {
    106     mDisplayStates = other.mDisplayStates;
    107     mComposerStates = other.mComposerStates;
    108 }
    109 
    110 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Transaction&& other) {
    111     for (auto const& kv : other.mComposerStates) {
    112         if (mComposerStates.count(kv.first) == 0) {
    113             mComposerStates[kv.first] = kv.second;
    114         } else {
    115             mComposerStates[kv.first].state.merge(kv.second.state);
    116         }
    117     }
    118     other.mComposerStates.clear();
    119 
    120     for (auto const& state : other.mDisplayStates) {
    121         ssize_t index = mDisplayStates.indexOf(state);
    122         if (index < 0) {
    123             mDisplayStates.add(state);
    124         } else {
    125             mDisplayStates.editItemAt(static_cast<size_t>(index)).merge(state);
    126         }
    127     }
    128     other.mDisplayStates.clear();
    129 
    130     return *this;
    131 }
    132 
    133 status_t SurfaceComposerClient::Transaction::apply(bool synchronous) {
    134     if (mStatus != NO_ERROR) {
    135         return mStatus;
    136     }
    137 
    138     sp<ISurfaceComposer> sf(ComposerService::getComposerService());
    139 
    140     Vector<ComposerState> composerStates;
    141     Vector<DisplayState> displayStates;
    142     uint32_t flags = 0;
    143 
    144     mForceSynchronous |= synchronous;
    145 
    146     for (auto const& kv : mComposerStates){
    147         composerStates.add(kv.second);
    148     }
    149 
    150     mComposerStates.clear();
    151 
    152     displayStates = mDisplayStates;
    153     mDisplayStates.clear();
    154 
    155     if (mForceSynchronous) {
    156         flags |= ISurfaceComposer::eSynchronous;
    157     }
    158     if (mAnimation) {
    159         flags |= ISurfaceComposer::eAnimation;
    160     }
    161     if (mEarlyWakeup) {
    162         flags |= ISurfaceComposer::eEarlyWakeup;
    163     }
    164 
    165     mForceSynchronous = false;
    166     mAnimation = false;
    167     mEarlyWakeup = false;
    168 
    169     sf->setTransactionState(composerStates, displayStates, flags);
    170     mStatus = NO_ERROR;
    171     return NO_ERROR;
    172 }
    173 
    174 // ---------------------------------------------------------------------------
    175 
    176 sp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, bool secure) {
    177     return ComposerService::getComposerService()->createDisplay(displayName,
    178             secure);
    179 }
    180 
    181 void SurfaceComposerClient::destroyDisplay(const sp<IBinder>& display) {
    182     return ComposerService::getComposerService()->destroyDisplay(display);
    183 }
    184 
    185 sp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) {
    186     return ComposerService::getComposerService()->getBuiltInDisplay(id);
    187 }
    188 
    189 void SurfaceComposerClient::Transaction::setAnimationTransaction() {
    190     mAnimation = true;
    191 }
    192 
    193 void SurfaceComposerClient::Transaction::setEarlyWakeup() {
    194     mEarlyWakeup = true;
    195 }
    196 
    197 layer_state_t* SurfaceComposerClient::Transaction::getLayerState(const sp<SurfaceControl>& sc) {
    198     if (mComposerStates.count(sc) == 0) {
    199         // we don't have it, add an initialized layer_state to our list
    200         ComposerState s;
    201         s.client = sc->getClient()->mClient;
    202         s.state.surface = sc->getHandle();
    203         mComposerStates[sc] = s;
    204     }
    205 
    206     return &(mComposerStates[sc].state);
    207 }
    208 
    209 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosition(
    210         const sp<SurfaceControl>& sc, float x, float y) {
    211     layer_state_t* s = getLayerState(sc);
    212     if (!s) {
    213         mStatus = BAD_INDEX;
    214         return *this;
    215     }
    216     s->what |= layer_state_t::ePositionChanged;
    217     s->x = x;
    218     s->y = y;
    219     return *this;
    220 }
    221 
    222 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::show(
    223         const sp<SurfaceControl>& sc) {
    224     return setFlags(sc, 0, layer_state_t::eLayerHidden);
    225 }
    226 
    227 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::hide(
    228         const sp<SurfaceControl>& sc) {
    229     return setFlags(sc, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
    230 }
    231 
    232 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setSize(
    233         const sp<SurfaceControl>& sc, uint32_t w, uint32_t h) {
    234     layer_state_t* s = getLayerState(sc);
    235     if (!s) {
    236         mStatus = BAD_INDEX;
    237         return *this;
    238     }
    239     s->what |= layer_state_t::eSizeChanged;
    240     s->w = w;
    241     s->h = h;
    242 
    243     // Resizing a surface makes the transaction synchronous.
    244     mForceSynchronous = true;
    245 
    246     return *this;
    247 }
    248 
    249 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayer(
    250         const sp<SurfaceControl>& sc, int32_t z) {
    251     layer_state_t* s = getLayerState(sc);
    252     if (!s) {
    253         mStatus = BAD_INDEX;
    254         return *this;
    255     }
    256     s->what |= layer_state_t::eLayerChanged;
    257     s->z = z;
    258     return *this;
    259 }
    260 
    261 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setRelativeLayer(const sp<SurfaceControl>& sc, const sp<IBinder>& relativeTo,
    262         int32_t z) {
    263     layer_state_t* s = getLayerState(sc);
    264     if (!s) {
    265         mStatus = BAD_INDEX;
    266     }
    267     s->what |= layer_state_t::eRelativeLayerChanged;
    268     s->relativeLayerHandle = relativeTo;
    269     s->z = z;
    270     return *this;
    271 }
    272 
    273 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFlags(
    274         const sp<SurfaceControl>& sc, uint32_t flags,
    275         uint32_t mask) {
    276     layer_state_t* s = getLayerState(sc);
    277     if (!s) {
    278         mStatus = BAD_INDEX;
    279         return *this;
    280     }
    281     if ((mask & layer_state_t::eLayerOpaque) ||
    282             (mask & layer_state_t::eLayerHidden) ||
    283             (mask & layer_state_t::eLayerSecure)) {
    284         s->what |= layer_state_t::eFlagsChanged;
    285     }
    286     s->flags &= ~mask;
    287     s->flags |= (flags & mask);
    288     s->mask |= mask;
    289     return *this;
    290 }
    291 
    292 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setTransparentRegionHint(
    293         const sp<SurfaceControl>& sc,
    294         const Region& transparentRegion) {
    295     layer_state_t* s = getLayerState(sc);
    296     if (!s) {
    297         mStatus = BAD_INDEX;
    298         return *this;
    299     }
    300     s->what |= layer_state_t::eTransparentRegionChanged;
    301     s->transparentRegion = transparentRegion;
    302     return *this;
    303 }
    304 
    305 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setAlpha(
    306         const sp<SurfaceControl>& sc, float alpha) {
    307     layer_state_t* s = getLayerState(sc);
    308     if (!s) {
    309         mStatus = BAD_INDEX;
    310         return *this;
    311     }
    312     s->what |= layer_state_t::eAlphaChanged;
    313     s->alpha = alpha;
    314     return *this;
    315 }
    316 
    317 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayerStack(
    318         const sp<SurfaceControl>& sc, uint32_t layerStack) {
    319     layer_state_t* s = getLayerState(sc);
    320     if (!s) {
    321         mStatus = BAD_INDEX;
    322         return *this;
    323     }
    324     s->what |= layer_state_t::eLayerStackChanged;
    325     s->layerStack = layerStack;
    326     return *this;
    327 }
    328 
    329 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setMatrix(
    330         const sp<SurfaceControl>& sc, float dsdx, float dtdx,
    331         float dtdy, float dsdy) {
    332     layer_state_t* s = getLayerState(sc);
    333     if (!s) {
    334         mStatus = BAD_INDEX;
    335         return *this;
    336     }
    337     s->what |= layer_state_t::eMatrixChanged;
    338     layer_state_t::matrix22_t matrix;
    339     matrix.dsdx = dsdx;
    340     matrix.dtdx = dtdx;
    341     matrix.dsdy = dsdy;
    342     matrix.dtdy = dtdy;
    343     s->matrix = matrix;
    344     return *this;
    345 }
    346 
    347 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setCrop(
    348         const sp<SurfaceControl>& sc, const Rect& crop) {
    349     layer_state_t* s = getLayerState(sc);
    350     if (!s) {
    351         mStatus = BAD_INDEX;
    352         return *this;
    353     }
    354     s->what |= layer_state_t::eCropChanged;
    355     s->crop = crop;
    356     return *this;
    357 }
    358 
    359 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFinalCrop(const sp<SurfaceControl>& sc, const Rect& crop) {
    360     layer_state_t* s = getLayerState(sc);
    361     if (!s) {
    362         mStatus = BAD_INDEX;
    363         return *this;
    364     }
    365     s->what |= layer_state_t::eFinalCropChanged;
    366     s->finalCrop = crop;
    367     return *this;
    368 }
    369 
    370 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::deferTransactionUntil(
    371         const sp<SurfaceControl>& sc,
    372         const sp<IBinder>& handle, uint64_t frameNumber) {
    373     layer_state_t* s = getLayerState(sc);
    374     if (!s) {
    375         mStatus = BAD_INDEX;
    376         return *this;
    377     }
    378     s->what |= layer_state_t::eDeferTransaction;
    379     s->barrierHandle = handle;
    380     s->frameNumber = frameNumber;
    381     return *this;
    382 }
    383 
    384 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::deferTransactionUntil(
    385         const sp<SurfaceControl>& sc,
    386         const sp<Surface>& barrierSurface, uint64_t frameNumber) {
    387     layer_state_t* s = getLayerState(sc);
    388     if (!s) {
    389         mStatus = BAD_INDEX;
    390         return *this;
    391     }
    392     s->what |= layer_state_t::eDeferTransaction;
    393     s->barrierGbp = barrierSurface->getIGraphicBufferProducer();
    394     s->frameNumber = frameNumber;
    395     return *this;
    396 }
    397 
    398 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparentChildren(
    399         const sp<SurfaceControl>& sc,
    400         const sp<IBinder>& newParentHandle) {
    401     layer_state_t* s = getLayerState(sc);
    402     if (!s) {
    403         mStatus = BAD_INDEX;
    404         return *this;
    405     }
    406     s->what |= layer_state_t::eReparentChildren;
    407     s->reparentHandle = newParentHandle;
    408     return *this;
    409 }
    410 
    411 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::reparent(
    412         const sp<SurfaceControl>& sc,
    413         const sp<IBinder>& newParentHandle) {
    414     layer_state_t* s = getLayerState(sc);
    415     if (!s) {
    416         mStatus = BAD_INDEX;
    417         return *this;
    418     }
    419     s->what |= layer_state_t::eReparent;
    420     s->parentHandleForChild = newParentHandle;
    421     return *this;
    422 }
    423 
    424 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setColor(
    425         const sp<SurfaceControl>& sc,
    426         const half3& color) {
    427     layer_state_t* s = getLayerState(sc);
    428     if (!s) {
    429         mStatus = BAD_INDEX;
    430         return *this;
    431     }
    432     s->what |= layer_state_t::eColorChanged;
    433     s->color = color;
    434     return *this;
    435 }
    436 
    437 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::detachChildren(
    438         const sp<SurfaceControl>& sc) {
    439     layer_state_t* s = getLayerState(sc);
    440     if (!s) {
    441         mStatus = BAD_INDEX;
    442     }
    443     s->what |= layer_state_t::eDetachChildren;
    444     return *this;
    445 }
    446 
    447 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setOverrideScalingMode(
    448         const sp<SurfaceControl>& sc, int32_t overrideScalingMode) {
    449     layer_state_t* s = getLayerState(sc);
    450     if (!s) {
    451         mStatus = BAD_INDEX;
    452         return *this;
    453     }
    454 
    455     switch (overrideScalingMode) {
    456         case NATIVE_WINDOW_SCALING_MODE_FREEZE:
    457         case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW:
    458         case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP:
    459         case NATIVE_WINDOW_SCALING_MODE_NO_SCALE_CROP:
    460         case -1:
    461             break;
    462         default:
    463             ALOGE("unknown scaling mode: %d",
    464                     overrideScalingMode);
    465             mStatus = BAD_VALUE;
    466             return *this;
    467     }
    468 
    469     s->what |= layer_state_t::eOverrideScalingModeChanged;
    470     s->overrideScalingMode = overrideScalingMode;
    471     return *this;
    472 }
    473 
    474 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setGeometryAppliesWithResize(
    475         const sp<SurfaceControl>& sc) {
    476     layer_state_t* s = getLayerState(sc);
    477     if (!s) {
    478         mStatus = BAD_INDEX;
    479         return *this;
    480     }
    481     s->what |= layer_state_t::eGeometryAppliesWithResize;
    482     return *this;
    483 }
    484 
    485 SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::destroySurface(
    486         const sp<SurfaceControl>& sc) {
    487     layer_state_t* s = getLayerState(sc);
    488     if (!s) {
    489         mStatus = BAD_INDEX;
    490         return *this;
    491     }
    492     s->what |= layer_state_t::eDestroySurface;
    493     return *this;
    494 }
    495 
    496 // ---------------------------------------------------------------------------
    497 
    498 DisplayState& SurfaceComposerClient::Transaction::getDisplayState(const sp<IBinder>& token) {
    499     DisplayState s;
    500     s.token = token;
    501     ssize_t index = mDisplayStates.indexOf(s);
    502     if (index < 0) {
    503         // we don't have it, add an initialized layer_state to our list
    504         s.what = 0;
    505         index = mDisplayStates.add(s);
    506     }
    507     return mDisplayStates.editItemAt(static_cast<size_t>(index));
    508 }
    509 
    510 status_t SurfaceComposerClient::Transaction::setDisplaySurface(const sp<IBinder>& token,
    511         const sp<IGraphicBufferProducer>& bufferProducer) {
    512     if (bufferProducer.get() != nullptr) {
    513         // Make sure that composition can never be stalled by a virtual display
    514         // consumer that isn't processing buffers fast enough.
    515         status_t err = bufferProducer->setAsyncMode(true);
    516         if (err != NO_ERROR) {
    517             ALOGE("Composer::setDisplaySurface Failed to enable async mode on the "
    518                     "BufferQueue. This BufferQueue cannot be used for virtual "
    519                     "display. (%d)", err);
    520             return err;
    521         }
    522     }
    523     DisplayState& s(getDisplayState(token));
    524     s.surface = bufferProducer;
    525     s.what |= DisplayState::eSurfaceChanged;
    526     return NO_ERROR;
    527 }
    528 
    529 void SurfaceComposerClient::Transaction::setDisplayLayerStack(const sp<IBinder>& token,
    530         uint32_t layerStack) {
    531     DisplayState& s(getDisplayState(token));
    532     s.layerStack = layerStack;
    533     s.what |= DisplayState::eLayerStackChanged;
    534 }
    535 
    536 void SurfaceComposerClient::Transaction::setDisplayProjection(const sp<IBinder>& token,
    537         uint32_t orientation,
    538         const Rect& layerStackRect,
    539         const Rect& displayRect) {
    540     DisplayState& s(getDisplayState(token));
    541     s.orientation = orientation;
    542     s.viewport = layerStackRect;
    543     s.frame = displayRect;
    544     s.what |= DisplayState::eDisplayProjectionChanged;
    545     mForceSynchronous = true; // TODO: do we actually still need this?
    546 }
    547 
    548 void SurfaceComposerClient::Transaction::setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height) {
    549     DisplayState& s(getDisplayState(token));
    550     s.width = width;
    551     s.height = height;
    552     s.what |= DisplayState::eDisplaySizeChanged;
    553 }
    554 
    555 // ---------------------------------------------------------------------------
    556 
    557 SurfaceComposerClient::SurfaceComposerClient()
    558     : mStatus(NO_INIT)
    559 {
    560 }
    561 
    562 SurfaceComposerClient::SurfaceComposerClient(const sp<IGraphicBufferProducer>& root)
    563     : mStatus(NO_INIT), mParent(root)
    564 {
    565 }
    566 
    567 SurfaceComposerClient::SurfaceComposerClient(const sp<ISurfaceComposerClient>& client)
    568     : mStatus(NO_ERROR), mClient(client)
    569 {
    570 }
    571 
    572 void SurfaceComposerClient::onFirstRef() {
    573     sp<ISurfaceComposer> sf(ComposerService::getComposerService());
    574     if (sf != 0 && mStatus == NO_INIT) {
    575         auto rootProducer = mParent.promote();
    576         sp<ISurfaceComposerClient> conn;
    577         conn = (rootProducer != nullptr) ? sf->createScopedConnection(rootProducer) :
    578                 sf->createConnection();
    579         if (conn != 0) {
    580             mClient = conn;
    581             mStatus = NO_ERROR;
    582         }
    583     }
    584 }
    585 
    586 SurfaceComposerClient::~SurfaceComposerClient() {
    587     dispose();
    588 }
    589 
    590 status_t SurfaceComposerClient::initCheck() const {
    591     return mStatus;
    592 }
    593 
    594 sp<IBinder> SurfaceComposerClient::connection() const {
    595     return IInterface::asBinder(mClient);
    596 }
    597 
    598 status_t SurfaceComposerClient::linkToComposerDeath(
    599         const sp<IBinder::DeathRecipient>& recipient,
    600         void* cookie, uint32_t flags) {
    601     sp<ISurfaceComposer> sf(ComposerService::getComposerService());
    602     return IInterface::asBinder(sf)->linkToDeath(recipient, cookie, flags);
    603 }
    604 
    605 void SurfaceComposerClient::dispose() {
    606     // this can be called more than once.
    607     sp<ISurfaceComposerClient> client;
    608     Mutex::Autolock _lm(mLock);
    609     if (mClient != 0) {
    610         client = mClient; // hold ref while lock is held
    611         mClient.clear();
    612     }
    613     mStatus = NO_INIT;
    614 }
    615 
    616 sp<SurfaceControl> SurfaceComposerClient::createSurface(
    617         const String8& name,
    618         uint32_t w,
    619         uint32_t h,
    620         PixelFormat format,
    621         uint32_t flags,
    622         SurfaceControl* parent,
    623         int32_t windowType,
    624         int32_t ownerUid)
    625 {
    626     sp<SurfaceControl> s;
    627     createSurfaceChecked(name, w, h, format, &s, flags, parent, windowType, ownerUid);
    628     return s;
    629 }
    630 
    631 status_t SurfaceComposerClient::createSurfaceChecked(
    632         const String8& name,
    633         uint32_t w,
    634         uint32_t h,
    635         PixelFormat format,
    636         sp<SurfaceControl>* outSurface,
    637         uint32_t flags,
    638         SurfaceControl* parent,
    639         int32_t windowType,
    640         int32_t ownerUid)
    641 {
    642     sp<SurfaceControl> sur;
    643     status_t err = mStatus;
    644 
    645     if (mStatus == NO_ERROR) {
    646         sp<IBinder> handle;
    647         sp<IBinder> parentHandle;
    648         sp<IGraphicBufferProducer> gbp;
    649 
    650         if (parent != nullptr) {
    651             parentHandle = parent->getHandle();
    652         }
    653         err = mClient->createSurface(name, w, h, format, flags, parentHandle,
    654                 windowType, ownerUid, &handle, &gbp);
    655         ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err));
    656         if (err == NO_ERROR) {
    657             *outSurface = new SurfaceControl(this, handle, gbp, true /* owned */);
    658         }
    659     }
    660     return err;
    661 }
    662 
    663 status_t SurfaceComposerClient::destroySurface(const sp<IBinder>& sid) {
    664     if (mStatus != NO_ERROR)
    665         return mStatus;
    666     status_t err = mClient->destroySurface(sid);
    667     return err;
    668 }
    669 
    670 status_t SurfaceComposerClient::clearLayerFrameStats(const sp<IBinder>& token) const {
    671     if (mStatus != NO_ERROR) {
    672         return mStatus;
    673     }
    674     return mClient->clearLayerFrameStats(token);
    675 }
    676 
    677 status_t SurfaceComposerClient::getLayerFrameStats(const sp<IBinder>& token,
    678         FrameStats* outStats) const {
    679     if (mStatus != NO_ERROR) {
    680         return mStatus;
    681     }
    682     return mClient->getLayerFrameStats(token, outStats);
    683 }
    684 
    685 // ----------------------------------------------------------------------------
    686 
    687 status_t SurfaceComposerClient::enableVSyncInjections(bool enable) {
    688     sp<ISurfaceComposer> sf(ComposerService::getComposerService());
    689     return sf->enableVSyncInjections(enable);
    690 }
    691 
    692 status_t SurfaceComposerClient::injectVSync(nsecs_t when) {
    693     sp<ISurfaceComposer> sf(ComposerService::getComposerService());
    694     return sf->injectVSync(when);
    695 }
    696 
    697 status_t SurfaceComposerClient::getDisplayConfigs(
    698         const sp<IBinder>& display, Vector<DisplayInfo>* configs)
    699 {
    700     return ComposerService::getComposerService()->getDisplayConfigs(display, configs);
    701 }
    702 
    703 status_t SurfaceComposerClient::getDisplayInfo(const sp<IBinder>& display,
    704         DisplayInfo* info) {
    705     Vector<DisplayInfo> configs;
    706     status_t result = getDisplayConfigs(display, &configs);
    707     if (result != NO_ERROR) {
    708         return result;
    709     }
    710 
    711     int activeId = getActiveConfig(display);
    712     if (activeId < 0) {
    713         ALOGE("No active configuration found");
    714         return NAME_NOT_FOUND;
    715     }
    716 
    717     *info = configs[static_cast<size_t>(activeId)];
    718     return NO_ERROR;
    719 }
    720 
    721 int SurfaceComposerClient::getActiveConfig(const sp<IBinder>& display) {
    722     return ComposerService::getComposerService()->getActiveConfig(display);
    723 }
    724 
    725 status_t SurfaceComposerClient::setActiveConfig(const sp<IBinder>& display, int id) {
    726     return ComposerService::getComposerService()->setActiveConfig(display, id);
    727 }
    728 
    729 status_t SurfaceComposerClient::getDisplayColorModes(const sp<IBinder>& display,
    730         Vector<ColorMode>* outColorModes) {
    731     return ComposerService::getComposerService()->getDisplayColorModes(display, outColorModes);
    732 }
    733 
    734 ColorMode SurfaceComposerClient::getActiveColorMode(const sp<IBinder>& display) {
    735     return ComposerService::getComposerService()->getActiveColorMode(display);
    736 }
    737 
    738 status_t SurfaceComposerClient::setActiveColorMode(const sp<IBinder>& display,
    739         ColorMode colorMode) {
    740     return ComposerService::getComposerService()->setActiveColorMode(display, colorMode);
    741 }
    742 
    743 void SurfaceComposerClient::setDisplayPowerMode(const sp<IBinder>& token,
    744         int mode) {
    745     ComposerService::getComposerService()->setPowerMode(token, mode);
    746 }
    747 
    748 status_t SurfaceComposerClient::clearAnimationFrameStats() {
    749     return ComposerService::getComposerService()->clearAnimationFrameStats();
    750 }
    751 
    752 status_t SurfaceComposerClient::getAnimationFrameStats(FrameStats* outStats) {
    753     return ComposerService::getComposerService()->getAnimationFrameStats(outStats);
    754 }
    755 
    756 status_t SurfaceComposerClient::getHdrCapabilities(const sp<IBinder>& display,
    757         HdrCapabilities* outCapabilities) {
    758     return ComposerService::getComposerService()->getHdrCapabilities(display,
    759             outCapabilities);
    760 }
    761 
    762 // ----------------------------------------------------------------------------
    763 
    764 status_t ScreenshotClient::capture(const sp<IBinder>& display, Rect sourceCrop, uint32_t reqWidth,
    765                                    uint32_t reqHeight, int32_t minLayerZ, int32_t maxLayerZ,
    766                                    bool useIdentityTransform, uint32_t rotation,
    767                                    sp<GraphicBuffer>* outBuffer) {
    768     sp<ISurfaceComposer> s(ComposerService::getComposerService());
    769     if (s == NULL) return NO_INIT;
    770     status_t ret = s->captureScreen(display, outBuffer, sourceCrop, reqWidth, reqHeight, minLayerZ,
    771                                     maxLayerZ, useIdentityTransform,
    772                                     static_cast<ISurfaceComposer::Rotation>(rotation));
    773     if (ret != NO_ERROR) {
    774         return ret;
    775     }
    776     return ret;
    777 }
    778 
    779 status_t ScreenshotClient::captureLayers(const sp<IBinder>& layerHandle, Rect sourceCrop,
    780                                          float frameScale, sp<GraphicBuffer>* outBuffer) {
    781     sp<ISurfaceComposer> s(ComposerService::getComposerService());
    782     if (s == NULL) return NO_INIT;
    783     status_t ret = s->captureLayers(layerHandle, outBuffer, sourceCrop, frameScale,
    784                                     false /* childrenOnly */);
    785     return ret;
    786 }
    787 
    788 status_t ScreenshotClient::captureChildLayers(const sp<IBinder>& layerHandle, Rect sourceCrop,
    789                                               float frameScale, sp<GraphicBuffer>* outBuffer) {
    790     sp<ISurfaceComposer> s(ComposerService::getComposerService());
    791     if (s == NULL) return NO_INIT;
    792     status_t ret = s->captureLayers(layerHandle, outBuffer, sourceCrop, frameScale,
    793                                     true /* childrenOnly */);
    794     return ret;
    795 }
    796 // ----------------------------------------------------------------------------
    797 }; // namespace android
    798