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

Commit 8366f563 authored by Yichi Chen's avatar Yichi Chen
Browse files

HWC2: Optimize execution by caching all HWC2 calls in setPerFrameData

To avoid redundant HWC2 calls into hwcomposer service, we cache all HWC2
calls in BufferLayer::setPerFrameData by having visible region, damage
region and layer buffers cached in HWC2::Layer.

Bug: 119414178
Test: Display function test on F2.
Test: b/129317072 Display function tests on M1/S1, M2/S2, B1/C1, B4/S4,
      and C2/F2.
Change-Id: I1679e755ac55a459c93b42b9f8225f0c270228e6
parent 945a7006
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@
#include <ui/Fence.h>
#include <ui/FloatRect.h>
#include <ui/GraphicBuffer.h>
#include <ui/Region.h>

#include <android/configuration.h>

@@ -826,6 +825,11 @@ Error Layer::setCursorPosition(int32_t x, int32_t y)
Error Layer::setBuffer(uint32_t slot, const sp<GraphicBuffer>& buffer,
        const sp<Fence>& acquireFence)
{
    if (buffer == nullptr && mBufferSlot == slot) {
        return Error::None;
    }
    mBufferSlot = slot;

    int32_t fenceFd = acquireFence->dup();
    auto intError = mComposer.setLayerBuffer(mDisplayId, mId, slot, buffer,
                                             fenceFd);
@@ -834,6 +838,12 @@ Error Layer::setBuffer(uint32_t slot, const sp<GraphicBuffer>& buffer,

Error Layer::setSurfaceDamage(const Region& damage)
{
    if (damage.isRect() && mDamageRegion.isRect() &&
        (damage.getBounds() == mDamageRegion.getBounds())) {
        return Error::None;
    }
    mDamageRegion = damage;

    // We encode default full-screen damage as INVALID_RECT upstream, but as 0
    // rects for HWC
    Hwc2::Error intError = Hwc2::Error::NONE;
@@ -988,6 +998,12 @@ Error Layer::setTransform(Transform transform)

Error Layer::setVisibleRegion(const Region& region)
{
    if (region.isRect() && mVisibleRegion.isRect() &&
        (region.getBounds() == mVisibleRegion.getBounds())) {
        return Error::None;
    }
    mVisibleRegion = region;

    size_t rectCount = 0;
    auto rectArray = region.getArray(&rectCount);

+7 −2
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <math/mat4.h>
#include <ui/GraphicTypes.h>
#include <ui/HdrCapabilities.h>
#include <ui/Region.h>
#include <utils/Log.h>
#include <utils/StrongPointer.h>
#include <utils/Timers.h>
@@ -42,8 +43,6 @@ namespace android {
    class Fence;
    class FloatRect;
    class GraphicBuffer;
    class Rect;
    class Region;
    namespace Hwc2 {
        class Composer;
    }
@@ -438,9 +437,15 @@ private:

    hwc2_display_t mDisplayId;
    hwc2_layer_t mId;

    // Cached HWC2 data, to ensure the same commands aren't sent to the HWC
    // multiple times.
    android::Region mVisibleRegion = android::Region::INVALID_REGION;
    android::Region mDamageRegion = android::Region::INVALID_REGION;
    android::ui::Dataspace mDataSpace = android::ui::Dataspace::UNKNOWN;
    android::HdrMetadata mHdrMetadata;
    android::mat4 mColorMatrix;
    uint32_t mBufferSlot;
};

} // namespace impl