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

Commit 35fca9d4 authored by Lloyd Pique's avatar Lloyd Pique
Browse files

SF: Move postFrameBuffer to CompositionEngine

This moves SurfaceFlinger::postFrameBuffer to
compositionengine::Output::postFrameBuffer, with some implementation
details in compositionengine::Display::presentAndGetFrameFences.

Test: atest libsurfaceflinger_unittest libcompositionengine_test
Test: atest CtsColorModeTestCases
Test: atest CtsDisplayTestCases
Test: atest CtsGraphicsTestCases
Test: atest CtsUiRenderingTestCases
Test: atest CtsViewTestCases
Test: atest android.media.cts.EncodeVirtualDisplayWithCompositionTest
Bug: 121291683

Change-Id: I8cda7bf26ec4b9e437c91ef951c5030f8d2752e9
parent 66d6860c
Loading
Loading
Loading
Loading
+16 −0
Original line number Original line Diff line number Diff line
@@ -19,8 +19,10 @@
#include <cstdint>
#include <cstdint>
#include <optional>
#include <optional>
#include <string>
#include <string>
#include <unordered_map>


#include <math/mat4.h>
#include <math/mat4.h>
#include <ui/Fence.h>
#include <ui/GraphicTypes.h>
#include <ui/GraphicTypes.h>
#include <ui/Region.h>
#include <ui/Region.h>
#include <ui/Transform.h>
#include <ui/Transform.h>
@@ -28,6 +30,10 @@


#include "DisplayHardware/DisplayIdentification.h"
#include "DisplayHardware/DisplayIdentification.h"


namespace HWC2 {
class Layer;
} // namespace HWC2

namespace android::compositionengine {
namespace android::compositionengine {


class DisplayColorProfile;
class DisplayColorProfile;
@@ -48,6 +54,12 @@ public:
    using OutputLayers = std::vector<std::unique_ptr<compositionengine::OutputLayer>>;
    using OutputLayers = std::vector<std::unique_ptr<compositionengine::OutputLayer>>;
    using ReleasedLayers = std::vector<wp<LayerFE>>;
    using ReleasedLayers = std::vector<wp<LayerFE>>;


    struct FrameFences {
        sp<Fence> presentFence{Fence::NO_FENCE};
        sp<Fence> clientTargetAcquireFence{Fence::NO_FENCE};
        std::unordered_map<HWC2::Layer*, sp<Fence>> layerFences;
    };

    virtual ~Output();
    virtual ~Output();


    // Returns true if the output is valid. This is meant to be checked post-
    // Returns true if the output is valid. This is meant to be checked post-
@@ -141,10 +153,14 @@ public:
    // Prepares a frame for display
    // Prepares a frame for display
    virtual void prepareFrame() = 0;
    virtual void prepareFrame() = 0;


    // Posts the new frame, and sets release fences.
    virtual void postFramebuffer() = 0;

protected:
protected:
    virtual void setDisplayColorProfile(std::unique_ptr<DisplayColorProfile>) = 0;
    virtual void setDisplayColorProfile(std::unique_ptr<DisplayColorProfile>) = 0;
    virtual void setRenderSurface(std::unique_ptr<RenderSurface>) = 0;
    virtual void setRenderSurface(std::unique_ptr<RenderSurface>) = 0;
    virtual void chooseCompositionStrategy() = 0;
    virtual void chooseCompositionStrategy() = 0;
    virtual FrameFences presentAndGetFrameFences() = 0;
};
};


} // namespace android::compositionengine
} // namespace android::compositionengine
+3 −2
Original line number Original line Diff line number Diff line
@@ -42,6 +42,7 @@ public:
    void setColorTransform(const mat4&) override;
    void setColorTransform(const mat4&) override;
    void setColorMode(ui::ColorMode, ui::Dataspace, ui::RenderIntent, ui::Dataspace) override;
    void setColorMode(ui::ColorMode, ui::Dataspace, ui::RenderIntent, ui::Dataspace) override;
    void chooseCompositionStrategy() override;
    void chooseCompositionStrategy() override;
    compositionengine::Output::FrameFences presentAndGetFrameFences() override;


    // compositionengine::Display overrides
    // compositionengine::Display overrides
    const std::optional<DisplayId>& getId() const override;
    const std::optional<DisplayId>& getId() const override;
@@ -66,7 +67,7 @@ private:
    std::optional<DisplayId> mId;
    std::optional<DisplayId> mId;
};
};


std::shared_ptr<compositionengine::Display> createDisplay(
std::shared_ptr<Display> createDisplay(const compositionengine::CompositionEngine&,
        const compositionengine::CompositionEngine&, compositionengine::DisplayCreationArgs&&);
                                       compositionengine::DisplayCreationArgs&&);
} // namespace impl
} // namespace impl
} // namespace android::compositionengine
} // namespace android::compositionengine
+2 −0
Original line number Original line Diff line number Diff line
@@ -76,6 +76,7 @@ public:
    ReleasedLayers takeReleasedLayers() override;
    ReleasedLayers takeReleasedLayers() override;


    void prepareFrame() override;
    void prepareFrame() override;
    void postFramebuffer() override;


    // Testing
    // Testing
    void setDisplayColorProfileForTest(std::unique_ptr<compositionengine::DisplayColorProfile>);
    void setDisplayColorProfileForTest(std::unique_ptr<compositionengine::DisplayColorProfile>);
@@ -84,6 +85,7 @@ public:
protected:
protected:
    const CompositionEngine& getCompositionEngine() const;
    const CompositionEngine& getCompositionEngine() const;
    void chooseCompositionStrategy() override;
    void chooseCompositionStrategy() override;
    compositionengine::Output::FrameFences presentAndGetFrameFences() override;
    void dumpBase(std::string&) const;
    void dumpBase(std::string&) const;


private:
private:
+3 −0
Original line number Original line Diff line number Diff line
@@ -75,6 +75,9 @@ public:


    MOCK_METHOD0(prepareFrame, void());
    MOCK_METHOD0(prepareFrame, void());
    MOCK_METHOD0(chooseCompositionStrategy, void());
    MOCK_METHOD0(chooseCompositionStrategy, void());

    MOCK_METHOD0(postFramebuffer, void());
    MOCK_METHOD0(presentAndGetFrameFences, compositionengine::Output::FrameFences());
};
};


} // namespace android::compositionengine::mock
} // namespace android::compositionengine::mock
+28 −1
Original line number Original line Diff line number Diff line
@@ -29,7 +29,7 @@


namespace android::compositionengine::impl {
namespace android::compositionengine::impl {


std::shared_ptr<compositionengine::Display> createDisplay(
std::shared_ptr<Display> createDisplay(
        const compositionengine::CompositionEngine& compositionEngine,
        const compositionengine::CompositionEngine& compositionEngine,
        compositionengine::DisplayCreationArgs&& args) {
        compositionengine::DisplayCreationArgs&& args) {
    return std::make_shared<Display>(compositionEngine, std::move(args));
    return std::make_shared<Display>(compositionEngine, std::move(args));
@@ -213,4 +213,31 @@ void Display::applyLayerRequestsToLayers(const LayerRequests& layerRequests) {
    }
    }
}
}


compositionengine::Output::FrameFences Display::presentAndGetFrameFences() {
    auto result = impl::Output::presentAndGetFrameFences();

    if (!mId) {
        return result;
    }

    auto& hwc = getCompositionEngine().getHwComposer();
    hwc.presentAndGetReleaseFences(*mId);

    result.presentFence = hwc.getPresentFence(*mId);

    // TODO(b/121291683): Change HWComposer call to return entire map
    for (const auto& layer : getOutputLayersOrderedByZ()) {
        auto hwcLayer = layer->getHwcLayer();
        if (!hwcLayer) {
            continue;
        }

        result.layerFences.emplace(hwcLayer, hwc.getLayerReleaseFence(*mId, hwcLayer));
    }

    hwc.clearReleaseFences(*mId);

    return result;
}

} // namespace android::compositionengine::impl
} // namespace android::compositionengine::impl
Loading