Home | History | Annotate | Download | only in functional
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define LOG_TAG "graphics_composer_hidl_hal_test (at) 2.3"
     18 
     19 #include <algorithm>
     20 
     21 #include <VtsHalHidlTargetTestBase.h>
     22 #include <android-base/logging.h>
     23 #include <android/hardware/graphics/mapper/2.0/IMapper.h>
     24 #include <composer-command-buffer/2.3/ComposerCommandBuffer.h>
     25 #include <composer-vts/2.1/GraphicsComposerCallback.h>
     26 #include <composer-vts/2.1/TestCommandReader.h>
     27 #include <composer-vts/2.3/ComposerVts.h>
     28 #include <mapper-vts/2.0/MapperVts.h>
     29 
     30 namespace android {
     31 namespace hardware {
     32 namespace graphics {
     33 namespace composer {
     34 namespace V2_3 {
     35 namespace vts {
     36 namespace {
     37 
     38 using common::V1_0::BufferUsage;
     39 using common::V1_1::RenderIntent;
     40 using common::V1_2::ColorMode;
     41 using common::V1_2::Dataspace;
     42 using common::V1_2::PixelFormat;
     43 using mapper::V2_0::IMapper;
     44 using V2_2::vts::Gralloc;
     45 
     46 // Test environment for graphics.composer
     47 class GraphicsComposerHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
     48    public:
     49     // get the test environment singleton
     50     static GraphicsComposerHidlEnvironment* Instance() {
     51         static GraphicsComposerHidlEnvironment* instance = new GraphicsComposerHidlEnvironment;
     52         return instance;
     53     }
     54 
     55     virtual void registerTestServices() override { registerTestService<IComposer>(); }
     56 
     57    private:
     58     GraphicsComposerHidlEnvironment() {}
     59 
     60     GTEST_DISALLOW_COPY_AND_ASSIGN_(GraphicsComposerHidlEnvironment);
     61 };
     62 
     63 class GraphicsComposerHidlTest : public ::testing::VtsHalHidlTargetTestBase {
     64    protected:
     65     void SetUp() override {
     66         ASSERT_NO_FATAL_FAILURE(
     67             mComposer = std::make_unique<Composer>(
     68                 GraphicsComposerHidlEnvironment::Instance()->getServiceName<IComposer>()));
     69         ASSERT_NO_FATAL_FAILURE(mComposerClient = mComposer->createClient());
     70 
     71         mComposerCallback = new V2_1::vts::GraphicsComposerCallback;
     72         mComposerClient->registerCallback(mComposerCallback);
     73 
     74         // assume the first display is primary and is never removed
     75         mPrimaryDisplay = waitForFirstDisplay();
     76 
     77         mInvalidDisplayId = GetInvalidDisplayId();
     78 
     79         // explicitly disable vsync
     80         mComposerClient->setVsyncEnabled(mPrimaryDisplay, false);
     81         mComposerCallback->setVsyncAllowed(false);
     82 
     83         mWriter = std::make_unique<CommandWriterBase>(1024);
     84         mReader = std::make_unique<V2_1::vts::TestCommandReader>();
     85     }
     86 
     87     void TearDown() override {
     88         ASSERT_EQ(0, mReader->mErrors.size());
     89         ASSERT_EQ(0, mReader->mCompositionChanges.size());
     90         if (mComposerCallback != nullptr) {
     91             EXPECT_EQ(0, mComposerCallback->getInvalidHotplugCount());
     92             EXPECT_EQ(0, mComposerCallback->getInvalidRefreshCount());
     93             EXPECT_EQ(0, mComposerCallback->getInvalidVsyncCount());
     94         }
     95     }
     96 
     97     // returns an invalid display id (one that has not been registered to a
     98     // display.  Currently assuming that a device will never have close to
     99     // std::numeric_limit<uint64_t>::max() displays registered while running tests
    100     Display GetInvalidDisplayId() {
    101         std::vector<Display> validDisplays = mComposerCallback->getDisplays();
    102         uint64_t id = std::numeric_limits<uint64_t>::max();
    103         while (id > 0) {
    104             if (std::find(validDisplays.begin(), validDisplays.end(), id) == validDisplays.end()) {
    105                 return id;
    106             }
    107             id--;
    108         }
    109 
    110         return 0;
    111     }
    112 
    113     void execute() { mComposerClient->execute(mReader.get(), mWriter.get()); }
    114 
    115     // use the slot count usually set by SF
    116     static constexpr uint32_t kBufferSlotCount = 64;
    117 
    118     std::unique_ptr<Composer> mComposer;
    119     std::unique_ptr<ComposerClient> mComposerClient;
    120     sp<V2_1::vts::GraphicsComposerCallback> mComposerCallback;
    121     // the first display and is assumed never to be removed
    122     Display mPrimaryDisplay;
    123     Display mInvalidDisplayId;
    124     std::unique_ptr<CommandWriterBase> mWriter;
    125     std::unique_ptr<V2_1::vts::TestCommandReader> mReader;
    126 
    127    private:
    128     Display waitForFirstDisplay() {
    129         while (true) {
    130             std::vector<Display> displays = mComposerCallback->getDisplays();
    131             if (displays.empty()) {
    132                 usleep(5 * 1000);
    133                 continue;
    134             }
    135 
    136             return displays[0];
    137         }
    138     }
    139 };
    140 
    141 // Tests for IComposerClient::Command.
    142 class GraphicsComposerHidlCommandTest : public GraphicsComposerHidlTest {
    143    protected:
    144     void SetUp() override {
    145         ASSERT_NO_FATAL_FAILURE(GraphicsComposerHidlTest::SetUp());
    146 
    147         ASSERT_NO_FATAL_FAILURE(mGralloc = std::make_unique<Gralloc>());
    148 
    149         mWriter = std::make_unique<CommandWriterBase>(1024);
    150         mReader = std::make_unique<V2_1::vts::TestCommandReader>();
    151     }
    152 
    153     void TearDown() override {
    154         ASSERT_EQ(0, mReader->mErrors.size());
    155         ASSERT_NO_FATAL_FAILURE(GraphicsComposerHidlTest::TearDown());
    156     }
    157 
    158     const native_handle_t* allocate() {
    159         return mGralloc->allocate(
    160                 64, 64, 1, static_cast<common::V1_1::PixelFormat>(PixelFormat::RGBA_8888),
    161                 static_cast<uint64_t>(BufferUsage::CPU_WRITE_OFTEN | BufferUsage::CPU_READ_OFTEN));
    162     }
    163 
    164     void execute() { mComposerClient->execute(mReader.get(), mWriter.get()); }
    165 
    166     std::unique_ptr<CommandWriterBase> mWriter;
    167     std::unique_ptr<V2_1::vts::TestCommandReader> mReader;
    168 
    169    private:
    170     std::unique_ptr<Gralloc> mGralloc;
    171 };
    172 
    173 /**
    174  * Test IComposerClient::getDisplayIdentificationData.
    175  *
    176  * TODO: Check that ports are unique for multiple displays.
    177  */
    178 TEST_F(GraphicsComposerHidlTest, GetDisplayIdentificationData) {
    179     uint8_t port0;
    180     std::vector<uint8_t> data0;
    181     if (mComposerClient->getDisplayIdentificationData(mPrimaryDisplay, &port0, &data0)) {
    182         uint8_t port1;
    183         std::vector<uint8_t> data1;
    184         ASSERT_TRUE(mComposerClient->getDisplayIdentificationData(mPrimaryDisplay, &port1, &data1));
    185 
    186         ASSERT_EQ(port0, port1) << "ports are not stable";
    187         ASSERT_TRUE(data0.size() == data1.size() &&
    188                     std::equal(data0.begin(), data0.end(), data1.begin()))
    189             << "data is not stable";
    190     }
    191 }
    192 
    193 /**
    194  * Test IComposerClient::Command::SET_LAYER_PER_FRAME_METADATA.
    195  */
    196 TEST_F(GraphicsComposerHidlCommandTest, SET_LAYER_PER_FRAME_METADATA) {
    197     Layer layer;
    198     ASSERT_NO_FATAL_FAILURE(layer =
    199                                 mComposerClient->createLayer(mPrimaryDisplay, kBufferSlotCount));
    200 
    201     mWriter->selectDisplay(mPrimaryDisplay);
    202     mWriter->selectLayer(layer);
    203 
    204     /**
    205      * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
    206      * the D65 white point and the SRGB transfer functions.
    207      * Rendering Intent: Colorimetric
    208      * Primaries:
    209      *                  x       y
    210      *  green           0.265   0.690
    211      *  blue            0.150   0.060
    212      *  red             0.680   0.320
    213      *  white (D65)     0.3127  0.3290
    214      */
    215 
    216     std::vector<IComposerClient::PerFrameMetadata> hidlMetadata;
    217     hidlMetadata.push_back({IComposerClient::PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X, 0.680});
    218     hidlMetadata.push_back({IComposerClient::PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y, 0.320});
    219     hidlMetadata.push_back({IComposerClient::PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X, 0.265});
    220     hidlMetadata.push_back({IComposerClient::PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y, 0.690});
    221     hidlMetadata.push_back({IComposerClient::PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X, 0.150});
    222     hidlMetadata.push_back({IComposerClient::PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y, 0.060});
    223     hidlMetadata.push_back({IComposerClient::PerFrameMetadataKey::WHITE_POINT_X, 0.3127});
    224     hidlMetadata.push_back({IComposerClient::PerFrameMetadataKey::WHITE_POINT_Y, 0.3290});
    225     hidlMetadata.push_back({IComposerClient::PerFrameMetadataKey::MAX_LUMINANCE, 100.0});
    226     hidlMetadata.push_back({IComposerClient::PerFrameMetadataKey::MIN_LUMINANCE, 0.1});
    227     hidlMetadata.push_back({IComposerClient::PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL, 78.0});
    228     hidlMetadata.push_back(
    229         {IComposerClient::PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL, 62.0});
    230     mWriter->setLayerPerFrameMetadata(hidlMetadata);
    231     execute();
    232 
    233     if (mReader->mErrors.size() == 1 &&
    234         static_cast<Error>(mReader->mErrors[0].second) == Error::UNSUPPORTED) {
    235         mReader->mErrors.clear();
    236         GTEST_SUCCEED() << "SetLayerPerFrameMetadata is not supported";
    237         ASSERT_NO_FATAL_FAILURE(mComposerClient->destroyLayer(mPrimaryDisplay, layer));
    238         return;
    239     }
    240 
    241     ASSERT_NO_FATAL_FAILURE(mComposerClient->destroyLayer(mPrimaryDisplay, layer));
    242 }
    243 
    244 /**
    245  * Test IComposerClient::getHdrCapabilities_2_3
    246  */
    247 TEST_F(GraphicsComposerHidlTest, GetHdrCapabilities_2_3) {
    248     float maxLuminance;
    249     float maxAverageLuminance;
    250     float minLuminance;
    251     ASSERT_NO_FATAL_FAILURE(mComposerClient->getHdrCapabilities_2_3(
    252         mPrimaryDisplay, &maxLuminance, &maxAverageLuminance, &minLuminance));
    253     ASSERT_TRUE(maxLuminance >= minLuminance);
    254 }
    255 
    256 /**
    257  * Test IComposerClient::getPerFrameMetadataKeys_2_3
    258  */
    259 TEST_F(GraphicsComposerHidlTest, GetPerFrameMetadataKeys_2_3) {
    260     std::vector<IComposerClient::PerFrameMetadataKey> keys;
    261     mComposerClient->getRaw()->getPerFrameMetadataKeys_2_3(
    262         mPrimaryDisplay, [&](const auto tmpError, const auto outKeys) {
    263             if (tmpError != Error::UNSUPPORTED) {
    264                 ASSERT_EQ(Error::NONE, tmpError);
    265                 keys = outKeys;
    266             }
    267         });
    268 }
    269 
    270 /**
    271  * TestIComposerClient::getReadbackBufferAttributes_2_3
    272  */
    273 TEST_F(GraphicsComposerHidlTest, GetReadbackBufferAttributes_2_3) {
    274     Dataspace dataspace;
    275     PixelFormat pixelFormat;
    276 
    277     mComposerClient->getRaw()->getReadbackBufferAttributes_2_3(
    278         mPrimaryDisplay,
    279         [&](const auto tmpError, const auto outPixelFormat, const auto outDataspace) {
    280             if (tmpError != Error::UNSUPPORTED) {
    281                 ASSERT_EQ(Error::NONE, tmpError);
    282                 dataspace = outDataspace;
    283                 pixelFormat = outPixelFormat;
    284             }
    285         });
    286 }
    287 
    288 /**
    289  * Test IComposerClient::getClientTargetSupport_2_3
    290  */
    291 TEST_F(GraphicsComposerHidlTest, GetClientTargetSupport_2_3) {
    292     std::vector<V2_1::Config> configs = mComposerClient->getDisplayConfigs(mPrimaryDisplay);
    293     for (auto config : configs) {
    294         int32_t width = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config,
    295                                                              IComposerClient::Attribute::WIDTH);
    296         int32_t height = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config,
    297                                                               IComposerClient::Attribute::HEIGHT);
    298         ASSERT_LT(0, width);
    299         ASSERT_LT(0, height);
    300 
    301         mComposerClient->setActiveConfig(mPrimaryDisplay, config);
    302 
    303         ASSERT_TRUE(mComposerClient->getClientTargetSupport_2_3(
    304             mPrimaryDisplay, width, height, PixelFormat::RGBA_8888, Dataspace::UNKNOWN));
    305     }
    306 }
    307 /**
    308  * Test IComposerClient::getClientTargetSupport_2_3
    309  *
    310  * Test that IComposerClient::getClientTargetSupport_2_3 returns
    311  * Error::BAD_DISPLAY when passed in an invalid display handle
    312  */
    313 
    314 TEST_F(GraphicsComposerHidlTest, GetClientTargetSupport_2_3BadDisplay) {
    315     std::vector<V2_1::Config> configs = mComposerClient->getDisplayConfigs(mPrimaryDisplay);
    316     for (auto config : configs) {
    317         int32_t width = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config,
    318                                                              IComposerClient::Attribute::WIDTH);
    319         int32_t height = mComposerClient->getDisplayAttribute(mPrimaryDisplay, config,
    320                                                               IComposerClient::Attribute::HEIGHT);
    321         ASSERT_LT(0, width);
    322         ASSERT_LT(0, height);
    323 
    324         mComposerClient->setActiveConfig(mPrimaryDisplay, config);
    325 
    326         Error error = mComposerClient->getRaw()->getClientTargetSupport_2_3(
    327             mInvalidDisplayId, width, height, PixelFormat::RGBA_8888, Dataspace::UNKNOWN);
    328 
    329         EXPECT_EQ(Error::BAD_DISPLAY, error);
    330     }
    331 }
    332 
    333 /**
    334  * Test IComposerClient::getRenderIntents_2_3
    335  */
    336 TEST_F(GraphicsComposerHidlTest, GetRenderIntents_2_3) {
    337     std::vector<ColorMode> modes = mComposerClient->getColorModes_2_3(mPrimaryDisplay);
    338     for (auto mode : modes) {
    339         std::vector<RenderIntent> intents =
    340             mComposerClient->getRenderIntents_2_3(mPrimaryDisplay, mode);
    341 
    342         bool isHdr;
    343         switch (mode) {
    344             case ColorMode::BT2100_PQ:
    345             case ColorMode::BT2100_HLG:
    346                 isHdr = true;
    347                 break;
    348             default:
    349                 isHdr = false;
    350                 break;
    351         }
    352         RenderIntent requiredIntent =
    353             isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
    354 
    355         auto iter = std::find(intents.cbegin(), intents.cend(), requiredIntent);
    356         EXPECT_NE(intents.cend(), iter);
    357     }
    358 }
    359 
    360 /*
    361  * Test IComposerClient::getRenderIntents_2_3
    362  *
    363  * Test that IComposerClient::getRenderIntents_2_3 returns Error::BAD_DISPLAY when
    364  * passed an invalid display handle
    365  */
    366 TEST_F(GraphicsComposerHidlTest, GetRenderIntents_2_3BadDisplay) {
    367     std::vector<ColorMode> modes = mComposerClient->getColorModes_2_3(mPrimaryDisplay);
    368     for (auto mode : modes) {
    369         mComposerClient->getRaw()->getRenderIntents_2_3(
    370             mInvalidDisplayId, mode,
    371             [&](const auto& tmpError, const auto&) { EXPECT_EQ(Error::BAD_DISPLAY, tmpError); });
    372     }
    373 }
    374 
    375 /*
    376  * Test IComposerClient::getRenderIntents_2_3
    377  *
    378  * Test that IComposerClient::getRenderIntents_2_3 returns Error::BAD_PARAMETER when
    379  * pased either an invalid Color mode or an invalid Render Intent
    380  */
    381 TEST_F(GraphicsComposerHidlTest, GetRenderIntents_2_3BadParameter) {
    382     mComposerClient->getRaw()->getRenderIntents_2_3(
    383         mPrimaryDisplay, static_cast<ColorMode>(-1),
    384         [&](const auto& tmpError, const auto&) { EXPECT_EQ(Error::BAD_PARAMETER, tmpError); });
    385 }
    386 
    387 /**
    388  * IComposerClient::getColorModes_2_3
    389  */
    390 TEST_F(GraphicsComposerHidlTest, GetColorModes_2_3) {
    391     std::vector<ColorMode> colorModes = mComposerClient->getColorModes_2_3(mPrimaryDisplay);
    392 
    393     auto native = std::find(colorModes.cbegin(), colorModes.cend(), ColorMode::NATIVE);
    394     ASSERT_NE(colorModes.cend(), native);
    395 }
    396 
    397 /*
    398  * Test IComposerClient::getColorModes_2_3
    399  *
    400  * Test that IComposerClient::getColorModes_2_3 returns Error::BAD_DISPLAY when
    401  * passed an invalid display handle
    402  */
    403 TEST_F(GraphicsComposerHidlTest, GetColorMode_2_3BadDisplay) {
    404     mComposerClient->getRaw()->getColorModes_2_3(
    405         mInvalidDisplayId,
    406         [&](const auto& tmpError, const auto&) { ASSERT_EQ(Error::BAD_DISPLAY, tmpError); });
    407 }
    408 
    409 /**
    410  * IComposerClient::setColorMode_2_3
    411  */
    412 TEST_F(GraphicsComposerHidlTest, SetColorMode_2_3) {
    413     std::vector<ColorMode> colorModes = mComposerClient->getColorModes_2_3(mPrimaryDisplay);
    414     for (auto mode : colorModes) {
    415         std::vector<RenderIntent> intents =
    416             mComposerClient->getRenderIntents_2_3(mPrimaryDisplay, mode);
    417         for (auto intent : intents) {
    418             ASSERT_NO_FATAL_FAILURE(
    419                 mComposerClient->setColorMode_2_3(mPrimaryDisplay, mode, intent));
    420         }
    421     }
    422 
    423     ASSERT_NO_FATAL_FAILURE(mComposerClient->setColorMode_2_3(mPrimaryDisplay, ColorMode::NATIVE,
    424                                                               RenderIntent::COLORIMETRIC));
    425 }
    426 
    427 /*
    428  * Test IComposerClient::setColorMode_2_3
    429  *
    430  * Test that IComposerClient::setColorMode_2_3 returns an Error::BAD_DISPLAY
    431  * when passed an invalid display handle
    432  */
    433 TEST_F(GraphicsComposerHidlTest, SetColorMode_2_3BadDisplay) {
    434     Error error = mComposerClient->getRaw()->setColorMode_2_3(mInvalidDisplayId, ColorMode::NATIVE,
    435                                                               RenderIntent::COLORIMETRIC);
    436 
    437     ASSERT_EQ(Error::BAD_DISPLAY, error);
    438 }
    439 
    440 /*
    441  * Test IComposerClient::setColorMode_2_3
    442  *
    443  * Test that IComposerClient::setColorMode_2_3 returns Error::BAD_PARAMETER when
    444  * passed an invalid Color mode or an invalid render intent
    445  */
    446 TEST_F(GraphicsComposerHidlTest, SetColorMode_2_3BadParameter) {
    447     Error colorModeError = mComposerClient->getRaw()->setColorMode_2_3(
    448         mPrimaryDisplay, static_cast<ColorMode>(-1), RenderIntent::COLORIMETRIC);
    449     EXPECT_EQ(Error::BAD_PARAMETER, colorModeError);
    450 
    451     Error renderIntentError = mComposerClient->getRaw()->setColorMode_2_3(
    452         mPrimaryDisplay, ColorMode::NATIVE, static_cast<RenderIntent>(-1));
    453     EXPECT_EQ(Error::BAD_PARAMETER, renderIntentError);
    454 }
    455 
    456 /**
    457  * Test IComposerClient::Command::SET_LAYER_COLOR_TRANSFORM.
    458  * TODO Add color to the layer, use matrix to keep only red component,
    459  * and check.
    460  */
    461 TEST_F(GraphicsComposerHidlTest, SetLayerColorTransform) {
    462     Layer layer;
    463     ASSERT_NO_FATAL_FAILURE(layer =
    464                                 mComposerClient->createLayer(mPrimaryDisplay, kBufferSlotCount));
    465     mWriter->selectDisplay(mPrimaryDisplay);
    466     mWriter->selectLayer(layer);
    467 
    468     // clang-format off
    469     const std::array<float, 16> matrix = {{
    470         1.0f, 0.0f, 0.0f, 0.0f,
    471         0.0f, 1.0f, 0.0f, 0.0f,
    472         0.0f, 0.0f, 1.0f, 0.0f,
    473         0.0f, 0.0f, 0.0f, 1.0f,
    474     }};
    475     // clang-format on
    476 
    477     mWriter->setLayerColorTransform(matrix.data());
    478     execute();
    479 
    480     if (mReader->mErrors.size() == 1 &&
    481         static_cast<Error>(mReader->mErrors[0].second) == Error::UNSUPPORTED) {
    482         mReader->mErrors.clear();
    483         GTEST_SUCCEED() << "setLayerColorTransform is not supported";
    484         return;
    485     }
    486 }
    487 
    488 TEST_F(GraphicsComposerHidlTest, GetDisplayedContentSamplingAttributes) {
    489     int constexpr invalid = -1;
    490     auto format = static_cast<PixelFormat>(invalid);
    491     auto dataspace = static_cast<Dataspace>(invalid);
    492     auto componentMask = static_cast<hidl_bitfield<IComposerClient::FormatColorComponent>>(invalid);
    493     auto error = mComposerClient->getDisplayedContentSamplingAttributes(mPrimaryDisplay, format,
    494                                                                         dataspace, componentMask);
    495 
    496     if (error == Error::UNSUPPORTED) {
    497         SUCCEED() << "Device does not support optional extension. Test skipped";
    498         return;
    499     }
    500 
    501     EXPECT_EQ(error, Error::NONE);
    502     EXPECT_NE(format, static_cast<PixelFormat>(invalid));
    503     EXPECT_NE(dataspace, static_cast<Dataspace>(invalid));
    504     EXPECT_NE(componentMask,
    505               static_cast<hidl_bitfield<IComposerClient::FormatColorComponent>>(invalid));
    506 };
    507 
    508 TEST_F(GraphicsComposerHidlTest, SetDisplayedContentSamplingEnabled) {
    509     auto const maxFrames = 10;
    510     auto const enableAllComponents = 0;
    511     auto error = mComposerClient->setDisplayedContentSamplingEnabled(
    512         mPrimaryDisplay, IComposerClient::DisplayedContentSampling::ENABLE, enableAllComponents,
    513         maxFrames);
    514     if (error == Error::UNSUPPORTED) {
    515         SUCCEED() << "Device does not support optional extension. Test skipped";
    516         return;
    517     }
    518     EXPECT_EQ(error, Error::NONE);
    519 
    520     error = mComposerClient->setDisplayedContentSamplingEnabled(
    521         mPrimaryDisplay, IComposerClient::DisplayedContentSampling::DISABLE, enableAllComponents,
    522         maxFrames);
    523     EXPECT_EQ(error, Error::NONE);
    524 }
    525 
    526 TEST_F(GraphicsComposerHidlTest, GetDisplayedContentSample) {
    527     int constexpr invalid = -1;
    528     auto format = static_cast<PixelFormat>(invalid);
    529     auto dataspace = static_cast<Dataspace>(invalid);
    530     auto componentMask = static_cast<hidl_bitfield<IComposerClient::FormatColorComponent>>(invalid);
    531     auto error = mComposerClient->getDisplayedContentSamplingAttributes(mPrimaryDisplay, format,
    532                                                                         dataspace, componentMask);
    533 
    534     uint64_t maxFrames = 10;
    535     uint64_t timestamp = 0;
    536     uint64_t frameCount = 0;
    537     hidl_array<hidl_vec<uint64_t>, 4> histogram;
    538     error = mComposerClient->getDisplayedContentSample(mPrimaryDisplay, maxFrames, timestamp,
    539                                                        frameCount, histogram[0], histogram[1],
    540                                                        histogram[2], histogram[3]);
    541     if (error == Error::UNSUPPORTED) {
    542         SUCCEED() << "Device does not support optional extension. Test skipped";
    543         return;
    544     }
    545 
    546     EXPECT_EQ(error, Error::NONE);
    547     EXPECT_LE(frameCount, maxFrames);
    548     for (auto i = 0; i < histogram.size(); i++) {
    549         if (componentMask & (1 << i)) {
    550             EXPECT_NE(histogram[i].size(), 0);
    551         } else {
    552             EXPECT_EQ(histogram[i].size(), 0);
    553         }
    554     }
    555 }
    556 
    557 /*
    558  * getDisplayCapabilities is required in composer 2.3
    559  * Test some constraints.
    560  */
    561 TEST_F(GraphicsComposerHidlTest, getDisplayCapabilitiesBasic) {
    562     std::vector<IComposerClient::DisplayCapability> capabilities;
    563     const auto error = mComposerClient->getDisplayCapabilities(mPrimaryDisplay, &capabilities);
    564     ASSERT_EQ(Error::NONE, error);
    565     const bool hasDozeSupport =
    566             std::find(capabilities.begin(), capabilities.end(),
    567                       IComposerClient::DisplayCapability::DOZE) != capabilities.end();
    568     EXPECT_EQ(mComposerClient->getDozeSupport(mPrimaryDisplay), hasDozeSupport);
    569     bool hasBrightnessSupport =
    570             std::find(capabilities.begin(), capabilities.end(),
    571                       IComposerClient::DisplayCapability::BRIGHTNESS) != capabilities.end();
    572     EXPECT_EQ(mComposerClient->getDisplayBrightnessSupport(mPrimaryDisplay), hasBrightnessSupport);
    573 }
    574 
    575 TEST_F(GraphicsComposerHidlTest, getDisplayCapabilitiesBadDisplay) {
    576     std::vector<IComposerClient::DisplayCapability> capabilities;
    577     const auto error = mComposerClient->getDisplayCapabilities(mInvalidDisplayId, &capabilities);
    578     EXPECT_EQ(Error::BAD_DISPLAY, error);
    579 }
    580 
    581 TEST_F(GraphicsComposerHidlTest, SetLayerPerFrameMetadataBlobs) {
    582     Layer layer;
    583     ASSERT_NO_FATAL_FAILURE(layer =
    584                                 mComposerClient->createLayer(mPrimaryDisplay, kBufferSlotCount));
    585 
    586     mWriter->selectDisplay(mPrimaryDisplay);
    587     mWriter->selectLayer(layer);
    588 
    589     std::vector<IComposerClient::PerFrameMetadataBlob> metadata;
    590     metadata.push_back(
    591         {IComposerClient::PerFrameMetadataKey::HDR10_PLUS_SEI, std::vector<uint8_t>(1, 0xff)});
    592 
    593     mWriter->setLayerPerFrameMetadataBlobs(metadata);
    594     execute();
    595 
    596     if (mReader->mErrors.size() == 1 &&
    597         static_cast<Error>(mReader->mErrors[0].second) == Error::UNSUPPORTED) {
    598         mReader->mErrors.clear();
    599         GTEST_SUCCEED() << "setLayerDynamicPerFrameMetadata is not supported";
    600         return;
    601     }
    602 }
    603 
    604 /*
    605  * Test that if brightness operations are supported, setDisplayBrightness works as expected.
    606  */
    607 TEST_F(GraphicsComposerHidlTest, setDisplayBrightness) {
    608     std::vector<IComposerClient::DisplayCapability> capabilities;
    609     const auto error = mComposerClient->getDisplayCapabilities(mPrimaryDisplay, &capabilities);
    610     ASSERT_EQ(Error::NONE, error);
    611     bool brightnessSupport =
    612             std::find(capabilities.begin(), capabilities.end(),
    613                       IComposerClient::DisplayCapability::BRIGHTNESS) != capabilities.end();
    614     if (!brightnessSupport) {
    615         EXPECT_EQ(mComposerClient->getRaw()->setDisplayBrightness(mPrimaryDisplay, 0.5f),
    616                   Error::UNSUPPORTED);
    617         GTEST_SUCCEED() << "Brightness operations are not supported";
    618         return;
    619     }
    620 
    621     EXPECT_EQ(mComposerClient->setDisplayBrightness(mPrimaryDisplay, 0.0f), Error::NONE);
    622     EXPECT_EQ(mComposerClient->setDisplayBrightness(mPrimaryDisplay, 0.5f), Error::NONE);
    623     EXPECT_EQ(mComposerClient->setDisplayBrightness(mPrimaryDisplay, 1.0f), Error::NONE);
    624     EXPECT_EQ(mComposerClient->setDisplayBrightness(mPrimaryDisplay, -1.0f), Error::NONE);
    625 
    626     EXPECT_EQ(mComposerClient->setDisplayBrightness(mPrimaryDisplay, +2.0f), Error::BAD_PARAMETER);
    627     EXPECT_EQ(mComposerClient->setDisplayBrightness(mPrimaryDisplay, -2.0f), Error::BAD_PARAMETER);
    628 }
    629 
    630 }  // namespace
    631 }  // namespace vts
    632 }  // namespace V2_3
    633 }  // namespace composer
    634 }  // namespace graphics
    635 }  // namespace hardware
    636 }  // namespace android
    637 
    638 int main(int argc, char** argv) {
    639     using android::hardware::graphics::composer::V2_3::vts::GraphicsComposerHidlEnvironment;
    640     ::testing::AddGlobalTestEnvironment(GraphicsComposerHidlEnvironment::Instance());
    641     ::testing::InitGoogleTest(&argc, argv);
    642     GraphicsComposerHidlEnvironment::Instance()->init(&argc, argv);
    643     int status = RUN_ALL_TESTS();
    644     return status;
    645 }
    646