diff options
Diffstat (limited to 'graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp')
| -rw-r--r-- | graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp | 431 |
1 files changed, 417 insertions, 14 deletions
diff --git a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp index 72f3f1b4bf..30b96949dc 100644 --- a/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp +++ b/graphics/composer/2.1/vts/functional/VtsHalGraphicsComposerV2_1TargetTest.cpp @@ -21,6 +21,7 @@ #include <composer-vts/2.1/GraphicsComposerCallback.h> #include <composer-vts/2.1/TestCommandReader.h> #include <mapper-vts/2.0/MapperVts.h> +#include <mapper-vts/3.0/MapperVts.h> #include <VtsHalHidlTargetTestBase.h> #include <VtsHalHidlTargetTestEnvBase.h> @@ -47,8 +48,6 @@ using android::hardware::graphics::common::V1_0::ColorTransform; using android::hardware::graphics::common::V1_0::Dataspace; using android::hardware::graphics::common::V1_0::PixelFormat; using android::hardware::graphics::common::V1_0::Transform; -using android::hardware::graphics::mapper::V2_0::IMapper; -using android::hardware::graphics::mapper::V2_0::vts::Gralloc; using GrallocError = android::hardware::graphics::mapper::V2_0::Error; // Test environment for graphics.composer @@ -71,6 +70,7 @@ class GraphicsComposerHidlEnvironment : public ::testing::VtsHalHidlTargetTestEn class GraphicsComposerHidlTest : public ::testing::VtsHalHidlTargetTestBase { protected: void SetUp() override { + VtsHalHidlTargetTestBase::SetUp(); ASSERT_NO_FATAL_FAILURE( mComposer = std::make_unique<Composer>( GraphicsComposerHidlEnvironment::Instance()->getServiceName<IComposer>())); @@ -85,6 +85,13 @@ class GraphicsComposerHidlTest : public ::testing::VtsHalHidlTargetTestBase { // explicitly disable vsync mComposerClient->setVsyncEnabled(mPrimaryDisplay, false); mComposerCallback->setVsyncAllowed(false); + + mInvalidDisplayId = GetInvalidDisplayId(); + + // Although 0 could be an invalid display, a return value of 0 + // from GetInvalidDisplayId means all other ids are in use, a condition which + // we are assuming a device will never have + ASSERT_NE(0, mInvalidDisplayId); } void TearDown() override { @@ -93,6 +100,24 @@ class GraphicsComposerHidlTest : public ::testing::VtsHalHidlTargetTestBase { EXPECT_EQ(0, mComposerCallback->getInvalidRefreshCount()); EXPECT_EQ(0, mComposerCallback->getInvalidVsyncCount()); } + VtsHalHidlTargetTestBase::TearDown(); + } + + // returns an invalid display id (one that has not been registered to a + // display. Currently assuming that a device will never have close to + // std::numeric_limit<uint64_t>::max() displays registered while running tests + Display GetInvalidDisplayId() { + std::vector<Display> validDisplays = mComposerCallback->getDisplays(); + + uint64_t id = std::numeric_limits<uint64_t>::max(); + while (id > 0) { + if (std::find(validDisplays.begin(), validDisplays.end(), id) == validDisplays.end()) { + return id; + } + id--; + } + + return 0; } // use the slot count usually set by SF @@ -103,6 +128,7 @@ class GraphicsComposerHidlTest : public ::testing::VtsHalHidlTargetTestBase { sp<GraphicsComposerCallback> mComposerCallback; // the first display and is assumed never to be removed Display mPrimaryDisplay; + Display mInvalidDisplayId; private: Display waitForFirstDisplay() { @@ -172,6 +198,22 @@ TEST_F(GraphicsComposerHidlTest, CreateVirtualDisplay) { } /** + * Test IComposerClient::destroyVirtualDisplay + * + * Test that passing a bad display handle to destroyVirtualDisplay + * returns a BAD_DISPLAY error + */ +TEST_F(GraphicsComposerHidlTest, DestroyVirtualDisplayBadDisplay) { + if (mComposerClient->getMaxVirtualDisplayCount() == 0) { + GTEST_SUCCEED() << "no virtual display support"; + return; + } + + Error error = mComposerClient->getRaw()->destroyVirtualDisplay(mInvalidDisplayId); + ASSERT_EQ(Error::BAD_DISPLAY, error); +} + +/** * Test IComposerClient::createLayer and IComposerClient::destroyLayer. * * Test that layers can be created and destroyed. @@ -185,6 +227,89 @@ TEST_F(GraphicsComposerHidlTest, CreateLayer) { } /** + * Test IComposerClient::createLayer + * + * Test that passing in an invalid display handle to createLayer returns + * BAD_DISPLAY. + */ +TEST_F(GraphicsComposerHidlTest, CreateLayerBadDisplay) { + Error error; + mComposerClient->getRaw()->createLayer( + mInvalidDisplayId, kBufferSlotCount, + [&](const auto& tmpOutError, const auto&) { error = tmpOutError; }); + ASSERT_EQ(Error::BAD_DISPLAY, error); +} + +/** + * Test IComposerClient::destroyLayer + * + * Test that passing in an invalid display handle to destroyLayer returns + * BAD_DISPLAY + */ +TEST_F(GraphicsComposerHidlTest, DestroyLayerBadDisplay) { + Error error; + Layer layer; + ASSERT_NO_FATAL_FAILURE(layer = + mComposerClient->createLayer(mPrimaryDisplay, kBufferSlotCount)); + + error = mComposerClient->getRaw()->destroyLayer(mInvalidDisplayId, layer); + + EXPECT_EQ(Error::BAD_DISPLAY, error); + + ASSERT_NO_FATAL_FAILURE(mComposerClient->destroyLayer(mPrimaryDisplay, layer)); +} + +/** + * Test IComposerClient::destroyLayer + * + * Test that passing in an invalid layer handle to destroyLayer returns + * BAD_LAYER + */ +TEST_F(GraphicsComposerHidlTest, DestroyLayerBadLayerError) { + // We haven't created any layers yet, so any id should be invalid + Error error = mComposerClient->getRaw()->destroyLayer(mPrimaryDisplay, 1); + + EXPECT_EQ(Error::BAD_LAYER, error); +} + +/** + * Test IComposerClient::getActiveConfig + * + * Test that passing in a bad display handle to getActiveConfig generates a + * BAD_DISPLAY error + */ +TEST_F(GraphicsComposerHidlTest, GetActiveConfigBadDisplay) { + Error error; + mComposerClient->getRaw()->getActiveConfig( + mInvalidDisplayId, [&](const auto& tmpOutError, const auto&) { error = tmpOutError; }); + ASSERT_EQ(Error::BAD_DISPLAY, error); +} + +/** + * Test IComposerClient::getDisplayConfigs + * + * Test IComposerClient::getDisplayConfigs returns no error + * when passed in a valid display + */ +TEST_F(GraphicsComposerHidlTest, GetDisplayConfig) { + std::vector<Config> configs; + ASSERT_NO_FATAL_FAILURE(configs = mComposerClient->getDisplayConfigs(mPrimaryDisplay)); +} + +/** + * Test IComposerClient::getDisplayConfigs + * + * Test IComposerClient::getDisplayConfigs returns BAD_DISPLAY + * when passed in an invalid display handle + */ +TEST_F(GraphicsComposerHidlTest, GetDisplayConfigBadDisplay) { + Error error; + mComposerClient->getRaw()->getDisplayConfigs( + mInvalidDisplayId, [&](const auto& tmpOutError, const auto&) { error = tmpOutError; }); + ASSERT_EQ(Error::BAD_DISPLAY, error); +} + +/** * Test IComposerClient::getDisplayName. */ TEST_F(GraphicsComposerHidlTest, GetDisplayName) { @@ -226,6 +351,30 @@ TEST_F(GraphicsComposerHidlTest, GetClientTargetSupport) { } /** + * Test IComposerClient::getClientTargetSupport + * + * Test that IComposerClient::getClientTargetSupport returns BAD_DISPLAY when + * passed an invalid display handle + */ +TEST_F(GraphicsComposerHidlTest, GetClientTargetSupportBadDisplay) { + std::vector<Config> configs = mComposerClient->getDisplayConfigs(mPrimaryDisplay); + for (auto config : configs) { + int32_t width = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config, + IComposerClient::Attribute::WIDTH); + int32_t height = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config, + IComposerClient::Attribute::HEIGHT); + ASSERT_LT(0, width); + ASSERT_LT(0, height); + + mComposerClient->setActiveConfig(mPrimaryDisplay, config); + + Error error = mComposerClient->getRaw()->getClientTargetSupport( + mInvalidDisplayId, width, height, PixelFormat::RGBA_8888, Dataspace::UNKNOWN); + EXPECT_EQ(Error::BAD_DISPLAY, error); + } +} + +/** * Test IComposerClient::getDisplayAttribute. * * Test that IComposerClient::getDisplayAttribute succeeds for the required @@ -287,6 +436,43 @@ TEST_F(GraphicsComposerHidlTest, SetActiveConfig) { } /** + * Test IComposerClient::setActiveConfig + * + * Test that config set during IComposerClient::setActiveConfig is maintained + * during a display on/off power cycle + */ +TEST_F(GraphicsComposerHidlTest, SetActiveConfigPowerCycle) { + ASSERT_NO_FATAL_FAILURE( + mComposerClient->setPowerMode(mPrimaryDisplay, IComposerClient::PowerMode::OFF)); + ASSERT_NO_FATAL_FAILURE( + mComposerClient->setPowerMode(mPrimaryDisplay, IComposerClient::PowerMode::ON)); + + std::vector<Config> configs = mComposerClient->getDisplayConfigs(mPrimaryDisplay); + for (auto config : configs) { + mComposerClient->setActiveConfig(mPrimaryDisplay, config); + ASSERT_EQ(config, mComposerClient->getActiveConfig(mPrimaryDisplay)); + + ASSERT_NO_FATAL_FAILURE( + mComposerClient->setPowerMode(mPrimaryDisplay, IComposerClient::PowerMode::OFF)); + ASSERT_NO_FATAL_FAILURE( + mComposerClient->setPowerMode(mPrimaryDisplay, IComposerClient::PowerMode::ON)); + ASSERT_EQ(config, mComposerClient->getActiveConfig(mPrimaryDisplay)); + } +} + +/** + * Test IComposerClient::getColorMode + * + * Test that IComposerClient::getColorMode always returns ColorMode::NATIVE + */ +TEST_F(GraphicsComposerHidlTest, GetColorModes) { + std::vector<ColorMode> modes = mComposerClient->getColorModes(mPrimaryDisplay); + auto nativeModeLocation = std::find(modes.begin(), modes.end(), ColorMode::NATIVE); + + ASSERT_NE(modes.end(), nativeModeLocation); +} + +/** * Test IComposerClient::setColorMode. * * Test that IComposerClient::setColorMode succeeds for all color modes. @@ -306,6 +492,45 @@ TEST_F(GraphicsComposerHidlTest, SetColorMode) { } /** + * Test IComposerClient::setColorMode + * + * Test that IComposerClient::setColorMode returns BAD_DISPLAY for + * an invalid display handle + */ +TEST_F(GraphicsComposerHidlTest, SetColorModeBadDisplay) { + std::vector<ColorMode> modes = mComposerClient->getColorModes(mPrimaryDisplay); + for (auto mode : modes) { + Error error = mComposerClient->getRaw()->setColorMode(mInvalidDisplayId, mode); + EXPECT_EQ(Error::BAD_DISPLAY, error); + } +} + +/** + * Test IComposerClient::setColorMode + * + * Test that IComposerClient::setColorMode returns BAD_PARAMETER when passed in + * an invalid color mode + */ +TEST_F(GraphicsComposerHidlTest, SetColorModeBadParameter) { + Error error = + mComposerClient->getRaw()->setColorMode(mPrimaryDisplay, static_cast<ColorMode>(-1)); + ASSERT_EQ(Error::BAD_PARAMETER, error); +} + +/** + * Test IComposerClient::getDozeSupport + * + * Test that IComposerClient::getDozeSupport returns + * BAD_DISPLAY when passed an invalid display handle + */ +TEST_F(GraphicsComposerHidlTest, GetDozeSupportBadDisplay) { + Error error; + mComposerClient->getRaw()->getDozeSupport( + mInvalidDisplayId, [&](const auto& tmpOutError, const auto&) { error = tmpOutError; }); + ASSERT_EQ(Error::BAD_DISPLAY, error); +} + +/** * Test IComposerClient::setPowerMode. * * Test that IComposerClient::setPowerMode succeeds for all power modes. @@ -328,6 +553,99 @@ TEST_F(GraphicsComposerHidlTest, SetPowerMode) { } /** + * Test IComposerClient::setPowerMode + * + * Test IComposerClient::setPowerMode succeeds with different + * orderings of power modes + */ +TEST_F(GraphicsComposerHidlTest, SetPowerModeVariations) { + std::vector<IComposerClient::PowerMode> modes; + modes.push_back(IComposerClient::PowerMode::OFF); + modes.push_back(IComposerClient::PowerMode::ON); + modes.push_back(IComposerClient::PowerMode::OFF); + for (auto mode : modes) { + ASSERT_NO_FATAL_FAILURE(mComposerClient->setPowerMode(mPrimaryDisplay, mode)); + } + + modes.clear(); + + modes.push_back(IComposerClient::PowerMode::OFF); + modes.push_back(IComposerClient::PowerMode::OFF); + for (auto mode : modes) { + ASSERT_NO_FATAL_FAILURE(mComposerClient->setPowerMode(mPrimaryDisplay, mode)); + } + + modes.clear(); + if (mComposerClient->getDozeSupport(mPrimaryDisplay)) { + modes.push_back(IComposerClient::PowerMode::DOZE); + modes.push_back(IComposerClient::PowerMode::DOZE); + + for (auto mode : modes) { + ASSERT_NO_FATAL_FAILURE(mComposerClient->setPowerMode(mPrimaryDisplay, mode)); + } + + modes.clear(); + + modes.push_back(IComposerClient::PowerMode::DOZE_SUSPEND); + modes.push_back(IComposerClient::PowerMode::DOZE_SUSPEND); + + for (auto mode : modes) { + ASSERT_NO_FATAL_FAILURE(mComposerClient->setPowerMode(mPrimaryDisplay, mode)); + } + } + + modes.clear(); + + modes.push_back(IComposerClient::PowerMode::ON); + modes.push_back(IComposerClient::PowerMode::ON); + for (auto mode : modes) { + ASSERT_NO_FATAL_FAILURE(mComposerClient->setPowerMode(mPrimaryDisplay, mode)); + } +} + +/** + * Test IComposerClient::setPowerMode + * + * Test IComposerClient::setPowerMode returns BAD_DISPLAY when passed an invalid + * display handle + */ +TEST_F(GraphicsComposerHidlTest, SetPowerModeBadDisplay) { + Error error = + mComposerClient->getRaw()->setPowerMode(mInvalidDisplayId, IComposerClient::PowerMode::ON); + ASSERT_EQ(Error::BAD_DISPLAY, error); +} + +/** + * Test IComposerClient::setPowerMode + * + * Test that IComposerClient::setPowerMode returns UNSUPPORTED when passed DOZE + * or DOZE_SUSPEND on devices that do not support DOZE/DOZE_SUSPEND + */ +TEST_F(GraphicsComposerHidlTest, SetPowerModeUnsupported) { + if (!mComposerClient->getDozeSupport(mPrimaryDisplay)) { + Error error = mComposerClient->getRaw()->setPowerMode(mPrimaryDisplay, + IComposerClient::PowerMode::DOZE); + EXPECT_EQ(Error::UNSUPPORTED, error); + + error = mComposerClient->getRaw()->setPowerMode(mPrimaryDisplay, + IComposerClient::PowerMode::DOZE_SUSPEND); + EXPECT_EQ(Error::UNSUPPORTED, error); + } +} + +/** + * Test IComposerClient::setPowerMode + * + * Tests that IComposerClient::setPowerMode returns BAD_PARAMETER when passed an invalid + * PowerMode + */ +TEST_F(GraphicsComposerHidlTest, SetPowerModeBadParameter) { + Error error = mComposerClient->getRaw()->setPowerMode( + mPrimaryDisplay, static_cast<IComposerClient::PowerMode>(-1)); + ASSERT_EQ(Error::BAD_PARAMETER, error); +} + +/** * Test IComposerClient::setVsyncEnabled. * * Test that IComposerClient::setVsyncEnabled succeeds and there is no @@ -350,32 +668,36 @@ class GraphicsComposerHidlCommandTest : public GraphicsComposerHidlTest { ASSERT_NO_FATAL_FAILURE(GraphicsComposerHidlTest::SetUp()); ASSERT_NO_FATAL_FAILURE(mGralloc = std::make_unique<Gralloc>()); - + Config activeConfig = mComposerClient->getActiveConfig(mPrimaryDisplay); + mDisplayWidth = mComposerClient->getDisplayAttribute(mPrimaryDisplay, activeConfig, + IComposerClient::Attribute::WIDTH); + mDisplayHeight = mComposerClient->getDisplayAttribute(mPrimaryDisplay, activeConfig, + IComposerClient::Attribute::HEIGHT); mWriter = std::make_unique<CommandWriterBase>(1024); mReader = std::make_unique<TestCommandReader>(); } - void TearDown() override { ASSERT_NO_FATAL_FAILURE(GraphicsComposerHidlTest::TearDown()); } + void TearDown() override { + ASSERT_EQ(0, mReader->mErrors.size()); + ASSERT_NO_FATAL_FAILURE(GraphicsComposerHidlTest::TearDown()); + } const native_handle_t* allocate() { - IMapper::BufferDescriptorInfo info{}; - info.width = 64; - info.height = 64; - info.layerCount = 1; - info.format = PixelFormat::RGBA_8888; - info.usage = - static_cast<uint64_t>(BufferUsage::CPU_WRITE_OFTEN | BufferUsage::CPU_READ_OFTEN); - - return mGralloc->allocate(info); + uint64_t usage = + static_cast<uint64_t>(BufferUsage::CPU_WRITE_OFTEN | BufferUsage::CPU_READ_OFTEN | + BufferUsage::COMPOSER_OVERLAY); + return mGralloc->allocate(mDisplayWidth, mDisplayHeight, 1, PixelFormat::RGBA_8888, usage); } void execute() { mComposerClient->execute(mReader.get(), mWriter.get()); } std::unique_ptr<CommandWriterBase> mWriter; std::unique_ptr<TestCommandReader> mReader; + int32_t mDisplayWidth; + int32_t mDisplayHeight; private: - std::unique_ptr<Gralloc> mGralloc; + std::unique_ptr<Gralloc> mGralloc; }; /** @@ -459,6 +781,60 @@ TEST_F(GraphicsComposerHidlCommandTest, PRESENT_DISPLAY) { } /** + * Test IComposerClient::Command::PRESENT_DISPLAY + * + * Test that IComposerClient::Command::PRESENT_DISPLAY works without + * additional call to validateDisplay when only the layer buffer handle and + * surface damage have been set + */ +TEST_F(GraphicsComposerHidlCommandTest, PRESENT_DISPLAY_NO_LAYER_STATE_CHANGES) { + mWriter->selectDisplay(mPrimaryDisplay); + mComposerClient->setPowerMode(mPrimaryDisplay, IComposerClient::PowerMode::ON); + mComposerClient->setColorMode(mPrimaryDisplay, ColorMode::SRGB); + + auto handle = allocate(); + ASSERT_NE(nullptr, handle); + + IComposerClient::Rect displayFrame{0, 0, mDisplayWidth, mDisplayHeight}; + + Layer layer; + ASSERT_NO_FATAL_FAILURE(layer = + mComposerClient->createLayer(mPrimaryDisplay, kBufferSlotCount)); + mWriter->selectLayer(layer); + mWriter->setLayerCompositionType(IComposerClient::Composition::DEVICE); + mWriter->setLayerDisplayFrame(displayFrame); + mWriter->setLayerPlaneAlpha(1); + mWriter->setLayerSourceCrop({0, 0, (float)mDisplayWidth, (float)mDisplayHeight}); + mWriter->setLayerTransform(static_cast<Transform>(0)); + mWriter->setLayerVisibleRegion(std::vector<IComposerClient::Rect>(1, displayFrame)); + mWriter->setLayerZOrder(10); + mWriter->setLayerBlendMode(IComposerClient::BlendMode::NONE); + mWriter->setLayerSurfaceDamage(std::vector<IComposerClient::Rect>(1, displayFrame)); + mWriter->setLayerBuffer(0, handle, -1); + mWriter->setLayerDataspace(Dataspace::UNKNOWN); + + mWriter->validateDisplay(); + execute(); + if (mReader->mCompositionChanges.size() != 0) { + GTEST_SUCCEED() << "Composition change requested, skipping test"; + return; + } + + ASSERT_EQ(0, mReader->mErrors.size()); + mWriter->presentDisplay(); + execute(); + ASSERT_EQ(0, mReader->mErrors.size()); + + mWriter->selectLayer(layer); + auto handle2 = allocate(); + ASSERT_NE(nullptr, handle2); + mWriter->setLayerBuffer(0, handle2, -1); + mWriter->setLayerSurfaceDamage(std::vector<IComposerClient::Rect>(1, {0, 0, 10, 10})); + mWriter->presentDisplay(); + execute(); +} + +/** * Test IComposerClient::Command::SET_LAYER_CURSOR_POSITION. */ TEST_F(GraphicsComposerHidlCommandTest, SET_LAYER_CURSOR_POSITION) { @@ -466,10 +842,37 @@ TEST_F(GraphicsComposerHidlCommandTest, SET_LAYER_CURSOR_POSITION) { ASSERT_NO_FATAL_FAILURE(layer = mComposerClient->createLayer(mPrimaryDisplay, kBufferSlotCount)); + auto handle = allocate(); + ASSERT_NE(nullptr, handle); + IComposerClient::Rect displayFrame{0, 0, mDisplayWidth, mDisplayHeight}; + mWriter->selectDisplay(mPrimaryDisplay); mWriter->selectLayer(layer); + mWriter->setLayerBuffer(0, handle, -1); + mWriter->setLayerCompositionType(IComposerClient::Composition::CURSOR); + mWriter->setLayerDisplayFrame(displayFrame); + mWriter->setLayerPlaneAlpha(1); + mWriter->setLayerSourceCrop({0, 0, (float)mDisplayWidth, (float)mDisplayHeight}); + mWriter->setLayerTransform(static_cast<Transform>(0)); + mWriter->setLayerVisibleRegion(std::vector<IComposerClient::Rect>(1, displayFrame)); + mWriter->setLayerZOrder(10); + mWriter->setLayerBlendMode(IComposerClient::BlendMode::NONE); + mWriter->setLayerSurfaceDamage(std::vector<IComposerClient::Rect>(1, displayFrame)); + mWriter->setLayerDataspace(Dataspace::UNKNOWN); + mWriter->validateDisplay(); + + execute(); + if (mReader->mCompositionChanges.size() != 0) { + GTEST_SUCCEED() << "Composition change requested, skipping test"; + return; + } + mWriter->presentDisplay(); + ASSERT_EQ(0, mReader->mErrors.size()); + mWriter->setLayerCursorPosition(1, 1); mWriter->setLayerCursorPosition(0, 0); + mWriter->validateDisplay(); + mWriter->presentDisplay(); execute(); } |
