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

Commit c01af289 authored by Alec Mouri's avatar Alec Mouri
Browse files

Don't blur too many layers

An application requesting lots and lots of blurs:
a. Enables pixel stealing by measuring how long it takes to perform a
blur across windows
b. Probably isn't very valid anyways.

So, just arbitrarily pick an upper bound for blur requests that a
display is allowed to manage (10), and disable everything else.
Arbitrarily, pick the 10 "front-most" blurs to be respected.

Bug: 399120953
Flag: EXEMPT security
Test: Security PoC no longer PoCs
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:acf65e7b90c8313b3cf939d14b8299818d77cc18)
Merged-In: Ie7195eb852b52aff2f58da8bd095d8684baceef6
Change-Id: Ie7195eb852b52aff2f58da8bd095d8684baceef6
parent e7626987
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -157,6 +157,7 @@ public:
        // only has a value if there's something needing it, like when a TrustedPresentationListener
        // is set
        std::optional<Region> aboveCoveredLayersExcludingOverlays;
        int32_t aboveBlurRequests = 0;
    };

    virtual ~Output();
+1 −0
Original line number Diff line number Diff line
@@ -160,6 +160,7 @@ private:
    void dirtyEntireOutput();
    void updateCompositionStateForBorder(const compositionengine::CompositionRefreshArgs&);
    compositionengine::OutputLayer* findLayerRequestingBackgroundComposition() const;
    void sanitizeOutputLayers() const;
    void finishPrepareFrame();
    ui::Dataspace getBestDataspace(ui::Dataspace*, bool*) const;
    compositionengine::Output::ColorProfile pickColorProfile(
+3 −0
Original line number Diff line number Diff line
@@ -100,6 +100,9 @@ struct OutputLayerCompositionState {
    // order to save power.
    Region outputSpaceBlockingRegionHint;

    // ignore blur requests if there's just too many on top of this layer
    bool ignoreBlur{false};

    // Overrides the buffer, acquire fence, and display frame stored in LayerFECompositionState
    struct {
        std::shared_ptr<renderengine::ExternalTexture> buffer = nullptr;
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ public:
        const std::string& getName() const { return mState->getName(); }
        int32_t getBackgroundBlurRadius() const { return mState->getBackgroundBlurRadius(); }
        Rect getDisplayFrame() const { return mState->getDisplayFrame(); }
        bool hasBlurBehind() const { return mState->hasBlurBehind(); }
        const Region& getVisibleRegion() const { return mState->getVisibleRegion(); }
        const sp<GraphicBuffer>& getBuffer() const {
            return mState->getOutputLayer()->getLayerFE().getCompositionState()->buffer;
+8 −3
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ enum class LayerStateField : uint32_t {
    BlurRegions           = 1u << 18,
    HasProtectedContent   = 1u << 19,
    CachingHint           = 1u << 20,
    BlursDisabled         = 1u << 21,
};
// clang-format on

@@ -234,7 +235,8 @@ public:
    Rect getDisplayFrame() const { return mDisplayFrame.get(); }
    const Region& getVisibleRegion() const { return mVisibleRegion.get(); }
    bool hasBlurBehind() const {
        return mBackgroundBlurRadius.get() > 0 || !mBlurRegions.get().empty();
        return (mBackgroundBlurRadius.get() > 0 || !mBlurRegions.get().empty()) &&
                !mIsBlursDisabled.get();
    }
    int32_t getBackgroundBlurRadius() const { return mBackgroundBlurRadius.get(); }
    aidl::android::hardware::graphics::composer3::Composition getCompositionType() const {
@@ -502,7 +504,10 @@ private:
                             return std::vector<std::string>{toString(cachingHint)};
                         }};

    static const constexpr size_t kNumNonUniqueFields = 19;
    OutputLayerState<bool, LayerStateField::BlursDisabled> mIsBlursDisabled{
            [](auto layer) { return layer->getState().ignoreBlur; }};

    static const constexpr size_t kNumNonUniqueFields = 20;

    std::array<StateInterface*, kNumNonUniqueFields> getNonUniqueFields() {
        std::array<const StateInterface*, kNumNonUniqueFields> constFields =
@@ -520,7 +525,7 @@ private:
                &mAlpha,        &mLayerMetadata,  &mVisibleRegion,        &mOutputDataspace,
                &mPixelFormat,  &mColorTransform, &mCompositionType,      &mSidebandStream,
                &mBuffer,       &mSolidColor,     &mBackgroundBlurRadius, &mBlurRegions,
                &mFrameNumber,  &mIsProtected,    &mCachingHint};
                &mFrameNumber,  &mIsProtected,    &mCachingHint,          &mIsBlursDisabled};
    }
};

Loading