diff options
| -rw-r--r-- | services/surfaceflinger/BufferLayer.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/DisplayDevice.h | 15 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 9 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.h | 5 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 21 |
5 files changed, 23 insertions, 29 deletions
diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index f5b5eda9ec..707cb42336 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -204,7 +204,7 @@ void BufferLayer::onDraw(const RenderArea& renderArea, const Region& clip, if (!blackOutLayer) { // TODO: we could be more subtle with isFixedSize() - const bool useFiltering = getFiltering() || needsFiltering(renderArea) || isFixedSize(); + const bool useFiltering = needsFiltering(renderArea) || isFixedSize(); // Query the texture matrix given our current filtering mode. float textureMatrix[16]; diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index 0e8867f609..548cabc7e9 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -355,7 +355,20 @@ public: int getHeight() const override { return mDevice->getHeight(); } int getWidth() const override { return mDevice->getWidth(); } bool isSecure() const override { return mDevice->isSecure(); } - bool needsFiltering() const override { return mDevice->needsFiltering(); } + + bool needsFiltering() const override { + if (mDevice->needsFiltering()) { + return true; + } + + const Rect sourceCrop = getSourceCrop(); + int width = sourceCrop.width(); + int height = sourceCrop.height(); + if (getRotationFlags() & Transform::ROT_90) { + std::swap(width, height); + } + return width != getReqWidth() || height != getReqHeight(); + } Rect getSourceCrop() const override { const int orientation = mDevice->getInstallOrientation(); diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 0caac9b16d..72f1fc4363 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -88,7 +88,6 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, const String8& n mCurrentOpacity(true), mCurrentFrameNumber(0), mFrameLatencyNeeded(false), - mFiltering(false), mNeedsFiltering(false), mProtectedByApp(false), mClientRef(client), @@ -793,14 +792,6 @@ bool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { return true; } -void Layer::setFiltering(bool filtering) { - mFiltering = filtering; -} - -bool Layer::getFiltering() const { - return mFiltering; -} - // ---------------------------------------------------------------------------- // local state // ---------------------------------------------------------------------------- diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 301f190e16..239f3979e8 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -530,9 +530,6 @@ public: // ----------------------------------------------------------------------- void clearWithOpenGL(const RenderArea& renderArea) const; - void setFiltering(bool filtering); - bool getFiltering() const; - inline const State& getDrawingState() const { return mDrawingState; } inline const State& getCurrentState() const { return mCurrentState; } @@ -755,8 +752,6 @@ protected: bool mCurrentOpacity; std::atomic<uint64_t> mCurrentFrameNumber; bool mFrameLatencyNeeded; - // Whether filtering is forced on or not - bool mFiltering; // Whether filtering is needed b/c of the drawingstate bool mNeedsFiltering; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index cadbf8afbd..ab2cbe2468 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -4899,6 +4899,7 @@ status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder, : RenderArea(reqWidth, reqHeight, CaptureFill::CLEAR), mLayer(layer), mCrop(crop), + mNeedsFiltering(false), mFlinger(flinger), mChildrenOnly(childrenOnly) {} const Transform& getTransform() const override { return mTransform; } @@ -4909,7 +4910,7 @@ status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder, int getHeight() const override { return mLayer->getDrawingState().active.h; } int getWidth() const override { return mLayer->getDrawingState().active.w; } bool isSecure() const override { return false; } - bool needsFiltering() const override { return false; } + bool needsFiltering() const override { return mNeedsFiltering; } Rect getSourceCrop() const override { if (mCrop.isEmpty()) { return getBounds(); @@ -4930,6 +4931,11 @@ status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder, }; void render(std::function<void()> drawLayers) override { + const Rect sourceCrop = getSourceCrop(); + // no need to check rotation because there is none + mNeedsFiltering = sourceCrop.width() != getReqWidth() || + sourceCrop.height() != getReqHeight(); + if (!mChildrenOnly) { mTransform = mLayer->getTransform().inverse(); drawLayers(); @@ -4952,6 +4958,7 @@ status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder, // layer which has no properties set and which does not draw. sp<ContainerLayer> screenshotParentLayer; Transform mTransform; + bool mNeedsFiltering; SurfaceFlinger* mFlinger; const bool mChildrenOnly; @@ -5090,7 +5097,6 @@ void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea, auto& engine(getRenderEngine()); // get screen geometry - const auto raWidth = renderArea.getWidth(); const auto raHeight = renderArea.getHeight(); const auto reqWidth = renderArea.getReqWidth(); @@ -5098,15 +5104,6 @@ void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea, const auto sourceCrop = renderArea.getSourceCrop(); const auto rotation = renderArea.getRotationFlags(); - bool filtering = false; - if (primaryDisplayOrientation & DisplayState::eOrientationSwapMask) { - filtering = static_cast<int32_t>(reqWidth) != raHeight || - static_cast<int32_t>(reqHeight) != raWidth; - } else { - filtering = static_cast<int32_t>(reqWidth) != raWidth || - static_cast<int32_t>(reqHeight) != raHeight; - } - // assume ColorMode::SRGB / RenderIntent::COLORIMETRIC engine.setOutputDataSpace(Dataspace::SRGB); engine.setDisplayMaxLuminance(DisplayDevice::sDefaultMaxLumiance); @@ -5124,9 +5121,7 @@ void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea, engine.clearWithColor(0, 0, 0, alpha); traverseLayers([&](Layer* layer) { - if (filtering) layer->setFiltering(true); layer->draw(renderArea, useIdentityTransform); - if (filtering) layer->setFiltering(false); }); } |