Home | History | Annotate | Download | only in hwc2
      1 /*
      2  * Copyright (C) 2016 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 #include <sstream>
     18 #include <cutils/log.h>
     19 #include <ui/Rect.h>
     20 
     21 #define HWC2_INCLUDE_STRINGIFICATION
     22 #define HWC2_USE_CPP11
     23 #include <hardware/hwcomposer2.h>
     24 #undef HWC2_INCLUDE_STRINGIFICATION
     25 #undef HWC2_USE_CPP11
     26 
     27 #include "Hwc2TestBuffer.h"
     28 #include "Hwc2TestProperties.h"
     29 
     30 Hwc2TestBufferArea::Hwc2TestBufferArea(Hwc2TestCoverage coverage,
     31         const Area& displayArea)
     32     : Hwc2TestProperty(mBufferAreas, mCompositionSupport),
     33       mScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteScalars:
     34             (coverage == Hwc2TestCoverage::Basic)? mBasicScalars:
     35             mDefaultScalars),
     36       mDisplayArea(displayArea)
     37 {
     38     update();
     39 }
     40 
     41 std::string Hwc2TestBufferArea::dump() const
     42 {
     43     std::stringstream dmp;
     44     const Area& curr = get();
     45     dmp << "\tbuffer area: width " << curr.width << ", height " << curr.height
     46             << "\n";
     47     return dmp.str();
     48 }
     49 
     50 void Hwc2TestBufferArea::setDependent(Hwc2TestBuffer* buffer)
     51 {
     52     mBuffer = buffer;
     53     if (buffer) {
     54         buffer->updateBufferArea(get());
     55     }
     56 }
     57 
     58 void Hwc2TestBufferArea::setDependent(Hwc2TestSourceCrop* sourceCrop)
     59 {
     60     mSourceCrop = sourceCrop;
     61     if (mSourceCrop) {
     62         mSourceCrop->updateBufferArea(get());
     63     }
     64 }
     65 
     66 void Hwc2TestBufferArea::setDependent(Hwc2TestSurfaceDamage* surfaceDamage)
     67 {
     68     mSurfaceDamage = surfaceDamage;
     69     if (mSurfaceDamage) {
     70         mSurfaceDamage->updateBufferArea(get());
     71     }
     72 }
     73 
     74 void Hwc2TestBufferArea::update()
     75 {
     76     mBufferAreas.clear();
     77 
     78     if (mDisplayArea.width == 0 && mDisplayArea.height == 0) {
     79         mBufferAreas.push_back({0, 0});
     80         return;
     81     }
     82 
     83     for (auto scalar : mScalars) {
     84         mBufferAreas.push_back({static_cast<int32_t>(scalar * mDisplayArea.width),
     85                 static_cast<int32_t>(scalar * mDisplayArea.height)});
     86     }
     87 
     88     updateDependents();
     89 }
     90 
     91 void Hwc2TestBufferArea::updateDependents()
     92 {
     93     const Area& curr = get();
     94 
     95     if (mBuffer)
     96         mBuffer->updateBufferArea(curr);
     97     if (mSourceCrop)
     98         mSourceCrop->updateBufferArea(curr);
     99     if (mSurfaceDamage)
    100         mSurfaceDamage->updateBufferArea(curr);
    101 }
    102 
    103 const std::vector<float> Hwc2TestBufferArea::mDefaultScalars = {
    104     1.0f,
    105 };
    106 
    107 const std::vector<float> Hwc2TestBufferArea::mBasicScalars = {
    108     1.0f, 0.5f,
    109 };
    110 
    111 const std::vector<float> Hwc2TestBufferArea::mCompleteScalars = {
    112     1.0f, 0.75f, 0.5f
    113 };
    114 
    115 
    116 Hwc2TestBlendMode::Hwc2TestBlendMode(Hwc2TestCoverage coverage)
    117     : Hwc2TestProperty(coverage, mCompleteBlendModes, mBasicBlendModes,
    118             mDefaultBlendModes, mCompositionSupport) { }
    119 
    120 std::string Hwc2TestBlendMode::dump() const
    121 {
    122     std::stringstream dmp;
    123     dmp << "\tblend mode: " << getBlendModeName(get()) << "\n";
    124     return dmp.str();
    125 }
    126 
    127 void Hwc2TestBlendMode::setDependent(Hwc2TestColor* color)
    128 {
    129     mColor = color;
    130     updateDependents();
    131 }
    132 
    133 void Hwc2TestBlendMode::updateDependents()
    134 {
    135     if (mColor)
    136         mColor->updateBlendMode(get());
    137 }
    138 
    139 const std::vector<hwc2_blend_mode_t> Hwc2TestBlendMode::mDefaultBlendModes = {
    140     HWC2_BLEND_MODE_NONE,
    141 };
    142 
    143 const std::vector<hwc2_blend_mode_t> Hwc2TestBlendMode::mBasicBlendModes = {
    144     HWC2_BLEND_MODE_NONE,
    145     HWC2_BLEND_MODE_PREMULTIPLIED,
    146 };
    147 
    148 const std::vector<hwc2_blend_mode_t> Hwc2TestBlendMode::mCompleteBlendModes = {
    149     HWC2_BLEND_MODE_NONE,
    150     HWC2_BLEND_MODE_PREMULTIPLIED,
    151     HWC2_BLEND_MODE_COVERAGE,
    152 };
    153 
    154 
    155 Hwc2TestColor::Hwc2TestColor(Hwc2TestCoverage coverage,
    156         hwc2_blend_mode_t blendMode)
    157     : Hwc2TestProperty(mColors, mCompositionSupport),
    158       mBaseColors((coverage == Hwc2TestCoverage::Complete)? mCompleteBaseColors:
    159             (coverage == Hwc2TestCoverage::Basic)? mBasicBaseColors:
    160             mDefaultBaseColors),
    161       mBlendMode(blendMode)
    162 {
    163     update();
    164 }
    165 
    166 std::string Hwc2TestColor::dump() const
    167 {
    168     std::stringstream dmp;
    169     const hwc_color_t& color = get();
    170     dmp << "\tcolor: r " << std::to_string(color.r) << ", g "
    171             << std::to_string(color.g) << ", b " << std::to_string(color.b)
    172             << ", a " << std::to_string(color.a) << "\n";
    173     return dmp.str();
    174 }
    175 
    176 void Hwc2TestColor::updateBlendMode(hwc2_blend_mode_t blendMode)
    177 {
    178     mBlendMode = blendMode;
    179     update();
    180 }
    181 
    182 void Hwc2TestColor::update()
    183 {
    184     if (mBlendMode != HWC2_BLEND_MODE_PREMULTIPLIED) {
    185         mColors = mBaseColors;
    186         return;
    187     }
    188 
    189     mColors.clear();
    190 
    191     for (const hwc_color_t& baseColor : mBaseColors) {
    192         if (baseColor.a >= baseColor.r && baseColor.a >= baseColor.g
    193                 && baseColor.a >= baseColor.b) {
    194             mColors.push_back(baseColor);
    195         }
    196     }
    197 
    198 }
    199 
    200 const std::vector<hwc_color_t> Hwc2TestColor::mDefaultBaseColors = {
    201     {UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX},
    202 };
    203 
    204 const std::vector<hwc_color_t> Hwc2TestColor::mBasicBaseColors = {
    205     {UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX},
    206     {        0,         0,         0,         0},
    207 };
    208 
    209 const std::vector<hwc_color_t> Hwc2TestColor::mCompleteBaseColors = {
    210     {UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX},
    211     {UINT8_MAX, UINT8_MAX, UINT8_MAX,         0},
    212     {UINT8_MAX, UINT8_MAX,         0, UINT8_MAX},
    213     {UINT8_MAX, UINT8_MAX,         0,         0},
    214     {UINT8_MAX,         0, UINT8_MAX, UINT8_MAX},
    215     {UINT8_MAX,         0, UINT8_MAX,         0},
    216     {UINT8_MAX,         0,         0, UINT8_MAX},
    217     {UINT8_MAX,         0,         0,         0},
    218     {        0, UINT8_MAX, UINT8_MAX, UINT8_MAX},
    219     {        0, UINT8_MAX, UINT8_MAX,         0},
    220     {        0, UINT8_MAX,         0, UINT8_MAX},
    221     {        0, UINT8_MAX,         0,         0},
    222     {        0,         0, UINT8_MAX, UINT8_MAX},
    223     {        0,         0, UINT8_MAX,         0},
    224     {        0,         0,         0, UINT8_MAX},
    225     {        0,         0,         0,         0},
    226 };
    227 
    228 
    229 Hwc2TestComposition::Hwc2TestComposition(Hwc2TestCoverage coverage)
    230     : Hwc2TestProperty(coverage, mCompleteCompositions, mBasicCompositions,
    231             mDefaultCompositions, mCompositionSupport) { }
    232 
    233 std::string Hwc2TestComposition::dump() const
    234 {
    235     std::stringstream dmp;
    236     dmp << "\tcomposition: " << getCompositionName(get()) << "\n";
    237     return dmp.str();
    238 }
    239 
    240 const std::vector<hwc2_composition_t> Hwc2TestComposition::mDefaultCompositions = {
    241     HWC2_COMPOSITION_DEVICE,
    242 };
    243 
    244 const std::vector<hwc2_composition_t> Hwc2TestComposition::mBasicCompositions = {
    245     HWC2_COMPOSITION_CLIENT,
    246     HWC2_COMPOSITION_DEVICE,
    247 };
    248 
    249 const std::vector<hwc2_composition_t> Hwc2TestComposition::mCompleteCompositions = {
    250     HWC2_COMPOSITION_CLIENT,
    251     HWC2_COMPOSITION_DEVICE,
    252     HWC2_COMPOSITION_SOLID_COLOR,
    253     HWC2_COMPOSITION_CURSOR,
    254     HWC2_COMPOSITION_SIDEBAND,
    255 };
    256 
    257 
    258 Hwc2TestDataspace::Hwc2TestDataspace(Hwc2TestCoverage coverage)
    259     : Hwc2TestProperty(coverage, completeDataspaces, basicDataspaces,
    260             defaultDataspaces, mCompositionSupport) { }
    261 
    262 std::string Hwc2TestDataspace::dump() const
    263 {
    264     std::stringstream dmp;
    265     dmp << "\tdataspace: " << static_cast<int32_t>(get()) << "\n";
    266     return dmp.str();
    267 }
    268 
    269 const std::vector<android::ui::Dataspace> Hwc2TestDataspace::defaultDataspaces = {
    270     android::ui::Dataspace::UNKNOWN,
    271 };
    272 
    273 const std::vector<android::ui::Dataspace> Hwc2TestDataspace::basicDataspaces = {
    274     android::ui::Dataspace::UNKNOWN,
    275     android::ui::Dataspace::V0_SRGB,
    276 };
    277 
    278 const std::vector<android::ui::Dataspace> Hwc2TestDataspace::completeDataspaces = {
    279     android::ui::Dataspace::UNKNOWN,
    280     android::ui::Dataspace::ARBITRARY,
    281     android::ui::Dataspace::STANDARD_SHIFT,
    282     android::ui::Dataspace::STANDARD_MASK,
    283     android::ui::Dataspace::STANDARD_UNSPECIFIED,
    284     android::ui::Dataspace::STANDARD_BT709,
    285     android::ui::Dataspace::STANDARD_BT601_625,
    286     android::ui::Dataspace::STANDARD_BT601_625_UNADJUSTED,
    287     android::ui::Dataspace::STANDARD_BT601_525,
    288     android::ui::Dataspace::STANDARD_BT601_525_UNADJUSTED,
    289     android::ui::Dataspace::STANDARD_BT2020,
    290     android::ui::Dataspace::STANDARD_BT2020_CONSTANT_LUMINANCE,
    291     android::ui::Dataspace::STANDARD_BT470M,
    292     android::ui::Dataspace::STANDARD_FILM,
    293     android::ui::Dataspace::TRANSFER_SHIFT,
    294     android::ui::Dataspace::TRANSFER_MASK,
    295     android::ui::Dataspace::TRANSFER_UNSPECIFIED,
    296     android::ui::Dataspace::TRANSFER_LINEAR,
    297     android::ui::Dataspace::TRANSFER_SRGB,
    298     android::ui::Dataspace::TRANSFER_SMPTE_170M,
    299     android::ui::Dataspace::TRANSFER_GAMMA2_2,
    300     android::ui::Dataspace::TRANSFER_GAMMA2_8,
    301     android::ui::Dataspace::TRANSFER_ST2084,
    302     android::ui::Dataspace::TRANSFER_HLG,
    303     android::ui::Dataspace::RANGE_SHIFT,
    304     android::ui::Dataspace::RANGE_MASK,
    305     android::ui::Dataspace::RANGE_UNSPECIFIED,
    306     android::ui::Dataspace::RANGE_FULL,
    307     android::ui::Dataspace::RANGE_LIMITED,
    308     android::ui::Dataspace::SRGB_LINEAR,
    309     android::ui::Dataspace::V0_SRGB_LINEAR,
    310     android::ui::Dataspace::SRGB,
    311     android::ui::Dataspace::V0_SRGB,
    312     android::ui::Dataspace::JFIF,
    313     android::ui::Dataspace::V0_JFIF,
    314     android::ui::Dataspace::BT601_625,
    315     android::ui::Dataspace::V0_BT601_625,
    316     android::ui::Dataspace::BT601_525,
    317     android::ui::Dataspace::V0_BT601_525,
    318     android::ui::Dataspace::BT709,
    319     android::ui::Dataspace::V0_BT709,
    320     android::ui::Dataspace::DEPTH,
    321 };
    322 
    323 
    324 Hwc2TestDisplayDimension::Hwc2TestDisplayDimension(Hwc2TestCoverage coverage)
    325     : Hwc2TestProperty(
    326             (coverage == Hwc2TestCoverage::Complete)? mCompleteDisplayDimensions:
    327             (coverage == Hwc2TestCoverage::Basic)? mBasicDisplayDimensions:
    328             mDefaultDisplayDimensions, mCompositionSupport) { }
    329 
    330 std::string Hwc2TestDisplayDimension::dump() const
    331 {
    332     std::stringstream dmp;
    333     const UnsignedArea& curr = get();
    334     dmp << "\tdisplay dimension: " << curr.width<< " x " << curr.height<< "\n";
    335     return dmp.str();
    336 }
    337 
    338 void Hwc2TestDisplayDimension::setDependent(Hwc2TestVirtualBuffer* buffer)
    339 {
    340     mBuffers.insert(buffer);
    341     updateDependents();
    342 }
    343 
    344 void Hwc2TestDisplayDimension::updateDependents()
    345 {
    346     const UnsignedArea& curr = get();
    347 
    348     for (Hwc2TestVirtualBuffer* buffer : mBuffers)
    349         buffer->updateBufferArea({static_cast<int32_t>(curr.width),
    350                 static_cast<int32_t>(curr.height)});
    351 }
    352 
    353 const std::vector<UnsignedArea>
    354         Hwc2TestDisplayDimension::mDefaultDisplayDimensions = {
    355     {1920, 1080},
    356 };
    357 
    358 const std::vector<UnsignedArea>
    359         Hwc2TestDisplayDimension::mBasicDisplayDimensions = {
    360     {640, 480},
    361     {1280, 720},
    362     {1920, 1080},
    363     {1920, 1200},
    364 };
    365 
    366 const std::vector<UnsignedArea>
    367         Hwc2TestDisplayDimension::mCompleteDisplayDimensions = {
    368     {320, 240},
    369     {480, 320},
    370     {640, 480},
    371     {1280, 720},
    372     {1920, 1080},
    373     {1920, 1200},
    374     {2560, 1440},
    375     {2560, 1600},
    376     {3840, 2160},
    377     {4096, 2160},
    378 };
    379 
    380 
    381 Hwc2TestDisplayFrame::Hwc2TestDisplayFrame(Hwc2TestCoverage coverage,
    382         const Area& displayArea)
    383     : Hwc2TestProperty(mDisplayFrames, mCompositionSupport),
    384       mFrectScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteFrectScalars:
    385             (coverage == Hwc2TestCoverage::Basic)? mBasicFrectScalars:
    386             mDefaultFrectScalars),
    387       mDisplayArea(displayArea)
    388 {
    389     update();
    390 }
    391 
    392 std::string Hwc2TestDisplayFrame::dump() const
    393 {
    394     std::stringstream dmp;
    395     const hwc_rect_t& displayFrame = get();
    396     dmp << "\tdisplay frame: left " << displayFrame.left << ", top "
    397             << displayFrame.top << ", right " << displayFrame.right
    398             << ", bottom " << displayFrame.bottom << "\n";
    399     return dmp.str();
    400 }
    401 
    402 void Hwc2TestDisplayFrame::update()
    403 {
    404     mDisplayFrames.clear();
    405 
    406     if (mDisplayArea.width == 0 && mDisplayArea.height == 0) {
    407         mDisplayFrames.push_back({0, 0, 0, 0});
    408         return;
    409     }
    410 
    411     for (const auto& frectScalar : mFrectScalars) {
    412         mDisplayFrames.push_back({
    413                 static_cast<int>(frectScalar.left * mDisplayArea.width),
    414                 static_cast<int>(frectScalar.top * mDisplayArea.height),
    415                 static_cast<int>(frectScalar.right * mDisplayArea.width),
    416                 static_cast<int>(frectScalar.bottom * mDisplayArea.height)});
    417     }
    418 }
    419 
    420 const std::vector<hwc_frect_t> Hwc2TestDisplayFrame::mDefaultFrectScalars = {
    421     {0.0, 0.0, 1.0, 1.0},
    422 };
    423 
    424 const std::vector<hwc_frect_t> Hwc2TestDisplayFrame::mBasicFrectScalars = {
    425     {0.0, 0.0, 1.0, 1.0},
    426     {0.0, 0.0, 1.0, 0.05},
    427     {0.0, 0.95, 1.0, 1.0},
    428 };
    429 
    430 const std::vector<hwc_frect_t> Hwc2TestDisplayFrame::mCompleteFrectScalars = {
    431     {0.0, 0.0, 1.0, 1.0},
    432     {0.0, 0.05, 1.0, 0.95},
    433     {0.0, 0.05, 1.0, 1.0},
    434     {0.0, 0.0, 1.0, 0.05},
    435     {0.0, 0.95, 1.0, 1.0},
    436     {0.25, 0.0, 0.75, 0.35},
    437     {0.25, 0.25, 0.75, 0.75},
    438 };
    439 
    440 
    441 Hwc2TestPlaneAlpha::Hwc2TestPlaneAlpha(Hwc2TestCoverage coverage)
    442     : Hwc2TestProperty(coverage, mCompletePlaneAlphas, mBasicPlaneAlphas,
    443             mDefaultPlaneAlphas, mCompositionSupport) { }
    444 
    445 std::string Hwc2TestPlaneAlpha::dump() const
    446 {
    447     std::stringstream dmp;
    448     dmp << "\tplane alpha: " << get() << "\n";
    449     return dmp.str();
    450 }
    451 
    452 const std::vector<float> Hwc2TestPlaneAlpha::mDefaultPlaneAlphas = {
    453     1.0f,
    454 };
    455 
    456 const std::vector<float> Hwc2TestPlaneAlpha::mBasicPlaneAlphas = {
    457     1.0f, 0.0f,
    458 };
    459 
    460 const std::vector<float> Hwc2TestPlaneAlpha::mCompletePlaneAlphas = {
    461     1.0f, 0.75f, 0.5f, 0.25f, 0.0f,
    462 };
    463 
    464 
    465 Hwc2TestSourceCrop::Hwc2TestSourceCrop(Hwc2TestCoverage coverage,
    466         const Area& bufferArea)
    467     : Hwc2TestProperty(mSourceCrops, mCompositionSupport),
    468       mFrectScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteFrectScalars:
    469             (coverage == Hwc2TestCoverage::Basic)? mBasicFrectScalars:
    470             mDefaultFrectScalars),
    471       mBufferArea(bufferArea)
    472 {
    473     update();
    474 }
    475 
    476 std::string Hwc2TestSourceCrop::dump() const
    477 {
    478     std::stringstream dmp;
    479     const hwc_frect_t& sourceCrop = get();
    480     dmp << "\tsource crop: left " << sourceCrop.left << ", top "
    481             << sourceCrop.top << ", right " << sourceCrop.right << ", bottom "
    482             << sourceCrop.bottom << "\n";
    483     return dmp.str();
    484 }
    485 
    486 void Hwc2TestSourceCrop::updateBufferArea(const Area& bufferArea)
    487 {
    488     mBufferArea = bufferArea;
    489     update();
    490 }
    491 
    492 void Hwc2TestSourceCrop::update()
    493 {
    494     mSourceCrops.clear();
    495 
    496     if (mBufferArea.width == 0 && mBufferArea.height == 0) {
    497         mSourceCrops.push_back({0, 0, 0, 0});
    498         return;
    499     }
    500 
    501     for (const auto& frectScalar : mFrectScalars) {
    502         mSourceCrops.push_back({
    503                 frectScalar.left * mBufferArea.width,
    504                 frectScalar.top * mBufferArea.height,
    505                 frectScalar.right * mBufferArea.width,
    506                 frectScalar.bottom * mBufferArea.height});
    507     }
    508 }
    509 
    510 const std::vector<hwc_frect_t> Hwc2TestSourceCrop::mDefaultFrectScalars = {
    511     {0.0, 0.0, 1.0, 1.0},
    512 };
    513 
    514 const std::vector<hwc_frect_t> Hwc2TestSourceCrop::mBasicFrectScalars = {
    515     {0.0, 0.0, 1.0, 1.0},
    516     {0.0, 0.0, 0.5, 0.5},
    517     {0.5, 0.5, 1.0, 1.0},
    518 };
    519 
    520 const std::vector<hwc_frect_t> Hwc2TestSourceCrop::mCompleteFrectScalars = {
    521     {0.0, 0.0, 1.0, 1.0},
    522     {0.0, 0.0, 0.5, 0.5},
    523     {0.5, 0.5, 1.0, 1.0},
    524     {0.0, 0.0, 0.25, 0.25},
    525     {0.25, 0.25, 0.75, 0.75},
    526 };
    527 
    528 
    529 Hwc2TestSurfaceDamage::Hwc2TestSurfaceDamage(Hwc2TestCoverage coverage)
    530     : Hwc2TestProperty(mSurfaceDamages, mCompositionSupport),
    531       mRegionScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteRegionScalars:
    532             (coverage == Hwc2TestCoverage::Basic)? mBasicRegionScalars:
    533             mDefaultRegionScalars)
    534 {
    535     update();
    536 }
    537 
    538 Hwc2TestSurfaceDamage::~Hwc2TestSurfaceDamage()
    539 {
    540     freeSurfaceDamages();
    541 }
    542 
    543 std::string Hwc2TestSurfaceDamage::dump() const
    544 {
    545     std::stringstream dmp;
    546 
    547     const hwc_region_t& curr = get();
    548     dmp << "\tsurface damage: region count " << curr.numRects << "\n";
    549     for (size_t i = 0; i < curr.numRects; i++) {
    550         const hwc_rect_t& rect = curr.rects[i];
    551         dmp << "\t\trect: left " << rect.left << ", top " << rect.top
    552                 << ", right " << rect.right << ", bottom " << rect.bottom << "\n";
    553     }
    554 
    555     return dmp.str();
    556 }
    557 
    558 void Hwc2TestSurfaceDamage::updateBufferArea(const Area& bufferArea)
    559 {
    560     mBufferArea = bufferArea;
    561     update();
    562 }
    563 
    564 void Hwc2TestSurfaceDamage::update()
    565 {
    566     freeSurfaceDamages();
    567 
    568     if (mBufferArea.width == 0 && mBufferArea.height == 0) {
    569         mSurfaceDamages.push_back({0, nullptr});
    570         return;
    571     }
    572 
    573     hwc_region_t damage;
    574 
    575     for (const auto& regionScalar : mRegionScalars) {
    576         damage.numRects = regionScalar.size();
    577 
    578         if (damage.numRects > 0) {
    579             hwc_rect_t* rects = new hwc_rect_t[damage.numRects];
    580             if (!rects) {
    581                 ALOGW("failed to allocate new hwc_rect_t array");
    582                 continue;
    583             }
    584 
    585             for (size_t i = 0; i < damage.numRects; i++) {
    586                 rects[i].left = regionScalar[i].left * mBufferArea.width;
    587                 rects[i].top = regionScalar[i].top * mBufferArea.height;
    588                 rects[i].right = regionScalar[i].right * mBufferArea.width;
    589                 rects[i].bottom = regionScalar[i].bottom * mBufferArea.height;
    590             }
    591 
    592             damage.rects = static_cast<hwc_rect_t const*>(rects);
    593         } else {
    594             damage.rects = nullptr;
    595         }
    596 
    597         mSurfaceDamages.push_back(damage);
    598     }
    599 }
    600 
    601 void Hwc2TestSurfaceDamage::freeSurfaceDamages()
    602 {
    603     for (const auto& surfaceDamage : mSurfaceDamages) {
    604         if (surfaceDamage.numRects > 0 && surfaceDamage.rects)
    605             delete[] surfaceDamage.rects;
    606     }
    607     mSurfaceDamages.clear();
    608 }
    609 
    610 const std::vector<std::vector<hwc_frect_t>> Hwc2TestSurfaceDamage::mDefaultRegionScalars = {
    611     {{}},
    612 };
    613 
    614 const std::vector<std::vector<hwc_frect_t>> Hwc2TestSurfaceDamage::mBasicRegionScalars = {
    615     {{}},
    616     {{0.0, 0.0, 1.0, 1.0}},
    617 };
    618 
    619 const std::vector<std::vector<hwc_frect_t>> Hwc2TestSurfaceDamage::mCompleteRegionScalars = {
    620     {{}},
    621     {{0.0, 0.0, 1.0, 1.0}},
    622     {{0.0, 0.0, 0.5, 0.5}, {0.5, 0.5, 1.0, 1.0}},
    623 };
    624 
    625 
    626 Hwc2TestTransform::Hwc2TestTransform(Hwc2TestCoverage coverage)
    627     : Hwc2TestProperty(coverage, mCompleteTransforms, mBasicTransforms,
    628             mDefaultTransforms, mCompositionSupport) { }
    629 
    630 std::string Hwc2TestTransform::dump() const
    631 {
    632     std::stringstream dmp;
    633     dmp << "\ttransform: " << getTransformName(get()) << "\n";
    634     return dmp.str();
    635 }
    636 
    637 const std::vector<hwc_transform_t> Hwc2TestTransform::mDefaultTransforms = {
    638     static_cast<hwc_transform_t>(0),
    639 };
    640 
    641 const std::vector<hwc_transform_t> Hwc2TestTransform::mBasicTransforms = {
    642     static_cast<hwc_transform_t>(0),
    643     HWC_TRANSFORM_FLIP_H,
    644     HWC_TRANSFORM_FLIP_V,
    645     HWC_TRANSFORM_ROT_90,
    646 };
    647 
    648 const std::vector<hwc_transform_t> Hwc2TestTransform::mCompleteTransforms = {
    649     static_cast<hwc_transform_t>(0),
    650     HWC_TRANSFORM_FLIP_H,
    651     HWC_TRANSFORM_FLIP_V,
    652     HWC_TRANSFORM_ROT_90,
    653     HWC_TRANSFORM_ROT_180,
    654     HWC_TRANSFORM_ROT_270,
    655     HWC_TRANSFORM_FLIP_H_ROT_90,
    656     HWC_TRANSFORM_FLIP_V_ROT_90,
    657 };
    658 
    659 
    660 Hwc2TestVisibleRegion::~Hwc2TestVisibleRegion()
    661 {
    662     release();
    663 }
    664 
    665 std::string Hwc2TestVisibleRegion::dump() const
    666 {
    667     std::stringstream dmp;
    668 
    669     const hwc_region_t& curr = get();
    670     dmp << "\tvisible region: region count " << curr.numRects << "\n";
    671     for (size_t i = 0; i < curr.numRects; i++) {
    672         const hwc_rect_t& rect = curr.rects[i];
    673         dmp << "\t\trect: left " << rect.left << ", top " << rect.top
    674                 << ", right " << rect.right << ", bottom " << rect.bottom << "\n";
    675     }
    676 
    677     return dmp.str();
    678 }
    679 
    680 void Hwc2TestVisibleRegion::set(const android::Region& visibleRegion)
    681 {
    682     release();
    683 
    684     size_t size = 0;
    685     const android::Rect* rects = visibleRegion.getArray(&size);
    686 
    687     mVisibleRegion.numRects = size;
    688     mVisibleRegion.rects = nullptr;
    689 
    690     if (size > 0) {
    691         hwc_rect_t* hwcRects = new hwc_rect_t[size];
    692         for (size_t i = 0; i < size; i++) {
    693             hwcRects[i].left = rects[i].left;
    694             hwcRects[i].top = rects[i].top;
    695             hwcRects[i].right = rects[i].right;
    696             hwcRects[i].bottom = rects[i].bottom;
    697         }
    698         mVisibleRegion.rects = hwcRects;
    699     }
    700 }
    701 
    702 hwc_region_t Hwc2TestVisibleRegion::get() const
    703 {
    704     return mVisibleRegion;
    705 }
    706 
    707 void Hwc2TestVisibleRegion::release()
    708 {
    709     if (mVisibleRegion.numRects > 0 && mVisibleRegion.rects)
    710         delete[] mVisibleRegion.rects;
    711     mVisibleRegion.rects = nullptr;
    712     mVisibleRegion.numRects = 0;
    713 }
    714 
    715 /* Identifies which layer properties are supported by each composition type.
    716  * hwc2_composition_t values range from:
    717  *  HWC2_COMPOSITION_INVALID = 0,
    718  *  HWC2_COMPOSITION_CLIENT = 1,
    719  *  HWC2_COMPOSITION_DEVICE = 2,
    720  *  HWC2_COMPOSITION_SOLID_COLOR = 3,
    721  *  HWC2_COMPOSITION_CURSOR = 4,
    722  *  HWC2_COMPOSITION_SIDEBAND = 5,
    723  *
    724  * Each property array can be indexed by a hwc2_composition_t value.
    725  * By using an array instead of a more complex data structure, runtimes for
    726  * some test cases showed a noticeable improvement.
    727  */
    728 
    729 /*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
    730 const std::array<bool, 6> Hwc2TestBufferArea::mCompositionSupport = {{
    731     false,   true,    true,    false,   true,    true,
    732 }};
    733 
    734 /*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
    735 const std::array<bool, 6> Hwc2TestBlendMode::mCompositionSupport = {{
    736     false,   true,    true,    false,   true,    true,
    737 }};
    738 
    739 /*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
    740 const std::array<bool, 6> Hwc2TestColor::mCompositionSupport = {{
    741     false,   false,   false,   true,    false,   false,
    742 }};
    743 
    744 /*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
    745 const std::array<bool, 6> Hwc2TestComposition::mCompositionSupport = {{
    746     false,   true,    true,    true,    true,    true,
    747 }};
    748 
    749 /*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
    750 const std::array<bool, 6> Hwc2TestDataspace::mCompositionSupport = {{
    751     false,   true,    true,    true,    true,    false,
    752 }};
    753 
    754 /*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
    755 const std::array<bool, 6> Hwc2TestDisplayDimension::mCompositionSupport = {{
    756     false,   true,    true,    true,    true,    true,
    757 }};
    758 
    759 /*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
    760 const std::array<bool, 6> Hwc2TestDisplayFrame::mCompositionSupport = {{
    761     false,   true,    true,    true,    false,   true,
    762 }};
    763 
    764 /*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
    765 const std::array<bool, 6> Hwc2TestPlaneAlpha::mCompositionSupport = {{
    766     false,   true,    true,    true,    true,    true,
    767 }};
    768 
    769 /*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
    770 const std::array<bool, 6> Hwc2TestSourceCrop::mCompositionSupport = {{
    771     false,   true,    true,    false,   true,    false,
    772 }};
    773 
    774 /*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
    775 const std::array<bool, 6> Hwc2TestSurfaceDamage::mCompositionSupport = {{
    776     false,   false,   true,    false,   true,    false,
    777 }};
    778 
    779 /*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
    780 const std::array<bool, 6> Hwc2TestTransform::mCompositionSupport = {{
    781     false,   true,    true,    false,   true,    true,
    782 }};
    783