Home | History | Annotate | Download | only in surfaceflinger
      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_NDEBUG 0
     18 #undef LOG_TAG
     19 #define LOG_TAG "Layer"
     20 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
     21 
     22 #include <stdlib.h>
     23 #include <stdint.h>
     24 #include <sys/types.h>
     25 #include <math.h>
     26 
     27 #include <cutils/compiler.h>
     28 #include <cutils/native_handle.h>
     29 #include <cutils/properties.h>
     30 
     31 #include <utils/Errors.h>
     32 #include <utils/Log.h>
     33 #include <utils/NativeHandle.h>
     34 #include <utils/StopWatch.h>
     35 #include <utils/Trace.h>
     36 
     37 #include <ui/GraphicBuffer.h>
     38 #include <ui/PixelFormat.h>
     39 
     40 #include <gui/BufferItem.h>
     41 #include <gui/Surface.h>
     42 
     43 #include "clz.h"
     44 #include "Colorizer.h"
     45 #include "DisplayDevice.h"
     46 #include "Layer.h"
     47 #include "MonitoredProducer.h"
     48 #include "SurfaceFlinger.h"
     49 
     50 #include "DisplayHardware/HWComposer.h"
     51 
     52 #include "RenderEngine/RenderEngine.h"
     53 
     54 #include <mutex>
     55 
     56 #define DEBUG_RESIZE    0
     57 
     58 namespace android {
     59 
     60 // ---------------------------------------------------------------------------
     61 
     62 int32_t Layer::sSequence = 1;
     63 
     64 Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
     65         const String8& name, uint32_t w, uint32_t h, uint32_t flags)
     66     :   contentDirty(false),
     67         sequence(uint32_t(android_atomic_inc(&sSequence))),
     68         mFlinger(flinger),
     69         mTextureName(-1U),
     70         mPremultipliedAlpha(true),
     71         mName("unnamed"),
     72         mFormat(PIXEL_FORMAT_NONE),
     73         mTransactionFlags(0),
     74         mPendingStateMutex(),
     75         mPendingStates(),
     76         mQueuedFrames(0),
     77         mSidebandStreamChanged(false),
     78         mCurrentTransform(0),
     79         mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
     80         mOverrideScalingMode(-1),
     81         mCurrentOpacity(true),
     82         mCurrentFrameNumber(0),
     83         mRefreshPending(false),
     84         mFrameLatencyNeeded(false),
     85         mFiltering(false),
     86         mNeedsFiltering(false),
     87         mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),
     88 #ifndef USE_HWC2
     89         mIsGlesComposition(false),
     90 #endif
     91         mProtectedByApp(false),
     92         mHasSurface(false),
     93         mClientRef(client),
     94         mPotentialCursor(false),
     95         mQueueItemLock(),
     96         mQueueItemCondition(),
     97         mQueueItems(),
     98         mLastFrameNumberReceived(0),
     99         mUpdateTexImageFailed(false),
    100         mAutoRefresh(false),
    101         mFreezePositionUpdates(false)
    102 {
    103 #ifdef USE_HWC2
    104     ALOGV("Creating Layer %s", name.string());
    105 #endif
    106 
    107     mCurrentCrop.makeInvalid();
    108     mFlinger->getRenderEngine().genTextures(1, &mTextureName);
    109     mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName);
    110 
    111     uint32_t layerFlags = 0;
    112     if (flags & ISurfaceComposerClient::eHidden)
    113         layerFlags |= layer_state_t::eLayerHidden;
    114     if (flags & ISurfaceComposerClient::eOpaque)
    115         layerFlags |= layer_state_t::eLayerOpaque;
    116     if (flags & ISurfaceComposerClient::eSecure)
    117         layerFlags |= layer_state_t::eLayerSecure;
    118 
    119     if (flags & ISurfaceComposerClient::eNonPremultiplied)
    120         mPremultipliedAlpha = false;
    121 
    122     mName = name;
    123 
    124     mCurrentState.active.w = w;
    125     mCurrentState.active.h = h;
    126     mCurrentState.active.transform.set(0, 0);
    127     mCurrentState.crop.makeInvalid();
    128     mCurrentState.finalCrop.makeInvalid();
    129     mCurrentState.z = 0;
    130 #ifdef USE_HWC2
    131     mCurrentState.alpha = 1.0f;
    132 #else
    133     mCurrentState.alpha = 0xFF;
    134 #endif
    135     mCurrentState.layerStack = 0;
    136     mCurrentState.flags = layerFlags;
    137     mCurrentState.sequence = 0;
    138     mCurrentState.requested = mCurrentState.active;
    139 
    140     // drawing state & current state are identical
    141     mDrawingState = mCurrentState;
    142 
    143 #ifdef USE_HWC2
    144     const auto& hwc = flinger->getHwComposer();
    145     const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY);
    146     nsecs_t displayPeriod = activeConfig->getVsyncPeriod();
    147 #else
    148     nsecs_t displayPeriod =
    149             flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
    150 #endif
    151     mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
    152 }
    153 
    154 void Layer::onFirstRef() {
    155     // Creates a custom BufferQueue for SurfaceFlingerConsumer to use
    156     sp<IGraphicBufferProducer> producer;
    157     sp<IGraphicBufferConsumer> consumer;
    158     BufferQueue::createBufferQueue(&producer, &consumer);
    159     mProducer = new MonitoredProducer(producer, mFlinger);
    160     mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName,
    161             this);
    162     mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
    163     mSurfaceFlingerConsumer->setContentsChangedListener(this);
    164     mSurfaceFlingerConsumer->setName(mName);
    165 
    166 #ifdef TARGET_DISABLE_TRIPLE_BUFFERING
    167 #warning "disabling triple buffering"
    168 #else
    169     mProducer->setMaxDequeuedBufferCount(2);
    170 #endif
    171 
    172     const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice());
    173     updateTransformHint(hw);
    174 }
    175 
    176 Layer::~Layer() {
    177   sp<Client> c(mClientRef.promote());
    178     if (c != 0) {
    179         c->detachLayer(this);
    180     }
    181 
    182     for (auto& point : mRemoteSyncPoints) {
    183         point->setTransactionApplied();
    184     }
    185     for (auto& point : mLocalSyncPoints) {
    186         point->setFrameAvailable();
    187     }
    188     mFlinger->deleteTextureAsync(mTextureName);
    189     mFrameTracker.logAndResetStats(mName);
    190 }
    191 
    192 // ---------------------------------------------------------------------------
    193 // callbacks
    194 // ---------------------------------------------------------------------------
    195 
    196 #ifdef USE_HWC2
    197 void Layer::onLayerDisplayed(const sp<Fence>& releaseFence) {
    198     if (mHwcLayers.empty()) {
    199         return;
    200     }
    201     mSurfaceFlingerConsumer->setReleaseFence(releaseFence);
    202 }
    203 #else
    204 void Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */,
    205         HWComposer::HWCLayerInterface* layer) {
    206     if (layer) {
    207         layer->onDisplayed();
    208         mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence());
    209     }
    210 }
    211 #endif
    212 
    213 void Layer::onFrameAvailable(const BufferItem& item) {
    214     // Add this buffer from our internal queue tracker
    215     { // Autolock scope
    216         Mutex::Autolock lock(mQueueItemLock);
    217 
    218         // Reset the frame number tracker when we receive the first buffer after
    219         // a frame number reset
    220         if (item.mFrameNumber == 1) {
    221             mLastFrameNumberReceived = 0;
    222         }
    223 
    224         // Ensure that callbacks are handled in order
    225         while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
    226             status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
    227                     ms2ns(500));
    228             if (result != NO_ERROR) {
    229                 ALOGE("[%s] Timed out waiting on callback", mName.string());
    230             }
    231         }
    232 
    233         mQueueItems.push_back(item);
    234         android_atomic_inc(&mQueuedFrames);
    235 
    236         // Wake up any pending callbacks
    237         mLastFrameNumberReceived = item.mFrameNumber;
    238         mQueueItemCondition.broadcast();
    239     }
    240 
    241     mFlinger->signalLayerUpdate();
    242 }
    243 
    244 void Layer::onFrameReplaced(const BufferItem& item) {
    245     { // Autolock scope
    246         Mutex::Autolock lock(mQueueItemLock);
    247 
    248         // Ensure that callbacks are handled in order
    249         while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
    250             status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
    251                     ms2ns(500));
    252             if (result != NO_ERROR) {
    253                 ALOGE("[%s] Timed out waiting on callback", mName.string());
    254             }
    255         }
    256 
    257         if (mQueueItems.empty()) {
    258             ALOGE("Can't replace a frame on an empty queue");
    259             return;
    260         }
    261         mQueueItems.editItemAt(mQueueItems.size() - 1) = item;
    262 
    263         // Wake up any pending callbacks
    264         mLastFrameNumberReceived = item.mFrameNumber;
    265         mQueueItemCondition.broadcast();
    266     }
    267 }
    268 
    269 void Layer::onSidebandStreamChanged() {
    270     if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) {
    271         // mSidebandStreamChanged was false
    272         mFlinger->signalLayerUpdate();
    273     }
    274 }
    275 
    276 // called with SurfaceFlinger::mStateLock from the drawing thread after
    277 // the layer has been remove from the current state list (and just before
    278 // it's removed from the drawing state list)
    279 void Layer::onRemoved() {
    280     mSurfaceFlingerConsumer->abandon();
    281 }
    282 
    283 // ---------------------------------------------------------------------------
    284 // set-up
    285 // ---------------------------------------------------------------------------
    286 
    287 const String8& Layer::getName() const {
    288     return mName;
    289 }
    290 
    291 status_t Layer::setBuffers( uint32_t w, uint32_t h,
    292                             PixelFormat format, uint32_t flags)
    293 {
    294     uint32_t const maxSurfaceDims = min(
    295             mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims());
    296 
    297     // never allow a surface larger than what our underlying GL implementation
    298     // can handle.
    299     if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) {
    300         ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h));
    301         return BAD_VALUE;
    302     }
    303 
    304     mFormat = format;
    305 
    306     mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false;
    307     mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false;
    308     mCurrentOpacity = getOpacityForFormat(format);
    309 
    310     mSurfaceFlingerConsumer->setDefaultBufferSize(w, h);
    311     mSurfaceFlingerConsumer->setDefaultBufferFormat(format);
    312     mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
    313 
    314     return NO_ERROR;
    315 }
    316 
    317 /*
    318  * The layer handle is just a BBinder object passed to the client
    319  * (remote process) -- we don't keep any reference on our side such that
    320  * the dtor is called when the remote side let go of its reference.
    321  *
    322  * LayerCleaner ensures that mFlinger->onLayerDestroyed() is called for
    323  * this layer when the handle is destroyed.
    324  */
    325 class Layer::Handle : public BBinder, public LayerCleaner {
    326     public:
    327         Handle(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer)
    328             : LayerCleaner(flinger, layer), owner(layer) {}
    329 
    330         wp<Layer> owner;
    331 };
    332 
    333 sp<IBinder> Layer::getHandle() {
    334     Mutex::Autolock _l(mLock);
    335 
    336     LOG_ALWAYS_FATAL_IF(mHasSurface,
    337             "Layer::getHandle() has already been called");
    338 
    339     mHasSurface = true;
    340 
    341     return new Handle(mFlinger, this);
    342 }
    343 
    344 sp<IGraphicBufferProducer> Layer::getProducer() const {
    345     return mProducer;
    346 }
    347 
    348 // ---------------------------------------------------------------------------
    349 // h/w composer set-up
    350 // ---------------------------------------------------------------------------
    351 
    352 Rect Layer::getContentCrop() const {
    353     // this is the crop rectangle that applies to the buffer
    354     // itself (as opposed to the window)
    355     Rect crop;
    356     if (!mCurrentCrop.isEmpty()) {
    357         // if the buffer crop is defined, we use that
    358         crop = mCurrentCrop;
    359     } else if (mActiveBuffer != NULL) {
    360         // otherwise we use the whole buffer
    361         crop = mActiveBuffer->getBounds();
    362     } else {
    363         // if we don't have a buffer yet, we use an empty/invalid crop
    364         crop.makeInvalid();
    365     }
    366     return crop;
    367 }
    368 
    369 static Rect reduce(const Rect& win, const Region& exclude) {
    370     if (CC_LIKELY(exclude.isEmpty())) {
    371         return win;
    372     }
    373     if (exclude.isRect()) {
    374         return win.reduce(exclude.getBounds());
    375     }
    376     return Region(win).subtract(exclude).getBounds();
    377 }
    378 
    379 Rect Layer::computeBounds() const {
    380     const Layer::State& s(getDrawingState());
    381     return computeBounds(s.activeTransparentRegion);
    382 }
    383 
    384 Rect Layer::computeBounds(const Region& activeTransparentRegion) const {
    385     const Layer::State& s(getDrawingState());
    386     Rect win(s.active.w, s.active.h);
    387 
    388     if (!s.crop.isEmpty()) {
    389         win.intersect(s.crop, &win);
    390     }
    391     // subtract the transparent region and snap to the bounds
    392     return reduce(win, activeTransparentRegion);
    393 }
    394 
    395 FloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
    396     // the content crop is the area of the content that gets scaled to the
    397     // layer's size.
    398     FloatRect crop(getContentCrop());
    399 
    400     // the crop is the area of the window that gets cropped, but not
    401     // scaled in any ways.
    402     const State& s(getDrawingState());
    403 
    404     // apply the projection's clipping to the window crop in
    405     // layerstack space, and convert-back to layer space.
    406     // if there are no window scaling involved, this operation will map to full
    407     // pixels in the buffer.
    408     // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
    409     // a viewport clipping and a window transform. we should use floating point to fix this.
    410 
    411     Rect activeCrop(s.active.w, s.active.h);
    412     if (!s.crop.isEmpty()) {
    413         activeCrop = s.crop;
    414     }
    415 
    416     activeCrop = s.active.transform.transform(activeCrop);
    417     if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
    418         activeCrop.clear();
    419     }
    420     if (!s.finalCrop.isEmpty()) {
    421         if(!activeCrop.intersect(s.finalCrop, &activeCrop)) {
    422             activeCrop.clear();
    423         }
    424     }
    425     activeCrop = s.active.transform.inverse().transform(activeCrop);
    426 
    427     // This needs to be here as transform.transform(Rect) computes the
    428     // transformed rect and then takes the bounding box of the result before
    429     // returning. This means
    430     // transform.inverse().transform(transform.transform(Rect)) != Rect
    431     // in which case we need to make sure the final rect is clipped to the
    432     // display bounds.
    433     if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
    434         activeCrop.clear();
    435     }
    436 
    437     // subtract the transparent region and snap to the bounds
    438     activeCrop = reduce(activeCrop, s.activeTransparentRegion);
    439 
    440     // Transform the window crop to match the buffer coordinate system,
    441     // which means using the inverse of the current transform set on the
    442     // SurfaceFlingerConsumer.
    443     uint32_t invTransform = mCurrentTransform;
    444     if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
    445         /*
    446          * the code below applies the primary display's inverse transform to the
    447          * buffer
    448          */
    449         uint32_t invTransformOrient =
    450                 DisplayDevice::getPrimaryDisplayOrientationTransform();
    451         // calculate the inverse transform
    452         if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
    453             invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
    454                     NATIVE_WINDOW_TRANSFORM_FLIP_H;
    455         }
    456         // and apply to the current transform
    457         invTransform = (Transform(invTransformOrient) * Transform(invTransform))
    458                 .getOrientation();
    459     }
    460 
    461     int winWidth = s.active.w;
    462     int winHeight = s.active.h;
    463     if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
    464         // If the activeCrop has been rotate the ends are rotated but not
    465         // the space itself so when transforming ends back we can't rely on
    466         // a modification of the axes of rotation. To account for this we
    467         // need to reorient the inverse rotation in terms of the current
    468         // axes of rotation.
    469         bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
    470         bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
    471         if (is_h_flipped == is_v_flipped) {
    472             invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
    473                     NATIVE_WINDOW_TRANSFORM_FLIP_H;
    474         }
    475         winWidth = s.active.h;
    476         winHeight = s.active.w;
    477     }
    478     const Rect winCrop = activeCrop.transform(
    479             invTransform, s.active.w, s.active.h);
    480 
    481     // below, crop is intersected with winCrop expressed in crop's coordinate space
    482     float xScale = crop.getWidth()  / float(winWidth);
    483     float yScale = crop.getHeight() / float(winHeight);
    484 
    485     float insetL = winCrop.left                 * xScale;
    486     float insetT = winCrop.top                  * yScale;
    487     float insetR = (winWidth - winCrop.right )  * xScale;
    488     float insetB = (winHeight - winCrop.bottom) * yScale;
    489 
    490     crop.left   += insetL;
    491     crop.top    += insetT;
    492     crop.right  -= insetR;
    493     crop.bottom -= insetB;
    494 
    495     return crop;
    496 }
    497 
    498 #ifdef USE_HWC2
    499 void Layer::setGeometry(const sp<const DisplayDevice>& displayDevice)
    500 #else
    501 void Layer::setGeometry(
    502     const sp<const DisplayDevice>& hw,
    503         HWComposer::HWCLayerInterface& layer)
    504 #endif
    505 {
    506 #ifdef USE_HWC2
    507     const auto hwcId = displayDevice->getHwcDisplayId();
    508     auto& hwcInfo = mHwcLayers[hwcId];
    509 #else
    510     layer.setDefaultState();
    511 #endif
    512 
    513     // enable this layer
    514 #ifdef USE_HWC2
    515     hwcInfo.forceClientComposition = false;
    516 
    517     if (isSecure() && !displayDevice->isSecure()) {
    518         hwcInfo.forceClientComposition = true;
    519     }
    520 
    521     auto& hwcLayer = hwcInfo.layer;
    522 #else
    523     layer.setSkip(false);
    524 
    525     if (isSecure() && !hw->isSecure()) {
    526         layer.setSkip(true);
    527     }
    528 #endif
    529 
    530     // this gives us only the "orientation" component of the transform
    531     const State& s(getDrawingState());
    532 #ifdef USE_HWC2
    533     if (!isOpaque(s) || s.alpha != 1.0f) {
    534         auto blendMode = mPremultipliedAlpha ?
    535                 HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage;
    536         auto error = hwcLayer->setBlendMode(blendMode);
    537         ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:"
    538                 " %s (%d)", mName.string(), to_string(blendMode).c_str(),
    539                 to_string(error).c_str(), static_cast<int32_t>(error));
    540     }
    541 #else
    542     if (!isOpaque(s) || s.alpha != 0xFF) {
    543         layer.setBlending(mPremultipliedAlpha ?
    544                 HWC_BLENDING_PREMULT :
    545                 HWC_BLENDING_COVERAGE);
    546     }
    547 #endif
    548 
    549     // apply the layer's transform, followed by the display's global transform
    550     // here we're guaranteed that the layer's transform preserves rects
    551     Region activeTransparentRegion(s.activeTransparentRegion);
    552     if (!s.crop.isEmpty()) {
    553         Rect activeCrop(s.crop);
    554         activeCrop = s.active.transform.transform(activeCrop);
    555 #ifdef USE_HWC2
    556         if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) {
    557 #else
    558         if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) {
    559 #endif
    560             activeCrop.clear();
    561         }
    562         activeCrop = s.active.transform.inverse().transform(activeCrop, true);
    563         // This needs to be here as transform.transform(Rect) computes the
    564         // transformed rect and then takes the bounding box of the result before
    565         // returning. This means
    566         // transform.inverse().transform(transform.transform(Rect)) != Rect
    567         // in which case we need to make sure the final rect is clipped to the
    568         // display bounds.
    569         if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) {
    570             activeCrop.clear();
    571         }
    572         // mark regions outside the crop as transparent
    573         activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
    574         activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom,
    575                 s.active.w, s.active.h));
    576         activeTransparentRegion.orSelf(Rect(0, activeCrop.top,
    577                 activeCrop.left, activeCrop.bottom));
    578         activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top,
    579                 s.active.w, activeCrop.bottom));
    580     }
    581     Rect frame(s.active.transform.transform(computeBounds(activeTransparentRegion)));
    582     if (!s.finalCrop.isEmpty()) {
    583         if(!frame.intersect(s.finalCrop, &frame)) {
    584             frame.clear();
    585         }
    586     }
    587 #ifdef USE_HWC2
    588     if (!frame.intersect(displayDevice->getViewport(), &frame)) {
    589         frame.clear();
    590     }
    591     const Transform& tr(displayDevice->getTransform());
    592     Rect transformedFrame = tr.transform(frame);
    593     auto error = hwcLayer->setDisplayFrame(transformedFrame);
    594     ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set display frame "
    595             "[%d, %d, %d, %d]: %s (%d)", mName.string(), transformedFrame.left,
    596             transformedFrame.top, transformedFrame.right,
    597             transformedFrame.bottom, to_string(error).c_str(),
    598             static_cast<int32_t>(error));
    599 
    600     FloatRect sourceCrop = computeCrop(displayDevice);
    601     error = hwcLayer->setSourceCrop(sourceCrop);
    602     ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set source crop "
    603             "[%.3f, %.3f, %.3f, %.3f]: %s (%d)", mName.string(),
    604             sourceCrop.left, sourceCrop.top, sourceCrop.right,
    605             sourceCrop.bottom, to_string(error).c_str(),
    606             static_cast<int32_t>(error));
    607 
    608     error = hwcLayer->setPlaneAlpha(s.alpha);
    609     ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: "
    610             "%s (%d)", mName.string(), s.alpha, to_string(error).c_str(),
    611             static_cast<int32_t>(error));
    612 
    613     error = hwcLayer->setZOrder(s.z);
    614     ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)",
    615             mName.string(), s.z, to_string(error).c_str(),
    616             static_cast<int32_t>(error));
    617 #else
    618     if (!frame.intersect(hw->getViewport(), &frame)) {
    619         frame.clear();
    620     }
    621     const Transform& tr(hw->getTransform());
    622     layer.setFrame(tr.transform(frame));
    623     layer.setCrop(computeCrop(hw));
    624     layer.setPlaneAlpha(s.alpha);
    625 #endif
    626 
    627     /*
    628      * Transformations are applied in this order:
    629      * 1) buffer orientation/flip/mirror
    630      * 2) state transformation (window manager)
    631      * 3) layer orientation (screen orientation)
    632      * (NOTE: the matrices are multiplied in reverse order)
    633      */
    634 
    635     const Transform bufferOrientation(mCurrentTransform);
    636     Transform transform(tr * s.active.transform * bufferOrientation);
    637 
    638     if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
    639         /*
    640          * the code below applies the primary display's inverse transform to the
    641          * buffer
    642          */
    643         uint32_t invTransform =
    644                 DisplayDevice::getPrimaryDisplayOrientationTransform();
    645         // calculate the inverse transform
    646         if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
    647             invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
    648                     NATIVE_WINDOW_TRANSFORM_FLIP_H;
    649         }
    650         // and apply to the current transform
    651         transform = Transform(invTransform) * transform;
    652     }
    653 
    654     // this gives us only the "orientation" component of the transform
    655     const uint32_t orientation = transform.getOrientation();
    656 #ifdef USE_HWC2
    657     if (orientation & Transform::ROT_INVALID) {
    658         // we can only handle simple transformation
    659         hwcInfo.forceClientComposition = true;
    660     } else {
    661         auto transform = static_cast<HWC2::Transform>(orientation);
    662         auto error = hwcLayer->setTransform(transform);
    663         ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: "
    664                 "%s (%d)", mName.string(), to_string(transform).c_str(),
    665                 to_string(error).c_str(), static_cast<int32_t>(error));
    666     }
    667 #else
    668     if (orientation & Transform::ROT_INVALID) {
    669         // we can only handle simple transformation
    670         layer.setSkip(true);
    671     } else {
    672         layer.setTransform(orientation);
    673     }
    674 #endif
    675 }
    676 
    677 #ifdef USE_HWC2
    678 void Layer::forceClientComposition(int32_t hwcId) {
    679     if (mHwcLayers.count(hwcId) == 0) {
    680         ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId);
    681         return;
    682     }
    683 
    684     mHwcLayers[hwcId].forceClientComposition = true;
    685 }
    686 #endif
    687 
    688 #ifdef USE_HWC2
    689 void Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) {
    690     // Apply this display's projection's viewport to the visible region
    691     // before giving it to the HWC HAL.
    692     const Transform& tr = displayDevice->getTransform();
    693     const auto& viewport = displayDevice->getViewport();
    694     Region visible = tr.transform(visibleRegion.intersect(viewport));
    695     auto hwcId = displayDevice->getHwcDisplayId();
    696     auto& hwcLayer = mHwcLayers[hwcId].layer;
    697     auto error = hwcLayer->setVisibleRegion(visible);
    698     if (error != HWC2::Error::None) {
    699         ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(),
    700                 to_string(error).c_str(), static_cast<int32_t>(error));
    701         visible.dump(LOG_TAG);
    702     }
    703 
    704     error = hwcLayer->setSurfaceDamage(surfaceDamageRegion);
    705     if (error != HWC2::Error::None) {
    706         ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(),
    707                 to_string(error).c_str(), static_cast<int32_t>(error));
    708         surfaceDamageRegion.dump(LOG_TAG);
    709     }
    710 
    711     // Sideband layers
    712     if (mSidebandStream.get()) {
    713         setCompositionType(hwcId, HWC2::Composition::Sideband);
    714         ALOGV("[%s] Requesting Sideband composition", mName.string());
    715         error = hwcLayer->setSidebandStream(mSidebandStream->handle());
    716         if (error != HWC2::Error::None) {
    717             ALOGE("[%s] Failed to set sideband stream %p: %s (%d)",
    718                     mName.string(), mSidebandStream->handle(),
    719                     to_string(error).c_str(), static_cast<int32_t>(error));
    720         }
    721         return;
    722     }
    723 
    724     // Client layers
    725     if (mHwcLayers[hwcId].forceClientComposition ||
    726             (mActiveBuffer != nullptr && mActiveBuffer->handle == nullptr)) {
    727         ALOGV("[%s] Requesting Client composition", mName.string());
    728         setCompositionType(hwcId, HWC2::Composition::Client);
    729         return;
    730     }
    731 
    732     // SolidColor layers
    733     if (mActiveBuffer == nullptr) {
    734         setCompositionType(hwcId, HWC2::Composition::SolidColor);
    735 
    736         // For now, we only support black for DimLayer
    737         error = hwcLayer->setColor({0, 0, 0, 255});
    738         if (error != HWC2::Error::None) {
    739             ALOGE("[%s] Failed to set color: %s (%d)", mName.string(),
    740                     to_string(error).c_str(), static_cast<int32_t>(error));
    741         }
    742 
    743         // Clear out the transform, because it doesn't make sense absent a
    744         // source buffer
    745         error = hwcLayer->setTransform(HWC2::Transform::None);
    746         if (error != HWC2::Error::None) {
    747             ALOGE("[%s] Failed to clear transform: %s (%d)", mName.string(),
    748                     to_string(error).c_str(), static_cast<int32_t>(error));
    749         }
    750 
    751         return;
    752     }
    753 
    754     // Device or Cursor layers
    755     if (mPotentialCursor) {
    756         ALOGV("[%s] Requesting Cursor composition", mName.string());
    757         setCompositionType(hwcId, HWC2::Composition::Cursor);
    758     } else {
    759         ALOGV("[%s] Requesting Device composition", mName.string());
    760         setCompositionType(hwcId, HWC2::Composition::Device);
    761     }
    762 
    763     auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence();
    764     error = hwcLayer->setBuffer(mActiveBuffer->handle, acquireFence);
    765     if (error != HWC2::Error::None) {
    766         ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(),
    767                 mActiveBuffer->handle, to_string(error).c_str(),
    768                 static_cast<int32_t>(error));
    769     }
    770 }
    771 #else
    772 void Layer::setPerFrameData(const sp<const DisplayDevice>& hw,
    773         HWComposer::HWCLayerInterface& layer) {
    774     // we have to set the visible region on every frame because
    775     // we currently free it during onLayerDisplayed(), which is called
    776     // after HWComposer::commit() -- every frame.
    777     // Apply this display's projection's viewport to the visible region
    778     // before giving it to the HWC HAL.
    779     const Transform& tr = hw->getTransform();
    780     Region visible = tr.transform(visibleRegion.intersect(hw->getViewport()));
    781     layer.setVisibleRegionScreen(visible);
    782     layer.setSurfaceDamage(surfaceDamageRegion);
    783     mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER);
    784 
    785     if (mSidebandStream.get()) {
    786         layer.setSidebandStream(mSidebandStream);
    787     } else {
    788         // NOTE: buffer can be NULL if the client never drew into this
    789         // layer yet, or if we ran out of memory
    790         layer.setBuffer(mActiveBuffer);
    791     }
    792 }
    793 #endif
    794 
    795 #ifdef USE_HWC2
    796 void Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) {
    797     auto hwcId = displayDevice->getHwcDisplayId();
    798     if (mHwcLayers.count(hwcId) == 0 ||
    799             getCompositionType(hwcId) != HWC2::Composition::Cursor) {
    800         return;
    801     }
    802 
    803     // This gives us only the "orientation" component of the transform
    804     const State& s(getCurrentState());
    805 
    806     // Apply the layer's transform, followed by the display's global transform
    807     // Here we're guaranteed that the layer's transform preserves rects
    808     Rect win(s.active.w, s.active.h);
    809     if (!s.crop.isEmpty()) {
    810         win.intersect(s.crop, &win);
    811     }
    812     // Subtract the transparent region and snap to the bounds
    813     Rect bounds = reduce(win, s.activeTransparentRegion);
    814     Rect frame(s.active.transform.transform(bounds));
    815     frame.intersect(displayDevice->getViewport(), &frame);
    816     if (!s.finalCrop.isEmpty()) {
    817         frame.intersect(s.finalCrop, &frame);
    818     }
    819     auto& displayTransform(displayDevice->getTransform());
    820     auto position = displayTransform.transform(frame);
    821 
    822     auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left,
    823             position.top);
    824     ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position "
    825             "to (%d, %d): %s (%d)", mName.string(), position.left,
    826             position.top, to_string(error).c_str(),
    827             static_cast<int32_t>(error));
    828 }
    829 #else
    830 void Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */,
    831         HWComposer::HWCLayerInterface& layer) {
    832     int fenceFd = -1;
    833 
    834     // TODO: there is a possible optimization here: we only need to set the
    835     // acquire fence the first time a new buffer is acquired on EACH display.
    836 
    837     if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) {
    838         sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence();
    839         if (fence->isValid()) {
    840             fenceFd = fence->dup();
    841             if (fenceFd == -1) {
    842                 ALOGW("failed to dup layer fence, skipping sync: %d", errno);
    843             }
    844         }
    845     }
    846     layer.setAcquireFenceFd(fenceFd);
    847 }
    848 
    849 Rect Layer::getPosition(
    850     const sp<const DisplayDevice>& hw)
    851 {
    852     // this gives us only the "orientation" component of the transform
    853     const State& s(getCurrentState());
    854 
    855     // apply the layer's transform, followed by the display's global transform
    856     // here we're guaranteed that the layer's transform preserves rects
    857     Rect win(s.active.w, s.active.h);
    858     if (!s.crop.isEmpty()) {
    859         win.intersect(s.crop, &win);
    860     }
    861     // subtract the transparent region and snap to the bounds
    862     Rect bounds = reduce(win, s.activeTransparentRegion);
    863     Rect frame(s.active.transform.transform(bounds));
    864     frame.intersect(hw->getViewport(), &frame);
    865     if (!s.finalCrop.isEmpty()) {
    866         frame.intersect(s.finalCrop, &frame);
    867     }
    868     const Transform& tr(hw->getTransform());
    869     return Rect(tr.transform(frame));
    870 }
    871 #endif
    872 
    873 // ---------------------------------------------------------------------------
    874 // drawing...
    875 // ---------------------------------------------------------------------------
    876 
    877 void Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const {
    878     onDraw(hw, clip, false);
    879 }
    880 
    881 void Layer::draw(const sp<const DisplayDevice>& hw,
    882         bool useIdentityTransform) const {
    883     onDraw(hw, Region(hw->bounds()), useIdentityTransform);
    884 }
    885 
    886 void Layer::draw(const sp<const DisplayDevice>& hw) const {
    887     onDraw(hw, Region(hw->bounds()), false);
    888 }
    889 
    890 void Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip,
    891         bool useIdentityTransform) const
    892 {
    893     ATRACE_CALL();
    894 
    895     if (CC_UNLIKELY(mActiveBuffer == 0)) {
    896         // the texture has not been created yet, this Layer has
    897         // in fact never been drawn into. This happens frequently with
    898         // SurfaceView because the WindowManager can't know when the client
    899         // has drawn the first time.
    900 
    901         // If there is nothing under us, we paint the screen in black, otherwise
    902         // we just skip this update.
    903 
    904         // figure out if there is something below us
    905         Region under;
    906         const SurfaceFlinger::LayerVector& drawingLayers(
    907                 mFlinger->mDrawingState.layersSortedByZ);
    908         const size_t count = drawingLayers.size();
    909         for (size_t i=0 ; i<count ; ++i) {
    910             const sp<Layer>& layer(drawingLayers[i]);
    911             if (layer.get() == static_cast<Layer const*>(this))
    912                 break;
    913             under.orSelf( hw->getTransform().transform(layer->visibleRegion) );
    914         }
    915         // if not everything below us is covered, we plug the holes!
    916         Region holes(clip.subtract(under));
    917         if (!holes.isEmpty()) {
    918             clearWithOpenGL(hw, holes, 0, 0, 0, 1);
    919         }
    920         return;
    921     }
    922 
    923     // Bind the current buffer to the GL texture, and wait for it to be
    924     // ready for us to draw into.
    925     status_t err = mSurfaceFlingerConsumer->bindTextureImage();
    926     if (err != NO_ERROR) {
    927         ALOGW("onDraw: bindTextureImage failed (err=%d)", err);
    928         // Go ahead and draw the buffer anyway; no matter what we do the screen
    929         // is probably going to have something visibly wrong.
    930     }
    931 
    932     bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure());
    933 
    934     RenderEngine& engine(mFlinger->getRenderEngine());
    935 
    936     if (!blackOutLayer) {
    937         // TODO: we could be more subtle with isFixedSize()
    938         const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize();
    939 
    940         // Query the texture matrix given our current filtering mode.
    941         float textureMatrix[16];
    942         mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering);
    943         mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix);
    944 
    945         if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
    946 
    947             /*
    948              * the code below applies the primary display's inverse transform to
    949              * the texture transform
    950              */
    951 
    952             // create a 4x4 transform matrix from the display transform flags
    953             const mat4 flipH(-1,0,0,0,  0,1,0,0, 0,0,1,0, 1,0,0,1);
    954             const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1);
    955             const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1);
    956 
    957             mat4 tr;
    958             uint32_t transform =
    959                     DisplayDevice::getPrimaryDisplayOrientationTransform();
    960             if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90)
    961                 tr = tr * rot90;
    962             if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H)
    963                 tr = tr * flipH;
    964             if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V)
    965                 tr = tr * flipV;
    966 
    967             // calculate the inverse
    968             tr = inverse(tr);
    969 
    970             // and finally apply it to the original texture matrix
    971             const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr);
    972             memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix));
    973         }
    974 
    975         // Set things up for texturing.
    976         mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight());
    977         mTexture.setFiltering(useFiltering);
    978         mTexture.setMatrix(textureMatrix);
    979 
    980         engine.setupLayerTexturing(mTexture);
    981     } else {
    982         engine.setupLayerBlackedOut();
    983     }
    984     drawWithOpenGL(hw, clip, useIdentityTransform);
    985     engine.disableTexturing();
    986 }
    987 
    988 
    989 void Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw,
    990         const Region& /* clip */, float red, float green, float blue,
    991         float alpha) const
    992 {
    993     RenderEngine& engine(mFlinger->getRenderEngine());
    994     computeGeometry(hw, mMesh, false);
    995     engine.setupFillWithColor(red, green, blue, alpha);
    996     engine.drawMesh(mMesh);
    997 }
    998 
    999 void Layer::clearWithOpenGL(
   1000         const sp<const DisplayDevice>& hw, const Region& clip) const {
   1001     clearWithOpenGL(hw, clip, 0,0,0,0);
   1002 }
   1003 
   1004 void Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw,
   1005         const Region& /* clip */, bool useIdentityTransform) const {
   1006     const State& s(getDrawingState());
   1007 
   1008     computeGeometry(hw, mMesh, useIdentityTransform);
   1009 
   1010     /*
   1011      * NOTE: the way we compute the texture coordinates here produces
   1012      * different results than when we take the HWC path -- in the later case
   1013      * the "source crop" is rounded to texel boundaries.
   1014      * This can produce significantly different results when the texture
   1015      * is scaled by a large amount.
   1016      *
   1017      * The GL code below is more logical (imho), and the difference with
   1018      * HWC is due to a limitation of the HWC API to integers -- a question
   1019      * is suspend is whether we should ignore this problem or revert to
   1020      * GL composition when a buffer scaling is applied (maybe with some
   1021      * minimal value)? Or, we could make GL behave like HWC -- but this feel
   1022      * like more of a hack.
   1023      */
   1024     Rect win(computeBounds());
   1025 
   1026     if (!s.finalCrop.isEmpty()) {
   1027         win = s.active.transform.transform(win);
   1028         if (!win.intersect(s.finalCrop, &win)) {
   1029             win.clear();
   1030         }
   1031         win = s.active.transform.inverse().transform(win);
   1032         if (!win.intersect(computeBounds(), &win)) {
   1033             win.clear();
   1034         }
   1035     }
   1036 
   1037     float left   = float(win.left)   / float(s.active.w);
   1038     float top    = float(win.top)    / float(s.active.h);
   1039     float right  = float(win.right)  / float(s.active.w);
   1040     float bottom = float(win.bottom) / float(s.active.h);
   1041 
   1042     // TODO: we probably want to generate the texture coords with the mesh
   1043     // here we assume that we only have 4 vertices
   1044     Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>());
   1045     texCoords[0] = vec2(left, 1.0f - top);
   1046     texCoords[1] = vec2(left, 1.0f - bottom);
   1047     texCoords[2] = vec2(right, 1.0f - bottom);
   1048     texCoords[3] = vec2(right, 1.0f - top);
   1049 
   1050     RenderEngine& engine(mFlinger->getRenderEngine());
   1051     engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), s.alpha);
   1052     engine.drawMesh(mMesh);
   1053     engine.disableBlending();
   1054 }
   1055 
   1056 #ifdef USE_HWC2
   1057 void Layer::setCompositionType(int32_t hwcId, HWC2::Composition type,
   1058         bool callIntoHwc) {
   1059     if (mHwcLayers.count(hwcId) == 0) {
   1060         ALOGE("setCompositionType called without a valid HWC layer");
   1061         return;
   1062     }
   1063     auto& hwcInfo = mHwcLayers[hwcId];
   1064     auto& hwcLayer = hwcInfo.layer;
   1065     ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(),
   1066             to_string(type).c_str(), static_cast<int>(callIntoHwc));
   1067     if (hwcInfo.compositionType != type) {
   1068         ALOGV("    actually setting");
   1069         hwcInfo.compositionType = type;
   1070         if (callIntoHwc) {
   1071             auto error = hwcLayer->setCompositionType(type);
   1072             ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set "
   1073                     "composition type %s: %s (%d)", mName.string(),
   1074                     to_string(type).c_str(), to_string(error).c_str(),
   1075                     static_cast<int32_t>(error));
   1076         }
   1077     }
   1078 }
   1079 
   1080 HWC2::Composition Layer::getCompositionType(int32_t hwcId) const {
   1081     if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
   1082         // If we're querying the composition type for a display that does not
   1083         // have a HWC counterpart, then it will always be Client
   1084         return HWC2::Composition::Client;
   1085     }
   1086     if (mHwcLayers.count(hwcId) == 0) {
   1087         ALOGE("getCompositionType called with an invalid HWC layer");
   1088         return HWC2::Composition::Invalid;
   1089     }
   1090     return mHwcLayers.at(hwcId).compositionType;
   1091 }
   1092 
   1093 void Layer::setClearClientTarget(int32_t hwcId, bool clear) {
   1094     if (mHwcLayers.count(hwcId) == 0) {
   1095         ALOGE("setClearClientTarget called without a valid HWC layer");
   1096         return;
   1097     }
   1098     mHwcLayers[hwcId].clearClientTarget = clear;
   1099 }
   1100 
   1101 bool Layer::getClearClientTarget(int32_t hwcId) const {
   1102     if (mHwcLayers.count(hwcId) == 0) {
   1103         ALOGE("getClearClientTarget called without a valid HWC layer");
   1104         return false;
   1105     }
   1106     return mHwcLayers.at(hwcId).clearClientTarget;
   1107 }
   1108 #endif
   1109 
   1110 uint32_t Layer::getProducerStickyTransform() const {
   1111     int producerStickyTransform = 0;
   1112     int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform);
   1113     if (ret != OK) {
   1114         ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__,
   1115                 strerror(-ret), ret);
   1116         return 0;
   1117     }
   1118     return static_cast<uint32_t>(producerStickyTransform);
   1119 }
   1120 
   1121 bool Layer::latchUnsignaledBuffers() {
   1122     static bool propertyLoaded = false;
   1123     static bool latch = false;
   1124     static std::mutex mutex;
   1125     std::lock_guard<std::mutex> lock(mutex);
   1126     if (!propertyLoaded) {
   1127         char value[PROPERTY_VALUE_MAX] = {};
   1128         property_get("debug.sf.latch_unsignaled", value, "0");
   1129         latch = atoi(value);
   1130         propertyLoaded = true;
   1131     }
   1132     return latch;
   1133 }
   1134 
   1135 uint64_t Layer::getHeadFrameNumber() const {
   1136     Mutex::Autolock lock(mQueueItemLock);
   1137     if (!mQueueItems.empty()) {
   1138         return mQueueItems[0].mFrameNumber;
   1139     } else {
   1140         return mCurrentFrameNumber;
   1141     }
   1142 }
   1143 
   1144 bool Layer::headFenceHasSignaled() const {
   1145 #ifdef USE_HWC2
   1146     if (latchUnsignaledBuffers()) {
   1147         return true;
   1148     }
   1149 
   1150     Mutex::Autolock lock(mQueueItemLock);
   1151     if (mQueueItems.empty()) {
   1152         return true;
   1153     }
   1154     if (mQueueItems[0].mIsDroppable) {
   1155         // Even though this buffer's fence may not have signaled yet, it could
   1156         // be replaced by another buffer before it has a chance to, which means
   1157         // that it's possible to get into a situation where a buffer is never
   1158         // able to be latched. To avoid this, grab this buffer anyway.
   1159         return true;
   1160     }
   1161     return mQueueItems[0].mFence->getSignalTime() != INT64_MAX;
   1162 #else
   1163     return true;
   1164 #endif
   1165 }
   1166 
   1167 bool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) {
   1168     if (point->getFrameNumber() <= mCurrentFrameNumber) {
   1169         // Don't bother with a SyncPoint, since we've already latched the
   1170         // relevant frame
   1171         return false;
   1172     }
   1173 
   1174     Mutex::Autolock lock(mLocalSyncPointMutex);
   1175     mLocalSyncPoints.push_back(point);
   1176     return true;
   1177 }
   1178 
   1179 void Layer::setFiltering(bool filtering) {
   1180     mFiltering = filtering;
   1181 }
   1182 
   1183 bool Layer::getFiltering() const {
   1184     return mFiltering;
   1185 }
   1186 
   1187 // As documented in libhardware header, formats in the range
   1188 // 0x100 - 0x1FF are specific to the HAL implementation, and
   1189 // are known to have no alpha channel
   1190 // TODO: move definition for device-specific range into
   1191 // hardware.h, instead of using hard-coded values here.
   1192 #define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF)
   1193 
   1194 bool Layer::getOpacityForFormat(uint32_t format) {
   1195     if (HARDWARE_IS_DEVICE_FORMAT(format)) {
   1196         return true;
   1197     }
   1198     switch (format) {
   1199         case HAL_PIXEL_FORMAT_RGBA_8888:
   1200         case HAL_PIXEL_FORMAT_BGRA_8888:
   1201             return false;
   1202     }
   1203     // in all other case, we have no blending (also for unknown formats)
   1204     return true;
   1205 }
   1206 
   1207 // ----------------------------------------------------------------------------
   1208 // local state
   1209 // ----------------------------------------------------------------------------
   1210 
   1211 static void boundPoint(vec2* point, const Rect& crop) {
   1212     if (point->x < crop.left) {
   1213         point->x = crop.left;
   1214     }
   1215     if (point->x > crop.right) {
   1216         point->x = crop.right;
   1217     }
   1218     if (point->y < crop.top) {
   1219         point->y = crop.top;
   1220     }
   1221     if (point->y > crop.bottom) {
   1222         point->y = crop.bottom;
   1223     }
   1224 }
   1225 
   1226 void Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
   1227         bool useIdentityTransform) const
   1228 {
   1229     const Layer::State& s(getDrawingState());
   1230     const Transform tr(hw->getTransform());
   1231     const uint32_t hw_h = hw->getHeight();
   1232     Rect win(s.active.w, s.active.h);
   1233     if (!s.crop.isEmpty()) {
   1234         win.intersect(s.crop, &win);
   1235     }
   1236     // subtract the transparent region and snap to the bounds
   1237     win = reduce(win, s.activeTransparentRegion);
   1238 
   1239     vec2 lt = vec2(win.left, win.top);
   1240     vec2 lb = vec2(win.left, win.bottom);
   1241     vec2 rb = vec2(win.right, win.bottom);
   1242     vec2 rt = vec2(win.right, win.top);
   1243 
   1244     if (!useIdentityTransform) {
   1245         lt = s.active.transform.transform(lt);
   1246         lb = s.active.transform.transform(lb);
   1247         rb = s.active.transform.transform(rb);
   1248         rt = s.active.transform.transform(rt);
   1249     }
   1250 
   1251     if (!s.finalCrop.isEmpty()) {
   1252         boundPoint(&lt, s.finalCrop);
   1253         boundPoint(&lb, s.finalCrop);
   1254         boundPoint(&rb, s.finalCrop);
   1255         boundPoint(&rt, s.finalCrop);
   1256     }
   1257 
   1258     Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
   1259     position[0] = tr.transform(lt);
   1260     position[1] = tr.transform(lb);
   1261     position[2] = tr.transform(rb);
   1262     position[3] = tr.transform(rt);
   1263     for (size_t i=0 ; i<4 ; i++) {
   1264         position[i].y = hw_h - position[i].y;
   1265     }
   1266 }
   1267 
   1268 bool Layer::isOpaque(const Layer::State& s) const
   1269 {
   1270     // if we don't have a buffer yet, we're translucent regardless of the
   1271     // layer's opaque flag.
   1272     if (mActiveBuffer == 0) {
   1273         return false;
   1274     }
   1275 
   1276     // if the layer has the opaque flag, then we're always opaque,
   1277     // otherwise we use the current buffer's format.
   1278     return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity;
   1279 }
   1280 
   1281 bool Layer::isSecure() const
   1282 {
   1283     const Layer::State& s(mDrawingState);
   1284     return (s.flags & layer_state_t::eLayerSecure);
   1285 }
   1286 
   1287 bool Layer::isProtected() const
   1288 {
   1289     const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
   1290     return (activeBuffer != 0) &&
   1291             (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
   1292 }
   1293 
   1294 bool Layer::isFixedSize() const {
   1295     return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE;
   1296 }
   1297 
   1298 bool Layer::isCropped() const {
   1299     return !mCurrentCrop.isEmpty();
   1300 }
   1301 
   1302 bool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const {
   1303     return mNeedsFiltering || hw->needsFiltering();
   1304 }
   1305 
   1306 void Layer::setVisibleRegion(const Region& visibleRegion) {
   1307     // always called from main thread
   1308     this->visibleRegion = visibleRegion;
   1309 }
   1310 
   1311 void Layer::setCoveredRegion(const Region& coveredRegion) {
   1312     // always called from main thread
   1313     this->coveredRegion = coveredRegion;
   1314 }
   1315 
   1316 void Layer::setVisibleNonTransparentRegion(const Region&
   1317         setVisibleNonTransparentRegion) {
   1318     // always called from main thread
   1319     this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
   1320 }
   1321 
   1322 // ----------------------------------------------------------------------------
   1323 // transaction
   1324 // ----------------------------------------------------------------------------
   1325 
   1326 void Layer::pushPendingState() {
   1327     if (!mCurrentState.modified) {
   1328         return;
   1329     }
   1330 
   1331     // If this transaction is waiting on the receipt of a frame, generate a sync
   1332     // point and send it to the remote layer.
   1333     if (mCurrentState.handle != nullptr) {
   1334         sp<IBinder> strongBinder = mCurrentState.handle.promote();
   1335         sp<Handle> handle = nullptr;
   1336         sp<Layer> handleLayer = nullptr;
   1337         if (strongBinder != nullptr) {
   1338             handle = static_cast<Handle*>(strongBinder.get());
   1339             handleLayer = handle->owner.promote();
   1340         }
   1341         if (strongBinder == nullptr || handleLayer == nullptr) {
   1342             ALOGE("[%s] Unable to promote Layer handle", mName.string());
   1343             // If we can't promote the layer we are intended to wait on,
   1344             // then it is expired or otherwise invalid. Allow this transaction
   1345             // to be applied as per normal (no synchronization).
   1346             mCurrentState.handle = nullptr;
   1347         } else {
   1348             auto syncPoint = std::make_shared<SyncPoint>(
   1349                     mCurrentState.frameNumber);
   1350             if (handleLayer->addSyncPoint(syncPoint)) {
   1351                 mRemoteSyncPoints.push_back(std::move(syncPoint));
   1352             } else {
   1353                 // We already missed the frame we're supposed to synchronize
   1354                 // on, so go ahead and apply the state update
   1355                 mCurrentState.handle = nullptr;
   1356             }
   1357         }
   1358 
   1359         // Wake us up to check if the frame has been received
   1360         setTransactionFlags(eTransactionNeeded);
   1361     }
   1362     mPendingStates.push_back(mCurrentState);
   1363 }
   1364 
   1365 void Layer::popPendingState(State* stateToCommit) {
   1366     auto oldFlags = stateToCommit->flags;
   1367     *stateToCommit = mPendingStates[0];
   1368     stateToCommit->flags = (oldFlags & ~stateToCommit->mask) |
   1369             (stateToCommit->flags & stateToCommit->mask);
   1370 
   1371     mPendingStates.removeAt(0);
   1372 }
   1373 
   1374 bool Layer::applyPendingStates(State* stateToCommit) {
   1375     bool stateUpdateAvailable = false;
   1376     while (!mPendingStates.empty()) {
   1377         if (mPendingStates[0].handle != nullptr) {
   1378             if (mRemoteSyncPoints.empty()) {
   1379                 // If we don't have a sync point for this, apply it anyway. It
   1380                 // will be visually wrong, but it should keep us from getting
   1381                 // into too much trouble.
   1382                 ALOGE("[%s] No local sync point found", mName.string());
   1383                 popPendingState(stateToCommit);
   1384                 stateUpdateAvailable = true;
   1385                 continue;
   1386             }
   1387 
   1388             if (mRemoteSyncPoints.front()->getFrameNumber() !=
   1389                     mPendingStates[0].frameNumber) {
   1390                 ALOGE("[%s] Unexpected sync point frame number found",
   1391                         mName.string());
   1392 
   1393                 // Signal our end of the sync point and then dispose of it
   1394                 mRemoteSyncPoints.front()->setTransactionApplied();
   1395                 mRemoteSyncPoints.pop_front();
   1396                 continue;
   1397             }
   1398 
   1399             if (mRemoteSyncPoints.front()->frameIsAvailable()) {
   1400                 // Apply the state update
   1401                 popPendingState(stateToCommit);
   1402                 stateUpdateAvailable = true;
   1403 
   1404                 // Signal our end of the sync point and then dispose of it
   1405                 mRemoteSyncPoints.front()->setTransactionApplied();
   1406                 mRemoteSyncPoints.pop_front();
   1407             } else {
   1408                 break;
   1409             }
   1410         } else {
   1411             popPendingState(stateToCommit);
   1412             stateUpdateAvailable = true;
   1413         }
   1414     }
   1415 
   1416     // If we still have pending updates, wake SurfaceFlinger back up and point
   1417     // it at this layer so we can process them
   1418     if (!mPendingStates.empty()) {
   1419         setTransactionFlags(eTransactionNeeded);
   1420         mFlinger->setTransactionFlags(eTraversalNeeded);
   1421     }
   1422 
   1423     mCurrentState.modified = false;
   1424     return stateUpdateAvailable;
   1425 }
   1426 
   1427 void Layer::notifyAvailableFrames() {
   1428     auto headFrameNumber = getHeadFrameNumber();
   1429     bool headFenceSignaled = headFenceHasSignaled();
   1430     Mutex::Autolock lock(mLocalSyncPointMutex);
   1431     for (auto& point : mLocalSyncPoints) {
   1432         if (headFrameNumber >= point->getFrameNumber() && headFenceSignaled) {
   1433             point->setFrameAvailable();
   1434         }
   1435     }
   1436 }
   1437 
   1438 uint32_t Layer::doTransaction(uint32_t flags) {
   1439     ATRACE_CALL();
   1440 
   1441     pushPendingState();
   1442     Layer::State c = getCurrentState();
   1443     if (!applyPendingStates(&c)) {
   1444         return 0;
   1445     }
   1446 
   1447     const Layer::State& s(getDrawingState());
   1448 
   1449     const bool sizeChanged = (c.requested.w != s.requested.w) ||
   1450                              (c.requested.h != s.requested.h);
   1451 
   1452     if (sizeChanged) {
   1453         // the size changed, we need to ask our client to request a new buffer
   1454         ALOGD_IF(DEBUG_RESIZE,
   1455                 "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
   1456                 "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
   1457                 "            requested={ wh={%4u,%4u} }}\n"
   1458                 "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
   1459                 "            requested={ wh={%4u,%4u} }}\n",
   1460                 this, getName().string(), mCurrentTransform,
   1461                 getEffectiveScalingMode(),
   1462                 c.active.w, c.active.h,
   1463                 c.crop.left,
   1464                 c.crop.top,
   1465                 c.crop.right,
   1466                 c.crop.bottom,
   1467                 c.crop.getWidth(),
   1468                 c.crop.getHeight(),
   1469                 c.requested.w, c.requested.h,
   1470                 s.active.w, s.active.h,
   1471                 s.crop.left,
   1472                 s.crop.top,
   1473                 s.crop.right,
   1474                 s.crop.bottom,
   1475                 s.crop.getWidth(),
   1476                 s.crop.getHeight(),
   1477                 s.requested.w, s.requested.h);
   1478 
   1479         // record the new size, form this point on, when the client request
   1480         // a buffer, it'll get the new size.
   1481         mSurfaceFlingerConsumer->setDefaultBufferSize(
   1482                 c.requested.w, c.requested.h);
   1483     }
   1484 
   1485     const bool resizePending = (c.requested.w != c.active.w) ||
   1486             (c.requested.h != c.active.h);
   1487     if (!isFixedSize()) {
   1488         if (resizePending && mSidebandStream == NULL) {
   1489             // don't let Layer::doTransaction update the drawing state
   1490             // if we have a pending resize, unless we are in fixed-size mode.
   1491             // the drawing state will be updated only once we receive a buffer
   1492             // with the correct size.
   1493             //
   1494             // in particular, we want to make sure the clip (which is part
   1495             // of the geometry state) is latched together with the size but is
   1496             // latched immediately when no resizing is involved.
   1497             //
   1498             // If a sideband stream is attached, however, we want to skip this
   1499             // optimization so that transactions aren't missed when a buffer
   1500             // never arrives
   1501 
   1502             flags |= eDontUpdateGeometryState;
   1503         }
   1504     }
   1505 
   1506     // always set active to requested, unless we're asked not to
   1507     // this is used by Layer, which special cases resizes.
   1508     if (flags & eDontUpdateGeometryState)  {
   1509     } else {
   1510         Layer::State& editCurrentState(getCurrentState());
   1511         if (mFreezePositionUpdates) {
   1512             float tx = c.active.transform.tx();
   1513             float ty = c.active.transform.ty();
   1514             c.active = c.requested;
   1515             c.active.transform.set(tx, ty);
   1516             editCurrentState.active = c.active;
   1517         } else {
   1518             editCurrentState.active = editCurrentState.requested;
   1519             c.active = c.requested;
   1520         }
   1521     }
   1522 
   1523     if (s.active != c.active) {
   1524         // invalidate and recompute the visible regions if needed
   1525         flags |= Layer::eVisibleRegion;
   1526     }
   1527 
   1528     if (c.sequence != s.sequence) {
   1529         // invalidate and recompute the visible regions if needed
   1530         flags |= eVisibleRegion;
   1531         this->contentDirty = true;
   1532 
   1533         // we may use linear filtering, if the matrix scales us
   1534         const uint8_t type = c.active.transform.getType();
   1535         mNeedsFiltering = (!c.active.transform.preserveRects() ||
   1536                 (type >= Transform::SCALE));
   1537     }
   1538 
   1539     // If the layer is hidden, signal and clear out all local sync points so
   1540     // that transactions for layers depending on this layer's frames becoming
   1541     // visible are not blocked
   1542     if (c.flags & layer_state_t::eLayerHidden) {
   1543         Mutex::Autolock lock(mLocalSyncPointMutex);
   1544         for (auto& point : mLocalSyncPoints) {
   1545             point->setFrameAvailable();
   1546         }
   1547         mLocalSyncPoints.clear();
   1548     }
   1549 
   1550     // Commit the transaction
   1551     commitTransaction(c);
   1552     return flags;
   1553 }
   1554 
   1555 void Layer::commitTransaction(const State& stateToCommit) {
   1556     mDrawingState = stateToCommit;
   1557 }
   1558 
   1559 uint32_t Layer::getTransactionFlags(uint32_t flags) {
   1560     return android_atomic_and(~flags, &mTransactionFlags) & flags;
   1561 }
   1562 
   1563 uint32_t Layer::setTransactionFlags(uint32_t flags) {
   1564     return android_atomic_or(flags, &mTransactionFlags);
   1565 }
   1566 
   1567 bool Layer::setPosition(float x, float y, bool immediate) {
   1568     if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y)
   1569         return false;
   1570     mCurrentState.sequence++;
   1571 
   1572     // We update the requested and active position simultaneously because
   1573     // we want to apply the position portion of the transform matrix immediately,
   1574     // but still delay scaling when resizing a SCALING_MODE_FREEZE layer.
   1575     mCurrentState.requested.transform.set(x, y);
   1576     if (immediate && !mFreezePositionUpdates) {
   1577         mCurrentState.active.transform.set(x, y);
   1578     }
   1579     mFreezePositionUpdates = mFreezePositionUpdates || !immediate;
   1580 
   1581     mCurrentState.modified = true;
   1582     setTransactionFlags(eTransactionNeeded);
   1583     return true;
   1584 }
   1585 
   1586 bool Layer::setLayer(uint32_t z) {
   1587     if (mCurrentState.z == z)
   1588         return false;
   1589     mCurrentState.sequence++;
   1590     mCurrentState.z = z;
   1591     mCurrentState.modified = true;
   1592     setTransactionFlags(eTransactionNeeded);
   1593     return true;
   1594 }
   1595 bool Layer::setSize(uint32_t w, uint32_t h) {
   1596     if (mCurrentState.requested.w == w && mCurrentState.requested.h == h)
   1597         return false;
   1598     mCurrentState.requested.w = w;
   1599     mCurrentState.requested.h = h;
   1600     mCurrentState.modified = true;
   1601     setTransactionFlags(eTransactionNeeded);
   1602     return true;
   1603 }
   1604 #ifdef USE_HWC2
   1605 bool Layer::setAlpha(float alpha) {
   1606 #else
   1607 bool Layer::setAlpha(uint8_t alpha) {
   1608 #endif
   1609     if (mCurrentState.alpha == alpha)
   1610         return false;
   1611     mCurrentState.sequence++;
   1612     mCurrentState.alpha = alpha;
   1613     mCurrentState.modified = true;
   1614     setTransactionFlags(eTransactionNeeded);
   1615     return true;
   1616 }
   1617 bool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
   1618     mCurrentState.sequence++;
   1619     mCurrentState.requested.transform.set(
   1620             matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
   1621     mCurrentState.modified = true;
   1622     setTransactionFlags(eTransactionNeeded);
   1623     return true;
   1624 }
   1625 bool Layer::setTransparentRegionHint(const Region& transparent) {
   1626     mCurrentState.requestedTransparentRegion = transparent;
   1627     mCurrentState.modified = true;
   1628     setTransactionFlags(eTransactionNeeded);
   1629     return true;
   1630 }
   1631 bool Layer::setFlags(uint8_t flags, uint8_t mask) {
   1632     const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
   1633     if (mCurrentState.flags == newFlags)
   1634         return false;
   1635     mCurrentState.sequence++;
   1636     mCurrentState.flags = newFlags;
   1637     mCurrentState.mask = mask;
   1638     mCurrentState.modified = true;
   1639     setTransactionFlags(eTransactionNeeded);
   1640     return true;
   1641 }
   1642 
   1643 bool Layer::setCrop(const Rect& crop, bool immediate) {
   1644     if (mCurrentState.crop == crop)
   1645         return false;
   1646     mCurrentState.sequence++;
   1647     mCurrentState.requestedCrop = crop;
   1648     if (immediate) {
   1649         mCurrentState.crop = crop;
   1650     }
   1651     mCurrentState.modified = true;
   1652     setTransactionFlags(eTransactionNeeded);
   1653     return true;
   1654 }
   1655 bool Layer::setFinalCrop(const Rect& crop) {
   1656     if (mCurrentState.finalCrop == crop)
   1657         return false;
   1658     mCurrentState.sequence++;
   1659     mCurrentState.finalCrop = crop;
   1660     mCurrentState.modified = true;
   1661     setTransactionFlags(eTransactionNeeded);
   1662     return true;
   1663 }
   1664 
   1665 bool Layer::setOverrideScalingMode(int32_t scalingMode) {
   1666     if (scalingMode == mOverrideScalingMode)
   1667         return false;
   1668     mOverrideScalingMode = scalingMode;
   1669     setTransactionFlags(eTransactionNeeded);
   1670     return true;
   1671 }
   1672 
   1673 uint32_t Layer::getEffectiveScalingMode() const {
   1674     if (mOverrideScalingMode >= 0) {
   1675       return mOverrideScalingMode;
   1676     }
   1677     return mCurrentScalingMode;
   1678 }
   1679 
   1680 bool Layer::setLayerStack(uint32_t layerStack) {
   1681     if (mCurrentState.layerStack == layerStack)
   1682         return false;
   1683     mCurrentState.sequence++;
   1684     mCurrentState.layerStack = layerStack;
   1685     mCurrentState.modified = true;
   1686     setTransactionFlags(eTransactionNeeded);
   1687     return true;
   1688 }
   1689 
   1690 void Layer::deferTransactionUntil(const sp<IBinder>& handle,
   1691         uint64_t frameNumber) {
   1692     mCurrentState.handle = handle;
   1693     mCurrentState.frameNumber = frameNumber;
   1694     // We don't set eTransactionNeeded, because just receiving a deferral
   1695     // request without any other state updates shouldn't actually induce a delay
   1696     mCurrentState.modified = true;
   1697     pushPendingState();
   1698     mCurrentState.handle = nullptr;
   1699     mCurrentState.frameNumber = 0;
   1700     mCurrentState.modified = false;
   1701 }
   1702 
   1703 void Layer::useSurfaceDamage() {
   1704     if (mFlinger->mForceFullDamage) {
   1705         surfaceDamageRegion = Region::INVALID_REGION;
   1706     } else {
   1707         surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage();
   1708     }
   1709 }
   1710 
   1711 void Layer::useEmptyDamage() {
   1712     surfaceDamageRegion.clear();
   1713 }
   1714 
   1715 // ----------------------------------------------------------------------------
   1716 // pageflip handling...
   1717 // ----------------------------------------------------------------------------
   1718 
   1719 bool Layer::shouldPresentNow(const DispSync& dispSync) const {
   1720     if (mSidebandStreamChanged || mAutoRefresh) {
   1721         return true;
   1722     }
   1723 
   1724     Mutex::Autolock lock(mQueueItemLock);
   1725     if (mQueueItems.empty()) {
   1726         return false;
   1727     }
   1728     auto timestamp = mQueueItems[0].mTimestamp;
   1729     nsecs_t expectedPresent =
   1730             mSurfaceFlingerConsumer->computeExpectedPresent(dispSync);
   1731 
   1732     // Ignore timestamps more than a second in the future
   1733     bool isPlausible = timestamp < (expectedPresent + s2ns(1));
   1734     ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible "
   1735             "relative to expectedPresent %" PRId64, mName.string(), timestamp,
   1736             expectedPresent);
   1737 
   1738     bool isDue = timestamp < expectedPresent;
   1739     return isDue || !isPlausible;
   1740 }
   1741 
   1742 bool Layer::onPreComposition() {
   1743     mRefreshPending = false;
   1744     return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh;
   1745 }
   1746 
   1747 bool Layer::onPostComposition() {
   1748     bool frameLatencyNeeded = mFrameLatencyNeeded;
   1749     if (mFrameLatencyNeeded) {
   1750         nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
   1751         mFrameTracker.setDesiredPresentTime(desiredPresentTime);
   1752 
   1753         sp<Fence> frameReadyFence = mSurfaceFlingerConsumer->getCurrentFence();
   1754         if (frameReadyFence->isValid()) {
   1755             mFrameTracker.setFrameReadyFence(frameReadyFence);
   1756         } else {
   1757             // There was no fence for this frame, so assume that it was ready
   1758             // to be presented at the desired present time.
   1759             mFrameTracker.setFrameReadyTime(desiredPresentTime);
   1760         }
   1761 
   1762         const HWComposer& hwc = mFlinger->getHwComposer();
   1763 #ifdef USE_HWC2
   1764         sp<Fence> presentFence = hwc.getRetireFence(HWC_DISPLAY_PRIMARY);
   1765 #else
   1766         sp<Fence> presentFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY);
   1767 #endif
   1768         if (presentFence->isValid()) {
   1769             mFrameTracker.setActualPresentFence(presentFence);
   1770         } else {
   1771             // The HWC doesn't support present fences, so use the refresh
   1772             // timestamp instead.
   1773             nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
   1774             mFrameTracker.setActualPresentTime(presentTime);
   1775         }
   1776 
   1777         mFrameTracker.advanceFrame();
   1778         mFrameLatencyNeeded = false;
   1779     }
   1780     return frameLatencyNeeded;
   1781 }
   1782 
   1783 #ifdef USE_HWC2
   1784 void Layer::releasePendingBuffer() {
   1785     mSurfaceFlingerConsumer->releasePendingBuffer();
   1786 }
   1787 #endif
   1788 
   1789 bool Layer::isVisible() const {
   1790     const Layer::State& s(mDrawingState);
   1791 #ifdef USE_HWC2
   1792     return !(s.flags & layer_state_t::eLayerHidden) && s.alpha > 0.0f
   1793             && (mActiveBuffer != NULL || mSidebandStream != NULL);
   1794 #else
   1795     return !(s.flags & layer_state_t::eLayerHidden) && s.alpha
   1796             && (mActiveBuffer != NULL || mSidebandStream != NULL);
   1797 #endif
   1798 }
   1799 
   1800 Region Layer::latchBuffer(bool& recomputeVisibleRegions)
   1801 {
   1802     ATRACE_CALL();
   1803 
   1804     if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) {
   1805         // mSidebandStreamChanged was true
   1806         mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream();
   1807         if (mSidebandStream != NULL) {
   1808             setTransactionFlags(eTransactionNeeded);
   1809             mFlinger->setTransactionFlags(eTraversalNeeded);
   1810         }
   1811         recomputeVisibleRegions = true;
   1812 
   1813         const State& s(getDrawingState());
   1814         return s.active.transform.transform(Region(Rect(s.active.w, s.active.h)));
   1815     }
   1816 
   1817     Region outDirtyRegion;
   1818     if (mQueuedFrames > 0 || mAutoRefresh) {
   1819 
   1820         // if we've already called updateTexImage() without going through
   1821         // a composition step, we have to skip this layer at this point
   1822         // because we cannot call updateTeximage() without a corresponding
   1823         // compositionComplete() call.
   1824         // we'll trigger an update in onPreComposition().
   1825         if (mRefreshPending) {
   1826             return outDirtyRegion;
   1827         }
   1828 
   1829         // If the head buffer's acquire fence hasn't signaled yet, return and
   1830         // try again later
   1831         if (!headFenceHasSignaled()) {
   1832             mFlinger->signalLayerUpdate();
   1833             return outDirtyRegion;
   1834         }
   1835 
   1836         // Capture the old state of the layer for comparisons later
   1837         const State& s(getDrawingState());
   1838         const bool oldOpacity = isOpaque(s);
   1839         sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
   1840 
   1841         struct Reject : public SurfaceFlingerConsumer::BufferRejecter {
   1842             Layer::State& front;
   1843             Layer::State& current;
   1844             bool& recomputeVisibleRegions;
   1845             bool stickyTransformSet;
   1846             const char* name;
   1847             int32_t overrideScalingMode;
   1848             bool& freezePositionUpdates;
   1849 
   1850             Reject(Layer::State& front, Layer::State& current,
   1851                     bool& recomputeVisibleRegions, bool stickySet,
   1852                     const char* name,
   1853                     int32_t overrideScalingMode,
   1854                     bool& freezePositionUpdates)
   1855                 : front(front), current(current),
   1856                   recomputeVisibleRegions(recomputeVisibleRegions),
   1857                   stickyTransformSet(stickySet),
   1858                   name(name),
   1859                   overrideScalingMode(overrideScalingMode),
   1860                   freezePositionUpdates(freezePositionUpdates) {
   1861             }
   1862 
   1863             virtual bool reject(const sp<GraphicBuffer>& buf,
   1864                     const BufferItem& item) {
   1865                 if (buf == NULL) {
   1866                     return false;
   1867                 }
   1868 
   1869                 uint32_t bufWidth  = buf->getWidth();
   1870                 uint32_t bufHeight = buf->getHeight();
   1871 
   1872                 // check that we received a buffer of the right size
   1873                 // (Take the buffer's orientation into account)
   1874                 if (item.mTransform & Transform::ROT_90) {
   1875                     swap(bufWidth, bufHeight);
   1876                 }
   1877 
   1878                 int actualScalingMode = overrideScalingMode >= 0 ?
   1879                         overrideScalingMode : item.mScalingMode;
   1880                 bool isFixedSize = actualScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE;
   1881                 if (front.active != front.requested) {
   1882 
   1883                     if (isFixedSize ||
   1884                             (bufWidth == front.requested.w &&
   1885                              bufHeight == front.requested.h))
   1886                     {
   1887                         // Here we pretend the transaction happened by updating the
   1888                         // current and drawing states. Drawing state is only accessed
   1889                         // in this thread, no need to have it locked
   1890                         front.active = front.requested;
   1891 
   1892                         // We also need to update the current state so that
   1893                         // we don't end-up overwriting the drawing state with
   1894                         // this stale current state during the next transaction
   1895                         //
   1896                         // NOTE: We don't need to hold the transaction lock here
   1897                         // because State::active is only accessed from this thread.
   1898                         current.active = front.active;
   1899                         current.modified = true;
   1900 
   1901                         // recompute visible region
   1902                         recomputeVisibleRegions = true;
   1903                     }
   1904 
   1905                     ALOGD_IF(DEBUG_RESIZE,
   1906                             "[%s] latchBuffer/reject: buffer (%ux%u, tr=%02x), scalingMode=%d\n"
   1907                             "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
   1908                             "            requested={ wh={%4u,%4u} }}\n",
   1909                             name,
   1910                             bufWidth, bufHeight, item.mTransform, item.mScalingMode,
   1911                             front.active.w, front.active.h,
   1912                             front.crop.left,
   1913                             front.crop.top,
   1914                             front.crop.right,
   1915                             front.crop.bottom,
   1916                             front.crop.getWidth(),
   1917                             front.crop.getHeight(),
   1918                             front.requested.w, front.requested.h);
   1919                 }
   1920 
   1921                 if (!isFixedSize && !stickyTransformSet) {
   1922                     if (front.active.w != bufWidth ||
   1923                         front.active.h != bufHeight) {
   1924                         // reject this buffer
   1925                         ALOGE("[%s] rejecting buffer: "
   1926                                 "bufWidth=%d, bufHeight=%d, front.active.{w=%d, h=%d}",
   1927                                 name, bufWidth, bufHeight, front.active.w, front.active.h);
   1928                         return true;
   1929                     }
   1930                 }
   1931 
   1932                 // if the transparent region has changed (this test is
   1933                 // conservative, but that's fine, worst case we're doing
   1934                 // a bit of extra work), we latch the new one and we
   1935                 // trigger a visible-region recompute.
   1936                 if (!front.activeTransparentRegion.isTriviallyEqual(
   1937                         front.requestedTransparentRegion)) {
   1938                     front.activeTransparentRegion = front.requestedTransparentRegion;
   1939 
   1940                     // We also need to update the current state so that
   1941                     // we don't end-up overwriting the drawing state with
   1942                     // this stale current state during the next transaction
   1943                     //
   1944                     // NOTE: We don't need to hold the transaction lock here
   1945                     // because State::active is only accessed from this thread.
   1946                     current.activeTransparentRegion = front.activeTransparentRegion;
   1947 
   1948                     // recompute visible region
   1949                     recomputeVisibleRegions = true;
   1950                 }
   1951 
   1952                 if (front.crop != front.requestedCrop) {
   1953                     front.crop = front.requestedCrop;
   1954                     current.crop = front.requestedCrop;
   1955                     recomputeVisibleRegions = true;
   1956                 }
   1957                 freezePositionUpdates = false;
   1958 
   1959                 return false;
   1960             }
   1961         };
   1962 
   1963         Reject r(mDrawingState, getCurrentState(), recomputeVisibleRegions,
   1964                 getProducerStickyTransform() != 0, mName.string(),
   1965                 mOverrideScalingMode, mFreezePositionUpdates);
   1966 
   1967 
   1968         // Check all of our local sync points to ensure that all transactions
   1969         // which need to have been applied prior to the frame which is about to
   1970         // be latched have signaled
   1971 
   1972         auto headFrameNumber = getHeadFrameNumber();
   1973         bool matchingFramesFound = false;
   1974         bool allTransactionsApplied = true;
   1975         {
   1976             Mutex::Autolock lock(mLocalSyncPointMutex);
   1977             for (auto& point : mLocalSyncPoints) {
   1978                 if (point->getFrameNumber() > headFrameNumber) {
   1979                     break;
   1980                 }
   1981 
   1982                 matchingFramesFound = true;
   1983 
   1984                 if (!point->frameIsAvailable()) {
   1985                     // We haven't notified the remote layer that the frame for
   1986                     // this point is available yet. Notify it now, and then
   1987                     // abort this attempt to latch.
   1988                     point->setFrameAvailable();
   1989                     allTransactionsApplied = false;
   1990                     break;
   1991                 }
   1992 
   1993                 allTransactionsApplied &= point->transactionIsApplied();
   1994             }
   1995         }
   1996 
   1997         if (matchingFramesFound && !allTransactionsApplied) {
   1998             mFlinger->signalLayerUpdate();
   1999             return outDirtyRegion;
   2000         }
   2001 
   2002         // This boolean is used to make sure that SurfaceFlinger's shadow copy
   2003         // of the buffer queue isn't modified when the buffer queue is returning
   2004         // BufferItem's that weren't actually queued. This can happen in shared
   2005         // buffer mode.
   2006         bool queuedBuffer = false;
   2007         status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r,
   2008                 mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer,
   2009                 mLastFrameNumberReceived);
   2010         if (updateResult == BufferQueue::PRESENT_LATER) {
   2011             // Producer doesn't want buffer to be displayed yet.  Signal a
   2012             // layer update so we check again at the next opportunity.
   2013             mFlinger->signalLayerUpdate();
   2014             return outDirtyRegion;
   2015         } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) {
   2016             // If the buffer has been rejected, remove it from the shadow queue
   2017             // and return early
   2018             if (queuedBuffer) {
   2019                 Mutex::Autolock lock(mQueueItemLock);
   2020                 mQueueItems.removeAt(0);
   2021                 android_atomic_dec(&mQueuedFrames);
   2022             }
   2023             return outDirtyRegion;
   2024         } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) {
   2025             // This can occur if something goes wrong when trying to create the
   2026             // EGLImage for this buffer. If this happens, the buffer has already
   2027             // been released, so we need to clean up the queue and bug out
   2028             // early.
   2029             if (queuedBuffer) {
   2030                 Mutex::Autolock lock(mQueueItemLock);
   2031                 mQueueItems.clear();
   2032                 android_atomic_and(0, &mQueuedFrames);
   2033             }
   2034 
   2035             // Once we have hit this state, the shadow queue may no longer
   2036             // correctly reflect the incoming BufferQueue's contents, so even if
   2037             // updateTexImage starts working, the only safe course of action is
   2038             // to continue to ignore updates.
   2039             mUpdateTexImageFailed = true;
   2040 
   2041             return outDirtyRegion;
   2042         }
   2043 
   2044         if (queuedBuffer) {
   2045             // Autolock scope
   2046             auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
   2047 
   2048             Mutex::Autolock lock(mQueueItemLock);
   2049 
   2050             // Remove any stale buffers that have been dropped during
   2051             // updateTexImage
   2052             while (mQueueItems[0].mFrameNumber != currentFrameNumber) {
   2053                 mQueueItems.removeAt(0);
   2054                 android_atomic_dec(&mQueuedFrames);
   2055             }
   2056 
   2057             mQueueItems.removeAt(0);
   2058         }
   2059 
   2060 
   2061         // Decrement the queued-frames count.  Signal another event if we
   2062         // have more frames pending.
   2063         if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1)
   2064                 || mAutoRefresh) {
   2065             mFlinger->signalLayerUpdate();
   2066         }
   2067 
   2068         if (updateResult != NO_ERROR) {
   2069             // something happened!
   2070             recomputeVisibleRegions = true;
   2071             return outDirtyRegion;
   2072         }
   2073 
   2074         // update the active buffer
   2075         mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer();
   2076         if (mActiveBuffer == NULL) {
   2077             // this can only happen if the very first buffer was rejected.
   2078             return outDirtyRegion;
   2079         }
   2080 
   2081         mRefreshPending = true;
   2082         mFrameLatencyNeeded = true;
   2083         if (oldActiveBuffer == NULL) {
   2084              // the first time we receive a buffer, we need to trigger a
   2085              // geometry invalidation.
   2086             recomputeVisibleRegions = true;
   2087          }
   2088 
   2089         Rect crop(mSurfaceFlingerConsumer->getCurrentCrop());
   2090         const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform());
   2091         const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode());
   2092         if ((crop != mCurrentCrop) ||
   2093             (transform != mCurrentTransform) ||
   2094             (scalingMode != mCurrentScalingMode))
   2095         {
   2096             mCurrentCrop = crop;
   2097             mCurrentTransform = transform;
   2098             mCurrentScalingMode = scalingMode;
   2099             recomputeVisibleRegions = true;
   2100         }
   2101 
   2102         if (oldActiveBuffer != NULL) {
   2103             uint32_t bufWidth  = mActiveBuffer->getWidth();
   2104             uint32_t bufHeight = mActiveBuffer->getHeight();
   2105             if (bufWidth != uint32_t(oldActiveBuffer->width) ||
   2106                 bufHeight != uint32_t(oldActiveBuffer->height)) {
   2107                 recomputeVisibleRegions = true;
   2108             }
   2109         }
   2110 
   2111         mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
   2112         if (oldOpacity != isOpaque(s)) {
   2113             recomputeVisibleRegions = true;
   2114         }
   2115 
   2116         mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
   2117 
   2118         // Remove any sync points corresponding to the buffer which was just
   2119         // latched
   2120         {
   2121             Mutex::Autolock lock(mLocalSyncPointMutex);
   2122             auto point = mLocalSyncPoints.begin();
   2123             while (point != mLocalSyncPoints.end()) {
   2124                 if (!(*point)->frameIsAvailable() ||
   2125                         !(*point)->transactionIsApplied()) {
   2126                     // This sync point must have been added since we started
   2127                     // latching. Don't drop it yet.
   2128                     ++point;
   2129                     continue;
   2130                 }
   2131 
   2132                 if ((*point)->getFrameNumber() <= mCurrentFrameNumber) {
   2133                     point = mLocalSyncPoints.erase(point);
   2134                 } else {
   2135                     ++point;
   2136                 }
   2137             }
   2138         }
   2139 
   2140         // FIXME: postedRegion should be dirty & bounds
   2141         Region dirtyRegion(Rect(s.active.w, s.active.h));
   2142 
   2143         // transform the dirty region to window-manager space
   2144         outDirtyRegion = (s.active.transform.transform(dirtyRegion));
   2145     }
   2146     return outDirtyRegion;
   2147 }
   2148 
   2149 uint32_t Layer::getEffectiveUsage(uint32_t usage) const
   2150 {
   2151     // TODO: should we do something special if mSecure is set?
   2152     if (mProtectedByApp) {
   2153         // need a hardware-protected path to external video sink
   2154         usage |= GraphicBuffer::USAGE_PROTECTED;
   2155     }
   2156     if (mPotentialCursor) {
   2157         usage |= GraphicBuffer::USAGE_CURSOR;
   2158     }
   2159     usage |= GraphicBuffer::USAGE_HW_COMPOSER;
   2160     return usage;
   2161 }
   2162 
   2163 void Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
   2164     uint32_t orientation = 0;
   2165     if (!mFlinger->mDebugDisableTransformHint) {
   2166         // The transform hint is used to improve performance, but we can
   2167         // only have a single transform hint, it cannot
   2168         // apply to all displays.
   2169         const Transform& planeTransform(hw->getTransform());
   2170         orientation = planeTransform.getOrientation();
   2171         if (orientation & Transform::ROT_INVALID) {
   2172             orientation = 0;
   2173         }
   2174     }
   2175     mSurfaceFlingerConsumer->setTransformHint(orientation);
   2176 }
   2177 
   2178 // ----------------------------------------------------------------------------
   2179 // debugging
   2180 // ----------------------------------------------------------------------------
   2181 
   2182 void Layer::dump(String8& result, Colorizer& colorizer) const
   2183 {
   2184     const Layer::State& s(getDrawingState());
   2185 
   2186     colorizer.colorize(result, Colorizer::GREEN);
   2187     result.appendFormat(
   2188             "+ %s %p (%s)\n",
   2189             getTypeId(), this, getName().string());
   2190     colorizer.reset(result);
   2191 
   2192     s.activeTransparentRegion.dump(result, "transparentRegion");
   2193     visibleRegion.dump(result, "visibleRegion");
   2194     surfaceDamageRegion.dump(result, "surfaceDamageRegion");
   2195     sp<Client> client(mClientRef.promote());
   2196 
   2197     result.appendFormat(            "      "
   2198             "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), "
   2199             "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), "
   2200             "isOpaque=%1d, invalidate=%1d, "
   2201 #ifdef USE_HWC2
   2202             "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
   2203 #else
   2204             "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
   2205 #endif
   2206             "      client=%p\n",
   2207             s.layerStack, s.z, s.active.transform.tx(), s.active.transform.ty(), s.active.w, s.active.h,
   2208             s.crop.left, s.crop.top,
   2209             s.crop.right, s.crop.bottom,
   2210             s.finalCrop.left, s.finalCrop.top,
   2211             s.finalCrop.right, s.finalCrop.bottom,
   2212             isOpaque(s), contentDirty,
   2213             s.alpha, s.flags,
   2214             s.active.transform[0][0], s.active.transform[0][1],
   2215             s.active.transform[1][0], s.active.transform[1][1],
   2216             client.get());
   2217 
   2218     sp<const GraphicBuffer> buf0(mActiveBuffer);
   2219     uint32_t w0=0, h0=0, s0=0, f0=0;
   2220     if (buf0 != 0) {
   2221         w0 = buf0->getWidth();
   2222         h0 = buf0->getHeight();
   2223         s0 = buf0->getStride();
   2224         f0 = buf0->format;
   2225     }
   2226     result.appendFormat(
   2227             "      "
   2228             "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X],"
   2229             " queued-frames=%d, mRefreshPending=%d\n",
   2230             mFormat, w0, h0, s0,f0,
   2231             mQueuedFrames, mRefreshPending);
   2232 
   2233     if (mSurfaceFlingerConsumer != 0) {
   2234         mSurfaceFlingerConsumer->dump(result, "            ");
   2235     }
   2236 }
   2237 
   2238 void Layer::dumpFrameStats(String8& result) const {
   2239     mFrameTracker.dumpStats(result);
   2240 }
   2241 
   2242 void Layer::clearFrameStats() {
   2243     mFrameTracker.clearStats();
   2244 }
   2245 
   2246 void Layer::logFrameStats() {
   2247     mFrameTracker.logAndResetStats(mName);
   2248 }
   2249 
   2250 void Layer::getFrameStats(FrameStats* outStats) const {
   2251     mFrameTracker.getStats(outStats);
   2252 }
   2253 
   2254 void Layer::getFenceData(String8* outName, uint64_t* outFrameNumber,
   2255         bool* outIsGlesComposition, nsecs_t* outPostedTime,
   2256         sp<Fence>* outAcquireFence, sp<Fence>* outPrevReleaseFence) const {
   2257     *outName = mName;
   2258     *outFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
   2259 
   2260 #ifdef USE_HWC2
   2261     *outIsGlesComposition = mHwcLayers.count(HWC_DISPLAY_PRIMARY) ?
   2262             mHwcLayers.at(HWC_DISPLAY_PRIMARY).compositionType ==
   2263             HWC2::Composition::Client : true;
   2264 #else
   2265     *outIsGlesComposition = mIsGlesComposition;
   2266 #endif
   2267     *outPostedTime = mSurfaceFlingerConsumer->getTimestamp();
   2268     *outAcquireFence = mSurfaceFlingerConsumer->getCurrentFence();
   2269     *outPrevReleaseFence = mSurfaceFlingerConsumer->getPrevReleaseFence();
   2270 }
   2271 
   2272 std::vector<OccupancyTracker::Segment> Layer::getOccupancyHistory(
   2273         bool forceFlush) {
   2274     std::vector<OccupancyTracker::Segment> history;
   2275     status_t result = mSurfaceFlingerConsumer->getOccupancyHistory(forceFlush,
   2276             &history);
   2277     if (result != NO_ERROR) {
   2278         ALOGW("[%s] Failed to obtain occupancy history (%d)", mName.string(),
   2279                 result);
   2280         return {};
   2281     }
   2282     return history;
   2283 }
   2284 
   2285 bool Layer::getTransformToDisplayInverse() const {
   2286     return mSurfaceFlingerConsumer->getTransformToDisplayInverse();
   2287 }
   2288 
   2289 // ---------------------------------------------------------------------------
   2290 
   2291 Layer::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger,
   2292         const sp<Layer>& layer)
   2293     : mFlinger(flinger), mLayer(layer) {
   2294 }
   2295 
   2296 Layer::LayerCleaner::~LayerCleaner() {
   2297     // destroy client resources
   2298     mFlinger->onLayerDestroyed(mLayer);
   2299 }
   2300 
   2301 // ---------------------------------------------------------------------------
   2302 }; // namespace android
   2303 
   2304 #if defined(__gl_h_)
   2305 #error "don't include gl/gl.h in this file"
   2306 #endif
   2307 
   2308 #if defined(__gl2_h_)
   2309 #error "don't include gl2/gl2.h in this file"
   2310 #endif
   2311