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 21 Hwc2TestCoverage 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 28 Hwc2TestLayer::Hwc2TestLayer(Hwc2TestCoverage coverage, 29 const Area& displayArea) 30 : Hwc2TestLayer(coverage, displayArea, 31 std::unordered_map<Hwc2TestPropertyName, Hwc2TestCoverage>()) { } 32 33 Hwc2TestLayer::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 63 std::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 79 int 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 88 int Hwc2TestLayer::getBuffer(buffer_handle_t* outHandle, 89 int32_t* outAcquireFence) 90 { 91 return mBuffer.get(outHandle, outAcquireFence); 92 } 93 94 void Hwc2TestLayer::setZOrder(uint32_t zOrder) 95 { 96 mZOrder = zOrder; 97 } 98 99 void Hwc2TestLayer::setVisibleRegion(const android::Region& region) 100 { 101 return mVisibleRegion.set(region); 102 } 103 104 void Hwc2TestLayer::reset() 105 { 106 mVisibleRegion.release(); 107 108 for (auto property : mProperties) { 109 property->reset(); 110 } 111 } 112 113 bool 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 123 hwc2_blend_mode_t Hwc2TestLayer::getBlendMode() const 124 { 125 return mBlendMode.get(); 126 } 127 128 Area Hwc2TestLayer::getBufferArea() const 129 { 130 return mBufferArea.get(); 131 } 132 133 hwc_color_t Hwc2TestLayer::getColor() const 134 { 135 return mColor.get(); 136 } 137 138 hwc2_composition_t Hwc2TestLayer::getComposition() const 139 { 140 return mComposition.get(); 141 } 142 143 /* The cursor position corresponds to {displayFrame.left, displayFrame.top} */ 144 hwc_rect_t Hwc2TestLayer::getCursorPosition() const 145 { 146 return mDisplayFrame.get(); 147 } 148 149 android_dataspace_t Hwc2TestLayer::getDataspace() const 150 { 151 return mDataspace.get(); 152 } 153 154 hwc_rect_t Hwc2TestLayer::getDisplayFrame() const 155 { 156 return mDisplayFrame.get(); 157 } 158 159 float Hwc2TestLayer::getPlaneAlpha() const 160 { 161 return mPlaneAlpha.get(); 162 } 163 164 hwc_frect_t Hwc2TestLayer::getSourceCrop() const 165 { 166 return mSourceCrop.get(); 167 } 168 169 hwc_region_t Hwc2TestLayer::getSurfaceDamage() const 170 { 171 return mSurfaceDamage.get(); 172 } 173 174 hwc_transform_t Hwc2TestLayer::getTransform() const 175 { 176 return mTransform.get(); 177 } 178 179 hwc_region_t Hwc2TestLayer::getVisibleRegion() const 180 { 181 return mVisibleRegion.get(); 182 } 183 184 uint32_t Hwc2TestLayer::getZOrder() const 185 { 186 return mZOrder; 187 } 188 189 bool Hwc2TestLayer::advanceBlendMode() 190 { 191 return mBlendMode.advance(); 192 } 193 194 bool Hwc2TestLayer::advanceBufferArea() 195 { 196 return mBufferArea.advance(); 197 } 198 199 bool Hwc2TestLayer::advanceColor() 200 { 201 return mColor.advance(); 202 } 203 204 bool Hwc2TestLayer::advanceComposition() 205 { 206 return mComposition.advance(); 207 } 208 209 bool Hwc2TestLayer::advanceCursorPosition() 210 { 211 return mDisplayFrame.advance(); 212 } 213 214 bool Hwc2TestLayer::advanceDataspace() 215 { 216 return mDataspace.advance(); 217 } 218 219 bool Hwc2TestLayer::advanceDisplayFrame() 220 { 221 return mDisplayFrame.advance(); 222 } 223 224 bool Hwc2TestLayer::advancePlaneAlpha() 225 { 226 return mPlaneAlpha.advance(); 227 } 228 229 bool Hwc2TestLayer::advanceSourceCrop() 230 { 231 return mSourceCrop.advance(); 232 } 233 234 bool Hwc2TestLayer::advanceSurfaceDamage() 235 { 236 return mSurfaceDamage.advance(); 237 } 238 239 bool Hwc2TestLayer::advanceTransform() 240 { 241 return mTransform.advance(); 242 } 243 244 bool Hwc2TestLayer::advanceVisibleRegion() 245 { 246 if (mPlaneAlpha.advance()) 247 return true; 248 return mDisplayFrame.advance(); 249 } 250