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

Commit ddba9342 authored by Ady Abraham's avatar Ady Abraham
Browse files

SF: avoid a nullptr access in RefreshRateOverlay / HDR overlay

Bug: 302312658
Test: presubmit + manual
Change-Id: I3a69e4520be7f52779e1f92e5621a6138de08797
parent 75751b26
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -428,11 +428,13 @@ void DisplayDevice::enableHdrSdrRatioOverlay(bool enable) {
        return;
    }

    mHdrSdrRatioOverlay = std::make_unique<HdrSdrRatioOverlay>();
    mHdrSdrRatioOverlay = HdrSdrRatioOverlay::create();
    if (mHdrSdrRatioOverlay) {
        mHdrSdrRatioOverlay->setLayerStack(getLayerStack());
        mHdrSdrRatioOverlay->setViewport(getSize());
        updateHdrSdrRatioOverlayRatio(mHdrSdrRatio);
    }
}

void DisplayDevice::updateHdrSdrRatioOverlayRatio(float currentHdrSdrRatio) {
    ATRACE_CALL();
@@ -468,12 +470,14 @@ void DisplayDevice::enableRefreshRateOverlay(bool enable, bool setByHwc, bool sh

    // TODO(b/296636258) Update to use the render rate range in VRR mode.
    const auto fpsRange = mRefreshRateSelector->getSupportedRefreshRateRange();
    mRefreshRateOverlay = std::make_unique<RefreshRateOverlay>(fpsRange, features);
    mRefreshRateOverlay = RefreshRateOverlay::create(fpsRange, features);
    if (mRefreshRateOverlay) {
        mRefreshRateOverlay->setLayerStack(getLayerStack());
        mRefreshRateOverlay->setViewport(getSize());
        updateRefreshRateOverlayRate(getActiveMode().modePtr->getVsyncRate(), getActiveMode().fps,
                                     setByHwc);
    }
}

void DisplayDevice::updateRefreshRateOverlayRate(Fps vsyncRate, Fps renderFps, bool setByHwc) {
    ATRACE_CALL();
+16 −1
Original line number Diff line number Diff line
@@ -96,7 +96,18 @@ sp<GraphicBuffer> HdrSdrRatioOverlay::draw(float currentHdrSdrRatio, SkColor col
    return buffer;
}

HdrSdrRatioOverlay::HdrSdrRatioOverlay()
std::unique_ptr<HdrSdrRatioOverlay> HdrSdrRatioOverlay::create() {
    std::unique_ptr<HdrSdrRatioOverlay> overlay =
            std::make_unique<HdrSdrRatioOverlay>(ConstructorTag{});
    if (overlay->initCheck()) {
        return overlay;
    }

    ALOGE("%s: Failed to create HdrSdrRatioOverlay", __func__);
    return {};
}

HdrSdrRatioOverlay::HdrSdrRatioOverlay(ConstructorTag)
      : mSurfaceControl(
                SurfaceControlHolder::createSurfaceControlHolder(String8("HdrSdrRatioOverlay"))) {
    if (!mSurfaceControl) {
@@ -109,6 +120,10 @@ HdrSdrRatioOverlay::HdrSdrRatioOverlay()
            .apply();
}

bool HdrSdrRatioOverlay::initCheck() const {
    return mSurfaceControl != nullptr;
}

void HdrSdrRatioOverlay::changeHdrSdrRatio(float currentHdrSdrRatio) {
    mCurrentHdrSdrRatio = currentHdrSdrRatio;
    animate();
+10 −2
Original line number Diff line number Diff line
@@ -25,15 +25,22 @@ class SkCanvas;

namespace android {
class HdrSdrRatioOverlay {
private:
    // Effectively making the constructor private, while keeping std::make_unique work
    struct ConstructorTag {};

public:
    HdrSdrRatioOverlay();
    static std::unique_ptr<HdrSdrRatioOverlay> create();

    void setLayerStack(ui::LayerStack);
    void setViewport(ui::Size);
    void animate();
    void changeHdrSdrRatio(float currentRatio);

    HdrSdrRatioOverlay(ConstructorTag);

private:
    float mCurrentHdrSdrRatio = 1.f;
    bool initCheck() const;

    static sp<GraphicBuffer> draw(float currentHdrSdrRatio, SkColor, ui::Transform::RotationFlags,
                                  sp<GraphicBuffer>& ringBufer);
@@ -41,6 +48,7 @@ private:

    const sp<GraphicBuffer> getOrCreateBuffers(float currentHdrSdrRatio);

    float mCurrentHdrSdrRatio = 1.f;
    const std::unique_ptr<SurfaceControlHolder> mSurfaceControl;

    size_t mIndex = 0;
+18 −1
Original line number Diff line number Diff line
@@ -138,7 +138,20 @@ void RefreshRateOverlay::drawNumber(int number, int left, SkColor color, SkCanva
    SegmentDrawer::drawDigit(number % 10, left, color, canvas);
}

RefreshRateOverlay::RefreshRateOverlay(FpsRange fpsRange, ftl::Flags<Features> features)
std::unique_ptr<RefreshRateOverlay> RefreshRateOverlay::create(FpsRange range,
                                                               ftl::Flags<Features> features) {
    std::unique_ptr<RefreshRateOverlay> overlay =
            std::make_unique<RefreshRateOverlay>(ConstructorTag{}, range, features);
    if (overlay->initCheck()) {
        return overlay;
    }

    ALOGE("%s: Failed to create RefreshRateOverlay", __func__);
    return {};
}

RefreshRateOverlay::RefreshRateOverlay(ConstructorTag, FpsRange fpsRange,
                                       ftl::Flags<Features> features)
      : mFpsRange(fpsRange),
        mFeatures(features),
        mSurfaceControl(
@@ -154,6 +167,10 @@ RefreshRateOverlay::RefreshRateOverlay(FpsRange fpsRange, ftl::Flags<Features> f
            .apply();
}

bool RefreshRateOverlay::initCheck() const {
    return mSurfaceControl != nullptr;
}

auto RefreshRateOverlay::getOrCreateBuffers(Fps vsyncRate, Fps renderFps) -> const Buffers& {
    static const Buffers kNoBuffers;
    if (!mSurfaceControl) return kNoBuffers;
+9 −1
Original line number Diff line number Diff line
@@ -37,6 +37,10 @@ class GraphicBuffer;
class SurfaceFlinger;

class RefreshRateOverlay {
private:
    // Effectively making the constructor private, while keeping std::make_unique work
    struct ConstructorTag {};

public:
    enum class Features {
        Spinner = 1 << 0,
@@ -45,7 +49,7 @@ public:
        SetByHwc = 1 << 3,
    };

    RefreshRateOverlay(FpsRange, ftl::Flags<Features>);
    static std::unique_ptr<RefreshRateOverlay> create(FpsRange, ftl::Flags<Features>);

    void setLayerStack(ui::LayerStack);
    void setViewport(ui::Size);
@@ -54,7 +58,11 @@ public:
    void animate();
    bool isSetByHwc() const { return mFeatures.test(RefreshRateOverlay::Features::SetByHwc); }

    RefreshRateOverlay(ConstructorTag, FpsRange, ftl::Flags<Features>);

private:
    bool initCheck() const;

    using Buffers = std::vector<sp<GraphicBuffer>>;

    static Buffers draw(int vsyncRate, int renderFps, SkColor, ui::Transform::RotationFlags,