Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c6086ddd authored by Vishnu Nair's avatar Vishnu Nair
Browse files

SF: Get hwc slot in binder thread

Avoid locking inside the main thread and contention
with binder thread (via client token binder died).

Test: presubmit
Bug: 238781169
Change-Id: I61fe1d1f8babb0d301e894ed23c9c5d6be42c8a7
parent 40fff5cd
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -2846,7 +2846,7 @@ bool Layer::setPosition(float x, float y) {
bool Layer::setBuffer(std::shared_ptr<renderengine::ExternalTexture>& buffer,
                      const BufferData& bufferData, nsecs_t postTime, nsecs_t desiredPresentTime,
                      bool isAutoTimestamp, std::optional<nsecs_t> dequeueTime,
                      const FrameTimelineInfo& info) {
                      const FrameTimelineInfo& info, int hwcBufferSlot) {
    ATRACE_FORMAT("setBuffer %s - hasBuffer=%s", getDebugName(), (buffer ? "true" : "false"));
    if (!buffer) {
        return false;
@@ -2892,7 +2892,7 @@ bool Layer::setBuffer(std::shared_ptr<renderengine::ExternalTexture>& buffer,
    mDrawingState.releaseBufferListener = bufferData.releaseBufferListener;
    mDrawingState.buffer = std::move(buffer);
    mDrawingState.clientCacheId = bufferData.cachedBuffer;

    mDrawingState.hwcBufferSlot = hwcBufferSlot;
    mDrawingState.acquireFence = bufferData.flags.test(BufferData::BufferDataChange::fenceChanged)
            ? bufferData.acquireFence
            : Fence::NO_FENCE;
@@ -3191,7 +3191,7 @@ void Layer::gatherBufferInfo() {
    mBufferInfo.mHdrMetadata = mDrawingState.hdrMetadata;
    mBufferInfo.mApi = mDrawingState.api;
    mBufferInfo.mTransformToDisplayInverse = mDrawingState.transformToDisplayInverse;
    mBufferInfo.mBufferSlot = mHwcSlotGenerator->getHwcCacheSlot(mDrawingState.clientCacheId);
    mBufferInfo.mBufferSlot = mDrawingState.hwcBufferSlot;
}

Rect Layer::computeBufferCrop(const State& s) {
@@ -3210,7 +3210,6 @@ sp<Layer> Layer::createClone() {
    LayerCreationArgs args(mFlinger.get(), nullptr, mName + " (Mirror)", 0, LayerMetadata());
    args.textureName = mTextureName;
    sp<Layer> layer = mFlinger->getFactory().createBufferStateLayer(args);
    layer->mHwcSlotGenerator = mHwcSlotGenerator;
    layer->setInitialValuesForClone(sp<Layer>::fromExisting(this));
    return layer;
}
@@ -3969,6 +3968,10 @@ void Layer::updateRelativeMetadataSnapshot(const LayerMetadata& relativeLayerMet
    }
}

int Layer::getHwcCacheSlot(const client_cache_t& clientCacheId) {
    return mHwcSlotGenerator->getHwcCacheSlot(clientCacheId);
}

LayerSnapshotGuard::LayerSnapshotGuard(Layer* layer) : mLayer(layer) {
    if (mLayer) {
        mLayer->mLayerFE->mSnapshot = std::move(mLayer->mSnapshot);
+4 −1
Original line number Diff line number Diff line
@@ -146,6 +146,7 @@ public:
        bool transformToDisplayInverse;
        Region transparentRegionHint;
        std::shared_ptr<renderengine::ExternalTexture> buffer;
        int hwcBufferSlot;
        client_cache_t clientCacheId;
        sp<Fence> acquireFence;
        std::shared_ptr<FenceTime> acquireFenceTime;
@@ -297,7 +298,8 @@ public:
    bool setBuffer(std::shared_ptr<renderengine::ExternalTexture>& /* buffer */,
                   const BufferData& /* bufferData */, nsecs_t /* postTime */,
                   nsecs_t /*desiredPresentTime*/, bool /*isAutoTimestamp*/,
                   std::optional<nsecs_t> /* dequeueTime */, const FrameTimelineInfo& /*info*/);
                   std::optional<nsecs_t> /* dequeueTime */, const FrameTimelineInfo& /*info*/,
                   int /* hwcBufferSlot */);
    bool setDataspace(ui::Dataspace /*dataspace*/);
    bool setHdrMetadata(const HdrMetadata& /*hdrMetadata*/);
    bool setSurfaceDamageRegion(const Region& /*surfaceDamage*/);
@@ -810,6 +812,7 @@ public:
    void updateMetadataSnapshot(const LayerMetadata& parentMetadata);
    void updateRelativeMetadataSnapshot(const LayerMetadata& relativeLayerMetadata,
                                        std::unordered_set<Layer*>& visited);
    int getHwcCacheSlot(const client_cache_t& clientCacheId);

protected:
    // For unit tests
+9 −4
Original line number Diff line number Diff line
@@ -3919,12 +3919,17 @@ status_t SurfaceFlinger::setTransactionState(
        auto& resolvedState = resolvedStates.back();
        if (resolvedState.state.hasBufferChanges() && resolvedState.state.hasValidBuffer() &&
            resolvedState.state.surface) {
            sp<Layer> layer = LayerHandle::getLayer(resolvedState.state.surface);
            std::string layerName = (layer) ?
                    layer->getDebugName() : std::to_string(resolvedState.state.layerId);
            resolvedState.externalTexture =
                    getExternalTextureFromBufferData(*resolvedState.state.bufferData,
                                                     std::to_string(resolvedState.state.layerId)
                                                             .c_str(),
                                                     transactionId);
                                                     layerName.c_str(), transactionId);
            mBufferCountTracker.increment(resolvedState.state.surface->localBinder());
            if (layer) {
                resolvedState.hwcBufferSlot =
                        layer->getHwcCacheSlot(resolvedState.state.bufferData->cachedBuffer);
            }
        }
    }

@@ -4391,7 +4396,7 @@ uint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTime
    if (what & layer_state_t::eBufferChanged) {
        if (layer->setBuffer(composerState.externalTexture, *s.bufferData, postTime,
                             desiredPresentTime, isAutoTimestamp, dequeueBufferTimestamp,
                             frameTimelineInfo)) {
                             frameTimelineInfo, composerState.hwcBufferSlot)) {
            flags |= eTraversalNeeded;
        }
    } else if (frameTimelineInfo.vsyncId != FrameTimelineInfo::INVALID_VSYNC_ID) {
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ public:
    ResolvedComposerState() = default;
    ResolvedComposerState(ComposerState&& source) { state = std::move(source.state); }
    std::shared_ptr<renderengine::ExternalTexture> externalTexture;
    int hwcBufferSlot = 0;
};

struct TransactionState {
+1 −1
Original line number Diff line number Diff line
@@ -160,7 +160,7 @@ void LayerFuzzer::invokeBufferStateLayer() {
    layer->setBuffer(texture, {} /*bufferData*/, mFdp.ConsumeIntegral<nsecs_t>() /*postTime*/,
                     mFdp.ConsumeIntegral<nsecs_t>() /*desiredTime*/,
                     mFdp.ConsumeBool() /*isAutoTimestamp*/,
                     {mFdp.ConsumeIntegral<nsecs_t>()} /*dequeue*/, {} /*info*/);
                     {mFdp.ConsumeIntegral<nsecs_t>()} /*dequeue*/, {} /*info*/, 0 /* hwcslot */);

    LayerRenderArea layerArea(*(flinger.flinger()), layer, getFuzzedRect(),
                              {mFdp.ConsumeIntegral<int32_t>(),
Loading