diff --git a/graphics/composer/2.2/utils/vts/ComposerVts.cpp b/graphics/composer/2.2/utils/vts/ComposerVts.cpp index 357c7725af..6a32071279 100644 --- a/graphics/composer/2.2/utils/vts/ComposerVts.cpp +++ b/graphics/composer/2.2/utils/vts/ComposerVts.cpp @@ -45,6 +45,10 @@ std::unique_ptr Composer_v2_2::createClient_v2_2() { return client; } +sp ComposerClient_v2_2::getRaw() const { + return mClient_v2_2; +} + std::vector ComposerClient_v2_2::getPerFrameMetadataKeys( Display display) { std::vector keys; diff --git a/graphics/composer/2.2/utils/vts/include/composer-vts/2.2/ComposerVts.h b/graphics/composer/2.2/utils/vts/include/composer-vts/2.2/ComposerVts.h index 62ab83f3f2..1c6d7ae00b 100644 --- a/graphics/composer/2.2/utils/vts/include/composer-vts/2.2/ComposerVts.h +++ b/graphics/composer/2.2/utils/vts/include/composer-vts/2.2/ComposerVts.h @@ -63,6 +63,8 @@ class ComposerClient_v2_2 ComposerClient_v2_2(const sp& client) : V2_1::vts::ComposerClient(client), mClient_v2_2(client){}; + sp getRaw() const; + void execute_v2_2(V2_1::vts::TestCommandReader* reader, V2_2::CommandWriterBase* writer); std::vector getPerFrameMetadataKeys(Display display); diff --git a/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2TargetTest.cpp b/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2TargetTest.cpp index 4e41333e58..f0d22504ac 100644 --- a/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2TargetTest.cpp +++ b/graphics/composer/2.2/vts/functional/VtsHalGraphicsComposerV2_2TargetTest.cpp @@ -78,6 +78,11 @@ class GraphicsComposerHidlTest : public ::testing::VtsHalHidlTargetTestBase { // explicitly disable vsync mComposerClient->setVsyncEnabled(mPrimaryDisplay, false); mComposerCallback->setVsyncAllowed(false); + + mComposerClient->getRaw()->getReadbackBufferAttributes( + mPrimaryDisplay, [&](const auto& tmpError, const auto&, const auto&) { + mHasReadbackBuffer = tmpError == Error::NONE; + }); } void TearDown() override { @@ -96,6 +101,7 @@ class GraphicsComposerHidlTest : public ::testing::VtsHalHidlTargetTestBase { sp mComposerCallback; // the first display and is assumed never to be removed Display mPrimaryDisplay; + bool mHasReadbackBuffer; private: Display waitForFirstDisplay() { @@ -257,18 +263,44 @@ TEST_F(GraphicsComposerHidlTest, setPowerMode_2_2) { } TEST_F(GraphicsComposerHidlTest, setReadbackBuffer) { - mComposerClient->setReadbackBuffer(mPrimaryDisplay, nullptr, -1); -} + if (!mHasReadbackBuffer) { + return; + } -TEST_F(GraphicsComposerHidlTest, getReadbackBufferFence) { - int32_t fence; - mComposerClient->getReadbackBufferFence(mPrimaryDisplay, &fence); -} - -TEST_F(GraphicsComposerHidlTest, getReadbackBufferAttributes) { PixelFormat pixelFormat; Dataspace dataspace; mComposerClient->getReadbackBufferAttributes(mPrimaryDisplay, &pixelFormat, &dataspace); + ASSERT_LT(static_cast(0), pixelFormat); + ASSERT_NE(Dataspace::UNKNOWN, dataspace); + + IMapper::BufferDescriptorInfo info{}; + Config config = mComposerClient->getActiveConfig(mPrimaryDisplay); + info.width = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config, + IComposerClient::Attribute::WIDTH); + info.height = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config, + IComposerClient::Attribute::HEIGHT); + info.layerCount = 1; + info.format = pixelFormat; + // BufferUsage::COMPOSER_OUTPUT is missing + info.usage = static_cast(BufferUsage::COMPOSER_OVERLAY | BufferUsage::CPU_READ_OFTEN); + + std::unique_ptr gralloc; + const native_handle_t* buffer; + ASSERT_NO_FATAL_FAILURE(gralloc = std::make_unique()); + ASSERT_NO_FATAL_FAILURE(buffer = gralloc->allocate(info)); + + mComposerClient->setReadbackBuffer(mPrimaryDisplay, buffer, -1); +} + +TEST_F(GraphicsComposerHidlTest, getReadbackBufferFenceInactive) { + if (!mHasReadbackBuffer) { + return; + } + + mComposerClient->getRaw()->getReadbackBufferFence( + mPrimaryDisplay, [&](const auto& tmpError, const auto&) { + ASSERT_EQ(Error::UNSUPPORTED, tmpError) << "readback buffer is active"; + }); } /**