/* * 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 "Hwc2TestLayer.h" Hwc2TestCoverage getCoverage(Hwc2TestPropertyName property, Hwc2TestCoverage coverage, const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>& coverageExceptions) { auto exception = coverageExceptions.find(property); return (exception != coverageExceptions.end())? exception->second : coverage; } Hwc2TestLayer::Hwc2TestLayer(Hwc2TestCoverage coverage, const Area& displayArea) : Hwc2TestLayer(coverage, displayArea, std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>()) { } Hwc2TestLayer::Hwc2TestLayer(Hwc2TestCoverage coverage, const Area& displayArea, const std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>& coverageExceptions) : mBlendMode(getCoverage(Hwc2TestPropertyName::BlendMode, coverage, coverageExceptions)), mBufferArea(getCoverage(Hwc2TestPropertyName::BufferArea, coverage, coverageExceptions), displayArea), mColor(getCoverage(Hwc2TestPropertyName::Color, coverage, coverageExceptions)), mComposition(getCoverage(Hwc2TestPropertyName::Composition, coverage, coverageExceptions)), mDataspace(getCoverage(Hwc2TestPropertyName::Dataspace, coverage, coverageExceptions)), mDisplayFrame(getCoverage(Hwc2TestPropertyName::DisplayFrame, coverage, coverageExceptions), displayArea), mPlaneAlpha(getCoverage(Hwc2TestPropertyName::PlaneAlpha, coverage, coverageExceptions)), mSourceCrop(getCoverage(Hwc2TestPropertyName::SourceCrop, coverage, coverageExceptions)), mSurfaceDamage(getCoverage(Hwc2TestPropertyName::SurfaceDamage, coverage, coverageExceptions)), mTransform(getCoverage(Hwc2TestPropertyName::Transform, coverage, coverageExceptions)) { mBufferArea.setDependent(&mBuffer); mBufferArea.setDependent(&mSourceCrop); mBufferArea.setDependent(&mSurfaceDamage); mBlendMode.setDependent(&mColor); } std::string Hwc2TestLayer::dump() const { std::stringstream dmp; dmp << "layer: \n"; for (auto property : mProperties) { dmp << property->dump(); } dmp << mVisibleRegion.dump(); dmp << "\tz order: " << mZOrder << "\n"; return dmp.str(); } int Hwc2TestLayer::getBuffer(buffer_handle_t* outHandle, android::base::unique_fd* outAcquireFence) { int32_t acquireFence; int ret = mBuffer.get(outHandle, &acquireFence); outAcquireFence->reset(acquireFence); return ret; } int Hwc2TestLayer::getBuffer(buffer_handle_t* outHandle, int32_t* outAcquireFence) { return mBuffer.get(outHandle, outAcquireFence); } void Hwc2TestLayer::setZOrder(uint32_t zOrder) { mZOrder = zOrder; } void Hwc2TestLayer::setVisibleRegion(const android::Region& region) { return mVisibleRegion.set(region); } void Hwc2TestLayer::reset() { mVisibleRegion.release(); for (auto property : mProperties) { property->reset(); } } bool Hwc2TestLayer::advance() { for (auto property : mProperties) { if (property->isSupported(mComposition.get())) if (property->advance()) return true; } return false; } hwc2_blend_mode_t Hwc2TestLayer::getBlendMode() const { return mBlendMode.get(); } Area Hwc2TestLayer::getBufferArea() const { return mBufferArea.get(); } hwc_color_t Hwc2TestLayer::getColor() const { return mColor.get(); } hwc2_composition_t Hwc2TestLayer::getComposition() const { return mComposition.get(); } /* The cursor position corresponds to {displayFrame.left, displayFrame.top} */ hwc_rect_t Hwc2TestLayer::getCursorPosition() const { return mDisplayFrame.get(); } android::ui::Dataspace Hwc2TestLayer::getDataspace() const { return mDataspace.get(); } hwc_rect_t Hwc2TestLayer::getDisplayFrame() const { return mDisplayFrame.get(); } float Hwc2TestLayer::getPlaneAlpha() const { return mPlaneAlpha.get(); } hwc_frect_t Hwc2TestLayer::getSourceCrop() const { return mSourceCrop.get(); } hwc_region_t Hwc2TestLayer::getSurfaceDamage() const { return mSurfaceDamage.get(); } hwc_transform_t Hwc2TestLayer::getTransform() const { return mTransform.get(); } hwc_region_t Hwc2TestLayer::getVisibleRegion() const { return mVisibleRegion.get(); } uint32_t Hwc2TestLayer::getZOrder() const { return mZOrder; } bool Hwc2TestLayer::advanceBlendMode() { return mBlendMode.advance(); } bool Hwc2TestLayer::advanceBufferArea() { return mBufferArea.advance(); } bool Hwc2TestLayer::advanceColor() { return mColor.advance(); } bool Hwc2TestLayer::advanceComposition() { return mComposition.advance(); } bool Hwc2TestLayer::advanceCursorPosition() { return mDisplayFrame.advance(); } bool Hwc2TestLayer::advanceDataspace() { return mDataspace.advance(); } bool Hwc2TestLayer::advanceDisplayFrame() { return mDisplayFrame.advance(); } bool Hwc2TestLayer::advancePlaneAlpha() { return mPlaneAlpha.advance(); } bool Hwc2TestLayer::advanceSourceCrop() { return mSourceCrop.advance(); } bool Hwc2TestLayer::advanceSurfaceDamage() { return mSurfaceDamage.advance(); } bool Hwc2TestLayer::advanceTransform() { return mTransform.advance(); } bool Hwc2TestLayer::advanceVisibleRegion() { if (mPlaneAlpha.advance()) return true; return mDisplayFrame.advance(); }