diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2021-09-23 05:49:45 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2021-09-23 05:49:45 +0000 |
commit | cece376ccc15bf20184787b8ce2b00c7f90b5c63 (patch) | |
tree | aa4a4a076c3a2bff2680176610b572a50907b4dc | |
parent | 568a37672f285f3b6d2799c8bee6b613e215f403 (diff) | |
parent | 201564a4b49df8da59ce12629378bef4201ce38f (diff) | |
download | native-cece376ccc15bf20184787b8ce2b00c7f90b5c63.tar.gz |
Merge "Check if the buffer is actually being scaled instead of only checking scaling mode" into android11-gsi
-rw-r--r-- | services/surfaceflinger/BufferLayer.cpp | 8 | ||||
-rw-r--r-- | services/surfaceflinger/BufferLayer.h | 4 | ||||
-rw-r--r-- | services/surfaceflinger/BufferStateLayer.cpp | 25 | ||||
-rw-r--r-- | services/surfaceflinger/BufferStateLayer.h | 2 |
4 files changed, 37 insertions, 2 deletions
diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index f0b0200bc5..c8cb7b9cd3 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -204,8 +204,8 @@ std::optional<compositionengine::LayerFE::LayerSettings> BufferLayer::prepareCli layer.frameNumber = mCurrentFrameNumber; layer.bufferId = mBufferInfo.mBuffer ? mBufferInfo.mBuffer->getId() : 0; - // TODO: we could be more subtle with isFixedSize() - const bool useFiltering = targetSettings.needsFiltering || mNeedsFiltering || isFixedSize(); + const bool useFiltering = + targetSettings.needsFiltering || mNeedsFiltering || bufferNeedsFiltering(); // Query the texture matrix given our current filtering mode. float textureMatrix[16]; @@ -840,6 +840,10 @@ void BufferLayer::setTransformHint(ui::Transform::RotationFlags displayTransform } } +bool BufferLayer::bufferNeedsFiltering() const { + return isFixedSize(); +} + } // namespace android #if defined(__gl_h_) diff --git a/services/surfaceflinger/BufferLayer.h b/services/surfaceflinger/BufferLayer.h index 26bfb4931b..a3d8b685b2 100644 --- a/services/surfaceflinger/BufferLayer.h +++ b/services/surfaceflinger/BufferLayer.h @@ -118,6 +118,10 @@ public: ui::Transform::RotationFlags getTransformHint() const override { return mTransformHint; } + // Returns true if the transformed buffer size does not match the layer size and we need + // to apply filtering. + virtual bool bufferNeedsFiltering() const; + // ----------------------------------------------------------------------- // Functions that must be implemented by derived classes // ----------------------------------------------------------------------- diff --git a/services/surfaceflinger/BufferStateLayer.cpp b/services/surfaceflinger/BufferStateLayer.cpp index 790f2ece77..ad2620cd91 100644 --- a/services/surfaceflinger/BufferStateLayer.cpp +++ b/services/surfaceflinger/BufferStateLayer.cpp @@ -760,6 +760,31 @@ Layer::RoundedCornerState BufferStateLayer::getRoundedCornerState() const { static_cast<float>(s.active.transform.ty() + s.active.h)), radius); } + +bool BufferStateLayer::bufferNeedsFiltering() const { + const State& s(getDrawingState()); + if (!s.buffer) { + return false; + } + + uint32_t bufferWidth = s.buffer->width; + uint32_t bufferHeight = s.buffer->height; + + // Undo any transformations on the buffer and return the result. + if (s.transform & ui::Transform::ROT_90) { + std::swap(bufferWidth, bufferHeight); + } + + if (s.transformToDisplayInverse) { + uint32_t invTransform = DisplayDevice::getPrimaryDisplayRotationFlags(); + if (invTransform & ui::Transform::ROT_90) { + std::swap(bufferWidth, bufferHeight); + } + } + + const Rect layerSize{getBounds()}; + return layerSize.width() != bufferWidth || layerSize.height() != bufferHeight; +} } // namespace android // TODO(b/129481165): remove the #pragma below and fix conversion issues diff --git a/services/surfaceflinger/BufferStateLayer.h b/services/surfaceflinger/BufferStateLayer.h index 00fa7f7a2d..b408113108 100644 --- a/services/surfaceflinger/BufferStateLayer.h +++ b/services/surfaceflinger/BufferStateLayer.h @@ -145,6 +145,8 @@ private: friend class SlotGenerationTest; bool willPresentCurrentTransaction() const; + bool bufferNeedsFiltering() const override; + static const std::array<float, 16> IDENTITY_MATRIX; std::unique_ptr<renderengine::Image> mTextureImage; |