From 600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7 Mon Sep 17 00:00:00 2001 From: Marissa Wall Date: Thu, 15 Dec 2016 12:30:39 -0800 Subject: [PATCH] test-hwc2: set layer display frame Test: Add "#define HAVE_NO_SURFACE_FLINGER" to frameworks/native/libs/gui/BufferQueueCore.cpp. Recompile and flash. Run "mm" in frameworks/native/services/surfaceflinger/tests/hwc2. Push test-hwc2 to device. Run "adb root && adb shell stop". Run test case. Ex: "./test-hwc2" Change-Id: I4431ad0d207924b9fcde2c4c2f34382ec8ddc4d8 --- services/surfaceflinger/tests/hwc2/Hwc2Test.cpp | 89 +++++++++++++++++++++- .../surfaceflinger/tests/hwc2/Hwc2TestLayer.cpp | 14 +++- services/surfaceflinger/tests/hwc2/Hwc2TestLayer.h | 11 ++- .../surfaceflinger/tests/hwc2/Hwc2TestLayers.cpp | 4 +- .../surfaceflinger/tests/hwc2/Hwc2TestLayers.h | 2 +- .../tests/hwc2/Hwc2TestProperties.cpp | 60 +++++++++++++++ .../surfaceflinger/tests/hwc2/Hwc2TestProperties.h | 25 ++++++ 7 files changed, 194 insertions(+), 11 deletions(-) diff --git a/services/surfaceflinger/tests/hwc2/Hwc2Test.cpp b/services/surfaceflinger/tests/hwc2/Hwc2Test.cpp index 041f5d7f6d..c092f222be 100644 --- a/services/surfaceflinger/tests/hwc2/Hwc2Test.cpp +++ b/services/surfaceflinger/tests/hwc2/Hwc2Test.cpp @@ -391,6 +391,23 @@ public: } } + void setLayerDisplayFrame(hwc2_display_t display, hwc2_layer_t layer, + const hwc_rect_t& displayFrame, hwc2_error_t* outErr = nullptr) + { + auto pfn = reinterpret_cast( + getFunction(HWC2_FUNCTION_SET_LAYER_DISPLAY_FRAME)); + ASSERT_TRUE(pfn) << "failed to get function"; + + auto err = static_cast(pfn(mHwc2Device, display, layer, + displayFrame)); + if (outErr) { + *outErr = err; + } else { + ASSERT_EQ(err, HWC2_ERROR_NONE) << "failed to set layer display" + " frame"; + } + } + void setLayerPlaneAlpha(hwc2_display_t display, hwc2_layer_t layer, float alpha, hwc2_error_t* outErr = nullptr) { @@ -618,9 +635,12 @@ protected: for (auto config : configs) { hwc2_layer_t layer; + Area displayArea; ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config)); - Hwc2TestLayer testLayer(coverage); + ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, + &displayArea)); + Hwc2TestLayer testLayer(coverage, displayArea); do { ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); @@ -647,9 +667,12 @@ protected: for (auto config : configs) { hwc2_layer_t layer; + Area displayArea; ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config)); - Hwc2TestLayer testLayer(coverage); + ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, + &displayArea)); + Hwc2TestLayer testLayer(coverage, displayArea); ASSERT_NO_FATAL_FAILURE(createLayer(display, &layer)); @@ -677,11 +700,14 @@ protected: for (auto config : configs) { std::vector layers; + Area displayArea; ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config)); + ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, + &displayArea)); ASSERT_NO_FATAL_FAILURE(createLayers(display, &layers, layerCnt)); - Hwc2TestLayers testLayers(layers, coverage); + Hwc2TestLayers testLayers(layers, coverage, displayArea); for (auto layer : layers) { EXPECT_NO_FATAL_FAILURE(function(this, display, layer, @@ -710,10 +736,13 @@ protected: for (auto config : configs) { hwc2_layer_t layer = 0; + Area displayArea; hwc2_error_t err = HWC2_ERROR_NONE; ASSERT_NO_FATAL_FAILURE(setActiveConfig(display, config)); - Hwc2TestLayer testLayer(coverage); + ASSERT_NO_FATAL_FAILURE(getActiveDisplayArea(display, + &displayArea)); + Hwc2TestLayer testLayer(coverage, displayArea); ASSERT_NO_FATAL_FAILURE(function(this, display, layer, testLayer, &err)); @@ -761,6 +790,25 @@ protected: } } + void getActiveConfigAttribute(hwc2_display_t display, + hwc2_attribute_t attribute, int32_t* outValue) + { + hwc2_config_t config; + ASSERT_NO_FATAL_FAILURE(getActiveConfig(display, &config)); + ASSERT_NO_FATAL_FAILURE(getDisplayAttribute(display, config, + attribute, outValue)); + ASSERT_GE(*outValue, 0) << "failed to get valid " + << getAttributeName(attribute); + } + + void getActiveDisplayArea(hwc2_display_t display, Area* displayArea) + { + ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display, + HWC2_ATTRIBUTE_WIDTH, &displayArea->width)); + ASSERT_NO_FATAL_FAILURE(getActiveConfigAttribute(display, + HWC2_ATTRIBUTE_HEIGHT, &displayArea->height)); + } + hwc2_device_t* mHwc2Device = nullptr; enum class Hwc2TestHotplugStatus { @@ -839,6 +887,13 @@ void setDataspace(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer, testLayer.getDataspace(), outErr)); } +void setDisplayFrame(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer, + const Hwc2TestLayer& testLayer, hwc2_error_t* outErr) +{ + EXPECT_NO_FATAL_FAILURE(test->setLayerDisplayFrame(display, layer, + testLayer.getDisplayFrame(), outErr)); +} + void setPlaneAlpha(Hwc2Test* test, hwc2_display_t display, hwc2_layer_t layer, const Hwc2TestLayer& testLayer, hwc2_error_t *outErr) { @@ -877,6 +932,11 @@ bool advanceDataspace(Hwc2TestLayer* testLayer) return testLayer->advanceDataspace(); } +bool advanceDisplayFrame(Hwc2TestLayer* testLayer) +{ + return testLayer->advanceDisplayFrame(); +} + bool advancePlaneAlpha(Hwc2TestLayer* testLayer) { return testLayer->advancePlaneAlpha(); @@ -1790,6 +1850,27 @@ TEST_F(Hwc2Test, SET_LAYER_DATASPACE_bad_layer) setDataspace)); } +/* TESTCASE: Tests that the HWC2 can set the display frame of a layer. */ +TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME) +{ + ASSERT_NO_FATAL_FAILURE(setLayerProperty(Hwc2TestCoverage::Complete, + setDisplayFrame, advanceDisplayFrame)); +} + +/* TESTCASE: Tests that the HWC2 can update the display frame of a layer. */ +TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_update) +{ + ASSERT_NO_FATAL_FAILURE(setLayerPropertyUpdate(Hwc2TestCoverage::Complete, + setDisplayFrame, advanceDisplayFrame)); +} + +/* TESTCASE: Tests that the HWC2 cannot set the display frame of a bad layer. */ +TEST_F(Hwc2Test, SET_LAYER_DISPLAY_FRAME_bad_layer) +{ + ASSERT_NO_FATAL_FAILURE(setLayerPropertyBadLayer(Hwc2TestCoverage::Default, + setDisplayFrame)); +} + /* TESTCASE: Tests that the HWC2 can set the plane alpha of a layer. */ TEST_F(Hwc2Test, SET_LAYER_PLANE_ALPHA) { diff --git a/services/surfaceflinger/tests/hwc2/Hwc2TestLayer.cpp b/services/surfaceflinger/tests/hwc2/Hwc2TestLayer.cpp index b9ca9c3b03..261fe976a1 100644 --- a/services/surfaceflinger/tests/hwc2/Hwc2TestLayer.cpp +++ b/services/surfaceflinger/tests/hwc2/Hwc2TestLayer.cpp @@ -18,10 +18,12 @@ #include "Hwc2TestLayer.h" -Hwc2TestLayer::Hwc2TestLayer(Hwc2TestCoverage coverage, uint32_t zOrder) +Hwc2TestLayer::Hwc2TestLayer(Hwc2TestCoverage coverage, const Area& displayArea, + uint32_t zOrder) : mBlendMode(coverage), mComposition(coverage), mDataspace(coverage), + mDisplayFrame(coverage, displayArea), mPlaneAlpha(coverage), mTransform(coverage), mZOrder(zOrder) { } @@ -63,6 +65,11 @@ android_dataspace_t Hwc2TestLayer::getDataspace() const return mDataspace.get(); } +hwc_rect_t Hwc2TestLayer::getDisplayFrame() const +{ + return mDisplayFrame.get(); +} + float Hwc2TestLayer::getPlaneAlpha() const { return mPlaneAlpha.get(); @@ -93,6 +100,11 @@ bool Hwc2TestLayer::advanceDataspace() return mDataspace.advance(); } +bool Hwc2TestLayer::advanceDisplayFrame() +{ + return mDisplayFrame.advance(); +} + bool Hwc2TestLayer::advancePlaneAlpha() { return mPlaneAlpha.advance(); diff --git a/services/surfaceflinger/tests/hwc2/Hwc2TestLayer.h b/services/surfaceflinger/tests/hwc2/Hwc2TestLayer.h index 855f7bbbd8..e24ff77404 100644 --- a/services/surfaceflinger/tests/hwc2/Hwc2TestLayer.h +++ b/services/surfaceflinger/tests/hwc2/Hwc2TestLayer.h @@ -27,7 +27,8 @@ class Hwc2TestLayer { public: - Hwc2TestLayer(Hwc2TestCoverage coverage, uint32_t zOrder = 0); + Hwc2TestLayer(Hwc2TestCoverage coverage, const Area& displayArea, + uint32_t zOrder = 0); std::string dump() const; @@ -36,6 +37,7 @@ public: hwc2_blend_mode_t getBlendMode() const; hwc2_composition_t getComposition() const; android_dataspace_t getDataspace() const; + hwc_rect_t getDisplayFrame() const; float getPlaneAlpha() const; hwc_transform_t getTransform() const; uint32_t getZOrder() const; @@ -43,17 +45,20 @@ public: bool advanceBlendMode(); bool advanceComposition(); bool advanceDataspace(); + bool advanceDisplayFrame(); bool advancePlaneAlpha(); bool advanceTransform(); private: - std::array mProperties = {{ - &mBlendMode, &mComposition, &mDataspace, &mPlaneAlpha, &mTransform + std::array mProperties = {{ + &mBlendMode, &mComposition, &mDataspace, &mDisplayFrame, &mPlaneAlpha, + &mTransform }}; Hwc2TestBlendMode mBlendMode; Hwc2TestComposition mComposition; Hwc2TestDataspace mDataspace; + Hwc2TestDisplayFrame mDisplayFrame; Hwc2TestPlaneAlpha mPlaneAlpha; Hwc2TestTransform mTransform; diff --git a/services/surfaceflinger/tests/hwc2/Hwc2TestLayers.cpp b/services/surfaceflinger/tests/hwc2/Hwc2TestLayers.cpp index b2318b1d70..02a9df1d47 100644 --- a/services/surfaceflinger/tests/hwc2/Hwc2TestLayers.cpp +++ b/services/surfaceflinger/tests/hwc2/Hwc2TestLayers.cpp @@ -19,14 +19,14 @@ #include "Hwc2TestLayers.h" Hwc2TestLayers::Hwc2TestLayers(const std::vector& layers, - Hwc2TestCoverage coverage) + Hwc2TestCoverage coverage, const Area& displayArea) { uint32_t nextZOrder = 0; for (auto layer : layers) { mTestLayers.emplace(std::piecewise_construct, std::forward_as_tuple(layer), - std::forward_as_tuple(coverage, nextZOrder++)); + std::forward_as_tuple(coverage, displayArea, nextZOrder++)); } } diff --git a/services/surfaceflinger/tests/hwc2/Hwc2TestLayers.h b/services/surfaceflinger/tests/hwc2/Hwc2TestLayers.h index fcc903a19e..1625352b85 100644 --- a/services/surfaceflinger/tests/hwc2/Hwc2TestLayers.h +++ b/services/surfaceflinger/tests/hwc2/Hwc2TestLayers.h @@ -31,7 +31,7 @@ class Hwc2TestLayers { public: Hwc2TestLayers(const std::vector& layers, - Hwc2TestCoverage coverage); + Hwc2TestCoverage coverage, const Area& displayArea); std::string dump() const; diff --git a/services/surfaceflinger/tests/hwc2/Hwc2TestProperties.cpp b/services/surfaceflinger/tests/hwc2/Hwc2TestProperties.cpp index eb49d3272e..e793c11836 100644 --- a/services/surfaceflinger/tests/hwc2/Hwc2TestProperties.cpp +++ b/services/surfaceflinger/tests/hwc2/Hwc2TestProperties.cpp @@ -140,6 +140,66 @@ const std::vector Hwc2TestDataspace::completeDataspaces = { }; +Hwc2TestDisplayFrame::Hwc2TestDisplayFrame(Hwc2TestCoverage coverage, + const Area& displayArea) + : Hwc2TestProperty(mDisplayFrames), + mFrectScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteFrectScalars: + (coverage == Hwc2TestCoverage::Basic)? mBasicFrectScalars: + mDefaultFrectScalars), + mDisplayArea(displayArea) +{ + update(); +} + +std::string Hwc2TestDisplayFrame::dump() const +{ + std::stringstream dmp; + const hwc_rect_t& displayFrame = get(); + dmp << "\tdisplay frame: left " << displayFrame.left << ", top " + << displayFrame.top << ", right " << displayFrame.right + << ", bottom " << displayFrame.bottom << "\n"; + return dmp.str(); +} + +void Hwc2TestDisplayFrame::update() +{ + mDisplayFrames.clear(); + + if (mDisplayArea.width == 0 && mDisplayArea.height == 0) { + mDisplayFrames.push_back({0, 0, 0, 0}); + return; + } + + for (const auto& frectScalar : mFrectScalars) { + mDisplayFrames.push_back({ + static_cast(frectScalar.left * mDisplayArea.width), + static_cast(frectScalar.top * mDisplayArea.height), + static_cast(frectScalar.right * mDisplayArea.width), + static_cast(frectScalar.bottom * mDisplayArea.height)}); + } +} + +const std::vector Hwc2TestDisplayFrame::mDefaultFrectScalars = { + {0.0, 0.0, 1.0, 1.0}, +}; + +const std::vector Hwc2TestDisplayFrame::mBasicFrectScalars = { + {0.0, 0.0, 1.0, 1.0}, + {0.0, 0.0, 1.0, 0.05}, + {0.0, 0.95, 1.0, 1.0}, +}; + +const std::vector Hwc2TestDisplayFrame::mCompleteFrectScalars = { + {0.0, 0.0, 1.0, 1.0}, + {0.0, 0.05, 1.0, 0.95}, + {0.0, 0.05, 1.0, 1.0}, + {0.0, 0.0, 1.0, 0.05}, + {0.0, 0.95, 1.0, 1.0}, + {0.25, 0.0, 0.75, 0.35}, + {0.25, 0.25, 0.75, 0.75}, +}; + + Hwc2TestPlaneAlpha::Hwc2TestPlaneAlpha(Hwc2TestCoverage coverage) : Hwc2TestProperty(coverage, mCompletePlaneAlphas, mBasicPlaneAlphas, mDefaultPlaneAlphas) { } diff --git a/services/surfaceflinger/tests/hwc2/Hwc2TestProperties.h b/services/surfaceflinger/tests/hwc2/Hwc2TestProperties.h index a96b629a3d..25c6ad8717 100644 --- a/services/surfaceflinger/tests/hwc2/Hwc2TestProperties.h +++ b/services/surfaceflinger/tests/hwc2/Hwc2TestProperties.h @@ -32,6 +32,11 @@ enum class Hwc2TestCoverage { Complete, }; +typedef struct { + int32_t width; + int32_t height; +} Area; + class Hwc2TestContainer { public: @@ -125,6 +130,26 @@ protected: }; +class Hwc2TestDisplayFrame : public Hwc2TestProperty { +public: + Hwc2TestDisplayFrame(Hwc2TestCoverage coverage, const Area& displayArea); + + std::string dump() const override; + +protected: + void update(); + + const std::vector& mFrectScalars; + const static std::vector mDefaultFrectScalars; + const static std::vector mBasicFrectScalars; + const static std::vector mCompleteFrectScalars; + + Area mDisplayArea; + + std::vector mDisplayFrames; +}; + + class Hwc2TestPlaneAlpha : public Hwc2TestProperty { public: Hwc2TestPlaneAlpha(Hwc2TestCoverage coverage); -- 2.11.0