From b4ba8f5c269b6d82a09f779dc3336ece4c04c053 Mon Sep 17 00:00:00 2001 From: Dominik Laskowski Date: Mon, 27 Sep 2021 18:20:58 -0700 Subject: SF: Fix -Wunused-but-set-variable Soong appends -Wno-error=unused-but-set-variable, negating SF's -Werror. - The type and appId variables are VR remnants. - TimeStats::canAddNewAggregatedStats compared apples and oranges. Bug: 129481165 Test: No warnings on clean build Change-Id: I071e71148a269bf9ab9a5e930a775b4ae6564916 --- services/surfaceflinger/BufferLayerConsumer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'services/surfaceflinger/BufferLayerConsumer.cpp') diff --git a/services/surfaceflinger/BufferLayerConsumer.cpp b/services/surfaceflinger/BufferLayerConsumer.cpp index 96b22478ab..c79fa1104c 100644 --- a/services/surfaceflinger/BufferLayerConsumer.cpp +++ b/services/surfaceflinger/BufferLayerConsumer.cpp @@ -438,7 +438,7 @@ void BufferLayerConsumer::onDisconnect() { } void BufferLayerConsumer::onSidebandStreamChanged() { - FrameAvailableListener* unsafeFrameAvailableListener = nullptr; + [[maybe_unused]] FrameAvailableListener* unsafeFrameAvailableListener = nullptr; { Mutex::Autolock lock(mFrameAvailableMutex); unsafeFrameAvailableListener = mFrameAvailableListener.unsafe_get(); -- cgit v1.2.3-59-g8ed1b From dbbe3854efc2ceb6e0f5c2f0991161f6b7beea39 Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Wed, 12 Jan 2022 20:22:11 -0800 Subject: SF: Make ExternalTexture mockable Expose GraphicBuffer properties via ExternalTexture class. Within SurfaceFlinger access the buffer via this proxy interface. This allows us to inject and mock GraphicBuffers as needed. Specifically this will be used to recreate layer state from transaction traces. Test: compiles Bug: 200284593 Change-Id: I2e7f6bee28314b70eac477cfadbf9f94c4d70339 --- libs/renderengine/ExternalTexture.cpp | 20 ++-- libs/renderengine/benchmark/RenderEngineBench.cpp | 19 ++-- .../include/renderengine/ExternalTexture.h | 32 +++--- .../include/renderengine/RenderEngine.h | 3 +- .../include/renderengine/impl/ExternalTexture.h | 60 ++++++++++++ .../renderengine/mock/FakeExternalTexture.h | 51 ++++++++++ libs/renderengine/skia/Cache.cpp | 21 ++-- libs/renderengine/tests/RenderEngineTest.cpp | 57 ++++++----- .../tests/RenderEngineThreadedTest.cpp | 8 +- services/surfaceflinger/BufferLayer.cpp | 26 ++--- services/surfaceflinger/BufferLayerConsumer.cpp | 11 ++- services/surfaceflinger/BufferStateLayer.cpp | 70 ++++--------- services/surfaceflinger/BufferStateLayer.h | 6 +- services/surfaceflinger/ClientCache.cpp | 6 +- .../CompositionEngine/src/RenderSurface.cpp | 8 +- .../CompositionEngine/src/planner/TexturePool.cpp | 24 +++-- .../CompositionEngine/tests/OutputLayerTest.cpp | 10 +- .../CompositionEngine/tests/OutputTest.cpp | 31 +++--- .../CompositionEngine/tests/RenderSurfaceTest.cpp | 20 ++-- .../tests/planner/CachedSetTest.cpp | 17 ++-- .../tests/planner/FlattenerTest.cpp | 22 +++-- services/surfaceflinger/Layer.h | 6 +- services/surfaceflinger/RegionSamplingThread.cpp | 6 +- services/surfaceflinger/SurfaceFlinger.cpp | 51 ++++++++-- services/surfaceflinger/SurfaceFlinger.h | 3 + .../tests/unittests/CompositionTest.cpp | 13 ++- .../tests/unittests/TransactionFrameTracerTest.cpp | 13 ++- .../unittests/TransactionSurfaceFrameTest.cpp | 109 ++++++++++++++------- 28 files changed, 458 insertions(+), 265 deletions(-) create mode 100644 libs/renderengine/include/renderengine/impl/ExternalTexture.h create mode 100644 libs/renderengine/include/renderengine/mock/FakeExternalTexture.h (limited to 'services/surfaceflinger/BufferLayerConsumer.cpp') diff --git a/libs/renderengine/ExternalTexture.cpp b/libs/renderengine/ExternalTexture.cpp index eabff58eba..84771c0917 100644 --- a/libs/renderengine/ExternalTexture.cpp +++ b/libs/renderengine/ExternalTexture.cpp @@ -14,30 +14,32 @@ * limitations under the License. */ -#include #include +#include #include #include "log/log_main.h" -namespace android::renderengine { +namespace android::renderengine::impl { -ExternalTexture::ExternalTexture(const sp& buffer, RenderEngine& renderEngine, - uint32_t usage) +ExternalTexture::ExternalTexture(const sp& buffer, + renderengine::RenderEngine& renderEngine, uint32_t usage) : mBuffer(buffer), mRenderEngine(renderEngine) { LOG_ALWAYS_FATAL_IF(buffer == nullptr, "Attempted to bind a null buffer to an external texture!"); // GLESRenderEngine has a separate texture cache for output buffers, - if (usage == Usage::WRITEABLE && - (mRenderEngine.getRenderEngineType() == RenderEngine::RenderEngineType::GLES || - mRenderEngine.getRenderEngineType() == RenderEngine::RenderEngineType::THREADED)) { + if (usage == WRITEABLE && + (mRenderEngine.getRenderEngineType() == + renderengine::RenderEngine::RenderEngineType::GLES || + mRenderEngine.getRenderEngineType() == + renderengine::RenderEngine::RenderEngineType::THREADED)) { return; } - mRenderEngine.mapExternalTextureBuffer(mBuffer, usage & Usage::WRITEABLE); + mRenderEngine.mapExternalTextureBuffer(mBuffer, usage & WRITEABLE); } ExternalTexture::~ExternalTexture() { mRenderEngine.unmapExternalTextureBuffer(mBuffer); } -} // namespace android::renderengine +} // namespace android::renderengine::impl diff --git a/libs/renderengine/benchmark/RenderEngineBench.cpp b/libs/renderengine/benchmark/RenderEngineBench.cpp index 6c8f8e878b..ead97cf5df 100644 --- a/libs/renderengine/benchmark/RenderEngineBench.cpp +++ b/libs/renderengine/benchmark/RenderEngineBench.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -115,15 +116,15 @@ static std::shared_ptr allocateBuffer(RenderEngine& re, uint32_ uint32_t height, uint64_t extraUsageFlags = 0, std::string name = "output") { - return std::make_shared(new GraphicBuffer(width, height, - HAL_PIXEL_FORMAT_RGBA_8888, 1, - GRALLOC_USAGE_HW_RENDER | - GRALLOC_USAGE_HW_TEXTURE | - extraUsageFlags, - std::move(name)), - re, - ExternalTexture::Usage::READABLE | - ExternalTexture::Usage::WRITEABLE); + return std::make_shared< + impl::ExternalTexture>(new GraphicBuffer(width, height, HAL_PIXEL_FORMAT_RGBA_8888, 1, + GRALLOC_USAGE_HW_RENDER | + GRALLOC_USAGE_HW_TEXTURE | + extraUsageFlags, + std::move(name)), + re, + impl::ExternalTexture::Usage::READABLE | + impl::ExternalTexture::Usage::WRITEABLE); } static std::shared_ptr copyBuffer(RenderEngine& re, diff --git a/libs/renderengine/include/renderengine/ExternalTexture.h b/libs/renderengine/include/renderengine/ExternalTexture.h index 07f0833d4a..621a209afa 100644 --- a/libs/renderengine/include/renderengine/ExternalTexture.h +++ b/libs/renderengine/include/renderengine/ExternalTexture.h @@ -33,28 +33,22 @@ class RenderEngine; */ class ExternalTexture { public: - // Usage specifies the rendering intent for the buffer. - enum Usage : uint32_t { - // When a buffer is not READABLE but is WRITEABLE, then GLESRenderEngine will use that as a - // hint to load the buffer into a separate cache - READABLE = 1 << 0, - - // The buffer needs to be mapped as a 2D texture if set, otherwise must be mapped as an - // external texture - WRITEABLE = 1 << 1, - }; - // Creates an ExternalTexture for the provided buffer and RenderEngine instance, with the given - // usage hint of type Usage. - ExternalTexture(const sp& buffer, RenderEngine& renderEngine, uint32_t usage); - - ~ExternalTexture(); + ExternalTexture() = default; + virtual ~ExternalTexture() = default; + + virtual bool hasSameBuffer(const ExternalTexture& other) const = 0; + virtual uint32_t getWidth() const = 0; + virtual uint32_t getHeight() const = 0; + virtual uint64_t getId() const = 0; + virtual PixelFormat getPixelFormat() const = 0; + virtual uint64_t getUsage() const = 0; // Retrieves the buffer that is bound to this texture. - const sp& getBuffer() const { return mBuffer; } + virtual const sp& getBuffer() const = 0; -private: - sp mBuffer; - RenderEngine& mRenderEngine; + Rect getBounds() const { + return {0, 0, static_cast(getWidth()), static_cast(getHeight())}; + } DISALLOW_COPY_AND_ASSIGN(ExternalTexture); }; diff --git a/libs/renderengine/include/renderengine/RenderEngine.h b/libs/renderengine/include/renderengine/RenderEngine.h index d646756fc4..faa84fc1cd 100644 --- a/libs/renderengine/include/renderengine/RenderEngine.h +++ b/libs/renderengine/include/renderengine/RenderEngine.h @@ -76,6 +76,7 @@ class RenderEngineThreaded; namespace impl { class RenderEngine; +class ExternalTexture; } enum class Protection { @@ -228,7 +229,7 @@ protected: // avoid any thread synchronization that may be required by directly calling postRenderCleanup. virtual bool canSkipPostRenderCleanup() const = 0; - friend class ExternalTexture; + friend class impl::ExternalTexture; friend class threaded::RenderEngineThreaded; friend class RenderEngineTest_cleanupPostRender_cleansUpOnce_Test; const RenderEngineType mRenderEngineType; diff --git a/libs/renderengine/include/renderengine/impl/ExternalTexture.h b/libs/renderengine/include/renderengine/impl/ExternalTexture.h new file mode 100644 index 0000000000..c0e24f0c10 --- /dev/null +++ b/libs/renderengine/include/renderengine/impl/ExternalTexture.h @@ -0,0 +1,60 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include +#include + +namespace android::renderengine::impl { + +class RenderEngine; + +class ExternalTexture : public android::renderengine::ExternalTexture { +public: + // Usage specifies the rendering intent for the buffer. + enum Usage : uint32_t { + // When a buffer is not READABLE but is WRITEABLE, then GLESRenderEngine will use that as a + // hint to load the buffer into a separate cache + READABLE = 1 << 0, + + // The buffer needs to be mapped as a 2D texture if set, otherwise must be mapped as an + // external texture + WRITEABLE = 1 << 1, + }; + + // Creates an ExternalTexture for the provided buffer and RenderEngine instance, with the given + // usage hint of type Usage. + ExternalTexture(const sp& buffer, + android::renderengine::RenderEngine& renderEngine, uint32_t usage); + ~ExternalTexture(); + const sp& getBuffer() const override { return mBuffer; }; + uint32_t getWidth() const override { return getBuffer()->getWidth(); } + uint32_t getHeight() const override { return getBuffer()->getHeight(); } + uint64_t getId() const override { return getBuffer()->getId(); } + PixelFormat getPixelFormat() const override { return getBuffer()->getPixelFormat(); } + uint64_t getUsage() const override { return getBuffer()->getUsage(); } + bool hasSameBuffer(const renderengine::ExternalTexture& other) const override { + return getBuffer() == other.getBuffer(); + } + +private: + sp mBuffer; + android::renderengine::RenderEngine& mRenderEngine; +}; + +} // namespace android::renderengine::impl diff --git a/libs/renderengine/include/renderengine/mock/FakeExternalTexture.h b/libs/renderengine/include/renderengine/mock/FakeExternalTexture.h new file mode 100644 index 0000000000..974e0fddde --- /dev/null +++ b/libs/renderengine/include/renderengine/mock/FakeExternalTexture.h @@ -0,0 +1,51 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +namespace android { +namespace renderengine { +namespace mock { + +class FakeExternalTexture : public renderengine::ExternalTexture { + const sp mNullBuffer = nullptr; + uint32_t mWidth; + uint32_t mHeight; + uint64_t mId; + PixelFormat mPixelFormat; + uint64_t mUsage; + +public: + FakeExternalTexture(uint32_t width, uint32_t height, uint64_t id, PixelFormat pixelFormat, + uint64_t usage) + : mWidth(width), mHeight(height), mId(id), mPixelFormat(pixelFormat), mUsage(usage) {} + const sp& getBuffer() const { return mNullBuffer; } + bool hasSameBuffer(const renderengine::ExternalTexture& other) const override { + return getId() == other.getId(); + } + uint32_t getWidth() const override { return mWidth; } + uint32_t getHeight() const override { return mHeight; } + uint64_t getId() const override { return mId; } + PixelFormat getPixelFormat() const override { return mPixelFormat; } + uint64_t getUsage() const override { return mUsage; } + ~FakeExternalTexture() = default; +}; + +} // namespace mock +} // namespace renderengine +} // namespace android diff --git a/libs/renderengine/skia/Cache.cpp b/libs/renderengine/skia/Cache.cpp index b18a872836..a3a1969ee7 100644 --- a/libs/renderengine/skia/Cache.cpp +++ b/libs/renderengine/skia/Cache.cpp @@ -19,6 +19,7 @@ #include "android-base/unique_fd.h" #include "renderengine/DisplaySettings.h" #include "renderengine/LayerSettings.h" +#include "renderengine/impl/ExternalTexture.h" #include "ui/GraphicBuffer.h" #include "ui/GraphicTypes.h" #include "ui/PixelFormat.h" @@ -365,8 +366,8 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine) { 1, usage, "primeShaderCache_dst"); const auto dstTexture = - std::make_shared(dstBuffer, *renderengine, - ExternalTexture::Usage::WRITEABLE); + std::make_shared(dstBuffer, *renderengine, + impl::ExternalTexture::Usage::WRITEABLE); // This buffer will be the source for the call to drawImageLayers. Draw // something to it as a placeholder for what an app draws. We should draw // something, but the details are not important. Make use of the shadow layer drawing step @@ -375,10 +376,10 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine) { new GraphicBuffer(displayRect.width(), displayRect.height(), PIXEL_FORMAT_RGBA_8888, 1, usage, "drawImageLayer_src"); - const auto srcTexture = - std::make_shared(srcBuffer, *renderengine, - ExternalTexture::Usage::READABLE | - ExternalTexture::Usage::WRITEABLE); + const auto srcTexture = std::make_shared< + impl::ExternalTexture>(srcBuffer, *renderengine, + impl::ExternalTexture::Usage::READABLE | + impl::ExternalTexture::Usage::WRITEABLE); drawHolePunchLayer(renderengine, display, dstTexture); drawSolidLayers(renderengine, display, dstTexture); @@ -398,8 +399,8 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine) { new GraphicBuffer(displayRect.width(), displayRect.height(), PIXEL_FORMAT_RGBA_8888, 1, usageExternal, "primeShaderCache_external"); const auto externalTexture = - std::make_shared(externalBuffer, *renderengine, - ExternalTexture::Usage::READABLE); + std::make_shared(externalBuffer, *renderengine, + impl::ExternalTexture::Usage::READABLE); std::vector> textures = {srcTexture, externalTexture}; @@ -412,8 +413,8 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine) { status_t error = f16ExternalBuffer->initCheck(); if (!error) { const auto f16ExternalTexture = - std::make_shared(f16ExternalBuffer, *renderengine, - ExternalTexture::Usage::READABLE); + std::make_shared(f16ExternalBuffer, *renderengine, + impl::ExternalTexture::Usage::READABLE); textures.push_back(f16ExternalTexture); } diff --git a/libs/renderengine/tests/RenderEngineTest.cpp b/libs/renderengine/tests/RenderEngineTest.cpp index eb2b2dcbfa..2a25b0bfeb 100644 --- a/libs/renderengine/tests/RenderEngineTest.cpp +++ b/libs/renderengine/tests/RenderEngineTest.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -178,7 +179,7 @@ class RenderEngineTest : public ::testing::TestWithParam allocateDefaultBuffer() { return std::make_shared< - renderengine:: + renderengine::impl:: ExternalTexture>(new GraphicBuffer(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT, HAL_PIXEL_FORMAT_RGBA_8888, 1, @@ -188,15 +189,16 @@ public: GRALLOC_USAGE_HW_TEXTURE, "output"), *mRE, - renderengine::ExternalTexture::Usage::READABLE | - renderengine::ExternalTexture::Usage::WRITEABLE); + renderengine::impl::ExternalTexture::Usage::READABLE | + renderengine::impl::ExternalTexture::Usage:: + WRITEABLE); } // Allocates a 1x1 buffer to fill with a solid color std::shared_ptr allocateSourceBuffer(uint32_t width, uint32_t height) { return std::make_shared< - renderengine:: + renderengine::impl:: ExternalTexture>(new GraphicBuffer(width, height, HAL_PIXEL_FORMAT_RGBA_8888, 1, GRALLOC_USAGE_SW_READ_OFTEN | @@ -204,8 +206,9 @@ public: GRALLOC_USAGE_HW_TEXTURE, "input"), *mRE, - renderengine::ExternalTexture::Usage::READABLE | - renderengine::ExternalTexture::Usage::WRITEABLE); + renderengine::impl::ExternalTexture::Usage::READABLE | + renderengine::impl::ExternalTexture::Usage:: + WRITEABLE); } std::shared_ptr allocateAndFillSourceBuffer(uint32_t width, @@ -2439,16 +2442,17 @@ TEST_P(RenderEngineTest, test_tonemapPQMatches) { }; auto buf = std::make_shared< - renderengine::ExternalTexture>(new GraphicBuffer(kGreyLevels, 1, - HAL_PIXEL_FORMAT_RGBA_8888, 1, - GRALLOC_USAGE_SW_READ_OFTEN | - GRALLOC_USAGE_SW_WRITE_OFTEN | - GRALLOC_USAGE_HW_RENDER | - GRALLOC_USAGE_HW_TEXTURE, - "input"), - *mRE, - renderengine::ExternalTexture::Usage::READABLE | - renderengine::ExternalTexture::Usage::WRITEABLE); + renderengine::impl:: + ExternalTexture>(new GraphicBuffer(kGreyLevels, 1, HAL_PIXEL_FORMAT_RGBA_8888, + 1, + GRALLOC_USAGE_SW_READ_OFTEN | + GRALLOC_USAGE_SW_WRITE_OFTEN | + GRALLOC_USAGE_HW_RENDER | + GRALLOC_USAGE_HW_TEXTURE, + "input"), + *mRE, + renderengine::impl::ExternalTexture::Usage::READABLE | + renderengine::impl::ExternalTexture::Usage::WRITEABLE); ASSERT_EQ(0, buf->getBuffer()->initCheck()); { @@ -2472,16 +2476,17 @@ TEST_P(RenderEngineTest, test_tonemapPQMatches) { } mBuffer = std::make_shared< - renderengine::ExternalTexture>(new GraphicBuffer(kGreyLevels, 1, - HAL_PIXEL_FORMAT_RGBA_8888, 1, - GRALLOC_USAGE_SW_READ_OFTEN | - GRALLOC_USAGE_SW_WRITE_OFTEN | - GRALLOC_USAGE_HW_RENDER | - GRALLOC_USAGE_HW_TEXTURE, - "output"), - *mRE, - renderengine::ExternalTexture::Usage::READABLE | - renderengine::ExternalTexture::Usage::WRITEABLE); + renderengine::impl:: + ExternalTexture>(new GraphicBuffer(kGreyLevels, 1, HAL_PIXEL_FORMAT_RGBA_8888, + 1, + GRALLOC_USAGE_SW_READ_OFTEN | + GRALLOC_USAGE_SW_WRITE_OFTEN | + GRALLOC_USAGE_HW_RENDER | + GRALLOC_USAGE_HW_TEXTURE, + "output"), + *mRE, + renderengine::impl::ExternalTexture::Usage::READABLE | + renderengine::impl::ExternalTexture::Usage::WRITEABLE); ASSERT_EQ(0, mBuffer->getBuffer()->initCheck()); const renderengine::LayerSettings layer{ diff --git a/libs/renderengine/tests/RenderEngineThreadedTest.cpp b/libs/renderengine/tests/RenderEngineThreadedTest.cpp index db7e12b71b..96851892b4 100644 --- a/libs/renderengine/tests/RenderEngineThreadedTest.cpp +++ b/libs/renderengine/tests/RenderEngineThreadedTest.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include "../threaded/RenderEngineThreaded.h" @@ -174,9 +175,10 @@ TEST_F(RenderEngineThreadedTest, drawLayers) { renderengine::DisplaySettings settings; std::vector layers; std::shared_ptr buffer = std::make_shared< - renderengine::ExternalTexture>(new GraphicBuffer(), *mRenderEngine, - renderengine::ExternalTexture::Usage::READABLE | - renderengine::ExternalTexture::Usage::WRITEABLE); + renderengine::impl:: + ExternalTexture>(new GraphicBuffer(), *mRenderEngine, + renderengine::impl::ExternalTexture::Usage::READABLE | + renderengine::impl::ExternalTexture::Usage::WRITEABLE); base::unique_fd bufferFence; diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index d61a4cbd01..649138a48e 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -164,7 +164,7 @@ std::optional BufferLayer::prepareCli const bool blackOutLayer = (isProtected() && !targetSettings.supportsProtectedContent) || ((isSecure() || isProtected()) && !targetSettings.isSecure); const bool bufferCanBeUsedAsHwTexture = - mBufferInfo.mBuffer->getBuffer()->getUsage() & GraphicBuffer::USAGE_HW_TEXTURE; + mBufferInfo.mBuffer->getUsage() & GraphicBuffer::USAGE_HW_TEXTURE; compositionengine::LayerFE::LayerSettings& layer = *result; if (blackOutLayer || !bufferCanBeUsedAsHwTexture) { ALOGE_IF(!bufferCanBeUsedAsHwTexture, "%s is blacked out as buffer is not gpu readable", @@ -201,7 +201,7 @@ std::optional BufferLayer::prepareCli } layer.source.buffer.maxLuminanceNits = maxLuminance; layer.frameNumber = mCurrentFrameNumber; - layer.bufferId = mBufferInfo.mBuffer ? mBufferInfo.mBuffer->getBuffer()->getId() : 0; + layer.bufferId = mBufferInfo.mBuffer ? mBufferInfo.mBuffer->getId() : 0; const bool useFiltering = targetSettings.needsFiltering || mNeedsFiltering || bufferNeedsFiltering(); @@ -436,7 +436,7 @@ void BufferLayer::onPostComposition(const DisplayDevice* display, void BufferLayer::gatherBufferInfo() { mBufferInfo.mPixelFormat = - !mBufferInfo.mBuffer ? PIXEL_FORMAT_NONE : mBufferInfo.mBuffer->getBuffer()->format; + !mBufferInfo.mBuffer ? PIXEL_FORMAT_NONE : mBufferInfo.mBuffer->getPixelFormat(); mBufferInfo.mFrameLatencyNeeded = true; } @@ -533,10 +533,10 @@ bool BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime, } if (oldBufferInfo.mBuffer != nullptr) { - uint32_t bufWidth = mBufferInfo.mBuffer->getBuffer()->getWidth(); - uint32_t bufHeight = mBufferInfo.mBuffer->getBuffer()->getHeight(); - if (bufWidth != uint32_t(oldBufferInfo.mBuffer->getBuffer()->width) || - bufHeight != uint32_t(oldBufferInfo.mBuffer->getBuffer()->height)) { + uint32_t bufWidth = mBufferInfo.mBuffer->getWidth(); + uint32_t bufHeight = mBufferInfo.mBuffer->getHeight(); + if (bufWidth != oldBufferInfo.mBuffer->getWidth() || + bufHeight != oldBufferInfo.mBuffer->getHeight()) { recomputeVisibleRegions = true; } } @@ -558,7 +558,7 @@ uint32_t BufferLayer::getEffectiveScalingMode() const { bool BufferLayer::isProtected() const { return (mBufferInfo.mBuffer != nullptr) && - (mBufferInfo.mBuffer->getBuffer()->getUsage() & GRALLOC_USAGE_PROTECTED); + (mBufferInfo.mBuffer->getUsage() & GRALLOC_USAGE_PROTECTED); } // As documented in libhardware header, formats in the range @@ -638,8 +638,8 @@ Rect BufferLayer::getBufferSize(const State& s) const { return Rect::INVALID_RECT; } - uint32_t bufWidth = mBufferInfo.mBuffer->getBuffer()->getWidth(); - uint32_t bufHeight = mBufferInfo.mBuffer->getBuffer()->getHeight(); + uint32_t bufWidth = mBufferInfo.mBuffer->getWidth(); + uint32_t bufHeight = mBufferInfo.mBuffer->getHeight(); // Undo any transformations on the buffer and return the result. if (mBufferInfo.mTransform & ui::Transform::ROT_90) { @@ -670,8 +670,8 @@ FloatRect BufferLayer::computeSourceBounds(const FloatRect& parentBounds) const return parentBounds; } - uint32_t bufWidth = mBufferInfo.mBuffer->getBuffer()->getWidth(); - uint32_t bufHeight = mBufferInfo.mBuffer->getBuffer()->getHeight(); + uint32_t bufWidth = mBufferInfo.mBuffer->getWidth(); + uint32_t bufHeight = mBufferInfo.mBuffer->getHeight(); // Undo any transformations on the buffer and return the result. if (mBufferInfo.mTransform & ui::Transform::ROT_90) { @@ -713,7 +713,7 @@ Rect BufferLayer::getBufferCrop() const { return mBufferInfo.mCrop; } else if (mBufferInfo.mBuffer != nullptr) { // otherwise we use the whole buffer - return mBufferInfo.mBuffer->getBuffer()->getBounds(); + return mBufferInfo.mBuffer->getBounds(); } else { // if we don't have a buffer yet, we use an empty/invalid crop return Rect(); diff --git a/services/surfaceflinger/BufferLayerConsumer.cpp b/services/surfaceflinger/BufferLayerConsumer.cpp index c79fa1104c..9ae45fc4cb 100644 --- a/services/surfaceflinger/BufferLayerConsumer.cpp +++ b/services/surfaceflinger/BufferLayerConsumer.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -208,8 +209,9 @@ status_t BufferLayerConsumer::acquireBufferLocked(BufferItem* item, nsecs_t pres if (mImages[item->mSlot] == nullptr || mImages[item->mSlot]->getBuffer() == nullptr || mImages[item->mSlot]->getBuffer()->getId() != item->mGraphicBuffer->getId()) { mImages[item->mSlot] = std::make_shared< - renderengine::ExternalTexture>(item->mGraphicBuffer, mRE, - renderengine::ExternalTexture::Usage::READABLE); + renderengine::impl::ExternalTexture>(item->mGraphicBuffer, mRE, + renderengine::impl::ExternalTexture:: + Usage::READABLE); } } @@ -462,8 +464,9 @@ void BufferLayerConsumer::onBufferAvailable(const BufferItem& item) { if (oldImage == nullptr || oldImage->getBuffer() == nullptr || oldImage->getBuffer()->getId() != item.mGraphicBuffer->getId()) { mImages[item.mSlot] = std::make_shared< - renderengine::ExternalTexture>(item.mGraphicBuffer, mRE, - renderengine::ExternalTexture::Usage::READABLE); + renderengine::impl::ExternalTexture>(item.mGraphicBuffer, mRE, + renderengine::impl::ExternalTexture:: + Usage::READABLE); } } } diff --git a/services/surfaceflinger/BufferStateLayer.cpp b/services/surfaceflinger/BufferStateLayer.cpp index 2fac880065..6cecd8956a 100644 --- a/services/surfaceflinger/BufferStateLayer.cpp +++ b/services/surfaceflinger/BufferStateLayer.cpp @@ -295,8 +295,8 @@ bool BufferStateLayer::updateGeometry() { return assignTransform(&mDrawingState.transform, t); } - uint32_t bufferWidth = mDrawingState.buffer->getBuffer()->getWidth(); - uint32_t bufferHeight = mDrawingState.buffer->getBuffer()->getHeight(); + uint32_t bufferWidth = mDrawingState.buffer->getWidth(); + uint32_t bufferHeight = mDrawingState.buffer->getHeight(); // Undo any transformations on the buffer. if (mDrawingState.bufferTransform & ui::Transform::ROT_90) { std::swap(bufferWidth, bufferHeight); @@ -368,46 +368,13 @@ bool BufferStateLayer::addFrameEvent(const sp& acquireFence, nsecs_t post return true; } -std::shared_ptr BufferStateLayer::getBufferFromBufferData( - const BufferData& bufferData) { - bool cacheIdChanged = bufferData.flags.test(BufferData::BufferDataChange::cachedBufferChanged); - bool bufferSizeExceedsLimit = false; - std::shared_ptr buffer = nullptr; - if (cacheIdChanged && bufferData.buffer != nullptr) { - bufferSizeExceedsLimit = - mFlinger->exceedsMaxRenderTargetSize(bufferData.buffer->getWidth(), - bufferData.buffer->getHeight()); - if (!bufferSizeExceedsLimit) { - ClientCache::getInstance().add(bufferData.cachedBuffer, bufferData.buffer); - buffer = ClientCache::getInstance().get(bufferData.cachedBuffer); - } - } else if (cacheIdChanged) { - buffer = ClientCache::getInstance().get(bufferData.cachedBuffer); - } else if (bufferData.buffer != nullptr) { - bufferSizeExceedsLimit = - mFlinger->exceedsMaxRenderTargetSize(bufferData.buffer->getWidth(), - bufferData.buffer->getHeight()); - if (!bufferSizeExceedsLimit) { - buffer = std::make_shared< - renderengine::ExternalTexture>(bufferData.buffer, mFlinger->getRenderEngine(), - renderengine::ExternalTexture::Usage::READABLE); - } - } - ALOGE_IF(bufferSizeExceedsLimit, - "Attempted to create an ExternalTexture for layer %s that exceeds render target size " - "limit.", - getDebugName()); - return buffer; -} - -bool BufferStateLayer::setBuffer(const BufferData& bufferData, nsecs_t postTime, +bool BufferStateLayer::setBuffer(std::shared_ptr& buffer, + const BufferData& bufferData, nsecs_t postTime, nsecs_t desiredPresentTime, bool isAutoTimestamp, std::optional dequeueTime, const FrameTimelineInfo& info) { ATRACE_CALL(); - const std::shared_ptr& buffer = - getBufferFromBufferData(bufferData); if (!buffer) { return false; } @@ -419,8 +386,9 @@ bool BufferStateLayer::setBuffer(const BufferData& bufferData, nsecs_t postTime, if (mDrawingState.buffer) { mReleasePreviousBuffer = true; - if (mDrawingState.buffer != mBufferInfo.mBuffer || - mDrawingState.frameNumber != mBufferInfo.mFrameNumber) { + if (!mBufferInfo.mBuffer || + (!mDrawingState.buffer->hasSameBuffer(*mBufferInfo.mBuffer) || + mDrawingState.frameNumber != mBufferInfo.mFrameNumber)) { // If mDrawingState has a buffer, and we are about to update again // before swapping to drawing state, then the first buffer will be // dropped and we should decrement the pending buffer count and @@ -448,7 +416,7 @@ bool BufferStateLayer::setBuffer(const BufferData& bufferData, nsecs_t postTime, mDrawingState.frameNumber = frameNumber; mDrawingState.releaseBufferListener = bufferData.releaseBufferListener; - mDrawingState.buffer = buffer; + mDrawingState.buffer = std::move(buffer); mDrawingState.clientCacheId = bufferData.cachedBuffer; mDrawingState.acquireFence = bufferData.flags.test(BufferData::BufferDataChange::fenceChanged) @@ -485,7 +453,7 @@ bool BufferStateLayer::setBuffer(const BufferData& bufferData, nsecs_t postTime, setFrameTimelineVsyncForBufferTransaction(info, postTime); if (buffer && dequeueTime && *dequeueTime != 0) { - const uint64_t bufferId = buffer->getBuffer()->getId(); + const uint64_t bufferId = buffer->getId(); mFlinger->mFrameTracer->traceNewLayer(layerId, getName().c_str()); mFlinger->mFrameTracer->traceTimestamp(layerId, bufferId, frameNumber, *dequeueTime, FrameTracer::FrameEvent::DEQUEUE); @@ -493,8 +461,8 @@ bool BufferStateLayer::setBuffer(const BufferData& bufferData, nsecs_t postTime, FrameTracer::FrameEvent::QUEUE); } - mDrawingState.width = mDrawingState.buffer->getBuffer()->getWidth(); - mDrawingState.height = mDrawingState.buffer->getBuffer()->getHeight(); + mDrawingState.width = mDrawingState.buffer->getWidth(); + mDrawingState.height = mDrawingState.buffer->getHeight(); mDrawingState.releaseBufferEndpoint = bufferData.releaseBufferEndpoint; return true; } @@ -599,8 +567,8 @@ Rect BufferStateLayer::getBufferSize(const State& /*s*/) const { return Rect::INVALID_RECT; } - uint32_t bufWidth = mBufferInfo.mBuffer->getBuffer()->getWidth(); - uint32_t bufHeight = mBufferInfo.mBuffer->getBuffer()->getHeight(); + uint32_t bufWidth = mBufferInfo.mBuffer->getWidth(); + uint32_t bufHeight = mBufferInfo.mBuffer->getHeight(); // Undo any transformations on the buffer and return the result. if (mBufferInfo.mTransform & ui::Transform::ROT_90) { @@ -709,7 +677,7 @@ status_t BufferStateLayer::updateTexImage(bool& /*recomputeVisibleRegions*/, nse } const int32_t layerId = getSequence(); - const uint64_t bufferId = mDrawingState.buffer->getBuffer()->getId(); + const uint64_t bufferId = mDrawingState.buffer->getId(); const uint64_t frameNumber = mDrawingState.frameNumber; const auto acquireFence = std::make_shared(mDrawingState.acquireFence); mFlinger->mTimeStats->setAcquireFence(layerId, frameNumber, acquireFence); @@ -749,7 +717,7 @@ status_t BufferStateLayer::updateActiveBuffer() { return BAD_VALUE; } - if (!mBufferInfo.mBuffer || s.buffer->getBuffer() != mBufferInfo.mBuffer->getBuffer()) { + if (!mBufferInfo.mBuffer || !s.buffer->hasSameBuffer(*mBufferInfo.mBuffer)) { decrementPendingBufferCount(); } @@ -874,10 +842,10 @@ uint32_t BufferStateLayer::getEffectiveScalingMode() const { Rect BufferStateLayer::computeBufferCrop(const State& s) { if (s.buffer && !s.bufferCrop.isEmpty()) { Rect bufferCrop; - s.buffer->getBuffer()->getBounds().intersect(s.bufferCrop, &bufferCrop); + s.buffer->getBounds().intersect(s.bufferCrop, &bufferCrop); return bufferCrop; } else if (s.buffer) { - return s.buffer->getBuffer()->getBounds(); + return s.buffer->getBounds(); } else { return s.bufferCrop; } @@ -898,8 +866,8 @@ bool BufferStateLayer::bufferNeedsFiltering() const { return false; } - int32_t bufferWidth = s.buffer->getBuffer()->width; - int32_t bufferHeight = s.buffer->getBuffer()->height; + int32_t bufferWidth = static_cast(s.buffer->getWidth()); + int32_t bufferHeight = static_cast(s.buffer->getHeight()); // Undo any transformations on the buffer and return the result. if (s.bufferTransform & ui::Transform::ROT_90) { diff --git a/services/surfaceflinger/BufferStateLayer.h b/services/surfaceflinger/BufferStateLayer.h index eea700cf7b..2f613d7f26 100644 --- a/services/surfaceflinger/BufferStateLayer.h +++ b/services/surfaceflinger/BufferStateLayer.h @@ -57,7 +57,8 @@ public: bool setTransform(uint32_t transform) override; bool setTransformToDisplayInverse(bool transformToDisplayInverse) override; bool setCrop(const Rect& crop) override; - bool setBuffer(const BufferData& bufferData, nsecs_t postTime, nsecs_t desiredPresentTime, + bool setBuffer(std::shared_ptr& /* buffer */, + const BufferData& bufferData, nsecs_t postTime, nsecs_t desiredPresentTime, bool isAutoTimestamp, std::optional dequeueTime, const FrameTimelineInfo& info) override; bool setDataspace(ui::Dataspace dataspace) override; @@ -136,9 +137,6 @@ private: bool bufferNeedsFiltering() const override; - std::shared_ptr getBufferFromBufferData( - const BufferData& bufferData); - ReleaseCallbackId mPreviousReleaseCallbackId = ReleaseCallbackId::INVALID_ID; uint64_t mPreviousReleasedFrameNumber = 0; diff --git a/services/surfaceflinger/ClientCache.cpp b/services/surfaceflinger/ClientCache.cpp index e7b8995703..3c7b9d93aa 100644 --- a/services/surfaceflinger/ClientCache.cpp +++ b/services/surfaceflinger/ClientCache.cpp @@ -22,6 +22,7 @@ #include #include +#include #include "ClientCache.h" @@ -109,8 +110,9 @@ bool ClientCache::add(const client_cache_t& cacheId, const sp& bu "Attempted to build the ClientCache before a RenderEngine instance was " "ready!"); processBuffers[id].buffer = std::make_shared< - renderengine::ExternalTexture>(buffer, *mRenderEngine, - renderengine::ExternalTexture::Usage::READABLE); + renderengine::impl::ExternalTexture>(buffer, *mRenderEngine, + renderengine::impl::ExternalTexture::Usage:: + READABLE); return true; } diff --git a/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp b/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp index a19d23febf..12c2c8eb38 100644 --- a/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp +++ b/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -182,9 +183,10 @@ std::shared_ptr RenderSurface::dequeueBuffer( mTexture = texture; } else { mTexture = std::make_shared< - renderengine::ExternalTexture>(GraphicBuffer::from(buffer), - mCompositionEngine.getRenderEngine(), - renderengine::ExternalTexture::Usage::WRITEABLE); + renderengine::impl::ExternalTexture>(GraphicBuffer::from(buffer), + mCompositionEngine.getRenderEngine(), + renderengine::impl::ExternalTexture::Usage:: + WRITEABLE); } mTextureCache.push_back(mTexture); if (mTextureCache.size() > mMaxTextureCacheSize) { diff --git a/services/surfaceflinger/CompositionEngine/src/planner/TexturePool.cpp b/services/surfaceflinger/CompositionEngine/src/planner/TexturePool.cpp index 497c433c76..54ecb5691d 100644 --- a/services/surfaceflinger/CompositionEngine/src/planner/TexturePool.cpp +++ b/services/surfaceflinger/CompositionEngine/src/planner/TexturePool.cpp @@ -20,6 +20,7 @@ #define LOG_TAG "Planner" #include +#include #include namespace android::compositionengine::impl::planner { @@ -82,16 +83,19 @@ void TexturePool::returnTexture(std::shared_ptr&& std::shared_ptr TexturePool::genTexture() { LOG_ALWAYS_FATAL_IF(!mSize.isValid(), "Attempted to generate texture with invalid size"); return std::make_shared< - renderengine::ExternalTexture>(sp:: - make(mSize.getWidth(), mSize.getHeight(), - HAL_PIXEL_FORMAT_RGBA_8888, 1, - GraphicBuffer::USAGE_HW_RENDER | - GraphicBuffer::USAGE_HW_COMPOSER | - GraphicBuffer::USAGE_HW_TEXTURE, - "Planner"), - mRenderEngine, - renderengine::ExternalTexture::Usage::READABLE | - renderengine::ExternalTexture::Usage::WRITEABLE); + renderengine::impl:: + ExternalTexture>(sp:: + make(static_cast(mSize.getWidth()), + static_cast(mSize.getHeight()), + HAL_PIXEL_FORMAT_RGBA_8888, 1U, + static_cast( + GraphicBuffer::USAGE_HW_RENDER | + GraphicBuffer::USAGE_HW_COMPOSER | + GraphicBuffer::USAGE_HW_TEXTURE), + "Planner"), + mRenderEngine, + renderengine::impl::ExternalTexture::Usage::READABLE | + renderengine::impl::ExternalTexture::Usage::WRITEABLE); } void TexturePool::setEnabled(bool enabled) { diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp index ad7976f64c..37f17f5a9a 100644 --- a/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include #include "MockHWC2.h" @@ -815,10 +816,11 @@ struct OutputLayerWriteStateToHWCTest : public OutputLayerTest { auto& overrideInfo = mOutputLayer.editState().overrideInfo; overrideInfo.buffer = std::make_shared< - renderengine::ExternalTexture>(kOverrideBuffer, mRenderEngine, - renderengine::ExternalTexture::Usage::READABLE | - renderengine::ExternalTexture::Usage:: - WRITEABLE); + renderengine::impl::ExternalTexture>(kOverrideBuffer, mRenderEngine, + renderengine::impl::ExternalTexture::Usage:: + READABLE | + renderengine::impl::ExternalTexture:: + Usage::WRITEABLE); overrideInfo.acquireFence = kOverrideFence; overrideInfo.displayFrame = kOverrideDisplayFrame; overrideInfo.dataspace = kOverrideDataspace; diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp index 6d96260de7..5fcb52d260 100644 --- a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include #include #include @@ -37,7 +39,6 @@ #include "MockHWC2.h" #include "RegionMatcher.h" #include "TestUtils.h" -#include "renderengine/ExternalTexture.h" namespace android::compositionengine { namespace { @@ -273,9 +274,10 @@ TEST_F(OutputTest, setLayerCachingEnabled_disablesCachingAndResetsOverrideInfo) // Inject some layers InjectedLayer layer; layer.outputLayerState.overrideInfo.buffer = std::make_shared< - renderengine::ExternalTexture>(new GraphicBuffer(), renderEngine, - renderengine::ExternalTexture::Usage::READABLE | - renderengine::ExternalTexture::Usage::WRITEABLE); + renderengine::impl:: + ExternalTexture>(new GraphicBuffer(), renderEngine, + renderengine::impl::ExternalTexture::Usage::READABLE | + renderengine::impl::ExternalTexture::Usage::WRITEABLE); injectOutputLayer(layer); // inject a null layer to check for null exceptions injectNullOutputLayer(); @@ -956,9 +958,10 @@ TEST_F(OutputUpdateAndWriteCompositionStateTest, peekThroughLayerChangesOrder) { mOutput->planComposition(); std::shared_ptr buffer = std::make_shared< - renderengine::ExternalTexture>(new GraphicBuffer(), renderEngine, - renderengine::ExternalTexture::Usage::READABLE | - renderengine::ExternalTexture::Usage::WRITEABLE); + renderengine::impl:: + ExternalTexture>(new GraphicBuffer(), renderEngine, + renderengine::impl::ExternalTexture::Usage::READABLE | + renderengine::impl::ExternalTexture::Usage::WRITEABLE); layer1.outputLayerState.overrideInfo.buffer = buffer; layer2.outputLayerState.overrideInfo.buffer = buffer; layer1.outputLayerState.overrideInfo.peekThroughLayer = layer3.outputLayer; @@ -3077,9 +3080,10 @@ struct OutputComposeSurfacesTest : public testing::Test { mock::RenderSurface* mRenderSurface = new StrictMock(); StrictMock mOutput; std::shared_ptr mOutputBuffer = std::make_shared< - renderengine::ExternalTexture>(new GraphicBuffer(), mRenderEngine, - renderengine::ExternalTexture::Usage::READABLE | - renderengine::ExternalTexture::Usage::WRITEABLE); + renderengine::impl:: + ExternalTexture>(new GraphicBuffer(), mRenderEngine, + renderengine::impl::ExternalTexture::Usage::READABLE | + renderengine::impl::ExternalTexture::Usage::WRITEABLE); std::optional mReadyFence; }; @@ -3313,9 +3317,10 @@ TEST_F(OutputComposeSurfacesTest, clientCompositionIfBufferChanges) { .WillRepeatedly(Return()); const auto otherOutputBuffer = std::make_shared< - renderengine::ExternalTexture>(new GraphicBuffer(), mRenderEngine, - renderengine::ExternalTexture::Usage::READABLE | - renderengine::ExternalTexture::Usage::WRITEABLE); + renderengine::impl:: + ExternalTexture>(new GraphicBuffer(), mRenderEngine, + renderengine::impl::ExternalTexture::Usage::READABLE | + renderengine::impl::ExternalTexture::Usage::WRITEABLE); EXPECT_CALL(*mRenderSurface, dequeueBuffer(_)) .WillOnce(Return(mOutputBuffer)) .WillOnce(Return(otherOutputBuffer)); diff --git a/services/surfaceflinger/CompositionEngine/tests/RenderSurfaceTest.cpp b/services/surfaceflinger/CompositionEngine/tests/RenderSurfaceTest.cpp index 7c8e41b53e..e5f9ebfbeb 100644 --- a/services/surfaceflinger/CompositionEngine/tests/RenderSurfaceTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/RenderSurfaceTest.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -251,9 +252,10 @@ TEST_F(RenderSurfaceTest, dequeueBufferObtainsABuffer) { TEST_F(RenderSurfaceTest, queueBufferHandlesNoClientComposition) { const auto buffer = std::make_shared< - renderengine::ExternalTexture>(new GraphicBuffer(), mRenderEngine, - renderengine::ExternalTexture::Usage::READABLE | - renderengine::ExternalTexture::Usage::WRITEABLE); + renderengine::impl:: + ExternalTexture>(new GraphicBuffer(), mRenderEngine, + renderengine::impl::ExternalTexture::Usage::READABLE | + renderengine::impl::ExternalTexture::Usage::WRITEABLE); mSurface.mutableTextureForTest() = buffer; impl::OutputCompositionState state; @@ -269,8 +271,8 @@ TEST_F(RenderSurfaceTest, queueBufferHandlesNoClientComposition) { } TEST_F(RenderSurfaceTest, queueBufferHandlesClientComposition) { - const auto buffer = std::make_shared(new GraphicBuffer(), - mRenderEngine, false); + const auto buffer = std::make_shared(new GraphicBuffer(), + mRenderEngine, false); mSurface.mutableTextureForTest() = buffer; impl::OutputCompositionState state; @@ -288,8 +290,8 @@ TEST_F(RenderSurfaceTest, queueBufferHandlesClientComposition) { } TEST_F(RenderSurfaceTest, queueBufferHandlesFlipClientTargetRequest) { - const auto buffer = std::make_shared(new GraphicBuffer(), - mRenderEngine, false); + const auto buffer = std::make_shared(new GraphicBuffer(), + mRenderEngine, false); mSurface.mutableTextureForTest() = buffer; impl::OutputCompositionState state; @@ -327,8 +329,8 @@ TEST_F(RenderSurfaceTest, queueBufferHandlesFlipClientTargetRequestWithNoBufferY } TEST_F(RenderSurfaceTest, queueBufferHandlesNativeWindowQueueBufferFailureOnVirtualDisplay) { - const auto buffer = std::make_shared(new GraphicBuffer(), - mRenderEngine, false); + const auto buffer = std::make_shared(new GraphicBuffer(), + mRenderEngine, false); mSurface.mutableTextureForTest() = buffer; impl::OutputCompositionState state; diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp index d5a117a597..4ae921d661 100644 --- a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -702,9 +703,11 @@ TEST_F(CachedSetTest, addHolePunch) { std::vector clientCompList3; clientCompList3.push_back({}); - clientCompList3[0].source.buffer.buffer = std::make_shared< - renderengine::ExternalTexture>(sp::make(), mRenderEngine, - renderengine::ExternalTexture::READABLE); + clientCompList3[0].source.buffer.buffer = + std::make_shared(1U /*width*/, 1U /*height*/, + 1ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); EXPECT_CALL(*layerFE1, prepareClientCompositionList(_)).WillOnce(Return(clientCompList1)); EXPECT_CALL(*layerFE2, prepareClientCompositionList(_)).WillOnce(Return(clientCompList2)); @@ -901,9 +904,11 @@ TEST_F(CachedSetTest, addBlur) { std::vector clientCompList3; clientCompList3.push_back({}); - clientCompList3[0].source.buffer.buffer = std::make_shared< - renderengine::ExternalTexture>(sp::make(), mRenderEngine, - renderengine::ExternalTexture::READABLE); + clientCompList3[0].source.buffer.buffer = + std::make_shared(1U /*width*/, 1U /*height*/, + 1ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); EXPECT_CALL(*layerFE1, prepareClientCompositionList(ClientCompositionTargetSettingsBlurSettingsEq( diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp index 35d051ebea..58dc244402 100644 --- a/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -639,9 +640,10 @@ TEST_F(FlattenerTest, flattenLayers_pip) { LayerFE::LayerSettings{}, }; clientCompositionList[0].source.buffer.buffer = std::make_shared< - renderengine::ExternalTexture>(mTestLayers[2]->layerFECompositionState.buffer, - mRenderEngine, - renderengine::ExternalTexture::Usage::READABLE); + renderengine::impl::ExternalTexture>(mTestLayers[2]->layerFECompositionState.buffer, + mRenderEngine, + renderengine::impl::ExternalTexture::Usage:: + READABLE); EXPECT_CALL(*mTestLayers[2]->layerFE, prepareClientCompositionList(_)) .WillOnce(Return(clientCompositionList)); @@ -711,9 +713,10 @@ TEST_F(FlattenerTest, flattenLayers_holePunchSingleLayer) { LayerFE::LayerSettings{}, }; clientCompositionList[0].source.buffer.buffer = std::make_shared< - renderengine::ExternalTexture>(mTestLayers[1]->layerFECompositionState.buffer, - mRenderEngine, - renderengine::ExternalTexture::Usage::READABLE); + renderengine::impl::ExternalTexture>(mTestLayers[1]->layerFECompositionState.buffer, + mRenderEngine, + renderengine::impl::ExternalTexture::Usage:: + READABLE); EXPECT_CALL(*mTestLayers[1]->layerFE, prepareClientCompositionList(_)) .WillOnce(Return(clientCompositionList)); @@ -781,9 +784,10 @@ TEST_F(FlattenerTest, flattenLayers_holePunchSingleColorLayer) { LayerFE::LayerSettings{}, }; clientCompositionList[0].source.buffer.buffer = std::make_shared< - renderengine::ExternalTexture>(mTestLayers[1]->layerFECompositionState.buffer, - mRenderEngine, - renderengine::ExternalTexture::Usage::READABLE); + renderengine::impl::ExternalTexture>(mTestLayers[1]->layerFECompositionState.buffer, + mRenderEngine, + renderengine::impl::ExternalTexture::Usage:: + READABLE); EXPECT_CALL(*mTestLayers[1]->layerFE, prepareClientCompositionList(_)) .WillOnce(Return(clientCompositionList)); diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 31cdf0b3e4..0d2618acf5 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -416,8 +416,10 @@ public: // Used only to set BufferStateLayer state virtual bool setTransform(uint32_t /*transform*/) { return false; }; virtual bool setTransformToDisplayInverse(bool /*transformToDisplayInverse*/) { return false; }; - virtual bool setBuffer(const BufferData&, nsecs_t /*postTime*/, nsecs_t /*desiredPresentTime*/, - bool /*isAutoTimestamp*/, std::optional /* dequeueTime */, + virtual bool setBuffer(std::shared_ptr& /* buffer */, + const BufferData& /* bufferData */, nsecs_t /* postTime */, + nsecs_t /*desiredPresentTime*/, bool /*isAutoTimestamp*/, + std::optional /* dequeueTime */, const FrameTimelineInfo& /*info*/) { return false; }; diff --git a/services/surfaceflinger/RegionSamplingThread.cpp b/services/surfaceflinger/RegionSamplingThread.cpp index da8c3e062c..ff30348151 100644 --- a/services/surfaceflinger/RegionSamplingThread.cpp +++ b/services/surfaceflinger/RegionSamplingThread.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -351,8 +352,9 @@ void RegionSamplingThread::captureSample() { LOG_ALWAYS_FATAL_IF(bufferStatus != OK, "captureSample: Buffer failed to allocate: %d", bufferStatus); buffer = std::make_shared< - renderengine::ExternalTexture>(graphicBuffer, mFlinger.getRenderEngine(), - renderengine::ExternalTexture::Usage::WRITEABLE); + renderengine::impl::ExternalTexture>(graphicBuffer, mFlinger.getRenderEngine(), + renderengine::impl::ExternalTexture::Usage:: + WRITEABLE); } auto captureScreenResultFuture = diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index bd13c4169c..1dc75c8f43 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -65,6 +65,7 @@ #include #include #include +#include #include #include #include @@ -4419,10 +4420,13 @@ uint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTime } } - if (what & layer_state_t::eBufferChanged && - layer->setBuffer(*s.bufferData, postTime, desiredPresentTime, isAutoTimestamp, - dequeueBufferTimestamp, frameTimelineInfo)) { - flags |= eTraversalNeeded; + if (what & layer_state_t::eBufferChanged) { + std::shared_ptr buffer = + getExternalTextureFromBufferData(*s.bufferData, layer->getDebugName()); + if (layer->setBuffer(buffer, *s.bufferData, postTime, desiredPresentTime, isAutoTimestamp, + dequeueBufferTimestamp, frameTimelineInfo)) { + flags |= eTraversalNeeded; + } } else if (frameTimelineInfo.vsyncId != FrameTimelineInfo::INVALID_VSYNC_ID) { layer->setFrameTimelineVsyncForBufferlessTransaction(frameTimelineInfo, postTime); } @@ -6384,9 +6388,10 @@ std::shared_future SurfaceFlinger::captureScre const status_t bufferStatus = buffer->initCheck(); LOG_ALWAYS_FATAL_IF(bufferStatus != OK, "captureScreenCommon: Buffer failed to allocate: %d", bufferStatus); - const auto texture = std::make_shared< - renderengine::ExternalTexture>(buffer, getRenderEngine(), - renderengine::ExternalTexture::Usage::WRITEABLE); + const std::shared_ptr texture = std::make_shared< + renderengine::impl::ExternalTexture>(buffer, getRenderEngine(), + renderengine::impl::ExternalTexture::Usage:: + WRITEABLE); return captureScreenCommon(std::move(renderAreaFuture), traverseLayers, texture, false /* regionSampling */, grayscale, captureListener); } @@ -6463,7 +6468,7 @@ std::shared_future SurfaceFlinger::renderScree captureResults.capturedSecureLayers || (layer->isVisible() && layer->isSecure()); }); - const bool useProtected = buffer->getBuffer()->getUsage() & GRALLOC_USAGE_PROTECTED; + const bool useProtected = buffer->getUsage() & GRALLOC_USAGE_PROTECTED; // We allow the system server to take screenshots of secure layers for // use in situations like the Screen-rotation animation and place @@ -7074,6 +7079,36 @@ status_t SurfaceFlinger::removeWindowInfosListener( return NO_ERROR; } +std::shared_ptr SurfaceFlinger::getExternalTextureFromBufferData( + const BufferData& bufferData, const char* layerName) const { + bool cacheIdChanged = bufferData.flags.test(BufferData::BufferDataChange::cachedBufferChanged); + bool bufferSizeExceedsLimit = false; + std::shared_ptr buffer = nullptr; + if (cacheIdChanged && bufferData.buffer != nullptr) { + bufferSizeExceedsLimit = exceedsMaxRenderTargetSize(bufferData.buffer->getWidth(), + bufferData.buffer->getHeight()); + if (!bufferSizeExceedsLimit) { + ClientCache::getInstance().add(bufferData.cachedBuffer, bufferData.buffer); + buffer = ClientCache::getInstance().get(bufferData.cachedBuffer); + } + } else if (cacheIdChanged) { + buffer = ClientCache::getInstance().get(bufferData.cachedBuffer); + } else if (bufferData.buffer != nullptr) { + bufferSizeExceedsLimit = exceedsMaxRenderTargetSize(bufferData.buffer->getWidth(), + bufferData.buffer->getHeight()); + if (!bufferSizeExceedsLimit) { + buffer = std::make_shared< + renderengine::impl::ExternalTexture>(bufferData.buffer, getRenderEngine(), + renderengine::impl::ExternalTexture:: + Usage::READABLE); + } + } + ALOGE_IF(bufferSizeExceedsLimit, + "Attempted to create an ExternalTexture for layer %s that exceeds render target size " + "limit.", + layerName); + return buffer; +} } // namespace android #if defined(__gl_h_) diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 0c4236f9a4..338b35793d 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -330,6 +330,9 @@ protected: virtual void processDisplayAdded(const wp& displayToken, const DisplayDeviceState&) REQUIRES(mStateLock); + virtual std::shared_ptr getExternalTextureFromBufferData( + const BufferData& bufferData, const char* layerName) const; + // Returns true if any display matches a `bool(const DisplayDevice&)` predicate. template bool hasDisplay(Predicate p) const REQUIRES(mStateLock) { diff --git a/services/surfaceflinger/tests/unittests/CompositionTest.cpp b/services/surfaceflinger/tests/unittests/CompositionTest.cpp index f1e9b314d8..427159fda9 100644 --- a/services/surfaceflinger/tests/unittests/CompositionTest.cpp +++ b/services/surfaceflinger/tests/unittests/CompositionTest.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -234,15 +235,13 @@ void CompositionTest::captureScreenComposition() { CaptureArgs::UNSET_UID, visitor); }; - // TODO: Eliminate expensive/real allocation if possible. const uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE; - mCaptureScreenBuffer = std::make_shared< - renderengine::ExternalTexture>(new GraphicBuffer(renderArea->getReqWidth(), - renderArea->getReqHeight(), - HAL_PIXEL_FORMAT_RGBA_8888, 1, usage, - "screenshot"), - *mRenderEngine, true); + mCaptureScreenBuffer = + std::make_shared(renderArea->getReqWidth(), + renderArea->getReqHeight(), + HAL_PIXEL_FORMAT_RGBA_8888, 1, + usage); auto result = mFlinger.renderScreenImplLocked(*renderArea, traverseLayers, mCaptureScreenBuffer, forSystem, regionSampling); diff --git a/services/surfaceflinger/tests/unittests/TransactionFrameTracerTest.cpp b/services/surfaceflinger/tests/unittests/TransactionFrameTracerTest.cpp index deeb785bb9..5364630400 100644 --- a/services/surfaceflinger/tests/unittests/TransactionFrameTracerTest.cpp +++ b/services/surfaceflinger/tests/unittests/TransactionFrameTracerTest.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -101,9 +102,8 @@ public: sp layer = createBufferStateLayer(); sp fence(new Fence()); - const auto buffer = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0); int32_t layerId = layer->getSequence(); - uint64_t bufferId = buffer->getId(); + uint64_t bufferId = 42; uint64_t frameNumber = 5; nsecs_t dequeueTime = 10; nsecs_t postTime = 20; @@ -115,13 +115,16 @@ public: traceTimestamp(layerId, bufferId, frameNumber, postTime, FrameTracer::FrameEvent::QUEUE, /*duration*/ 0)); BufferData bufferData; - bufferData.buffer = buffer; bufferData.acquireFence = fence; bufferData.frameNumber = frameNumber; bufferData.flags |= BufferData::BufferDataChange::fenceChanged; bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged; - layer->setBuffer(bufferData, postTime, /*desiredPresentTime*/ 30, false, dequeueTime, - FrameTimelineInfo{}); + std::shared_ptr externalTexture = std::make_shared< + renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, bufferId, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); + layer->setBuffer(externalTexture, bufferData, postTime, /*desiredPresentTime*/ 30, false, + dequeueTime, FrameTimelineInfo{}); commitTransaction(layer.get()); bool computeVisisbleRegions; diff --git a/services/surfaceflinger/tests/unittests/TransactionSurfaceFrameTest.cpp b/services/surfaceflinger/tests/unittests/TransactionSurfaceFrameTest.cpp index 704340deac..5bb4c92a8e 100644 --- a/services/surfaceflinger/tests/unittests/TransactionSurfaceFrameTest.cpp +++ b/services/surfaceflinger/tests/unittests/TransactionSurfaceFrameTest.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -114,14 +115,17 @@ public: sp layer = createBufferStateLayer(); sp fence(new Fence()); auto acquireFence = fenceFactory.createFenceTimeForTest(fence); - const auto buffer = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0); BufferData bufferData; - bufferData.buffer = buffer; bufferData.acquireFence = fence; bufferData.frameNumber = 1; bufferData.flags |= BufferData::BufferDataChange::fenceChanged; bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged; - layer->setBuffer(bufferData, 10, 20, false, std::nullopt, + std::shared_ptr externalTexture = std::make_shared< + renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, + 1ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); + layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, {/*vsyncId*/ 1, /*inputEventId*/ 0}); acquireFence->signalForTest(12); @@ -145,14 +149,17 @@ public: sp fence1(new Fence()); auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1); - const auto buffer1 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0); BufferData bufferData; - bufferData.buffer = buffer1; bufferData.acquireFence = fence1; bufferData.frameNumber = 1; bufferData.flags |= BufferData::BufferDataChange::fenceChanged; bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged; - layer->setBuffer(bufferData, 10, 20, false, std::nullopt, + std::shared_ptr externalTexture1 = std::make_shared< + renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, + 1ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); + layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, {/*vsyncId*/ 1, /*inputEventId*/ 0}); EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size()); ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX); @@ -160,14 +167,17 @@ public: sp fence2(new Fence()); auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2); - const auto buffer2 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0); nsecs_t start = systemTime(); - bufferData.buffer = buffer2; bufferData.acquireFence = fence2; bufferData.frameNumber = 1; bufferData.flags |= BufferData::BufferDataChange::fenceChanged; bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged; - layer->setBuffer(bufferData, 10, 20, false, std::nullopt, + std::shared_ptr externalTexture2 = std::make_shared< + renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, + 2ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); + layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, {/*vsyncId*/ 1, /*inputEventId*/ 0}); nsecs_t end = systemTime(); acquireFence2->signalForTest(12); @@ -203,14 +213,17 @@ public: sp fence(new Fence()); auto acquireFence = fenceFactory.createFenceTimeForTest(fence); - const auto buffer = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0); BufferData bufferData; - bufferData.buffer = buffer; bufferData.acquireFence = fence; bufferData.frameNumber = 1; bufferData.flags |= BufferData::BufferDataChange::fenceChanged; bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged; - layer->setBuffer(bufferData, 10, 20, false, std::nullopt, + std::shared_ptr externalTexture = std::make_shared< + renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, + 1ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); + layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, {/*vsyncId*/ 1, /*inputEventId*/ 0}); acquireFence->signalForTest(12); @@ -234,14 +247,17 @@ public: sp layer = createBufferStateLayer(); sp fence(new Fence()); auto acquireFence = fenceFactory.createFenceTimeForTest(fence); - const auto buffer = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0); BufferData bufferData; - bufferData.buffer = buffer; bufferData.acquireFence = fence; bufferData.frameNumber = 1; bufferData.flags |= BufferData::BufferDataChange::fenceChanged; bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged; - layer->setBuffer(bufferData, 10, 20, false, std::nullopt, + std::shared_ptr externalTexture = std::make_shared< + renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, + 1ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); + layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, {/*vsyncId*/ 1, /*inputEventId*/ 0}); EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size()); ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX); @@ -269,14 +285,17 @@ public: sp fence(new Fence()); auto acquireFence = fenceFactory.createFenceTimeForTest(fence); - const auto buffer = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0); BufferData bufferData; - bufferData.buffer = buffer; bufferData.acquireFence = fence; bufferData.frameNumber = 1; bufferData.flags |= BufferData::BufferDataChange::fenceChanged; bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged; - layer->setBuffer(bufferData, 10, 20, false, std::nullopt, + std::shared_ptr externalTexture = std::make_shared< + renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, + 1ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); + layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, {/*vsyncId*/ 3, /*inputEventId*/ 0}); EXPECT_EQ(2u, layer->mDrawingState.bufferlessSurfaceFramesTX.size()); ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX); @@ -310,27 +329,33 @@ public: sp fence1(new Fence()); auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1); - const auto buffer1 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0); BufferData bufferData; - bufferData.buffer = buffer1; bufferData.acquireFence = fence1; bufferData.frameNumber = 1; bufferData.flags |= BufferData::BufferDataChange::fenceChanged; bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged; - layer->setBuffer(bufferData, 10, 20, false, std::nullopt, + std::shared_ptr externalTexture1 = std::make_shared< + renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, + 1ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); + layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, {/*vsyncId*/ 1, /*inputEventId*/ 0}); ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX); const auto droppedSurfaceFrame = layer->mDrawingState.bufferSurfaceFrameTX; sp fence2(new Fence()); auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2); - const auto buffer2 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0); - bufferData.buffer = buffer2; bufferData.acquireFence = fence2; bufferData.frameNumber = 1; bufferData.flags |= BufferData::BufferDataChange::fenceChanged; bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged; - layer->setBuffer(bufferData, 10, 20, false, std::nullopt, + std::shared_ptr externalTexture2 = std::make_shared< + renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, + 1ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); + layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, {/*vsyncId*/ 1, /*inputEventId*/ 0}); acquireFence2->signalForTest(12); @@ -356,14 +381,17 @@ public: sp fence1(new Fence()); auto acquireFence1 = fenceFactory.createFenceTimeForTest(fence1); - const auto buffer1 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0); BufferData bufferData; - bufferData.buffer = buffer1; bufferData.acquireFence = fence1; bufferData.frameNumber = 1; bufferData.flags |= BufferData::BufferDataChange::fenceChanged; bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged; - layer->setBuffer(bufferData, 10, 20, false, std::nullopt, + std::shared_ptr externalTexture1 = std::make_shared< + renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, + 1ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); + layer->setBuffer(externalTexture1, bufferData, 10, 20, false, std::nullopt, {/*vsyncId*/ 1, /*inputEventId*/ 0}); EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size()); ASSERT_NE(nullptr, layer->mDrawingState.bufferSurfaceFrameTX); @@ -371,14 +399,17 @@ public: sp fence2(new Fence()); auto acquireFence2 = fenceFactory.createFenceTimeForTest(fence2); - const auto buffer2 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0); auto dropStartTime1 = systemTime(); - bufferData.buffer = buffer2; bufferData.acquireFence = fence2; bufferData.frameNumber = 1; bufferData.flags |= BufferData::BufferDataChange::fenceChanged; bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged; - layer->setBuffer(bufferData, 10, 20, false, std::nullopt, + std::shared_ptr externalTexture2 = std::make_shared< + renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, + 1ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); + layer->setBuffer(externalTexture2, bufferData, 10, 20, false, std::nullopt, {/*vsyncId*/ FrameTimelineInfo::INVALID_VSYNC_ID, /*inputEventId*/ 0}); auto dropEndTime1 = systemTime(); EXPECT_EQ(0u, layer->mDrawingState.bufferlessSurfaceFramesTX.size()); @@ -387,14 +418,17 @@ public: sp fence3(new Fence()); auto acquireFence3 = fenceFactory.createFenceTimeForTest(fence3); - const auto buffer3 = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0); auto dropStartTime2 = systemTime(); - bufferData.buffer = buffer3; bufferData.acquireFence = fence3; bufferData.frameNumber = 1; bufferData.flags |= BufferData::BufferDataChange::fenceChanged; bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged; - layer->setBuffer(bufferData, 10, 20, false, std::nullopt, + std::shared_ptr externalTexture3 = std::make_shared< + renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, + 1ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); + layer->setBuffer(externalTexture3, bufferData, 10, 20, false, std::nullopt, {/*vsyncId*/ 2, /*inputEventId*/ 0}); auto dropEndTime2 = systemTime(); acquireFence3->signalForTest(12); @@ -432,14 +466,17 @@ public: std::vector> bufferlessSurfaceFrames; for (int i = 0; i < 10; i += 2) { sp fence(new Fence()); - const auto buffer = new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0); BufferData bufferData; - bufferData.buffer = buffer; bufferData.acquireFence = fence; bufferData.frameNumber = 1; bufferData.flags |= BufferData::BufferDataChange::fenceChanged; bufferData.flags |= BufferData::BufferDataChange::frameNumberChanged; - layer->setBuffer(bufferData, 10, 20, false, std::nullopt, + std::shared_ptr externalTexture = std::make_shared< + renderengine::mock::FakeExternalTexture>(1U /*width*/, 1U /*height*/, + 1ULL /* bufferId */, + HAL_PIXEL_FORMAT_RGBA_8888, + 0ULL /*usage*/); + layer->setBuffer(externalTexture, bufferData, 10, 20, false, std::nullopt, {/*vsyncId*/ 1, /*inputEventId*/ 0}); layer->setFrameTimelineVsyncForBufferlessTransaction({/*vsyncId*/ 2, /*inputEventId*/ 0}, -- cgit v1.2.3-59-g8ed1b From 8977ce95657dd39d9b814bc4d2a4ca7817e425e0 Mon Sep 17 00:00:00 2001 From: Alec Mouri Date: Sat, 7 May 2022 00:34:50 +0000 Subject: Remove consumer frame event history At this point only used in a part of dumpsys that no one checks, and is churning a bunch of fd cost. Bug: 231762515 Test: builds Change-Id: Iaaba87a236971920b302960c5a09d9c01253d562 --- services/surfaceflinger/BufferLayer.cpp | 15 ++------- services/surfaceflinger/BufferLayer.h | 2 +- services/surfaceflinger/BufferLayerConsumer.cpp | 12 ------- services/surfaceflinger/BufferLayerConsumer.h | 3 +- services/surfaceflinger/BufferQueueLayer.cpp | 19 ++--------- services/surfaceflinger/BufferQueueLayer.h | 2 +- services/surfaceflinger/BufferStateLayer.cpp | 30 +---------------- services/surfaceflinger/BufferStateLayer.h | 4 +-- services/surfaceflinger/Layer.cpp | 38 ---------------------- services/surfaceflinger/Layer.h | 14 -------- services/surfaceflinger/SurfaceFlinger.cpp | 8 ----- services/surfaceflinger/SurfaceFlinger.h | 2 -- .../fuzzer/surfaceflinger_fuzzers_utils.h | 3 -- .../fuzzer/surfaceflinger_layer_fuzzer.cpp | 2 -- 14 files changed, 10 insertions(+), 144 deletions(-) (limited to 'services/surfaceflinger/BufferLayerConsumer.cpp') diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index 635b0884d9..f8c53c338e 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -315,11 +315,7 @@ void BufferLayer::preparePerFrameCompositionState() { compositionState->sidebandStreamHasFrame = false; } -bool BufferLayer::onPreComposition(nsecs_t refreshStartTime) { - if (mBufferInfo.mBuffer != nullptr) { - Mutex::Autolock lock(mFrameEventHistoryMutex); - mFrameEventHistory.addPreComposition(mCurrentFrameNumber, refreshStartTime); - } +bool BufferLayer::onPreComposition(nsecs_t) { return hasReadyFrame(); } namespace { @@ -365,12 +361,7 @@ void BufferLayer::onPostComposition(const DisplayDevice* display, mAlreadyDisplayedThisCompose = false; // Update mFrameEventHistory. - { - Mutex::Autolock lock(mFrameEventHistoryMutex); - mFrameEventHistory.addPostComposition(mCurrentFrameNumber, glDoneFence, presentFence, - compositorTiming); - finalizeFrameEventHistory(glDoneFence, compositorTiming); - } + finalizeFrameEventHistory(glDoneFence, compositorTiming); // Update mFrameTracker. nsecs_t desiredPresentTime = mBufferInfo.mDesiredPresentTime; @@ -500,7 +491,7 @@ bool BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime, return false; } - err = updateFrameNumber(latchTime); + err = updateFrameNumber(); if (err != NO_ERROR) { return false; } diff --git a/services/surfaceflinger/BufferLayer.h b/services/surfaceflinger/BufferLayer.h index 3e70493101..4c70eb58bf 100644 --- a/services/surfaceflinger/BufferLayer.h +++ b/services/surfaceflinger/BufferLayer.h @@ -192,7 +192,7 @@ private: nsecs_t expectedPresentTime) = 0; virtual status_t updateActiveBuffer() = 0; - virtual status_t updateFrameNumber(nsecs_t latchTime) = 0; + virtual status_t updateFrameNumber() = 0; // We generate InputWindowHandles for all non-cursor buffered layers regardless of whether they // have an InputChannel. This is to enable the InputDispatcher to do PID based occlusion diff --git a/services/surfaceflinger/BufferLayerConsumer.cpp b/services/surfaceflinger/BufferLayerConsumer.cpp index 9ae45fc4cb..7361a4fdef 100644 --- a/services/surfaceflinger/BufferLayerConsumer.cpp +++ b/services/surfaceflinger/BufferLayerConsumer.cpp @@ -471,18 +471,6 @@ void BufferLayerConsumer::onBufferAvailable(const BufferItem& item) { } } -void BufferLayerConsumer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, - FrameEventHistoryDelta* outDelta) { - Mutex::Autolock lock(mMutex); - - if (mAbandoned) { - // Nothing to do if we're already abandoned. - return; - } - - mLayer->addAndGetFrameTimestamps(newTimestamps, outDelta); -} - void BufferLayerConsumer::abandonLocked() { BLC_LOGV("abandonLocked"); mCurrentTextureBuffer = nullptr; diff --git a/services/surfaceflinger/BufferLayerConsumer.h b/services/surfaceflinger/BufferLayerConsumer.h index 9ed80b46bd..23ad2a3f91 100644 --- a/services/surfaceflinger/BufferLayerConsumer.h +++ b/services/surfaceflinger/BufferLayerConsumer.h @@ -236,8 +236,7 @@ private: // IConsumerListener interface void onDisconnect() override; void onSidebandStreamChanged() override; - void addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, - FrameEventHistoryDelta* outDelta) override; + void addAndGetFrameTimestamps(const NewFrameEventsEntry*, FrameEventHistoryDelta*) override {} // computeCurrentTransformMatrixLocked computes the transform matrix for the // current texture. It uses mCurrentTransform and the current GraphicBuffer diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp index 926aa1dfb2..50146d7907 100644 --- a/services/surfaceflinger/BufferQueueLayer.cpp +++ b/services/surfaceflinger/BufferQueueLayer.cpp @@ -67,20 +67,10 @@ void BufferQueueLayer::setTransformHint(ui::Transform::RotationFlags displayTran mConsumer->setTransformHint(mTransformHint); } -void BufferQueueLayer::releasePendingBuffer(nsecs_t dequeueReadyTime) { +void BufferQueueLayer::releasePendingBuffer(nsecs_t) { if (!mConsumer->releasePendingBuffer()) { return; } - - auto releaseFenceTime = std::make_shared(mConsumer->getPrevFinalReleaseFence()); - mReleaseTimeline.updateSignalTimes(); - mReleaseTimeline.push(releaseFenceTime); - - Mutex::Autolock lock(mFrameEventHistoryMutex); - if (mPreviousFrameNumber != 0) { - mFrameEventHistory.addRelease(mPreviousFrameNumber, dequeueReadyTime, - std::move(releaseFenceTime)); - } } void BufferQueueLayer::setDefaultBufferSize(uint32_t w, uint32_t h) { @@ -320,14 +310,9 @@ status_t BufferQueueLayer::updateActiveBuffer() { return NO_ERROR; } -status_t BufferQueueLayer::updateFrameNumber(nsecs_t latchTime) { +status_t BufferQueueLayer::updateFrameNumber() { mPreviousFrameNumber = mCurrentFrameNumber; mCurrentFrameNumber = mConsumer->getFrameNumber(); - - { - Mutex::Autolock lock(mFrameEventHistoryMutex); - mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime); - } return NO_ERROR; } diff --git a/services/surfaceflinger/BufferQueueLayer.h b/services/surfaceflinger/BufferQueueLayer.h index c6e0727806..cca7f707fc 100644 --- a/services/surfaceflinger/BufferQueueLayer.h +++ b/services/surfaceflinger/BufferQueueLayer.h @@ -103,7 +103,7 @@ private: nsecs_t expectedPresentTime) override; status_t updateActiveBuffer() override; - status_t updateFrameNumber(nsecs_t latchTime) override; + status_t updateFrameNumber() override; void setFrameTimelineInfoForBuffer(const FrameTimelineInfo& frameTimelineInfo) override; sp createClone() override; diff --git a/services/surfaceflinger/BufferStateLayer.cpp b/services/surfaceflinger/BufferStateLayer.cpp index c5d7a601c5..af0039cd2c 100644 --- a/services/surfaceflinger/BufferStateLayer.cpp +++ b/services/surfaceflinger/BufferStateLayer.cpp @@ -179,15 +179,6 @@ void BufferStateLayer::releasePendingBuffer(nsecs_t dequeueReadyTime) { } mDrawingState.callbackHandles = {}; - - std::shared_ptr releaseFenceTime = std::make_shared(releaseFence); - { - Mutex::Autolock lock(mFrameEventHistoryMutex); - if (mPreviousFrameNumber != 0) { - mFrameEventHistory.addRelease(mPreviousFrameNumber, dequeueReadyTime, - std::move(releaseFenceTime)); - } - } } void BufferStateLayer::finalizeFrameEventHistory(const std::shared_ptr& glDoneFence, @@ -347,19 +338,6 @@ bool BufferStateLayer::setPosition(float x, float y) { return true; } -bool BufferStateLayer::addFrameEvent(const sp& acquireFence, nsecs_t postedTime, - nsecs_t desiredPresentTime) { - Mutex::Autolock lock(mFrameEventHistoryMutex); - mAcquireTimeline.updateSignalTimes(); - std::shared_ptr acquireFenceTime = - std::make_shared((acquireFence ? acquireFence : Fence::NO_FENCE)); - NewFrameEventsEntry newTimestamps = {mDrawingState.frameNumber, postedTime, desiredPresentTime, - acquireFenceTime}; - mFrameEventHistory.setProducerWantsEvents(); - mFrameEventHistory.addQueue(newTimestamps); - return true; -} - bool BufferStateLayer::setBuffer(std::shared_ptr& buffer, const BufferData& bufferData, nsecs_t postTime, nsecs_t desiredPresentTime, bool isAutoTimestamp, @@ -446,8 +424,6 @@ bool BufferStateLayer::setBuffer(std::shared_ptr& using LayerUpdateType = scheduler::LayerHistory::LayerUpdateType; mFlinger->mScheduler->recordLayerHistory(this, presentTime, LayerUpdateType::Buffer); - addFrameEvent(mDrawingState.acquireFence, postTime, isAutoTimestamp ? 0 : desiredPresentTime); - setFrameTimelineVsyncForBufferTransaction(info, postTime); if (dequeueTime && *dequeueTime != 0) { @@ -727,14 +703,10 @@ status_t BufferStateLayer::updateActiveBuffer() { return NO_ERROR; } -status_t BufferStateLayer::updateFrameNumber(nsecs_t latchTime) { +status_t BufferStateLayer::updateFrameNumber() { // TODO(marissaw): support frame history events mPreviousFrameNumber = mCurrentFrameNumber; mCurrentFrameNumber = mDrawingState.frameNumber; - { - Mutex::Autolock lock(mFrameEventHistoryMutex); - mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime); - } return NO_ERROR; } diff --git a/services/surfaceflinger/BufferStateLayer.h b/services/surfaceflinger/BufferStateLayer.h index 8a696f11b4..e98aa9abf9 100644 --- a/services/surfaceflinger/BufferStateLayer.h +++ b/services/surfaceflinger/BufferStateLayer.h @@ -67,8 +67,6 @@ public: bool setApi(int32_t api) override; bool setSidebandStream(const sp& sidebandStream) override; bool setTransactionCompletedListeners(const std::vector>& handles) override; - bool addFrameEvent(const sp& acquireFence, nsecs_t postedTime, - nsecs_t requestedPresentTime) override; bool setPosition(float /*x*/, float /*y*/) override; bool setMatrix(const layer_state_t::matrix22_t& /*matrix*/); @@ -125,7 +123,7 @@ private: nsecs_t expectedPresentTime) override; status_t updateActiveBuffer() override; - status_t updateFrameNumber(nsecs_t latchTime) override; + status_t updateFrameNumber() override; sp createClone() override; diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index e1eec8b97e..e4859c1354 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -151,10 +151,8 @@ Layer::Layer(const LayerCreationArgs& args) mDrawingState.color.g = -1.0_hf; mDrawingState.color.b = -1.0_hf; } - CompositorTiming compositorTiming; args.flinger->getCompositorTiming(&compositorTiming); - mFrameEventHistory.initializeCompositorTiming(compositorTiming); mFrameTracker.setDisplayRefreshPeriod(compositorTiming.interval); mCallingPid = args.callingPid; @@ -1532,53 +1530,17 @@ void Layer::getFrameStats(FrameStats* outStats) const { mFrameTracker.getStats(outStats); } -void Layer::dumpFrameEvents(std::string& result) { - StringAppendF(&result, "- Layer %s (%s, %p)\n", getName().c_str(), getType(), this); - Mutex::Autolock lock(mFrameEventHistoryMutex); - mFrameEventHistory.checkFencesForCompletion(); - mFrameEventHistory.dump(result); -} - void Layer::dumpCallingUidPid(std::string& result) const { StringAppendF(&result, "Layer %s (%s) callingPid:%d callingUid:%d ownerUid:%d\n", getName().c_str(), getType(), mCallingPid, mCallingUid, mOwnerUid); } void Layer::onDisconnect() { - Mutex::Autolock lock(mFrameEventHistoryMutex); - mFrameEventHistory.onDisconnect(); const int32_t layerId = getSequence(); mFlinger->mTimeStats->onDestroy(layerId); mFlinger->mFrameTracer->onDestroy(layerId); } -void Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, - FrameEventHistoryDelta* outDelta) { - if (newTimestamps) { - mFlinger->mTimeStats->setPostTime(getSequence(), newTimestamps->frameNumber, - getName().c_str(), mOwnerUid, newTimestamps->postedTime, - getGameMode()); - mFlinger->mTimeStats->setAcquireFence(getSequence(), newTimestamps->frameNumber, - newTimestamps->acquireFence); - } - - Mutex::Autolock lock(mFrameEventHistoryMutex); - if (newTimestamps) { - // If there are any unsignaled fences in the aquire timeline at this - // point, the previously queued frame hasn't been latched yet. Go ahead - // and try to get the signal time here so the syscall is taken out of - // the main thread's critical path. - mAcquireTimeline.updateSignalTimes(); - // Push the new fence after updating since it's likely still pending. - mAcquireTimeline.push(newTimestamps->acquireFence); - mFrameEventHistory.addQueue(*newTimestamps); - } - - if (outDelta) { - mFrameEventHistory.getAndResetDelta(outDelta); - } -} - size_t Layer::getChildrenCount() const { size_t count = 0; for (const sp& child : mCurrentChildren) { diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index ecea74413c..0b63fabe50 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -432,10 +432,6 @@ public: virtual bool setSidebandStream(const sp& /*sidebandStream*/) { return false; }; virtual bool setTransactionCompletedListeners( const std::vector>& /*handles*/); - virtual bool addFrameEvent(const sp& /*acquireFence*/, nsecs_t /*postedTime*/, - nsecs_t /*requestedPresentTime*/) { - return false; - } virtual bool setBackgroundColor(const half3& color, float alpha, ui::Dataspace dataspace); virtual bool setColorSpaceAgnostic(const bool agnostic); virtual bool setDimmingEnabled(const bool dimmingEnabled); @@ -743,14 +739,11 @@ public: void miniDump(std::string& result, const DisplayDevice&) const; void dumpFrameStats(std::string& result) const; - void dumpFrameEvents(std::string& result); void dumpCallingUidPid(std::string& result) const; void clearFrameStats(); void logFrameStats(); void getFrameStats(FrameStats* outStats) const; void onDisconnect(); - void addAndGetFrameTimestamps(const NewFrameEventsEntry* newEntry, - FrameEventHistoryDelta* outDelta); ui::Transform getTransform() const; bool isTransformValid() const; @@ -995,13 +988,6 @@ protected: // Timestamp history for UIAutomation. Thread safe. FrameTracker mFrameTracker; - // Timestamp history for the consumer to query. - // Accessed by both consumer and producer on main and binder threads. - Mutex mFrameEventHistoryMutex; - ConsumerFrameEventHistory mFrameEventHistory; - FenceTimeline mAcquireTimeline; - FenceTimeline mReleaseTimeline; - // main thread sp mSidebandStream; // False if the buffer and its contents have been previously used for GPU diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index e6b64c15e9..47478f7ecc 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -4974,7 +4974,6 @@ status_t SurfaceFlinger::doDump(int fd, const DumpArgs& args, bool asProto) { {"--displays"s, dumper(&SurfaceFlinger::dumpDisplays)}, {"--dispsync"s, dumper([this](std::string& s) { mScheduler->dumpVsync(s); })}, {"--edid"s, argsDumper(&SurfaceFlinger::dumpRawDisplayIdentificationData)}, - {"--frame-events"s, dumper(&SurfaceFlinger::dumpFrameEventsLocked)}, {"--latency"s, argsDumper(&SurfaceFlinger::dumpStatsLocked)}, {"--latency-clear"s, argsDumper(&SurfaceFlinger::clearStatsLocked)}, {"--list"s, dumper(&SurfaceFlinger::listLayersLocked)}, @@ -5141,13 +5140,6 @@ void SurfaceFlinger::dumpStaticScreenStats(std::string& result) const { bucketTimeSec, percent); } -void SurfaceFlinger::dumpFrameEventsLocked(std::string& result) { - result.append("Layer frame timestamps:\n"); - // Traverse all layers to dump frame-events for each layer - mCurrentState.traverseInZOrder( - [&] (Layer* layer) { layer->dumpFrameEvents(result); }); -} - void SurfaceFlinger::dumpCompositionDisplays(std::string& result) const { for (const auto& [token, display] : mDisplays) { display->getCompositionDisplay()->dump(result); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index fc27b62b33..db5fd470c5 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -1098,8 +1098,6 @@ private: void dumpVSync(std::string& result) const REQUIRES(mStateLock); void dumpStaticScreenStats(std::string& result) const; - // Not const because each Layer needs to query Fences and cache timestamps. - void dumpFrameEventsLocked(std::string& result); void dumpCompositionDisplays(std::string& result) const REQUIRES(mStateLock); void dumpDisplays(std::string& result) const REQUIRES(mStateLock); diff --git a/services/surfaceflinger/fuzzer/surfaceflinger_fuzzers_utils.h b/services/surfaceflinger/fuzzer/surfaceflinger_fuzzers_utils.h index a80aca2f73..867a1985bd 100644 --- a/services/surfaceflinger/fuzzer/surfaceflinger_fuzzers_utils.h +++ b/services/surfaceflinger/fuzzer/surfaceflinger_fuzzers_utils.h @@ -455,9 +455,6 @@ public: result = fdp->ConsumeRandomLengthString().c_str(); mFlinger->dumpStaticScreenStats(result); - result = fdp->ConsumeRandomLengthString().c_str(); - mFlinger->dumpFrameEventsLocked(result); - result = fdp->ConsumeRandomLengthString().c_str(); mFlinger->dumpRawDisplayIdentificationData(dumpArgs, result); diff --git a/services/surfaceflinger/fuzzer/surfaceflinger_layer_fuzzer.cpp b/services/surfaceflinger/fuzzer/surfaceflinger_layer_fuzzer.cpp index 46d52dd221..8b58298766 100644 --- a/services/surfaceflinger/fuzzer/surfaceflinger_layer_fuzzer.cpp +++ b/services/surfaceflinger/fuzzer/surfaceflinger_layer_fuzzer.cpp @@ -146,8 +146,6 @@ void LayerFuzzer::invokeBufferStateLayer() { const bool ownsHandle = mFdp.ConsumeBool(); sp nativeHandle = sp::make(testHandle, ownsHandle); layer->setSidebandStream(nativeHandle); - layer->addFrameEvent(fence, mFdp.ConsumeIntegral() /*postedTime*/, - mFdp.ConsumeIntegral() /*requestedTime*/); layer->computeSourceBounds(getFuzzedFloatRect(&mFdp)); layer->fenceHasSignaled(); -- cgit v1.2.3-59-g8ed1b