diff options
author | 2023-10-02 16:28:03 -0700 | |
---|---|---|
committer | 2023-10-02 23:29:29 +0000 | |
commit | ddba9342cf79ea67328a845bb1b99635b2cbd00e (patch) | |
tree | d5c69269756fe8b444582ce1a09c105e010c6c79 | |
parent | 75751b266ce74773b3ab1e39e85a7badd1f899f3 (diff) |
SF: avoid a nullptr access in RefreshRateOverlay / HDR overlay
Bug: 302312658
Test: presubmit + manual
Change-Id: I3a69e4520be7f52779e1f92e5621a6138de08797
-rw-r--r-- | services/surfaceflinger/DisplayDevice.cpp | 22 | ||||
-rw-r--r-- | services/surfaceflinger/HdrSdrRatioOverlay.cpp | 17 | ||||
-rw-r--r-- | services/surfaceflinger/HdrSdrRatioOverlay.h | 12 | ||||
-rw-r--r-- | services/surfaceflinger/RefreshRateOverlay.cpp | 19 | ||||
-rw-r--r-- | services/surfaceflinger/RefreshRateOverlay.h | 10 |
5 files changed, 66 insertions, 14 deletions
diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index 1faf6a1bcb..5b6591aeac 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -428,10 +428,12 @@ void DisplayDevice::enableHdrSdrRatioOverlay(bool enable) { return; } - mHdrSdrRatioOverlay = std::make_unique<HdrSdrRatioOverlay>(); - mHdrSdrRatioOverlay->setLayerStack(getLayerStack()); - mHdrSdrRatioOverlay->setViewport(getSize()); - updateHdrSdrRatioOverlayRatio(mHdrSdrRatio); + mHdrSdrRatioOverlay = HdrSdrRatioOverlay::create(); + if (mHdrSdrRatioOverlay) { + mHdrSdrRatioOverlay->setLayerStack(getLayerStack()); + mHdrSdrRatioOverlay->setViewport(getSize()); + updateHdrSdrRatioOverlayRatio(mHdrSdrRatio); + } } void DisplayDevice::updateHdrSdrRatioOverlayRatio(float currentHdrSdrRatio) { @@ -468,11 +470,13 @@ 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->setLayerStack(getLayerStack()); - mRefreshRateOverlay->setViewport(getSize()); - updateRefreshRateOverlayRate(getActiveMode().modePtr->getVsyncRate(), getActiveMode().fps, - setByHwc); + 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) { diff --git a/services/surfaceflinger/HdrSdrRatioOverlay.cpp b/services/surfaceflinger/HdrSdrRatioOverlay.cpp index 186e8784c5..dfb1c1e251 100644 --- a/services/surfaceflinger/HdrSdrRatioOverlay.cpp +++ b/services/surfaceflinger/HdrSdrRatioOverlay.cpp @@ -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(); diff --git a/services/surfaceflinger/HdrSdrRatioOverlay.h b/services/surfaceflinger/HdrSdrRatioOverlay.h index 69f95ecf7a..72d401d444 100644 --- a/services/surfaceflinger/HdrSdrRatioOverlay.h +++ b/services/surfaceflinger/HdrSdrRatioOverlay.h @@ -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; diff --git a/services/surfaceflinger/RefreshRateOverlay.cpp b/services/surfaceflinger/RefreshRateOverlay.cpp index be04c09fa3..42676c6936 100644 --- a/services/surfaceflinger/RefreshRateOverlay.cpp +++ b/services/surfaceflinger/RefreshRateOverlay.cpp @@ -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; diff --git a/services/surfaceflinger/RefreshRateOverlay.h b/services/surfaceflinger/RefreshRateOverlay.h index ae334e54ef..0fec470edc 100644 --- a/services/surfaceflinger/RefreshRateOverlay.h +++ b/services/surfaceflinger/RefreshRateOverlay.h @@ -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, |