Add remaining output-relevant fields to LayerState
Also clean up unit tests to collect logically shared assertions into
helper methods.
Bug: 180638831
Test: libcompositionengine_test
Change-Id: I59b80f7ecd5c036b27d16e4e213f99a180be3fdd
diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/LayerStateTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/LayerStateTest.cpp
index d5a7234..c1b25e6 100644
--- a/services/surfaceflinger/CompositionEngine/tests/planner/LayerStateTest.cpp
+++ b/services/surfaceflinger/CompositionEngine/tests/planner/LayerStateTest.cpp
@@ -24,6 +24,9 @@
#include <gtest/gtest.h>
#include <log/log.h>
+#include "android/hardware_buffer.h"
+#include "compositionengine/LayerFECompositionState.h"
+
namespace android::compositionengine::impl::planner {
namespace {
@@ -48,7 +51,15 @@
native_handle_t* const sFakeSidebandStreamOne = reinterpret_cast<native_handle_t*>(10);
native_handle_t* const sFakeSidebandStreamTwo = reinterpret_cast<native_handle_t*>(11);
const half4 sHalf4One = half4(0.2f, 0.3f, 0.4f, 0.5f);
-const half4 sHalf4Two = half4(0.5f, 0.4f, 0.43, 0.2f);
+const half4 sHalf4Two = half4(0.5f, 0.4f, 0.3f, 0.2f);
+const std::string sMetadataKeyOne = std::string("Meta!");
+const std::string sMetadataKeyTwo = std::string("Data!");
+const GenericLayerMetadataEntry sMetadataValueOne = GenericLayerMetadataEntry{
+ .value = std::vector<uint8_t>({1, 2}),
+};
+const GenericLayerMetadataEntry sMetadataValueTwo = GenericLayerMetadataEntry{
+ .value = std::vector<uint8_t>({1, 3}),
+};
struct LayerStateTest : public testing::Test {
LayerStateTest() {
@@ -75,6 +86,21 @@
EXPECT_CALL(layerFE, getCompositionState()).WillRepeatedly(Return(&layerFEState));
}
+ void verifyUniqueDifferingFields(const LayerState& lhs, const LayerState& rhs) {
+ EXPECT_EQ(lhs.getHash(), rhs.getHash());
+
+ EXPECT_EQ(Flags<LayerStateField>(LayerStateField::None), lhs.getDifferingFields(rhs));
+ EXPECT_EQ(Flags<LayerStateField>(LayerStateField::None), rhs.getDifferingFields(lhs));
+ }
+
+ void verifyNonUniqueDifferingFields(const LayerState& lhs, const LayerState& rhs,
+ Flags<LayerStateField> fields) {
+ EXPECT_NE(lhs.getHash(), rhs.getHash());
+
+ EXPECT_EQ(fields, lhs.getDifferingFields(rhs));
+ EXPECT_EQ(fields, rhs.getDifferingFields(lhs));
+ }
+
mock::LayerFE mLayerFE;
mock::OutputLayer mOutputLayer;
std::unique_ptr<LayerState> mLayerState;
@@ -129,14 +155,7 @@
EXPECT_NE(mLayerState->getId(), otherLayerState->getId());
// Id is a unique field, so it's not computed in the hash for a layer state.
- EXPECT_EQ(mLayerState->getHash(), otherLayerState->getHash());
-
- // Similarly, Id cannot be included in differing fields.
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::None),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::None),
- otherLayerState->getDifferingFields(*mLayerState));
-
+ verifyUniqueDifferingFields(*mLayerState, *otherLayerState);
EXPECT_FALSE(mLayerState->compare(*otherLayerState));
EXPECT_FALSE(otherLayerState->compare(*mLayerState));
}
@@ -181,14 +200,7 @@
EXPECT_NE(mLayerState->getName(), otherLayerState->getName());
// Name is a unique field, so it's not computed in the hash for a layer state.
- EXPECT_EQ(mLayerState->getHash(), otherLayerState->getHash());
-
- // Similarly, Name cannot be included in differing fields.
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::None),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::None),
- otherLayerState->getDifferingFields(*mLayerState));
-
+ verifyUniqueDifferingFields(*mLayerState, *otherLayerState);
EXPECT_FALSE(mLayerState->compare(*otherLayerState));
EXPECT_FALSE(otherLayerState->compare(*mLayerState));
}
@@ -239,13 +251,7 @@
EXPECT_NE(mLayerState->getDisplayFrame(), otherLayerState->getDisplayFrame());
- EXPECT_NE(mLayerState->getHash(), otherLayerState->getHash());
-
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::DisplayFrame),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::DisplayFrame),
- otherLayerState->getDifferingFields(*mLayerState));
-
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState, LayerStateField::DisplayFrame);
EXPECT_TRUE(mLayerState->compare(*otherLayerState));
EXPECT_TRUE(otherLayerState->compare(*mLayerState));
}
@@ -316,13 +322,8 @@
EXPECT_NE(mLayerState->getCompositionType(), otherLayerState->getCompositionType());
- EXPECT_NE(mLayerState->getHash(), otherLayerState->getHash());
-
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::CompositionType),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::CompositionType),
- otherLayerState->getDifferingFields(*mLayerState));
-
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState,
+ LayerStateField::CompositionType);
EXPECT_TRUE(mLayerState->compare(*otherLayerState));
EXPECT_TRUE(otherLayerState->compare(*mLayerState));
}
@@ -360,12 +361,8 @@
layerFECompositionStateTwo);
auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
- // Buffers are not included in differing fields or in hashes.
- EXPECT_EQ(mLayerState->getHash(), otherLayerState->getHash());
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::None),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::None),
- otherLayerState->getDifferingFields(*mLayerState));
+ // A buffer is not a unique field, but the assertions are the same.
+ verifyUniqueDifferingFields(*mLayerState, *otherLayerState);
// Buffers are explicitly excluded from comparison
EXPECT_FALSE(mLayerState->compare(*otherLayerState));
@@ -405,12 +402,7 @@
layerFECompositionState);
auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
- EXPECT_NE(mLayerState->getHash(), otherLayerState->getHash());
-
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::SourceCrop),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::SourceCrop),
- otherLayerState->getDifferingFields(*mLayerState));
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState, LayerStateField::SourceCrop);
EXPECT_TRUE(mLayerState->compare(*otherLayerState));
EXPECT_TRUE(otherLayerState->compare(*mLayerState));
@@ -449,12 +441,7 @@
layerFECompositionState);
auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
- EXPECT_NE(mLayerState->getHash(), otherLayerState->getHash());
-
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::ZOrder),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::ZOrder),
- otherLayerState->getDifferingFields(*mLayerState));
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState, LayerStateField::ZOrder);
EXPECT_TRUE(mLayerState->compare(*otherLayerState));
EXPECT_TRUE(otherLayerState->compare(*mLayerState));
@@ -493,12 +480,8 @@
layerFECompositionState);
auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
- EXPECT_NE(mLayerState->getHash(), otherLayerState->getHash());
-
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::BufferTransform),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::BufferTransform),
- otherLayerState->getDifferingFields(*mLayerState));
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState,
+ LayerStateField::BufferTransform);
EXPECT_TRUE(mLayerState->compare(*otherLayerState));
EXPECT_TRUE(otherLayerState->compare(*mLayerState));
@@ -537,12 +520,7 @@
layerFECompositionStateTwo);
auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
- EXPECT_NE(mLayerState->getHash(), otherLayerState->getHash());
-
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::BlendMode),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::BlendMode),
- otherLayerState->getDifferingFields(*mLayerState));
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState, LayerStateField::BlendMode);
EXPECT_TRUE(mLayerState->compare(*otherLayerState));
EXPECT_TRUE(otherLayerState->compare(*mLayerState));
@@ -581,12 +559,46 @@
layerFECompositionStateTwo);
auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
- EXPECT_NE(mLayerState->getHash(), otherLayerState->getHash());
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState, LayerStateField::Alpha);
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::Alpha),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::Alpha),
- otherLayerState->getDifferingFields(*mLayerState));
+ EXPECT_TRUE(mLayerState->compare(*otherLayerState));
+ EXPECT_TRUE(otherLayerState->compare(*mLayerState));
+}
+
+TEST_F(LayerStateTest, updateLayerMetadata) {
+ OutputLayerCompositionState outputLayerCompositionState;
+ LayerFECompositionState layerFECompositionState;
+ layerFECompositionState.metadata[sMetadataKeyOne] = sMetadataValueOne;
+ setupMocksForLayer(mOutputLayer, mLayerFE, outputLayerCompositionState,
+ layerFECompositionState);
+ mLayerState = std::make_unique<LayerState>(&mOutputLayer);
+
+ mock::OutputLayer newOutputLayer;
+ mock::LayerFE newLayerFE;
+ LayerFECompositionState layerFECompositionStateTwo;
+ layerFECompositionStateTwo.metadata[sMetadataKeyTwo] = sMetadataValueTwo;
+ setupMocksForLayer(newOutputLayer, newLayerFE, outputLayerCompositionState,
+ layerFECompositionStateTwo);
+ Flags<LayerStateField> updates = mLayerState->update(&newOutputLayer);
+ EXPECT_EQ(Flags<LayerStateField>(LayerStateField::LayerMetadata), updates);
+}
+
+TEST_F(LayerStateTest, compareLayerMetadata) {
+ OutputLayerCompositionState outputLayerCompositionState;
+ LayerFECompositionState layerFECompositionState;
+ layerFECompositionState.metadata[sMetadataKeyOne] = sMetadataValueOne;
+ setupMocksForLayer(mOutputLayer, mLayerFE, outputLayerCompositionState,
+ layerFECompositionState);
+ mLayerState = std::make_unique<LayerState>(&mOutputLayer);
+ mock::OutputLayer newOutputLayer;
+ mock::LayerFE newLayerFE;
+ LayerFECompositionState layerFECompositionStateTwo;
+ layerFECompositionStateTwo.metadata[sMetadataKeyTwo] = sMetadataValueTwo;
+ setupMocksForLayer(newOutputLayer, newLayerFE, outputLayerCompositionState,
+ layerFECompositionStateTwo);
+ auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
+
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState, LayerStateField::LayerMetadata);
EXPECT_TRUE(mLayerState->compare(*otherLayerState));
EXPECT_TRUE(otherLayerState->compare(*mLayerState));
@@ -625,12 +637,7 @@
layerFECompositionState);
auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
- EXPECT_NE(mLayerState->getHash(), otherLayerState->getHash());
-
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::VisibleRegion),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::VisibleRegion),
- otherLayerState->getDifferingFields(*mLayerState));
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState, LayerStateField::VisibleRegion);
EXPECT_TRUE(mLayerState->compare(*otherLayerState));
EXPECT_TRUE(otherLayerState->compare(*mLayerState));
@@ -669,12 +676,65 @@
layerFECompositionState);
auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
- EXPECT_NE(mLayerState->getHash(), otherLayerState->getHash());
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState, LayerStateField::Dataspace);
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::Dataspace),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::Dataspace),
- otherLayerState->getDifferingFields(*mLayerState));
+ EXPECT_TRUE(mLayerState->compare(*otherLayerState));
+ EXPECT_TRUE(otherLayerState->compare(*mLayerState));
+}
+
+TEST_F(LayerStateTest, updatePixelFormat) {
+ OutputLayerCompositionState outputLayerCompositionState;
+ LayerFECompositionState layerFECompositionState;
+ layerFECompositionState.buffer =
+ new GraphicBuffer(1, 1, PIXEL_FORMAT_RGBA_8888,
+ AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
+ AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN,
+ "buffer1");
+ setupMocksForLayer(mOutputLayer, mLayerFE, outputLayerCompositionState,
+ layerFECompositionState);
+ mLayerState = std::make_unique<LayerState>(&mOutputLayer);
+
+ mock::OutputLayer newOutputLayer;
+ mock::LayerFE newLayerFE;
+ LayerFECompositionState layerFECompositionStateTwo;
+ layerFECompositionStateTwo.buffer =
+ new GraphicBuffer(1, 1, PIXEL_FORMAT_RGBX_8888,
+ AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
+ AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN,
+ "buffer2");
+ setupMocksForLayer(newOutputLayer, newLayerFE, outputLayerCompositionState,
+ layerFECompositionStateTwo);
+ Flags<LayerStateField> updates = mLayerState->update(&newOutputLayer);
+ EXPECT_EQ(Flags<LayerStateField>(LayerStateField::Buffer) |
+ Flags<LayerStateField>(LayerStateField::PixelFormat),
+ updates);
+}
+
+TEST_F(LayerStateTest, comparePixelFormat) {
+ OutputLayerCompositionState outputLayerCompositionState;
+ LayerFECompositionState layerFECompositionState;
+ layerFECompositionState.buffer =
+ new GraphicBuffer(1, 1, PIXEL_FORMAT_RGBA_8888,
+ AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
+ AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN,
+ "buffer1");
+ setupMocksForLayer(mOutputLayer, mLayerFE, outputLayerCompositionState,
+ layerFECompositionState);
+ mLayerState = std::make_unique<LayerState>(&mOutputLayer);
+ mock::OutputLayer newOutputLayer;
+ mock::LayerFE newLayerFE;
+ LayerFECompositionState layerFECompositionStateTwo;
+ layerFECompositionStateTwo.buffer =
+ new GraphicBuffer(1, 1, PIXEL_FORMAT_RGBX_8888,
+ AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
+ AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN,
+ "buffer2");
+ setupMocksForLayer(newOutputLayer, newLayerFE, outputLayerCompositionState,
+ layerFECompositionStateTwo);
+ auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
+
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState,
+ Flags<LayerStateField>(LayerStateField::PixelFormat));
EXPECT_TRUE(mLayerState->compare(*otherLayerState));
EXPECT_TRUE(otherLayerState->compare(*mLayerState));
@@ -717,12 +777,48 @@
layerFECompositionStateTwo);
auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
- EXPECT_NE(mLayerState->getHash(), otherLayerState->getHash());
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState, LayerStateField::ColorTransform);
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::ColorTransform),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::ColorTransform),
- otherLayerState->getDifferingFields(*mLayerState));
+ EXPECT_TRUE(mLayerState->compare(*otherLayerState));
+ EXPECT_TRUE(otherLayerState->compare(*mLayerState));
+}
+
+TEST_F(LayerStateTest, updateSurfaceDamage) {
+ OutputLayerCompositionState outputLayerCompositionState;
+ LayerFECompositionState layerFECompositionState;
+ layerFECompositionState.surfaceDamage = sRegionOne;
+ setupMocksForLayer(mOutputLayer, mLayerFE, outputLayerCompositionState,
+ layerFECompositionState);
+ mLayerState = std::make_unique<LayerState>(&mOutputLayer);
+
+ mock::OutputLayer newOutputLayer;
+ mock::LayerFE newLayerFE;
+ OutputLayerCompositionState outputLayerCompositionStateTwo;
+ LayerFECompositionState layerFECompositionStateTwo;
+ layerFECompositionStateTwo.surfaceDamage = sRegionTwo;
+ setupMocksForLayer(newOutputLayer, newLayerFE, outputLayerCompositionStateTwo,
+ layerFECompositionStateTwo);
+ Flags<LayerStateField> updates = mLayerState->update(&newOutputLayer);
+ EXPECT_EQ(Flags<LayerStateField>(LayerStateField::SurfaceDamage), updates);
+}
+
+TEST_F(LayerStateTest, compareSurfaceDamage) {
+ OutputLayerCompositionState outputLayerCompositionState;
+ LayerFECompositionState layerFECompositionState;
+ layerFECompositionState.surfaceDamage = sRegionOne;
+ setupMocksForLayer(mOutputLayer, mLayerFE, outputLayerCompositionState,
+ layerFECompositionState);
+ mLayerState = std::make_unique<LayerState>(&mOutputLayer);
+ mock::OutputLayer newOutputLayer;
+ mock::LayerFE newLayerFE;
+ OutputLayerCompositionState outputLayerCompositionStateTwo;
+ LayerFECompositionState layerFECompositionStateTwo;
+ layerFECompositionStateTwo.surfaceDamage = sRegionTwo;
+ setupMocksForLayer(newOutputLayer, newLayerFE, outputLayerCompositionStateTwo,
+ layerFECompositionStateTwo);
+ auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
+
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState, LayerStateField::SurfaceDamage);
EXPECT_TRUE(mLayerState->compare(*otherLayerState));
EXPECT_TRUE(otherLayerState->compare(*mLayerState));
@@ -761,12 +857,7 @@
layerFECompositionStateTwo);
auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
- EXPECT_NE(mLayerState->getHash(), otherLayerState->getHash());
-
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::SidebandStream),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::SidebandStream),
- otherLayerState->getDifferingFields(*mLayerState));
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState, LayerStateField::SidebandStream);
EXPECT_TRUE(mLayerState->compare(*otherLayerState));
EXPECT_TRUE(otherLayerState->compare(*mLayerState));
@@ -805,12 +896,7 @@
layerFECompositionStateTwo);
auto otherLayerState = std::make_unique<LayerState>(&newOutputLayer);
- EXPECT_NE(mLayerState->getHash(), otherLayerState->getHash());
-
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::SolidColor),
- mLayerState->getDifferingFields(*otherLayerState));
- EXPECT_EQ(Flags<LayerStateField>(LayerStateField::SolidColor),
- otherLayerState->getDifferingFields(*mLayerState));
+ verifyNonUniqueDifferingFields(*mLayerState, *otherLayerState, LayerStateField::SolidColor);
EXPECT_TRUE(mLayerState->compare(*otherLayerState));
EXPECT_TRUE(otherLayerState->compare(*mLayerState));