diff options
10 files changed, 57 insertions, 28 deletions
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h index a56f28aec0..cfb496269c 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h @@ -16,6 +16,8 @@ #pragma once +#include <compositionengine/Output.h> +#include <compositionengine/ProjectionSpace.h> #include <compositionengine/impl/planner/LayerState.h> #include <renderengine/RenderEngine.h> @@ -92,8 +94,8 @@ public: } void incrementAge() { ++mAge; } - // Renders the cached set with the supplied output dataspace. - void render(renderengine::RenderEngine&, ui::Dataspace outputDataspace); + // Renders the cached set with the supplied output composition state. + void render(renderengine::RenderEngine& re, const OutputCompositionState& outputState); void dump(std::string& result) const; @@ -133,6 +135,7 @@ private: Texture mTexture; sp<Fence> mDrawFence; ui::Dataspace mOutputDataspace; + ui::Transform::RotationFlags mOrientation = ui::Transform::ROT_0; static const bool sDebugHighlighLayers; }; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/Flattener.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/Flattener.h index 2bd3249880..e21b5bc433 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/Flattener.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/Flattener.h @@ -42,8 +42,9 @@ public: NonBufferHash flattenLayers(const std::vector<const LayerState*>& layers, NonBufferHash, std::chrono::steady_clock::time_point now); - // Renders the newest cached sets with the supplied output dataspace - void renderCachedSets(renderengine::RenderEngine&, ui::Dataspace outputDataspace); + // Renders the newest cached sets with the supplied output composition state + void renderCachedSets(renderengine::RenderEngine& re, + const OutputCompositionState& outputState); void dump(std::string& result) const; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/Planner.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/Planner.h index 89de34d5af..e6d2b636a3 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/Planner.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/Planner.h @@ -59,7 +59,8 @@ public: compositionengine::Output::OutputLayersEnumerator<compositionengine::Output>&& layers); // The planner will call to the Flattener to render any pending cached set - void renderCachedSets(renderengine::RenderEngine&, ui::Dataspace outputDataspace); + void renderCachedSets(renderengine::RenderEngine& re, + const OutputCompositionState& outputState); void dump(const Vector<String16>& args, std::string&); diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp index ded2dccd35..aed3be93c3 100644 --- a/services/surfaceflinger/CompositionEngine/src/Output.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp @@ -1252,7 +1252,7 @@ void Output::postFramebuffer() { void Output::renderCachedSets() { if (mPlanner) { - mPlanner->renderCachedSets(getCompositionEngine().getRenderEngine(), getState().dataspace); + mPlanner->renderCachedSets(getCompositionEngine().getRenderEngine(), getState()); } } diff --git a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp index b36464931f..0a9764885f 100644 --- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp +++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp @@ -354,6 +354,7 @@ void OutputLayer::writeOutputDependentGeometryStateToHWC( Rect displayFrame = outputDependentState.displayFrame; FloatRect sourceCrop = outputDependentState.sourceCrop; + if (outputDependentState.overrideInfo.buffer != nullptr) { // adyabr displayFrame = outputDependentState.overrideInfo.displayFrame; sourceCrop = displayFrame.toFloatRect(); diff --git a/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp b/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp index 4d3036a686..e8c6de0eed 100644 --- a/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp +++ b/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp @@ -19,6 +19,7 @@ // #define LOG_NDEBUG 0 #include <android-base/properties.h> +#include <compositionengine/impl/OutputCompositionState.h> #include <compositionengine/impl/planner/CachedSet.h> #include <math/HashCombine.h> #include <renderengine/DisplaySettings.h> @@ -84,6 +85,7 @@ NonBufferHash CachedSet::getNonBufferHash() const { size_t hash = 0; android::hashCombineSingle(hash, mBounds); android::hashCombineSingle(hash, mOutputDataspace); + android::hashCombineSingle(hash, mOrientation); return hash; } @@ -148,10 +150,15 @@ void CachedSet::updateAge(std::chrono::steady_clock::time_point now) { } } -void CachedSet::render(renderengine::RenderEngine& renderEngine, ui::Dataspace outputDataspace) { +void CachedSet::render(renderengine::RenderEngine& renderEngine, + const OutputCompositionState& outputState) { + const ui::Dataspace& outputDataspace = outputState.dataspace; + const ui::Transform::RotationFlags orientation = + ui::Transform::toRotationFlags(outputState.displaySpace.orientation); renderengine::DisplaySettings displaySettings{ .physicalDisplay = Rect(0, 0, mBounds.getWidth(), mBounds.getHeight()), .clip = mBounds, + .orientation = orientation, .outputDataspace = outputDataspace, }; @@ -217,6 +224,7 @@ void CachedSet::render(renderengine::RenderEngine& renderEngine, ui::Dataspace o mTexture.setBuffer(buffer, &renderEngine); mDrawFence = new Fence(drawFence.release()); mOutputDataspace = outputDataspace; + mOrientation = orientation; } } diff --git a/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp b/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp index 60ebbb2c65..06f7e7a256 100644 --- a/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp +++ b/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp @@ -52,12 +52,12 @@ NonBufferHash Flattener::flattenLayers(const std::vector<const LayerState*>& lay } void Flattener::renderCachedSets(renderengine::RenderEngine& renderEngine, - ui::Dataspace outputDataspace) { + const OutputCompositionState& outputState) { if (!mNewCachedSet) { return; } - mNewCachedSet->render(renderEngine, outputDataspace); + mNewCachedSet->render(renderEngine, outputState); } void Flattener::dump(std::string& result) const { diff --git a/services/surfaceflinger/CompositionEngine/src/planner/Planner.cpp b/services/surfaceflinger/CompositionEngine/src/planner/Planner.cpp index 87721c740d..ad7555730d 100644 --- a/services/surfaceflinger/CompositionEngine/src/planner/Planner.cpp +++ b/services/surfaceflinger/CompositionEngine/src/planner/Planner.cpp @@ -134,8 +134,8 @@ void Planner::reportFinalPlan( } void Planner::renderCachedSets(renderengine::RenderEngine& renderEngine, - ui::Dataspace outputDataspace) { - mFlattener.renderCachedSets(renderEngine, outputDataspace); + const OutputCompositionState& outputState) { + mFlattener.renderCachedSets(renderEngine, outputState); } void Planner::dump(const Vector<String16>& args, std::string& result) { diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp index 7842efbe00..0e7ef71c65 100644 --- a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include <compositionengine/impl/OutputCompositionState.h> #include <compositionengine/impl/planner/CachedSet.h> #include <compositionengine/impl/planner/LayerState.h> #include <compositionengine/mock/LayerFE.h> @@ -59,6 +60,7 @@ protected: static constexpr size_t kNumLayers = 5; std::vector<std::unique_ptr<TestLayer>> mTestLayers; + impl::OutputCompositionState mOutputState; android::renderengine::mock::RenderEngine mRenderEngine; }; @@ -87,6 +89,10 @@ void CachedSetTest::SetUp() { std::make_unique<CachedSet::Layer>(testLayer->layerState.get(), kStartTime); mTestLayers.emplace_back(std::move(testLayer)); + + // set up minimium params needed for rendering + mOutputState.dataspace = ui::Dataspace::SRGB; + mOutputState.displaySpace.orientation = ui::ROTATION_0; } } @@ -300,7 +306,7 @@ TEST_F(CachedSetTest, render) { EXPECT_CALL(*layerFE2, prepareClientCompositionList(_)).WillOnce(Return(clientCompList2)); EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Invoke(drawLayers)); EXPECT_CALL(mRenderEngine, cacheExternalTextureBuffer(_)); - cachedSet.render(mRenderEngine, ui::Dataspace::SRGB); + cachedSet.render(mRenderEngine, mOutputState); expectReadyBuffer(cachedSet); // Now check that appending a new cached set properly cleans up RenderEngine resources. diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp index bd77559537..211b4dc1b4 100644 --- a/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include <compositionengine/impl/OutputCompositionState.h> #include <compositionengine/impl/planner/CachedSet.h> #include <compositionengine/impl/planner/Flattener.h> #include <compositionengine/impl/planner/LayerState.h> @@ -76,6 +77,7 @@ protected: static constexpr size_t kNumLayers = 5; std::vector<std::unique_ptr<TestLayer>> mTestLayers; + impl::OutputCompositionState mOutputState; }; void FlattenerTest::SetUp() { @@ -120,6 +122,10 @@ void FlattenerTest::SetUp() { testLayer->layerState->incrementFramesSinceBufferUpdate(); mTestLayers.emplace_back(std::move(testLayer)); + + // set up minimium params needed for rendering + mOutputState.dataspace = ui::Dataspace::SRGB; + mOutputState.displaySpace.orientation = ui::ROTATION_0; } } @@ -134,13 +140,13 @@ void FlattenerTest::initializeFlattener(const std::vector<const LayerState*>& la initializeOverrideBuffer(layers); EXPECT_EQ(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); // same geometry, update the internal layer stack initializeOverrideBuffer(layers); EXPECT_EQ(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); } void FlattenerTest::expectAllLayersFlattened(const std::vector<const LayerState*>& layers) { @@ -150,7 +156,7 @@ void FlattenerTest::expectAllLayersFlattened(const std::vector<const LayerState* initializeOverrideBuffer(layers); EXPECT_EQ(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); for (const auto layer : layers) { EXPECT_EQ(nullptr, layer->getOutputLayer()->getState().overrideInfo.buffer); @@ -160,7 +166,7 @@ void FlattenerTest::expectAllLayersFlattened(const std::vector<const LayerState* initializeOverrideBuffer(layers); EXPECT_NE(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); const auto buffer = layers[0]->getOutputLayer()->getState().overrideInfo.buffer; EXPECT_NE(nullptr, buffer); @@ -195,7 +201,7 @@ TEST_F(FlattenerTest, flattenLayers_ActiveLayersAreNotFlattened) { initializeOverrideBuffer(layers); EXPECT_EQ(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); } TEST_F(FlattenerTest, flattenLayers_basicFlatten) { @@ -241,7 +247,7 @@ TEST_F(FlattenerTest, flattenLayers_FlattenedLayersStayFlattenWhenNoUpdate) { initializeOverrideBuffer(layers); EXPECT_NE(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); EXPECT_NE(nullptr, overrideBuffer1); EXPECT_EQ(overrideBuffer1, overrideBuffer2); @@ -276,7 +282,7 @@ TEST_F(FlattenerTest, flattenLayers_addLayerToFlattenedCauseReset) { initializeOverrideBuffer(layers); EXPECT_EQ(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); EXPECT_EQ(nullptr, overrideBuffer1); EXPECT_EQ(nullptr, overrideBuffer2); @@ -313,7 +319,7 @@ TEST_F(FlattenerTest, flattenLayers_BufferUpdateToFlatten) { initializeOverrideBuffer(layers); EXPECT_EQ(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); EXPECT_EQ(nullptr, overrideBuffer1); EXPECT_EQ(nullptr, overrideBuffer2); @@ -322,7 +328,7 @@ TEST_F(FlattenerTest, flattenLayers_BufferUpdateToFlatten) { initializeOverrideBuffer(layers); EXPECT_NE(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); EXPECT_EQ(nullptr, overrideBuffer1); EXPECT_NE(nullptr, overrideBuffer2); @@ -335,7 +341,7 @@ TEST_F(FlattenerTest, flattenLayers_BufferUpdateToFlatten) { initializeOverrideBuffer(layers); EXPECT_NE(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); EXPECT_EQ(nullptr, overrideBuffer1); EXPECT_NE(nullptr, overrideBuffer2); @@ -344,7 +350,7 @@ TEST_F(FlattenerTest, flattenLayers_BufferUpdateToFlatten) { initializeOverrideBuffer(layers); EXPECT_NE(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); EXPECT_NE(nullptr, overrideBuffer1); EXPECT_EQ(overrideBuffer1, overrideBuffer2); @@ -386,7 +392,7 @@ TEST_F(FlattenerTest, flattenLayers_BufferUpdateForMiddleLayer) { initializeOverrideBuffer(layers); EXPECT_EQ(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); EXPECT_EQ(nullptr, overrideBuffer1); EXPECT_EQ(nullptr, overrideBuffer2); @@ -399,7 +405,8 @@ TEST_F(FlattenerTest, flattenLayers_BufferUpdateForMiddleLayer) { initializeOverrideBuffer(layers); EXPECT_NE(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mOutputState.displaySpace.orientation = ui::ROTATION_90; + mFlattener->renderCachedSets(mRenderEngine, mOutputState); EXPECT_NE(nullptr, overrideBuffer1); EXPECT_EQ(overrideBuffer1, overrideBuffer2); @@ -411,7 +418,8 @@ TEST_F(FlattenerTest, flattenLayers_BufferUpdateForMiddleLayer) { initializeOverrideBuffer(layers); EXPECT_NE(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mOutputState.displaySpace.orientation = ui::ROTATION_180; + mFlattener->renderCachedSets(mRenderEngine, mOutputState); EXPECT_NE(nullptr, overrideBuffer1); EXPECT_EQ(overrideBuffer1, overrideBuffer2); @@ -426,7 +434,7 @@ TEST_F(FlattenerTest, flattenLayers_BufferUpdateForMiddleLayer) { initializeOverrideBuffer(layers); EXPECT_NE(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); EXPECT_NE(nullptr, overrideBuffer1); EXPECT_EQ(overrideBuffer1, overrideBuffer2); @@ -437,7 +445,8 @@ TEST_F(FlattenerTest, flattenLayers_BufferUpdateForMiddleLayer) { initializeOverrideBuffer(layers); EXPECT_NE(getNonBufferHash(layers), mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); - mFlattener->renderCachedSets(mRenderEngine, ui::Dataspace::SRGB); + mOutputState.displaySpace.orientation = ui::ROTATION_270; + mFlattener->renderCachedSets(mRenderEngine, mOutputState); EXPECT_NE(nullptr, overrideBuffer1); EXPECT_EQ(overrideBuffer1, overrideBuffer2); |