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

Commit af0c7fd7 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 6a71beac
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -152,6 +152,7 @@ public:
        Region aboveOpaqueLayers;
        // The region of the output which should be considered dirty
        Region dirtyRegion;
        int32_t aboveBlurRequests = 0;
    };

    virtual ~Output();
+1 −0
Original line number Diff line number Diff line
@@ -157,6 +157,7 @@ protected:
private:
    void dirtyEntireOutput();
    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
@@ -94,6 +94,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
@@ -72,6 +72,7 @@ enum class LayerStateField : uint32_t {
    SolidColor            = 1u << 16,
    BackgroundBlurRadius  = 1u << 17,
    BlurRegions           = 1u << 18,
    BlursDisabled         = 1u << 19,
};
// clang-format on

@@ -232,7 +233,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 {
@@ -482,7 +484,10 @@ private:
                                      return hash;
                                  }};

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

    static const constexpr size_t kNumNonUniqueFields = 18;

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