diff options
Diffstat (limited to 'services/surfaceflinger/BufferStateLayer.cpp')
| -rw-r--r-- | services/surfaceflinger/BufferStateLayer.cpp | 66 | 
1 files changed, 27 insertions, 39 deletions
diff --git a/services/surfaceflinger/BufferStateLayer.cpp b/services/surfaceflinger/BufferStateLayer.cpp index 6b5cf04536..8bc51dfa5d 100644 --- a/services/surfaceflinger/BufferStateLayer.cpp +++ b/services/surfaceflinger/BufferStateLayer.cpp @@ -44,25 +44,18 @@ namespace android {  using PresentState = frametimeline::SurfaceFrame::PresentState;  namespace {  void callReleaseBufferCallback(const sp<ITransactionCompletedListener>& listener, -                               const sp<GraphicBuffer>& buffer, const sp<Fence>& releaseFence, -                               uint32_t transformHint, uint32_t currentMaxAcquiredBufferCount) { +                               const sp<GraphicBuffer>& buffer, uint64_t framenumber, +                               const sp<Fence>& releaseFence, uint32_t transformHint, +                               uint32_t currentMaxAcquiredBufferCount) {      if (!listener) {          return;      } -    listener->onReleaseBuffer(buffer->getId(), releaseFence ? releaseFence : Fence::NO_FENCE, -                              transformHint, currentMaxAcquiredBufferCount); +    listener->onReleaseBuffer({buffer->getId(), framenumber}, +                              releaseFence ? releaseFence : Fence::NO_FENCE, transformHint, +                              currentMaxAcquiredBufferCount);  }  } // namespace -// clang-format off -const std::array<float, 16> BufferStateLayer::IDENTITY_MATRIX{ -        1, 0, 0, 0, -        0, 1, 0, 0, -        0, 0, 1, 0, -        0, 0, 0, 1 -}; -// clang-format on -  BufferStateLayer::BufferStateLayer(const LayerCreationArgs& args)        : BufferLayer(args), mHwcSlotGenerator(new HwcSlotGenerator()) {      mDrawingState.dataspace = ui::Dataspace::V0_SRGB; @@ -75,8 +68,8 @@ BufferStateLayer::~BufferStateLayer() {      // issue with the clone layer trying to use the texture.      if (mBufferInfo.mBuffer != nullptr && !isClone()) {          callReleaseBufferCallback(mDrawingState.releaseBufferListener, -                                  mBufferInfo.mBuffer->getBuffer(), mBufferInfo.mFence, -                                  mTransformHint, +                                  mBufferInfo.mBuffer->getBuffer(), mBufferInfo.mFrameNumber, +                                  mBufferInfo.mFence, mTransformHint,                                    mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(                                            mOwnerUid));      } @@ -87,7 +80,7 @@ status_t BufferStateLayer::addReleaseFence(const sp<CallbackHandle>& ch,      if (ch == nullptr) {          return OK;      } -    ch->previousBufferId = mPreviousBufferId; +    ch->previousReleaseCallbackId = mPreviousReleaseCallbackId;      if (!ch->previousReleaseFence.get()) {          ch->previousReleaseFence = fence;          return OK; @@ -214,7 +207,7 @@ void BufferStateLayer::releasePendingBuffer(nsecs_t dequeueReadyTime) {      // see BufferStateLayer::onLayerDisplayed.      for (auto& handle : mDrawingState.callbackHandles) {          if (handle->releasePreviousBuffer) { -            handle->previousBufferId = mPreviousBufferId; +            handle->previousReleaseCallbackId = mPreviousReleaseCallbackId;              break;          }      } @@ -432,14 +425,15 @@ bool BufferStateLayer::setBuffer(const std::shared_ptr<renderengine::ExternalTex      if (mDrawingState.buffer) {          mReleasePreviousBuffer = true; -        if (mDrawingState.buffer != mBufferInfo.mBuffer) { +        if (mDrawingState.buffer != mBufferInfo.mBuffer || +            mDrawingState.frameNumber != mBufferInfo.mFrameNumber) {              // If mDrawingState has a buffer, and we are about to update again              // before swapping to drawing state, then the first buffer will be              // dropped and we should decrement the pending buffer count and              // call any release buffer callbacks if set.              callReleaseBufferCallback(mDrawingState.releaseBufferListener, -                                      mDrawingState.buffer->getBuffer(), mDrawingState.acquireFence, -                                      mTransformHint, +                                      mDrawingState.buffer->getBuffer(), mDrawingState.frameNumber, +                                      mDrawingState.acquireFence, mTransformHint,                                        mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(                                                mOwnerUid));              decrementPendingBufferCount(); @@ -597,6 +591,7 @@ bool BufferStateLayer::setTransactionCompletedListeners(  }  bool BufferStateLayer::setTransparentRegionHint(const Region& transparent) { +    mDrawingState.sequence++;      mDrawingState.transparentRegionHint = transparent;      mDrawingState.modified = true;      setTransactionFlags(eTransactionNeeded); @@ -642,6 +637,10 @@ FloatRect BufferStateLayer::computeSourceBounds(const FloatRect& parentBounds) c  // Interface implementation for BufferLayer  // -----------------------------------------------------------------------  bool BufferStateLayer::fenceHasSignaled() const { +    if (SurfaceFlinger::enableLatchUnsignaled) { +        return true; +    } +      const bool fenceSignaled =              getDrawingState().acquireFence->getStatus() == Fence::Status::Signaled;      if (!fenceSignaled) { @@ -684,7 +683,7 @@ uint64_t BufferStateLayer::getFrameNumber(nsecs_t /*expectedPresentTime*/) const   *     DeferTransactionUntil -> frameNumber = 2   *     Random other stuff   *  } - * Now imagine getHeadFrameNumber returned mDrawingState.mFrameNumber (or mCurrentFrameNumber). + * Now imagine mFrameNumber returned mDrawingState.frameNumber (or mCurrentFrameNumber).   * Prior to doTransaction SurfaceFlinger will call notifyAvailableFrames, but because we   * haven't swapped mDrawingState to mDrawingState yet we will think the sync point   * is not ready. So we will return false from applyPendingState and not swap @@ -725,7 +724,7 @@ bool BufferStateLayer::latchSidebandStream(bool& recomputeVisibleRegions) {  bool BufferStateLayer::hasFrameUpdate() const {      const State& c(getDrawingState()); -    return mDrawingStateModified && (c.buffer != nullptr || c.bgColorLayer != nullptr); +    return (mDrawingStateModified || mDrawingState.modified) && (c.buffer != nullptr || c.bgColorLayer != nullptr);  }  status_t BufferStateLayer::updateTexImage(bool& /*recomputeVisibleRegions*/, nsecs_t latchTime, @@ -792,9 +791,10 @@ status_t BufferStateLayer::updateActiveBuffer() {          decrementPendingBufferCount();      } -    mPreviousBufferId = getCurrentBufferId(); +    mPreviousReleaseCallbackId = {getCurrentBufferId(), mBufferInfo.mFrameNumber};      mBufferInfo.mBuffer = s.buffer;      mBufferInfo.mFence = s.acquireFence; +    mBufferInfo.mFrameNumber = s.frameNumber;      return NO_ERROR;  } @@ -891,7 +891,11 @@ void BufferStateLayer::gatherBufferInfo() {      mBufferInfo.mFenceTime = std::make_shared<FenceTime>(s.acquireFence);      mBufferInfo.mFence = s.acquireFence;      mBufferInfo.mTransform = s.bufferTransform; +    auto lastDataspace = mBufferInfo.mDataspace;      mBufferInfo.mDataspace = translateDataspace(s.dataspace); +    if (lastDataspace != mBufferInfo.mDataspace) { +        mFlinger->mSomeDataspaceChanged = true; +    }      mBufferInfo.mCrop = computeBufferCrop(s);      mBufferInfo.mScaleMode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW;      mBufferInfo.mSurfaceDamage = s.surfaceDamageRegion; @@ -960,22 +964,6 @@ void BufferStateLayer::tracePendingBufferCount(int32_t pendingBuffers) {      ATRACE_INT(mBlastTransactionName.c_str(), pendingBuffers);  } -void BufferStateLayer::bufferMayChange(const sp<GraphicBuffer>& newBuffer) { -    if (mDrawingState.buffer != nullptr && -        (!mBufferInfo.mBuffer || -         mDrawingState.buffer->getBuffer() != mBufferInfo.mBuffer->getBuffer()) && -        newBuffer != mDrawingState.buffer->getBuffer()) { -        // If we are about to update mDrawingState.buffer but it has not yet latched -        // then we will drop a buffer and should decrement the pending buffer count and -        // call any release buffer callbacks if set. -        callReleaseBufferCallback(mDrawingState.releaseBufferListener, -                                  mDrawingState.buffer->getBuffer(), mDrawingState.acquireFence, -                                  mTransformHint, -                                  mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate( -                                          mOwnerUid)); -        decrementPendingBufferCount(); -    } -}  /*   * We don't want to send the layer's transform to input, but rather the  |