diff options
author | 2020-09-10 13:35:20 +0200 | |
---|---|---|
committer | 2020-09-11 23:39:04 +0200 | |
commit | 043ba295074117d834388238a98b78890f099ccb (patch) | |
tree | 2e4ef958997d3c078fb8895c9ea6004588bf786f | |
parent | 8436cbdf4e7b9cdc4f687ce51cd82f4602f68420 (diff) |
[SF] Remove needsFiltering param from Output::setProjection
This parameter is not needed because its value is always computed
as a function of the other parameters.
Bug: 161793589
Test: atest libsurfaceflinger_unittest libcompositionengine_test
Change-Id: I7ce1b62577b9e84491185800bf98269f5f47b577
9 files changed, 33 insertions, 47 deletions
diff --git a/libs/ui/Transform.cpp b/libs/ui/Transform.cpp index e1fb45caf3..ec8a78afdc 100644 --- a/libs/ui/Transform.cpp +++ b/libs/ui/Transform.cpp @@ -22,8 +22,7 @@ #include <ui/Transform.h> #include <utils/String8.h> -namespace android { -namespace ui { +namespace android::ui { Transform::Transform() { reset(); @@ -57,8 +56,7 @@ bool Transform::operator==(const Transform& other) const { mMatrix[2][2] == other.mMatrix[2][2]; } -Transform Transform::operator * (const Transform& rhs) const -{ +Transform Transform::operator*(const Transform& rhs) const { if (CC_LIKELY(mType == IDENTITY)) return rhs; @@ -150,8 +148,7 @@ void Transform::reset() { } } -void Transform::set(float tx, float ty) -{ +void Transform::set(float tx, float ty) { mMatrix[2][0] = tx; mMatrix[2][1] = ty; mMatrix[2][2] = 1.0f; @@ -163,8 +160,7 @@ void Transform::set(float tx, float ty) } } -void Transform::set(float a, float b, float c, float d) -{ +void Transform::set(float a, float b, float c, float d) { mat33& M(mMatrix); M[0][0] = a; M[1][0] = b; M[0][1] = c; M[1][1] = d; @@ -172,8 +168,7 @@ void Transform::set(float a, float b, float c, float d) mType = UNKNOWN_TYPE; } -status_t Transform::set(uint32_t flags, float w, float h) -{ +status_t Transform::set(uint32_t flags, float w, float h) { if (flags & ROT_INVALID) { // that's not allowed! reset(); @@ -245,13 +240,11 @@ vec2 Transform::transform(float x, float y) const { return transform(vec2(x, y)); } -Rect Transform::makeBounds(int w, int h) const -{ +Rect Transform::makeBounds(int w, int h) const { return transform( Rect(w, h) ); } -Rect Transform::transform(const Rect& bounds, bool roundOutwards) const -{ +Rect Transform::transform(const Rect& bounds, bool roundOutwards) const { Rect r; vec2 lt( bounds.left, bounds.top ); vec2 rt( bounds.right, bounds.top ); @@ -278,8 +271,7 @@ Rect Transform::transform(const Rect& bounds, bool roundOutwards) const return r; } -FloatRect Transform::transform(const FloatRect& bounds) const -{ +FloatRect Transform::transform(const FloatRect& bounds) const { vec2 lt(bounds.left, bounds.top); vec2 rt(bounds.right, bounds.top); vec2 lb(bounds.left, bounds.bottom); @@ -299,8 +291,7 @@ FloatRect Transform::transform(const FloatRect& bounds) const return r; } -Region Transform::transform(const Region& reg) const -{ +Region Transform::transform(const Region& reg) const { Region out; if (CC_UNLIKELY(type() > TRANSLATE)) { if (CC_LIKELY(preserveRects())) { @@ -320,8 +311,7 @@ Region Transform::transform(const Region& reg) const return out; } -uint32_t Transform::type() const -{ +uint32_t Transform::type() const { if (mType & UNKNOWN_TYPE) { // recompute what this transform is @@ -416,16 +406,18 @@ uint32_t Transform::getType() const { return type() & 0xFF; } -uint32_t Transform::getOrientation() const -{ +uint32_t Transform::getOrientation() const { return (type() >> 8) & 0xFF; } -bool Transform::preserveRects() const -{ +bool Transform::preserveRects() const { return (getOrientation() & ROT_INVALID) ? false : true; } +bool Transform::needsBilinearFiltering() const { + return (!preserveRects() || getType() >= ui::Transform::SCALE); +} + mat4 Transform::asMatrix4() const { // Internally Transform uses a 3x3 matrix since the transform is meant for // two-dimensional values. An equivalent 4x4 matrix means inserting an extra @@ -531,5 +523,4 @@ void Transform::dump(const char* name, const char* prefix) const { ALOGD("%s", out.c_str()); } -} // namespace ui -} // namespace android +} // namespace android::ui diff --git a/libs/ui/include/ui/Transform.h b/libs/ui/include/ui/Transform.h index 4c463bf7f1..9a434e541b 100644 --- a/libs/ui/include/ui/Transform.h +++ b/libs/ui/include/ui/Transform.h @@ -61,9 +61,13 @@ public: }; // query the transform - bool preserveRects() const; - uint32_t getType() const; - uint32_t getOrientation() const; + bool preserveRects() const; + + // Returns if bilinear filtering is needed after applying this transform to avoid aliasing. + bool needsBilinearFiltering() const; + + uint32_t getType() const; + uint32_t getOrientation() const; bool operator==(const Transform& other) const; const vec3& operator [] (size_t i) const; // returns column i diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h index 6cc7a538ac..6552c5460a 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h @@ -165,8 +165,7 @@ public: // Sets the projection state to use virtual void setProjection(const ui::Transform&, uint32_t orientation, const Rect& orientedDisplaySpaceRect, - const Rect& layerStackSpaceRect, const Rect& displaySpaceRect, - bool needsFiltering) = 0; + const Rect& layerStackSpaceRect, const Rect& displaySpaceRect) = 0; // Sets the bounds to use virtual void setDisplaySpaceSize(const ui::Size&) = 0; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h index 57b7a974bf..e009894964 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h @@ -40,7 +40,7 @@ public: void setCompositionEnabled(bool) override; void setProjection(const ui::Transform&, uint32_t orientation, const Rect& orientedDisplaySpaceRect, const Rect& layerStackSpaceRect, - const Rect& displaySpaceRect, bool needsFiltering) override; + const Rect& displaySpaceRect) override; void setDisplaySpaceSize(const ui::Size&) override; void setLayerStackFilter(uint32_t layerStackId, bool isInternal) override; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h index 375d334b2d..5350611ae4 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h @@ -36,8 +36,8 @@ public: MOCK_CONST_METHOD0(getDisplayId, std::optional<DisplayId>()); MOCK_METHOD1(setCompositionEnabled, void(bool)); - MOCK_METHOD6(setProjection, - void(const ui::Transform&, uint32_t, const Rect&, const Rect&, const Rect&, bool)); + MOCK_METHOD5(setProjection, + void(const ui::Transform&, uint32_t, const Rect&, const Rect&, const Rect&)); MOCK_METHOD1(setDisplaySpaceSize, void(const ui::Size&)); MOCK_METHOD2(setLayerStackFilter, void(uint32_t, bool)); diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp index 9e0a43a0f2..816a09b05c 100644 --- a/services/surfaceflinger/CompositionEngine/src/Output.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp @@ -107,7 +107,7 @@ void Output::setCompositionEnabled(bool enabled) { void Output::setProjection(const ui::Transform& transform, uint32_t orientation, const Rect& orientedDisplaySpaceRect, const Rect& layerStackSpaceRect, - const Rect& displaySpaceRect, bool needsFiltering) { + const Rect& displaySpaceRect) { auto& outputState = editState(); outputState.transform = transform; outputState.orientation = orientation; @@ -123,7 +123,7 @@ void Output::setProjection(const ui::Transform& transform, uint32_t orientation, outputState.layerStackSpace.content = layerStackSpaceRect; outputState.layerStackSpace.bounds = layerStackSpaceRect; - outputState.needsFiltering = needsFiltering; + outputState.needsFiltering = transform.needsBilinearFiltering(); dirtyEntireOutput(); } diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp index 3dd26c0b06..23efd2dc18 100644 --- a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp @@ -241,17 +241,14 @@ TEST_F(OutputTest, setProjectionTriviallyWorks) { const Rect frame{1, 2, 3, 4}; const Rect viewport{5, 6, 7, 8}; const Rect destinationClip{13, 14, 15, 16}; - const bool needsFiltering = true; - mOutput->setProjection(transform, orientation, frame, viewport, destinationClip, - needsFiltering); + mOutput->setProjection(transform, orientation, frame, viewport, destinationClip); EXPECT_THAT(mOutput->getState().transform, transform); EXPECT_EQ(orientation, mOutput->getState().orientation); EXPECT_EQ(frame, mOutput->getState().orientedDisplaySpace.content); EXPECT_EQ(viewport, mOutput->getState().layerStackSpace.content); EXPECT_EQ(destinationClip, mOutput->getState().displaySpace.content); - EXPECT_EQ(needsFiltering, mOutput->getState().needsFiltering); } /* diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index ea5969282e..b53f88de58 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -216,10 +216,6 @@ void DisplayDevice::setProjection(ui::Rotation orientation, Rect layerStackSpace // physical translation and finally rotate to the physical orientation. ui::Transform globalTransform = rotation * physicalTranslation * scale * logicalTranslation; - const uint8_t type = globalTransform.getType(); - const bool needsFiltering = - (!globalTransform.preserveRects() || (type >= ui::Transform::SCALE)); - Rect displaySpaceRect = globalTransform.transform(layerStackSpaceRect); if (displaySpaceRect.isEmpty()) { displaySpaceRect = displayBounds; @@ -233,7 +229,7 @@ void DisplayDevice::setProjection(ui::Rotation orientation, Rect layerStackSpace getCompositionDisplay()->setProjection(globalTransform, transformOrientationFlags, orientedDisplaySpaceRect, layerStackSpaceRect, - displaySpaceRect, needsFiltering); + displaySpaceRect); } ui::Transform::RotationFlags DisplayDevice::getPrimaryDisplayRotationFlags() { diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index b916e0d8e0..eced6bdbe2 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -1001,8 +1001,7 @@ uint32_t Layer::doTransaction(uint32_t flags) { this->contentDirty = true; // we may use linear filtering, if the matrix scales us - const uint8_t type = getActiveTransform(c).getType(); - mNeedsFiltering = (!getActiveTransform(c).preserveRects() || type >= ui::Transform::SCALE); + mNeedsFiltering = getActiveTransform(c).needsBilinearFiltering(); } if (mCurrentState.inputInfoChanged) { |