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

Commit e1e2e668 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "SF: Do not duplicate fences per layer per frame" into tm-dev am: 1c94d263

parents e1d5f1aa 1c94d263
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -48,9 +48,8 @@ BufferQueueLayer::~BufferQueueLayer() {
// Interface implementation for Layer
// -----------------------------------------------------------------------

void BufferQueueLayer::onLayerDisplayed(
        std::shared_future<renderengine::RenderEngineResult> futureRenderEngineResult) {
    sp<Fence> releaseFence = new Fence(dup(futureRenderEngineResult.get().drawFence));
void BufferQueueLayer::onLayerDisplayed(std::shared_future<FenceResult> futureFenceResult) {
    const sp<Fence> releaseFence = futureFenceResult.get().value_or(Fence::NO_FENCE);
    mConsumer->setReleaseFence(releaseFence);

    // Prevent tracing the same release multiple times.
+1 −2
Original line number Diff line number Diff line
@@ -42,8 +42,7 @@ public:
    // Implements Layer.
    const char* getType() const override { return "BufferQueueLayer"; }

    void onLayerDisplayed(
            std::shared_future<renderengine::RenderEngineResult> futureRenderEngineResult) override;
    void onLayerDisplayed(std::shared_future<FenceResult>) override;

    // If a buffer was replaced this frame, release the former buffer
    void releasePendingBuffer(nsecs_t dequeueReadyTime) override;
+2 −3
Original line number Diff line number Diff line
@@ -73,8 +73,7 @@ BufferStateLayer::~BufferStateLayer() {
// -----------------------------------------------------------------------
// Interface implementation for Layer
// -----------------------------------------------------------------------
void BufferStateLayer::onLayerDisplayed(
        std::shared_future<renderengine::RenderEngineResult> futureRenderEngineResult) {
void BufferStateLayer::onLayerDisplayed(std::shared_future<FenceResult> futureFenceResult) {
    // If we are displayed on multiple displays in a single composition cycle then we would
    // need to do careful tracking to enable the use of the mLastClientCompositionFence.
    //  For example we can only use it if all the displays are client comp, and we need
@@ -118,7 +117,7 @@ void BufferStateLayer::onLayerDisplayed(

    if (ch != nullptr) {
        ch->previousReleaseCallbackId = mPreviousReleaseCallbackId;
        ch->previousReleaseFences.emplace_back(futureRenderEngineResult);
        ch->previousReleaseFences.emplace_back(std::move(futureFenceResult));
        ch->name = mName;
    }
}
+1 −2
Original line number Diff line number Diff line
@@ -39,8 +39,7 @@ public:
    // Implements Layer.
    const char* getType() const override { return "BufferStateLayer"; }

    void onLayerDisplayed(
            std::shared_future<renderengine::RenderEngineResult> futureRenderEngineResult) override;
    void onLayerDisplayed(std::shared_future<FenceResult>) override;

    void releasePendingBuffer(nsecs_t dequeueReadyTime) override;

+49 −0
Original line number Diff line number Diff line
/*
 * Copyright 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <android-base/expected.h>
#include <utils/Errors.h>
#include <utils/StrongPointer.h>

// TODO(b/232535621): Pull this file to <ui/FenceResult.h> so that RenderEngine::drawLayers returns
// FenceResult rather than RenderEngineResult.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wconversion"
#include <renderengine/RenderEngine.h>
#pragma clang diagnostic pop

namespace android {

class Fence;

using FenceResult = base::expected<sp<Fence>, status_t>;

// TODO(b/232535621): Prevent base::unexpected(NO_ERROR) from being a valid FenceResult.
inline status_t fenceStatus(const FenceResult& fenceResult) {
    return fenceResult.ok() ? NO_ERROR : fenceResult.error();
}

inline FenceResult toFenceResult(renderengine::RenderEngineResult&& result) {
    if (auto [status, fence] = std::move(result); fence.ok()) {
        return sp<Fence>::make(std::move(fence));
    } else {
        return base::unexpected(status);
    }
}

} // namespace android
Loading