| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <sstream> |
| #include <cutils/log.h> |
| #include <ui/Rect.h> |
| |
| #define HWC2_INCLUDE_STRINGIFICATION |
| #define HWC2_USE_CPP11 |
| #include <hardware/hwcomposer2.h> |
| #undef HWC2_INCLUDE_STRINGIFICATION |
| #undef HWC2_USE_CPP11 |
| |
| #include "Hwc2TestBuffer.h" |
| #include "Hwc2TestProperties.h" |
| |
| Hwc2TestBufferArea::Hwc2TestBufferArea(Hwc2TestCoverage coverage, |
| const Area& displayArea) |
| : Hwc2TestProperty(mBufferAreas, mCompositionSupport), |
| mScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteScalars: |
| (coverage == Hwc2TestCoverage::Basic)? mBasicScalars: |
| mDefaultScalars), |
| mDisplayArea(displayArea) |
| { |
| update(); |
| } |
| |
| std::string Hwc2TestBufferArea::dump() const |
| { |
| std::stringstream dmp; |
| const Area& curr = get(); |
| dmp << "\tbuffer area: width " << curr.width << ", height " << curr.height |
| << "\n"; |
| return dmp.str(); |
| } |
| |
| void Hwc2TestBufferArea::setDependent(Hwc2TestBuffer* buffer) |
| { |
| mBuffer = buffer; |
| if (buffer) { |
| buffer->updateBufferArea(get()); |
| } |
| } |
| |
| void Hwc2TestBufferArea::setDependent(Hwc2TestSourceCrop* sourceCrop) |
| { |
| mSourceCrop = sourceCrop; |
| if (mSourceCrop) { |
| mSourceCrop->updateBufferArea(get()); |
| } |
| } |
| |
| void Hwc2TestBufferArea::setDependent(Hwc2TestSurfaceDamage* surfaceDamage) |
| { |
| mSurfaceDamage = surfaceDamage; |
| if (mSurfaceDamage) { |
| mSurfaceDamage->updateBufferArea(get()); |
| } |
| } |
| |
| void Hwc2TestBufferArea::update() |
| { |
| mBufferAreas.clear(); |
| |
| if (mDisplayArea.width == 0 && mDisplayArea.height == 0) { |
| mBufferAreas.push_back({0, 0}); |
| return; |
| } |
| |
| for (auto scalar : mScalars) { |
| mBufferAreas.push_back({static_cast<int32_t>(scalar * mDisplayArea.width), |
| static_cast<int32_t>(scalar * mDisplayArea.height)}); |
| } |
| |
| updateDependents(); |
| } |
| |
| void Hwc2TestBufferArea::updateDependents() |
| { |
| const Area& curr = get(); |
| |
| if (mBuffer) |
| mBuffer->updateBufferArea(curr); |
| if (mSourceCrop) |
| mSourceCrop->updateBufferArea(curr); |
| if (mSurfaceDamage) |
| mSurfaceDamage->updateBufferArea(curr); |
| } |
| |
| const std::vector<float> Hwc2TestBufferArea::mDefaultScalars = { |
| 1.0f, |
| }; |
| |
| const std::vector<float> Hwc2TestBufferArea::mBasicScalars = { |
| 1.0f, 0.5f, |
| }; |
| |
| const std::vector<float> Hwc2TestBufferArea::mCompleteScalars = { |
| 1.0f, 0.75f, 0.5f |
| }; |
| |
| |
| Hwc2TestBlendMode::Hwc2TestBlendMode(Hwc2TestCoverage coverage) |
| : Hwc2TestProperty(coverage, mCompleteBlendModes, mBasicBlendModes, |
| mDefaultBlendModes, mCompositionSupport) { } |
| |
| std::string Hwc2TestBlendMode::dump() const |
| { |
| std::stringstream dmp; |
| dmp << "\tblend mode: " << getBlendModeName(get()) << "\n"; |
| return dmp.str(); |
| } |
| |
| void Hwc2TestBlendMode::setDependent(Hwc2TestColor* color) |
| { |
| mColor = color; |
| updateDependents(); |
| } |
| |
| void Hwc2TestBlendMode::updateDependents() |
| { |
| if (mColor) |
| mColor->updateBlendMode(get()); |
| } |
| |
| const std::vector<hwc2_blend_mode_t> Hwc2TestBlendMode::mDefaultBlendModes = { |
| HWC2_BLEND_MODE_NONE, |
| }; |
| |
| const std::vector<hwc2_blend_mode_t> Hwc2TestBlendMode::mBasicBlendModes = { |
| HWC2_BLEND_MODE_NONE, |
| HWC2_BLEND_MODE_PREMULTIPLIED, |
| }; |
| |
| const std::vector<hwc2_blend_mode_t> Hwc2TestBlendMode::mCompleteBlendModes = { |
| HWC2_BLEND_MODE_NONE, |
| HWC2_BLEND_MODE_PREMULTIPLIED, |
| HWC2_BLEND_MODE_COVERAGE, |
| }; |
| |
| |
| Hwc2TestColor::Hwc2TestColor(Hwc2TestCoverage coverage, |
| hwc2_blend_mode_t blendMode) |
| : Hwc2TestProperty(mColors, mCompositionSupport), |
| mBaseColors((coverage == Hwc2TestCoverage::Complete)? mCompleteBaseColors: |
| (coverage == Hwc2TestCoverage::Basic)? mBasicBaseColors: |
| mDefaultBaseColors), |
| mBlendMode(blendMode) |
| { |
| update(); |
| } |
| |
| std::string Hwc2TestColor::dump() const |
| { |
| std::stringstream dmp; |
| const hwc_color_t& color = get(); |
| dmp << "\tcolor: r " << std::to_string(color.r) << ", g " |
| << std::to_string(color.g) << ", b " << std::to_string(color.b) |
| << ", a " << std::to_string(color.a) << "\n"; |
| return dmp.str(); |
| } |
| |
| void Hwc2TestColor::updateBlendMode(hwc2_blend_mode_t blendMode) |
| { |
| mBlendMode = blendMode; |
| update(); |
| } |
| |
| void Hwc2TestColor::update() |
| { |
| if (mBlendMode != HWC2_BLEND_MODE_PREMULTIPLIED) { |
| mColors = mBaseColors; |
| return; |
| } |
| |
| mColors.clear(); |
| |
| for (const hwc_color_t& baseColor : mBaseColors) { |
| if (baseColor.a >= baseColor.r && baseColor.a >= baseColor.g |
| && baseColor.a >= baseColor.b) { |
| mColors.push_back(baseColor); |
| } |
| } |
| |
| } |
| |
| const std::vector<hwc_color_t> Hwc2TestColor::mDefaultBaseColors = { |
| {UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX}, |
| }; |
| |
| const std::vector<hwc_color_t> Hwc2TestColor::mBasicBaseColors = { |
| {UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX}, |
| { 0, 0, 0, 0}, |
| }; |
| |
| const std::vector<hwc_color_t> Hwc2TestColor::mCompleteBaseColors = { |
| {UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX}, |
| {UINT8_MAX, UINT8_MAX, UINT8_MAX, 0}, |
| {UINT8_MAX, UINT8_MAX, 0, UINT8_MAX}, |
| {UINT8_MAX, UINT8_MAX, 0, 0}, |
| {UINT8_MAX, 0, UINT8_MAX, UINT8_MAX}, |
| {UINT8_MAX, 0, UINT8_MAX, 0}, |
| {UINT8_MAX, 0, 0, UINT8_MAX}, |
| {UINT8_MAX, 0, 0, 0}, |
| { 0, UINT8_MAX, UINT8_MAX, UINT8_MAX}, |
| { 0, UINT8_MAX, UINT8_MAX, 0}, |
| { 0, UINT8_MAX, 0, UINT8_MAX}, |
| { 0, UINT8_MAX, 0, 0}, |
| { 0, 0, UINT8_MAX, UINT8_MAX}, |
| { 0, 0, UINT8_MAX, 0}, |
| { 0, 0, 0, UINT8_MAX}, |
| { 0, 0, 0, 0}, |
| }; |
| |
| |
| Hwc2TestComposition::Hwc2TestComposition(Hwc2TestCoverage coverage) |
| : Hwc2TestProperty(coverage, mCompleteCompositions, mBasicCompositions, |
| mDefaultCompositions, mCompositionSupport) { } |
| |
| std::string Hwc2TestComposition::dump() const |
| { |
| std::stringstream dmp; |
| dmp << "\tcomposition: " << getCompositionName(get()) << "\n"; |
| return dmp.str(); |
| } |
| |
| const std::vector<hwc2_composition_t> Hwc2TestComposition::mDefaultCompositions = { |
| HWC2_COMPOSITION_DEVICE, |
| }; |
| |
| const std::vector<hwc2_composition_t> Hwc2TestComposition::mBasicCompositions = { |
| HWC2_COMPOSITION_CLIENT, |
| HWC2_COMPOSITION_DEVICE, |
| }; |
| |
| const std::vector<hwc2_composition_t> Hwc2TestComposition::mCompleteCompositions = { |
| HWC2_COMPOSITION_CLIENT, |
| HWC2_COMPOSITION_DEVICE, |
| HWC2_COMPOSITION_SOLID_COLOR, |
| HWC2_COMPOSITION_CURSOR, |
| HWC2_COMPOSITION_SIDEBAND, |
| }; |
| |
| |
| Hwc2TestDataspace::Hwc2TestDataspace(Hwc2TestCoverage coverage) |
| : Hwc2TestProperty(coverage, completeDataspaces, basicDataspaces, |
| defaultDataspaces, mCompositionSupport) { } |
| |
| std::string Hwc2TestDataspace::dump() const |
| { |
| std::stringstream dmp; |
| dmp << "\tdataspace: " << static_cast<int32_t>(get()) << "\n"; |
| return dmp.str(); |
| } |
| |
| const std::vector<android::ui::Dataspace> Hwc2TestDataspace::defaultDataspaces = { |
| android::ui::Dataspace::UNKNOWN, |
| }; |
| |
| const std::vector<android::ui::Dataspace> Hwc2TestDataspace::basicDataspaces = { |
| android::ui::Dataspace::UNKNOWN, |
| android::ui::Dataspace::V0_SRGB, |
| }; |
| |
| const std::vector<android::ui::Dataspace> Hwc2TestDataspace::completeDataspaces = { |
| android::ui::Dataspace::UNKNOWN, |
| android::ui::Dataspace::ARBITRARY, |
| android::ui::Dataspace::STANDARD_SHIFT, |
| android::ui::Dataspace::STANDARD_MASK, |
| android::ui::Dataspace::STANDARD_UNSPECIFIED, |
| android::ui::Dataspace::STANDARD_BT709, |
| android::ui::Dataspace::STANDARD_BT601_625, |
| android::ui::Dataspace::STANDARD_BT601_625_UNADJUSTED, |
| android::ui::Dataspace::STANDARD_BT601_525, |
| android::ui::Dataspace::STANDARD_BT601_525_UNADJUSTED, |
| android::ui::Dataspace::STANDARD_BT2020, |
| android::ui::Dataspace::STANDARD_BT2020_CONSTANT_LUMINANCE, |
| android::ui::Dataspace::STANDARD_BT470M, |
| android::ui::Dataspace::STANDARD_FILM, |
| android::ui::Dataspace::TRANSFER_SHIFT, |
| android::ui::Dataspace::TRANSFER_MASK, |
| android::ui::Dataspace::TRANSFER_UNSPECIFIED, |
| android::ui::Dataspace::TRANSFER_LINEAR, |
| android::ui::Dataspace::TRANSFER_SRGB, |
| android::ui::Dataspace::TRANSFER_SMPTE_170M, |
| android::ui::Dataspace::TRANSFER_GAMMA2_2, |
| android::ui::Dataspace::TRANSFER_GAMMA2_8, |
| android::ui::Dataspace::TRANSFER_ST2084, |
| android::ui::Dataspace::TRANSFER_HLG, |
| android::ui::Dataspace::RANGE_SHIFT, |
| android::ui::Dataspace::RANGE_MASK, |
| android::ui::Dataspace::RANGE_UNSPECIFIED, |
| android::ui::Dataspace::RANGE_FULL, |
| android::ui::Dataspace::RANGE_LIMITED, |
| android::ui::Dataspace::SRGB_LINEAR, |
| android::ui::Dataspace::V0_SRGB_LINEAR, |
| android::ui::Dataspace::SRGB, |
| android::ui::Dataspace::V0_SRGB, |
| android::ui::Dataspace::JFIF, |
| android::ui::Dataspace::V0_JFIF, |
| android::ui::Dataspace::BT601_625, |
| android::ui::Dataspace::V0_BT601_625, |
| android::ui::Dataspace::BT601_525, |
| android::ui::Dataspace::V0_BT601_525, |
| android::ui::Dataspace::BT709, |
| android::ui::Dataspace::V0_BT709, |
| android::ui::Dataspace::DEPTH, |
| }; |
| |
| |
| Hwc2TestDisplayDimension::Hwc2TestDisplayDimension(Hwc2TestCoverage coverage) |
| : Hwc2TestProperty( |
| (coverage == Hwc2TestCoverage::Complete)? mCompleteDisplayDimensions: |
| (coverage == Hwc2TestCoverage::Basic)? mBasicDisplayDimensions: |
| mDefaultDisplayDimensions, mCompositionSupport) { } |
| |
| std::string Hwc2TestDisplayDimension::dump() const |
| { |
| std::stringstream dmp; |
| const UnsignedArea& curr = get(); |
| dmp << "\tdisplay dimension: " << curr.width<< " x " << curr.height<< "\n"; |
| return dmp.str(); |
| } |
| |
| void Hwc2TestDisplayDimension::setDependent(Hwc2TestVirtualBuffer* buffer) |
| { |
| mBuffers.insert(buffer); |
| updateDependents(); |
| } |
| |
| void Hwc2TestDisplayDimension::updateDependents() |
| { |
| const UnsignedArea& curr = get(); |
| |
| for (Hwc2TestVirtualBuffer* buffer : mBuffers) |
| buffer->updateBufferArea({static_cast<int32_t>(curr.width), |
| static_cast<int32_t>(curr.height)}); |
| } |
| |
| const std::vector<UnsignedArea> |
| Hwc2TestDisplayDimension::mDefaultDisplayDimensions = { |
| {1920, 1080}, |
| }; |
| |
| const std::vector<UnsignedArea> |
| Hwc2TestDisplayDimension::mBasicDisplayDimensions = { |
| {640, 480}, |
| {1280, 720}, |
| {1920, 1080}, |
| {1920, 1200}, |
| }; |
| |
| const std::vector<UnsignedArea> |
| Hwc2TestDisplayDimension::mCompleteDisplayDimensions = { |
| {320, 240}, |
| {480, 320}, |
| {640, 480}, |
| {1280, 720}, |
| {1920, 1080}, |
| {1920, 1200}, |
| {2560, 1440}, |
| {2560, 1600}, |
| {3840, 2160}, |
| {4096, 2160}, |
| }; |
| |
| |
| Hwc2TestDisplayFrame::Hwc2TestDisplayFrame(Hwc2TestCoverage coverage, |
| const Area& displayArea) |
| : Hwc2TestProperty(mDisplayFrames, mCompositionSupport), |
| mFrectScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteFrectScalars: |
| (coverage == Hwc2TestCoverage::Basic)? mBasicFrectScalars: |
| mDefaultFrectScalars), |
| mDisplayArea(displayArea) |
| { |
| update(); |
| } |
| |
| std::string Hwc2TestDisplayFrame::dump() const |
| { |
| std::stringstream dmp; |
| const hwc_rect_t& displayFrame = get(); |
| dmp << "\tdisplay frame: left " << displayFrame.left << ", top " |
| << displayFrame.top << ", right " << displayFrame.right |
| << ", bottom " << displayFrame.bottom << "\n"; |
| return dmp.str(); |
| } |
| |
| void Hwc2TestDisplayFrame::update() |
| { |
| mDisplayFrames.clear(); |
| |
| if (mDisplayArea.width == 0 && mDisplayArea.height == 0) { |
| mDisplayFrames.push_back({0, 0, 0, 0}); |
| return; |
| } |
| |
| for (const auto& frectScalar : mFrectScalars) { |
| mDisplayFrames.push_back({ |
| static_cast<int>(frectScalar.left * mDisplayArea.width), |
| static_cast<int>(frectScalar.top * mDisplayArea.height), |
| static_cast<int>(frectScalar.right * mDisplayArea.width), |
| static_cast<int>(frectScalar.bottom * mDisplayArea.height)}); |
| } |
| } |
| |
| const std::vector<hwc_frect_t> Hwc2TestDisplayFrame::mDefaultFrectScalars = { |
| {0.0, 0.0, 1.0, 1.0}, |
| }; |
| |
| const std::vector<hwc_frect_t> Hwc2TestDisplayFrame::mBasicFrectScalars = { |
| {0.0, 0.0, 1.0, 1.0}, |
| {0.0, 0.0, 1.0, 0.05}, |
| {0.0, 0.95, 1.0, 1.0}, |
| }; |
| |
| const std::vector<hwc_frect_t> Hwc2TestDisplayFrame::mCompleteFrectScalars = { |
| {0.0, 0.0, 1.0, 1.0}, |
| {0.0, 0.05, 1.0, 0.95}, |
| {0.0, 0.05, 1.0, 1.0}, |
| {0.0, 0.0, 1.0, 0.05}, |
| {0.0, 0.95, 1.0, 1.0}, |
| {0.25, 0.0, 0.75, 0.35}, |
| {0.25, 0.25, 0.75, 0.75}, |
| }; |
| |
| |
| Hwc2TestPlaneAlpha::Hwc2TestPlaneAlpha(Hwc2TestCoverage coverage) |
| : Hwc2TestProperty(coverage, mCompletePlaneAlphas, mBasicPlaneAlphas, |
| mDefaultPlaneAlphas, mCompositionSupport) { } |
| |
| std::string Hwc2TestPlaneAlpha::dump() const |
| { |
| std::stringstream dmp; |
| dmp << "\tplane alpha: " << get() << "\n"; |
| return dmp.str(); |
| } |
| |
| const std::vector<float> Hwc2TestPlaneAlpha::mDefaultPlaneAlphas = { |
| 1.0f, |
| }; |
| |
| const std::vector<float> Hwc2TestPlaneAlpha::mBasicPlaneAlphas = { |
| 1.0f, 0.0f, |
| }; |
| |
| const std::vector<float> Hwc2TestPlaneAlpha::mCompletePlaneAlphas = { |
| 1.0f, 0.75f, 0.5f, 0.25f, 0.0f, |
| }; |
| |
| |
| Hwc2TestSourceCrop::Hwc2TestSourceCrop(Hwc2TestCoverage coverage, |
| const Area& bufferArea) |
| : Hwc2TestProperty(mSourceCrops, mCompositionSupport), |
| mFrectScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteFrectScalars: |
| (coverage == Hwc2TestCoverage::Basic)? mBasicFrectScalars: |
| mDefaultFrectScalars), |
| mBufferArea(bufferArea) |
| { |
| update(); |
| } |
| |
| std::string Hwc2TestSourceCrop::dump() const |
| { |
| std::stringstream dmp; |
| const hwc_frect_t& sourceCrop = get(); |
| dmp << "\tsource crop: left " << sourceCrop.left << ", top " |
| << sourceCrop.top << ", right " << sourceCrop.right << ", bottom " |
| << sourceCrop.bottom << "\n"; |
| return dmp.str(); |
| } |
| |
| void Hwc2TestSourceCrop::updateBufferArea(const Area& bufferArea) |
| { |
| mBufferArea = bufferArea; |
| update(); |
| } |
| |
| void Hwc2TestSourceCrop::update() |
| { |
| mSourceCrops.clear(); |
| |
| if (mBufferArea.width == 0 && mBufferArea.height == 0) { |
| mSourceCrops.push_back({0, 0, 0, 0}); |
| return; |
| } |
| |
| for (const auto& frectScalar : mFrectScalars) { |
| mSourceCrops.push_back({ |
| frectScalar.left * mBufferArea.width, |
| frectScalar.top * mBufferArea.height, |
| frectScalar.right * mBufferArea.width, |
| frectScalar.bottom * mBufferArea.height}); |
| } |
| } |
| |
| const std::vector<hwc_frect_t> Hwc2TestSourceCrop::mDefaultFrectScalars = { |
| {0.0, 0.0, 1.0, 1.0}, |
| }; |
| |
| const std::vector<hwc_frect_t> Hwc2TestSourceCrop::mBasicFrectScalars = { |
| {0.0, 0.0, 1.0, 1.0}, |
| {0.0, 0.0, 0.5, 0.5}, |
| {0.5, 0.5, 1.0, 1.0}, |
| }; |
| |
| const std::vector<hwc_frect_t> Hwc2TestSourceCrop::mCompleteFrectScalars = { |
| {0.0, 0.0, 1.0, 1.0}, |
| {0.0, 0.0, 0.5, 0.5}, |
| {0.5, 0.5, 1.0, 1.0}, |
| {0.0, 0.0, 0.25, 0.25}, |
| {0.25, 0.25, 0.75, 0.75}, |
| }; |
| |
| |
| Hwc2TestSurfaceDamage::Hwc2TestSurfaceDamage(Hwc2TestCoverage coverage) |
| : Hwc2TestProperty(mSurfaceDamages, mCompositionSupport), |
| mRegionScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteRegionScalars: |
| (coverage == Hwc2TestCoverage::Basic)? mBasicRegionScalars: |
| mDefaultRegionScalars) |
| { |
| update(); |
| } |
| |
| Hwc2TestSurfaceDamage::~Hwc2TestSurfaceDamage() |
| { |
| freeSurfaceDamages(); |
| } |
| |
| std::string Hwc2TestSurfaceDamage::dump() const |
| { |
| std::stringstream dmp; |
| |
| const hwc_region_t& curr = get(); |
| dmp << "\tsurface damage: region count " << curr.numRects << "\n"; |
| for (size_t i = 0; i < curr.numRects; i++) { |
| const hwc_rect_t& rect = curr.rects[i]; |
| dmp << "\t\trect: left " << rect.left << ", top " << rect.top |
| << ", right " << rect.right << ", bottom " << rect.bottom << "\n"; |
| } |
| |
| return dmp.str(); |
| } |
| |
| void Hwc2TestSurfaceDamage::updateBufferArea(const Area& bufferArea) |
| { |
| mBufferArea = bufferArea; |
| update(); |
| } |
| |
| void Hwc2TestSurfaceDamage::update() |
| { |
| freeSurfaceDamages(); |
| |
| if (mBufferArea.width == 0 && mBufferArea.height == 0) { |
| mSurfaceDamages.push_back({0, nullptr}); |
| return; |
| } |
| |
| hwc_region_t damage; |
| |
| for (const auto& regionScalar : mRegionScalars) { |
| damage.numRects = regionScalar.size(); |
| |
| if (damage.numRects > 0) { |
| hwc_rect_t* rects = new hwc_rect_t[damage.numRects]; |
| if (!rects) { |
| ALOGW("failed to allocate new hwc_rect_t array"); |
| continue; |
| } |
| |
| for (size_t i = 0; i < damage.numRects; i++) { |
| rects[i].left = regionScalar[i].left * mBufferArea.width; |
| rects[i].top = regionScalar[i].top * mBufferArea.height; |
| rects[i].right = regionScalar[i].right * mBufferArea.width; |
| rects[i].bottom = regionScalar[i].bottom * mBufferArea.height; |
| } |
| |
| damage.rects = static_cast<hwc_rect_t const*>(rects); |
| } else { |
| damage.rects = nullptr; |
| } |
| |
| mSurfaceDamages.push_back(damage); |
| } |
| } |
| |
| void Hwc2TestSurfaceDamage::freeSurfaceDamages() |
| { |
| for (const auto& surfaceDamage : mSurfaceDamages) { |
| if (surfaceDamage.numRects > 0 && surfaceDamage.rects) |
| delete[] surfaceDamage.rects; |
| } |
| mSurfaceDamages.clear(); |
| } |
| |
| const std::vector<std::vector<hwc_frect_t>> Hwc2TestSurfaceDamage::mDefaultRegionScalars = { |
| {{}}, |
| }; |
| |
| const std::vector<std::vector<hwc_frect_t>> Hwc2TestSurfaceDamage::mBasicRegionScalars = { |
| {{}}, |
| {{0.0, 0.0, 1.0, 1.0}}, |
| }; |
| |
| const std::vector<std::vector<hwc_frect_t>> Hwc2TestSurfaceDamage::mCompleteRegionScalars = { |
| {{}}, |
| {{0.0, 0.0, 1.0, 1.0}}, |
| {{0.0, 0.0, 0.5, 0.5}, {0.5, 0.5, 1.0, 1.0}}, |
| }; |
| |
| |
| Hwc2TestTransform::Hwc2TestTransform(Hwc2TestCoverage coverage) |
| : Hwc2TestProperty(coverage, mCompleteTransforms, mBasicTransforms, |
| mDefaultTransforms, mCompositionSupport) { } |
| |
| std::string Hwc2TestTransform::dump() const |
| { |
| std::stringstream dmp; |
| dmp << "\ttransform: " << getTransformName(get()) << "\n"; |
| return dmp.str(); |
| } |
| |
| const std::vector<hwc_transform_t> Hwc2TestTransform::mDefaultTransforms = { |
| static_cast<hwc_transform_t>(0), |
| }; |
| |
| const std::vector<hwc_transform_t> Hwc2TestTransform::mBasicTransforms = { |
| static_cast<hwc_transform_t>(0), |
| HWC_TRANSFORM_FLIP_H, |
| HWC_TRANSFORM_FLIP_V, |
| HWC_TRANSFORM_ROT_90, |
| }; |
| |
| const std::vector<hwc_transform_t> Hwc2TestTransform::mCompleteTransforms = { |
| static_cast<hwc_transform_t>(0), |
| HWC_TRANSFORM_FLIP_H, |
| HWC_TRANSFORM_FLIP_V, |
| HWC_TRANSFORM_ROT_90, |
| HWC_TRANSFORM_ROT_180, |
| HWC_TRANSFORM_ROT_270, |
| HWC_TRANSFORM_FLIP_H_ROT_90, |
| HWC_TRANSFORM_FLIP_V_ROT_90, |
| }; |
| |
| |
| Hwc2TestVisibleRegion::~Hwc2TestVisibleRegion() |
| { |
| release(); |
| } |
| |
| std::string Hwc2TestVisibleRegion::dump() const |
| { |
| std::stringstream dmp; |
| |
| const hwc_region_t& curr = get(); |
| dmp << "\tvisible region: region count " << curr.numRects << "\n"; |
| for (size_t i = 0; i < curr.numRects; i++) { |
| const hwc_rect_t& rect = curr.rects[i]; |
| dmp << "\t\trect: left " << rect.left << ", top " << rect.top |
| << ", right " << rect.right << ", bottom " << rect.bottom << "\n"; |
| } |
| |
| return dmp.str(); |
| } |
| |
| void Hwc2TestVisibleRegion::set(const android::Region& visibleRegion) |
| { |
| release(); |
| |
| size_t size = 0; |
| const android::Rect* rects = visibleRegion.getArray(&size); |
| |
| mVisibleRegion.numRects = size; |
| mVisibleRegion.rects = nullptr; |
| |
| if (size > 0) { |
| hwc_rect_t* hwcRects = new hwc_rect_t[size]; |
| for (size_t i = 0; i < size; i++) { |
| hwcRects[i].left = rects[i].left; |
| hwcRects[i].top = rects[i].top; |
| hwcRects[i].right = rects[i].right; |
| hwcRects[i].bottom = rects[i].bottom; |
| } |
| mVisibleRegion.rects = hwcRects; |
| } |
| } |
| |
| hwc_region_t Hwc2TestVisibleRegion::get() const |
| { |
| return mVisibleRegion; |
| } |
| |
| void Hwc2TestVisibleRegion::release() |
| { |
| if (mVisibleRegion.numRects > 0 && mVisibleRegion.rects) |
| delete[] mVisibleRegion.rects; |
| mVisibleRegion.rects = nullptr; |
| mVisibleRegion.numRects = 0; |
| } |
| |
| /* Identifies which layer properties are supported by each composition type. |
| * hwc2_composition_t values range from: |
| * HWC2_COMPOSITION_INVALID = 0, |
| * HWC2_COMPOSITION_CLIENT = 1, |
| * HWC2_COMPOSITION_DEVICE = 2, |
| * HWC2_COMPOSITION_SOLID_COLOR = 3, |
| * HWC2_COMPOSITION_CURSOR = 4, |
| * HWC2_COMPOSITION_SIDEBAND = 5, |
| * |
| * Each property array can be indexed by a hwc2_composition_t value. |
| * By using an array instead of a more complex data structure, runtimes for |
| * some test cases showed a noticeable improvement. |
| */ |
| |
| /* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */ |
| const std::array<bool, 6> Hwc2TestBufferArea::mCompositionSupport = {{ |
| false, true, true, false, true, true, |
| }}; |
| |
| /* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */ |
| const std::array<bool, 6> Hwc2TestBlendMode::mCompositionSupport = {{ |
| false, true, true, false, true, true, |
| }}; |
| |
| /* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */ |
| const std::array<bool, 6> Hwc2TestColor::mCompositionSupport = {{ |
| false, false, false, true, false, false, |
| }}; |
| |
| /* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */ |
| const std::array<bool, 6> Hwc2TestComposition::mCompositionSupport = {{ |
| false, true, true, true, true, true, |
| }}; |
| |
| /* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */ |
| const std::array<bool, 6> Hwc2TestDataspace::mCompositionSupport = {{ |
| false, true, true, true, true, false, |
| }}; |
| |
| /* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */ |
| const std::array<bool, 6> Hwc2TestDisplayDimension::mCompositionSupport = {{ |
| false, true, true, true, true, true, |
| }}; |
| |
| /* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */ |
| const std::array<bool, 6> Hwc2TestDisplayFrame::mCompositionSupport = {{ |
| false, true, true, true, false, true, |
| }}; |
| |
| /* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */ |
| const std::array<bool, 6> Hwc2TestPlaneAlpha::mCompositionSupport = {{ |
| false, true, true, true, true, true, |
| }}; |
| |
| /* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */ |
| const std::array<bool, 6> Hwc2TestSourceCrop::mCompositionSupport = {{ |
| false, true, true, false, true, false, |
| }}; |
| |
| /* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */ |
| const std::array<bool, 6> Hwc2TestSurfaceDamage::mCompositionSupport = {{ |
| false, false, true, false, true, false, |
| }}; |
| |
| /* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */ |
| const std::array<bool, 6> Hwc2TestTransform::mCompositionSupport = {{ |
| false, true, true, false, true, true, |
| }}; |