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 19#include "Hwc2TestLayer.h" 20 21Hwc2TestCoverage getCoverage(Hwc2TestPropertyName property, 22 Hwc2TestCoverage coverage, const std::unordered_map<Hwc2TestPropertyName, 23 Hwc2TestCoverage>& coverageExceptions) { 24 auto exception = coverageExceptions.find(property); 25 return (exception != coverageExceptions.end())? exception->second : coverage; 26} 27 28Hwc2TestLayer::Hwc2TestLayer(Hwc2TestCoverage coverage, 29 const Area& displayArea) 30 : Hwc2TestLayer(coverage, displayArea, 31 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>()) { } 32 33Hwc2TestLayer::Hwc2TestLayer(Hwc2TestCoverage coverage, 34 const Area& displayArea, const std::unordered_map<Hwc2TestPropertyName, 35 Hwc2TestCoverage>& coverageExceptions) 36 : mBlendMode(getCoverage(Hwc2TestPropertyName::BlendMode, coverage, 37 coverageExceptions)), 38 mBufferArea(getCoverage(Hwc2TestPropertyName::BufferArea, coverage, 39 coverageExceptions), displayArea), 40 mColor(getCoverage(Hwc2TestPropertyName::Color, coverage, 41 coverageExceptions)), 42 mComposition(getCoverage(Hwc2TestPropertyName::Composition, coverage, 43 coverageExceptions)), 44 mDataspace(getCoverage(Hwc2TestPropertyName::Dataspace, coverage, 45 coverageExceptions)), 46 mDisplayFrame(getCoverage(Hwc2TestPropertyName::DisplayFrame, coverage, 47 coverageExceptions), displayArea), 48 mPlaneAlpha(getCoverage(Hwc2TestPropertyName::PlaneAlpha, coverage, 49 coverageExceptions)), 50 mSourceCrop(getCoverage(Hwc2TestPropertyName::SourceCrop, coverage, 51 coverageExceptions)), 52 mSurfaceDamage(getCoverage(Hwc2TestPropertyName::SurfaceDamage, coverage, 53 coverageExceptions)), 54 mTransform(getCoverage(Hwc2TestPropertyName::Transform, coverage, 55 coverageExceptions)) 56{ 57 mBufferArea.setDependent(&mBuffer); 58 mBufferArea.setDependent(&mSourceCrop); 59 mBufferArea.setDependent(&mSurfaceDamage); 60 mBlendMode.setDependent(&mColor); 61} 62 63std::string Hwc2TestLayer::dump() const 64{ 65 std::stringstream dmp; 66 67 dmp << "layer: \n"; 68 69 for (auto property : mProperties) { 70 dmp << property->dump(); 71 } 72 73 dmp << mVisibleRegion.dump(); 74 dmp << "\tz order: " << mZOrder << "\n"; 75 76 return dmp.str(); 77} 78 79int Hwc2TestLayer::getBuffer(buffer_handle_t* outHandle, 80 android::base::unique_fd* outAcquireFence) 81{ 82 int32_t acquireFence; 83 int ret = mBuffer.get(outHandle, &acquireFence); 84 outAcquireFence->reset(acquireFence); 85 return ret; 86} 87 88int Hwc2TestLayer::getBuffer(buffer_handle_t* outHandle, 89 int32_t* outAcquireFence) 90{ 91 return mBuffer.get(outHandle, outAcquireFence); 92} 93 94void Hwc2TestLayer::setZOrder(uint32_t zOrder) 95{ 96 mZOrder = zOrder; 97} 98 99void Hwc2TestLayer::setVisibleRegion(const android::Region& region) 100{ 101 return mVisibleRegion.set(region); 102} 103 104void Hwc2TestLayer::reset() 105{ 106 mVisibleRegion.release(); 107 108 for (auto property : mProperties) { 109 property->reset(); 110 } 111} 112 113bool Hwc2TestLayer::advance() 114{ 115 for (auto property : mProperties) { 116 if (property->isSupported(mComposition.get())) 117 if (property->advance()) 118 return true; 119 } 120 return false; 121} 122 123hwc2_blend_mode_t Hwc2TestLayer::getBlendMode() const 124{ 125 return mBlendMode.get(); 126} 127 128Area Hwc2TestLayer::getBufferArea() const 129{ 130 return mBufferArea.get(); 131} 132 133hwc_color_t Hwc2TestLayer::getColor() const 134{ 135 return mColor.get(); 136} 137 138hwc2_composition_t Hwc2TestLayer::getComposition() const 139{ 140 return mComposition.get(); 141} 142 143/* The cursor position corresponds to {displayFrame.left, displayFrame.top} */ 144hwc_rect_t Hwc2TestLayer::getCursorPosition() const 145{ 146 return mDisplayFrame.get(); 147} 148 149android_dataspace_t Hwc2TestLayer::getDataspace() const 150{ 151 return mDataspace.get(); 152} 153 154hwc_rect_t Hwc2TestLayer::getDisplayFrame() const 155{ 156 return mDisplayFrame.get(); 157} 158 159float Hwc2TestLayer::getPlaneAlpha() const 160{ 161 return mPlaneAlpha.get(); 162} 163 164hwc_frect_t Hwc2TestLayer::getSourceCrop() const 165{ 166 return mSourceCrop.get(); 167} 168 169hwc_region_t Hwc2TestLayer::getSurfaceDamage() const 170{ 171 return mSurfaceDamage.get(); 172} 173 174hwc_transform_t Hwc2TestLayer::getTransform() const 175{ 176 return mTransform.get(); 177} 178 179hwc_region_t Hwc2TestLayer::getVisibleRegion() const 180{ 181 return mVisibleRegion.get(); 182} 183 184uint32_t Hwc2TestLayer::getZOrder() const 185{ 186 return mZOrder; 187} 188 189bool Hwc2TestLayer::advanceBlendMode() 190{ 191 return mBlendMode.advance(); 192} 193 194bool Hwc2TestLayer::advanceBufferArea() 195{ 196 return mBufferArea.advance(); 197} 198 199bool Hwc2TestLayer::advanceColor() 200{ 201 return mColor.advance(); 202} 203 204bool Hwc2TestLayer::advanceComposition() 205{ 206 return mComposition.advance(); 207} 208 209bool Hwc2TestLayer::advanceCursorPosition() 210{ 211 return mDisplayFrame.advance(); 212} 213 214bool Hwc2TestLayer::advanceDataspace() 215{ 216 return mDataspace.advance(); 217} 218 219bool Hwc2TestLayer::advanceDisplayFrame() 220{ 221 return mDisplayFrame.advance(); 222} 223 224bool Hwc2TestLayer::advancePlaneAlpha() 225{ 226 return mPlaneAlpha.advance(); 227} 228 229bool Hwc2TestLayer::advanceSourceCrop() 230{ 231 return mSourceCrop.advance(); 232} 233 234bool Hwc2TestLayer::advanceSurfaceDamage() 235{ 236 return mSurfaceDamage.advance(); 237} 238 239bool Hwc2TestLayer::advanceTransform() 240{ 241 return mTransform.advance(); 242} 243 244bool Hwc2TestLayer::advanceVisibleRegion() 245{ 246 if (mPlaneAlpha.advance()) 247 return true; 248 return mDisplayFrame.advance(); 249} 250