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

Commit e8fe4748 authored by Lloyd Pique's avatar Lloyd Pique
Browse files

CE: Use distinct source and destination clip rectangles

The existing logic used a single clip rectangle, which was passed to
RenderEngine as both DisplaySettings.physicalDisplay and
DisplaySettings.clip. In at least the GLES backend, the first is used to
set the GL viewport, and the later is used to set the clip rectangle.

However if an Output is set up to render an arbitrary subrectangle of
a larger physical display space, distinct values need to be used --
typically the viewport (destination clip) is set to (0, 0, w, h), while
the source clip is set to some (x0, y0, x0 + w, y0 + w).

Note that in particular we still need to both rectangles to the same (0,
y0, w, y0 + h) rectangle when the goal is to hide a notch on a physical
device, so the rectangle settings must be obtained from code outside of
libcompositionengine.

Test: go/wm-smoke on crosshatch, checking notch-hiding
Test: atest libcompositionengine_test
Test: CtsColorModeTestCases
Test: CtsDisplayTestCases
Test: CtsGraphicsTestCases
Test: CtsUiRenderingTestCases
Test: CtsViewTestCases
Test: android.media.cts.EncodeVirtualDisplayWithCompositionTest
Bug: 144116549
Change-Id: Ic7218da2457f2645af180a1b4eed3dd6896db7d1
parent 5e18e873
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -163,7 +163,8 @@ public:


    // Sets the projection state to use
    // Sets the projection state to use
    virtual void setProjection(const ui::Transform&, uint32_t orientation, const Rect& frame,
    virtual void setProjection(const ui::Transform&, uint32_t orientation, const Rect& frame,
                               const Rect& viewport, const Rect& scissor, bool needsFiltering) = 0;
                               const Rect& viewport, const Rect& sourceClip,
                               const Rect& destinationClip, bool needsFiltering) = 0;
    // Sets the bounds to use
    // Sets the bounds to use
    virtual void setBounds(const ui::Size&) = 0;
    virtual void setBounds(const ui::Size&) = 0;


+2 −1
Original line number Original line Diff line number Diff line
@@ -39,7 +39,8 @@ public:
    std::optional<DisplayId> getDisplayId() const override;
    std::optional<DisplayId> getDisplayId() const override;
    void setCompositionEnabled(bool) override;
    void setCompositionEnabled(bool) override;
    void setProjection(const ui::Transform&, uint32_t orientation, const Rect& frame,
    void setProjection(const ui::Transform&, uint32_t orientation, const Rect& frame,
                       const Rect& viewport, const Rect& scissor, bool needsFiltering) override;
                       const Rect& viewport, const Rect& sourceClip, const Rect& destinationClip,
                       bool needsFiltering) override;
    void setBounds(const ui::Size&) override;
    void setBounds(const ui::Size&) override;
    void setLayerStackFilter(uint32_t layerStackId, bool isInternal) override;
    void setLayerStackFilter(uint32_t layerStackId, bool isInternal) override;


+5 −2
Original line number Original line Diff line number Diff line
@@ -79,8 +79,11 @@ struct OutputCompositionState {
    // The logical space user viewport rectangle
    // The logical space user viewport rectangle
    Rect viewport;
    Rect viewport;


    // The physical space scissor rectangle
    // The physical space source clip rectangle
    Rect scissor;
    Rect sourceClip;

    // The physical space destination clip rectangle
    Rect destinationClip;


    // If true, RenderEngine filtering should be enabled
    // If true, RenderEngine filtering should be enabled
    bool needsFiltering{false};
    bool needsFiltering{false};
+3 −2
Original line number Original line Diff line number Diff line
@@ -37,8 +37,9 @@ public:
    MOCK_CONST_METHOD0(getDisplayId, std::optional<DisplayId>());
    MOCK_CONST_METHOD0(getDisplayId, std::optional<DisplayId>());


    MOCK_METHOD1(setCompositionEnabled, void(bool));
    MOCK_METHOD1(setCompositionEnabled, void(bool));
    MOCK_METHOD6(setProjection,
    MOCK_METHOD7(setProjection,
                 void(const ui::Transform&, uint32_t, const Rect&, const Rect&, const Rect&, bool));
                 void(const ui::Transform&, uint32_t, const Rect&, const Rect&, const Rect&,
                      const Rect&, bool));
    MOCK_METHOD1(setBounds, void(const ui::Size&));
    MOCK_METHOD1(setBounds, void(const ui::Size&));
    MOCK_METHOD2(setLayerStackFilter, void(uint32_t, bool));
    MOCK_METHOD2(setLayerStackFilter, void(uint32_t, bool));


+6 −4
Original line number Original line Diff line number Diff line
@@ -107,11 +107,13 @@ void Output::setCompositionEnabled(bool enabled) {
}
}


void Output::setProjection(const ui::Transform& transform, uint32_t orientation, const Rect& frame,
void Output::setProjection(const ui::Transform& transform, uint32_t orientation, const Rect& frame,
                           const Rect& viewport, const Rect& scissor, bool needsFiltering) {
                           const Rect& viewport, const Rect& sourceClip,
                           const Rect& destinationClip, bool needsFiltering) {
    auto& outputState = editState();
    auto& outputState = editState();
    outputState.transform = transform;
    outputState.transform = transform;
    outputState.orientation = orientation;
    outputState.orientation = orientation;
    outputState.scissor = scissor;
    outputState.sourceClip = sourceClip;
    outputState.destinationClip = destinationClip;
    outputState.frame = frame;
    outputState.frame = frame;
    outputState.viewport = viewport;
    outputState.viewport = viewport;
    outputState.needsFiltering = needsFiltering;
    outputState.needsFiltering = needsFiltering;
@@ -834,8 +836,8 @@ std::optional<base::unique_fd> Output::composeSurfaces(const Region& debugRegion
    const bool supportsProtectedContent = renderEngine.supportsProtectedContent();
    const bool supportsProtectedContent = renderEngine.supportsProtectedContent();


    renderengine::DisplaySettings clientCompositionDisplay;
    renderengine::DisplaySettings clientCompositionDisplay;
    clientCompositionDisplay.physicalDisplay = outputState.scissor;
    clientCompositionDisplay.physicalDisplay = outputState.destinationClip;
    clientCompositionDisplay.clip = outputState.scissor;
    clientCompositionDisplay.clip = outputState.sourceClip;
    clientCompositionDisplay.globalTransform = outputState.transform.asMatrix4();
    clientCompositionDisplay.globalTransform = outputState.transform.asMatrix4();
    clientCompositionDisplay.orientation = outputState.orientation;
    clientCompositionDisplay.orientation = outputState.orientation;
    clientCompositionDisplay.outputDataspace = mDisplayColorProfile->hasWideColorGamut()
    clientCompositionDisplay.outputDataspace = mDisplayColorProfile->hasWideColorGamut()
Loading