From 0ca29273dcc407e6da7f27a2eccb71fa23d6b78f Mon Sep 17 00:00:00 2001 From: Sally Qi Date: Fri, 23 Feb 2024 11:07:08 -0800 Subject: [PATCH] Add vts case for OverlayProperties#isMixedColorSpacesSupported. - add sRGB and DisplayP3 layers in HWC, if mixedColorSpaces is supported, only DPU composition happens. Bug: 311252937 Test: this Change-Id: I400a6dd18a05bbdf69e249907e13a4fa7eafbf01 --- graphics/composer/aidl/vts/ReadbackVts.cpp | 3 +- .../VtsHalGraphicsComposer3_ReadbackTest.cpp | 77 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/graphics/composer/aidl/vts/ReadbackVts.cpp b/graphics/composer/aidl/vts/ReadbackVts.cpp index c72ec6974f..283b8ce2e4 100644 --- a/graphics/composer/aidl/vts/ReadbackVts.cpp +++ b/graphics/composer/aidl/vts/ReadbackVts.cpp @@ -67,8 +67,9 @@ Dataspace ReadbackHelper::getDataspaceForColorMode(ColorMode mode) { case ColorMode::DISPLAY_P3: return Dataspace::DISPLAY_P3; case ColorMode::SRGB: + return Dataspace::SRGB; default: - return common::Dataspace::UNKNOWN; + return Dataspace::UNKNOWN; } } diff --git a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_ReadbackTest.cpp b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_ReadbackTest.cpp index 3f82925455..d4ce3ba2b6 100644 --- a/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_ReadbackTest.cpp +++ b/graphics/composer/aidl/vts/VtsHalGraphicsComposer3_ReadbackTest.cpp @@ -522,6 +522,83 @@ TEST_P(GraphicsCompositionTest, ClientComposition) { } } +TEST_P(GraphicsCompositionTest, MixedColorSpaces) { + ASSERT_TRUE( + mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount) + .isOk()); + const auto& [status, properties] = mComposerClient->getOverlaySupport(); + if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC && + status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) { + GTEST_SUCCEED() << "getOverlaySupport is not supported"; + return; + } + + if (properties.supportMixedColorSpaces == false) { + GTEST_SUCCEED() << "supportMixedColorSpaces is not supported"; + return; + } + + for (ColorMode mode : mTestColorModes) { + EXPECT_TRUE(mComposerClient + ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC) + .isOk()); + + bool isSupported; + ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer()); + if (!isSupported) { + GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace"; + return; + } + + // sRGB layer + auto srgbLayer = std::make_shared( + mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(), + getDisplayHeight() / 2, PixelFormat::RGBA_8888, *mWriter); + std::vector sRgbDeviceColors(srgbLayer->getWidth() * srgbLayer->getHeight()); + ReadbackHelper::fillColorsArea(sRgbDeviceColors, getDisplayWidth(), + {0, 0, static_cast(srgbLayer->getWidth()), + static_cast(srgbLayer->getHeight())}, + GREEN); + srgbLayer->setDisplayFrame({0, 0, static_cast(srgbLayer->getWidth()), + static_cast(srgbLayer->getHeight())}); + srgbLayer->setZOrder(10); + srgbLayer->setDataspace(Dataspace::SRGB); + ASSERT_NO_FATAL_FAILURE(srgbLayer->setBuffer(sRgbDeviceColors)); + + // display P3 layer + auto displayP3Layer = std::make_shared( + mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(), + getDisplayHeight() / 2, PixelFormat::RGBA_8888, *mWriter); + std::vector displayP3DeviceColors( + static_cast(displayP3Layer->getWidth() * displayP3Layer->getHeight())); + ReadbackHelper::fillColorsArea(displayP3DeviceColors, getDisplayWidth(), + {0, 0, static_cast(displayP3Layer->getWidth()), + static_cast(displayP3Layer->getHeight())}, + RED); + displayP3Layer->setDisplayFrame( + {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}); + displayP3Layer->setZOrder(10); + displayP3Layer->setDataspace(Dataspace::DISPLAY_P3); + ASSERT_NO_FATAL_FAILURE(displayP3Layer->setBuffer(displayP3DeviceColors)); + + writeLayers({srgbLayer, displayP3Layer}); + + mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp, + VtsComposerClient::kNoFrameIntervalNs); + execute(); + + auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId()); + ASSERT_TRUE(changedCompositionTypes.empty()); + + mWriter->presentDisplay(getPrimaryDisplayId()); + execute(); + + changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId()); + ASSERT_TRUE(changedCompositionTypes.empty()); + ASSERT_TRUE(mReader.takeErrors().empty()); + } +} + TEST_P(GraphicsCompositionTest, DeviceAndClientComposition) { ASSERT_TRUE( mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)