blob: c5b92d06643ee4660c6d8d7aad539c1ae1712a4a [file] [log] [blame]
Marissa Wall6bd8bfd2016-12-15 12:25:31 -08001/*
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>
Marissa Wallad761812016-12-15 12:32:24 -080018#include <cutils/log.h>
Marissa Wallf7618ed2016-12-15 12:34:39 -080019#include <ui/Rect.h>
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080020
Marissa Wall5a240aa2016-12-15 12:34:06 -080021#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"
Marissa Wall6bd8bfd2016-12-15 12:25:31 -080028#include "Hwc2TestProperties.h"
29
Marissa Wallc57468f2016-12-15 12:31:12 -080030Hwc2TestBufferArea::Hwc2TestBufferArea(Hwc2TestCoverage coverage,
31 const Area& displayArea)
Marissa Wall1cd789c2017-01-27 12:55:36 -080032 : Hwc2TestProperty(mBufferAreas, mCompositionSupport),
Marissa Wallc57468f2016-12-15 12:31:12 -080033 mScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteScalars:
34 (coverage == Hwc2TestCoverage::Basic)? mBasicScalars:
35 mDefaultScalars),
36 mDisplayArea(displayArea)
37{
38 update();
39}
40
41std::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
Marissa Wall5a240aa2016-12-15 12:34:06 -080050void Hwc2TestBufferArea::setDependent(Hwc2TestBuffer* buffer)
51{
52 mBuffer = buffer;
53 if (buffer) {
54 buffer->updateBufferArea(get());
55 }
56}
57
Marissa Wallc57468f2016-12-15 12:31:12 -080058void Hwc2TestBufferArea::setDependent(Hwc2TestSourceCrop* sourceCrop)
59{
60 mSourceCrop = sourceCrop;
Marissa Wallad761812016-12-15 12:32:24 -080061 if (mSourceCrop) {
62 mSourceCrop->updateBufferArea(get());
63 }
64}
65
66void Hwc2TestBufferArea::setDependent(Hwc2TestSurfaceDamage* surfaceDamage)
67{
68 mSurfaceDamage = surfaceDamage;
69 if (mSurfaceDamage) {
70 mSurfaceDamage->updateBufferArea(get());
71 }
Marissa Wallc57468f2016-12-15 12:31:12 -080072}
73
74void 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
91void Hwc2TestBufferArea::updateDependents()
92{
93 const Area& curr = get();
94
Marissa Wall5a240aa2016-12-15 12:34:06 -080095 if (mBuffer)
96 mBuffer->updateBufferArea(curr);
Marissa Wallc57468f2016-12-15 12:31:12 -080097 if (mSourceCrop)
98 mSourceCrop->updateBufferArea(curr);
Marissa Wallad761812016-12-15 12:32:24 -080099 if (mSurfaceDamage)
100 mSurfaceDamage->updateBufferArea(curr);
Marissa Wallc57468f2016-12-15 12:31:12 -0800101}
102
103const std::vector<float> Hwc2TestBufferArea::mDefaultScalars = {
104 1.0f,
105};
106
107const std::vector<float> Hwc2TestBufferArea::mBasicScalars = {
108 1.0f, 0.5f,
109};
110
111const std::vector<float> Hwc2TestBufferArea::mCompleteScalars = {
112 1.0f, 0.75f, 0.5f
113};
114
115
Marissa Wallffc67da2016-12-15 12:26:09 -0800116Hwc2TestBlendMode::Hwc2TestBlendMode(Hwc2TestCoverage coverage)
117 : Hwc2TestProperty(coverage, mCompleteBlendModes, mBasicBlendModes,
Marissa Wall1cd789c2017-01-27 12:55:36 -0800118 mDefaultBlendModes, mCompositionSupport) { }
Marissa Wallffc67da2016-12-15 12:26:09 -0800119
120std::string Hwc2TestBlendMode::dump() const
121{
122 std::stringstream dmp;
123 dmp << "\tblend mode: " << getBlendModeName(get()) << "\n";
124 return dmp.str();
125}
126
Marissa Wallee242782016-12-15 12:30:12 -0800127void Hwc2TestBlendMode::setDependent(Hwc2TestColor* color)
128{
129 mColor = color;
130 updateDependents();
131}
132
133void Hwc2TestBlendMode::updateDependents()
134{
135 if (mColor)
136 mColor->updateBlendMode(get());
137}
138
Marissa Wallffc67da2016-12-15 12:26:09 -0800139const std::vector<hwc2_blend_mode_t> Hwc2TestBlendMode::mDefaultBlendModes = {
140 HWC2_BLEND_MODE_NONE,
141};
142
143const std::vector<hwc2_blend_mode_t> Hwc2TestBlendMode::mBasicBlendModes = {
144 HWC2_BLEND_MODE_NONE,
145 HWC2_BLEND_MODE_PREMULTIPLIED,
146};
147
148const 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
Marissa Wallee242782016-12-15 12:30:12 -0800155Hwc2TestColor::Hwc2TestColor(Hwc2TestCoverage coverage,
156 hwc2_blend_mode_t blendMode)
Marissa Wall1cd789c2017-01-27 12:55:36 -0800157 : Hwc2TestProperty(mColors, mCompositionSupport),
Marissa Wallee242782016-12-15 12:30:12 -0800158 mBaseColors((coverage == Hwc2TestCoverage::Complete)? mCompleteBaseColors:
159 (coverage == Hwc2TestCoverage::Basic)? mBasicBaseColors:
160 mDefaultBaseColors),
161 mBlendMode(blendMode)
162{
163 update();
164}
165
166std::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
176void Hwc2TestColor::updateBlendMode(hwc2_blend_mode_t blendMode)
177{
178 mBlendMode = blendMode;
179 update();
180}
181
182void 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
200const std::vector<hwc_color_t> Hwc2TestColor::mDefaultBaseColors = {
201 {UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX},
202};
203
204const std::vector<hwc_color_t> Hwc2TestColor::mBasicBaseColors = {
205 {UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX},
206 { 0, 0, 0, 0},
207};
208
209const 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
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800229Hwc2TestComposition::Hwc2TestComposition(Hwc2TestCoverage coverage)
Marissa Wallffc67da2016-12-15 12:26:09 -0800230 : Hwc2TestProperty(coverage, mCompleteCompositions, mBasicCompositions,
Marissa Wall1cd789c2017-01-27 12:55:36 -0800231 mDefaultCompositions, mCompositionSupport) { }
Marissa Wall6bd8bfd2016-12-15 12:25:31 -0800232
233std::string Hwc2TestComposition::dump() const
234{
235 std::stringstream dmp;
236 dmp << "\tcomposition: " << getCompositionName(get()) << "\n";
237 return dmp.str();
238}
239
240const std::vector<hwc2_composition_t> Hwc2TestComposition::mDefaultCompositions = {
241 HWC2_COMPOSITION_DEVICE,
242};
243
244const std::vector<hwc2_composition_t> Hwc2TestComposition::mBasicCompositions = {
245 HWC2_COMPOSITION_CLIENT,
246 HWC2_COMPOSITION_DEVICE,
247};
248
249const 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};
Marissa Wallb72b5c92016-12-15 12:26:39 -0800256
257
258Hwc2TestDataspace::Hwc2TestDataspace(Hwc2TestCoverage coverage)
259 : Hwc2TestProperty(coverage, completeDataspaces, basicDataspaces,
Marissa Wall1cd789c2017-01-27 12:55:36 -0800260 defaultDataspaces, mCompositionSupport) { }
Marissa Wallb72b5c92016-12-15 12:26:39 -0800261
262std::string Hwc2TestDataspace::dump() const
263{
264 std::stringstream dmp;
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700265 dmp << "\tdataspace: " << static_cast<int32_t>(get()) << "\n";
Marissa Wallb72b5c92016-12-15 12:26:39 -0800266 return dmp.str();
267}
268
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700269const std::vector<android::ui::Dataspace> Hwc2TestDataspace::defaultDataspaces = {
270 android::ui::Dataspace::UNKNOWN,
Marissa Wallb72b5c92016-12-15 12:26:39 -0800271};
272
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700273const std::vector<android::ui::Dataspace> Hwc2TestDataspace::basicDataspaces = {
274 android::ui::Dataspace::UNKNOWN,
275 android::ui::Dataspace::V0_SRGB,
Marissa Wallb72b5c92016-12-15 12:26:39 -0800276};
277
Peiyong Lin34beb7a2018-03-28 11:57:12 -0700278const 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,
Marissa Wallb72b5c92016-12-15 12:26:39 -0800321};
Marissa Wall2b1f5302016-12-15 12:27:20 -0800322
323
Marissa Wallbad1bc72017-02-21 14:33:46 -0800324Hwc2TestDisplayDimension::Hwc2TestDisplayDimension(Hwc2TestCoverage coverage)
325 : Hwc2TestProperty(
326 (coverage == Hwc2TestCoverage::Complete)? mCompleteDisplayDimensions:
327 (coverage == Hwc2TestCoverage::Basic)? mBasicDisplayDimensions:
328 mDefaultDisplayDimensions, mCompositionSupport) { }
329
330std::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
David Hanna Jr3f056022017-07-27 19:19:15 -0700338void Hwc2TestDisplayDimension::setDependent(Hwc2TestVirtualBuffer* buffer)
Marissa Wallbad1bc72017-02-21 14:33:46 -0800339{
David Hanna Jr3f056022017-07-27 19:19:15 -0700340 mBuffers.insert(buffer);
Marissa Wallbad1bc72017-02-21 14:33:46 -0800341 updateDependents();
342}
343
344void Hwc2TestDisplayDimension::updateDependents()
345{
346 const UnsignedArea& curr = get();
347
David Hanna Jr3f056022017-07-27 19:19:15 -0700348 for (Hwc2TestVirtualBuffer* buffer : mBuffers)
349 buffer->updateBufferArea({static_cast<int32_t>(curr.width),
Marissa Wallbad1bc72017-02-21 14:33:46 -0800350 static_cast<int32_t>(curr.height)});
351}
352
353const std::vector<UnsignedArea>
354 Hwc2TestDisplayDimension::mDefaultDisplayDimensions = {
355 {1920, 1080},
356};
357
358const std::vector<UnsignedArea>
359 Hwc2TestDisplayDimension::mBasicDisplayDimensions = {
360 {640, 480},
361 {1280, 720},
362 {1920, 1080},
363 {1920, 1200},
364};
365
366const 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
Marissa Wall600a73b2016-12-15 12:30:39 -0800381Hwc2TestDisplayFrame::Hwc2TestDisplayFrame(Hwc2TestCoverage coverage,
382 const Area& displayArea)
Marissa Wall1cd789c2017-01-27 12:55:36 -0800383 : Hwc2TestProperty(mDisplayFrames, mCompositionSupport),
Marissa Wall600a73b2016-12-15 12:30:39 -0800384 mFrectScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteFrectScalars:
385 (coverage == Hwc2TestCoverage::Basic)? mBasicFrectScalars:
386 mDefaultFrectScalars),
387 mDisplayArea(displayArea)
388{
389 update();
390}
391
392std::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
402void 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
420const std::vector<hwc_frect_t> Hwc2TestDisplayFrame::mDefaultFrectScalars = {
421 {0.0, 0.0, 1.0, 1.0},
422};
423
424const 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
430const 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
Marissa Wall2b1f5302016-12-15 12:27:20 -0800441Hwc2TestPlaneAlpha::Hwc2TestPlaneAlpha(Hwc2TestCoverage coverage)
442 : Hwc2TestProperty(coverage, mCompletePlaneAlphas, mBasicPlaneAlphas,
Marissa Wall1cd789c2017-01-27 12:55:36 -0800443 mDefaultPlaneAlphas, mCompositionSupport) { }
Marissa Wall2b1f5302016-12-15 12:27:20 -0800444
445std::string Hwc2TestPlaneAlpha::dump() const
446{
447 std::stringstream dmp;
448 dmp << "\tplane alpha: " << get() << "\n";
449 return dmp.str();
450}
451
452const std::vector<float> Hwc2TestPlaneAlpha::mDefaultPlaneAlphas = {
453 1.0f,
454};
455
456const std::vector<float> Hwc2TestPlaneAlpha::mBasicPlaneAlphas = {
457 1.0f, 0.0f,
458};
459
460const std::vector<float> Hwc2TestPlaneAlpha::mCompletePlaneAlphas = {
461 1.0f, 0.75f, 0.5f, 0.25f, 0.0f,
462};
Marissa Wallac108192016-12-15 12:27:48 -0800463
464
Marissa Wallc57468f2016-12-15 12:31:12 -0800465Hwc2TestSourceCrop::Hwc2TestSourceCrop(Hwc2TestCoverage coverage,
466 const Area& bufferArea)
Marissa Wall1cd789c2017-01-27 12:55:36 -0800467 : Hwc2TestProperty(mSourceCrops, mCompositionSupport),
Marissa Wallc57468f2016-12-15 12:31:12 -0800468 mFrectScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteFrectScalars:
469 (coverage == Hwc2TestCoverage::Basic)? mBasicFrectScalars:
470 mDefaultFrectScalars),
471 mBufferArea(bufferArea)
472{
473 update();
474}
475
476std::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
486void Hwc2TestSourceCrop::updateBufferArea(const Area& bufferArea)
487{
488 mBufferArea = bufferArea;
489 update();
490}
491
492void 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
510const std::vector<hwc_frect_t> Hwc2TestSourceCrop::mDefaultFrectScalars = {
511 {0.0, 0.0, 1.0, 1.0},
512};
513
514const 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
520const 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
Marissa Wallad761812016-12-15 12:32:24 -0800529Hwc2TestSurfaceDamage::Hwc2TestSurfaceDamage(Hwc2TestCoverage coverage)
Marissa Wall1cd789c2017-01-27 12:55:36 -0800530 : Hwc2TestProperty(mSurfaceDamages, mCompositionSupport),
Marissa Wallad761812016-12-15 12:32:24 -0800531 mRegionScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteRegionScalars:
532 (coverage == Hwc2TestCoverage::Basic)? mBasicRegionScalars:
533 mDefaultRegionScalars)
534{
535 update();
536}
537
538Hwc2TestSurfaceDamage::~Hwc2TestSurfaceDamage()
539{
540 freeSurfaceDamages();
541}
542
543std::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
558void Hwc2TestSurfaceDamage::updateBufferArea(const Area& bufferArea)
559{
560 mBufferArea = bufferArea;
561 update();
562}
563
564void 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
601void 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
610const std::vector<std::vector<hwc_frect_t>> Hwc2TestSurfaceDamage::mDefaultRegionScalars = {
611 {{}},
612};
613
614const std::vector<std::vector<hwc_frect_t>> Hwc2TestSurfaceDamage::mBasicRegionScalars = {
615 {{}},
616 {{0.0, 0.0, 1.0, 1.0}},
617};
618
619const 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
Marissa Wallac108192016-12-15 12:27:48 -0800626Hwc2TestTransform::Hwc2TestTransform(Hwc2TestCoverage coverage)
627 : Hwc2TestProperty(coverage, mCompleteTransforms, mBasicTransforms,
Marissa Wall1cd789c2017-01-27 12:55:36 -0800628 mDefaultTransforms, mCompositionSupport) { }
Marissa Wallac108192016-12-15 12:27:48 -0800629
630std::string Hwc2TestTransform::dump() const
631{
632 std::stringstream dmp;
633 dmp << "\ttransform: " << getTransformName(get()) << "\n";
634 return dmp.str();
635}
636
637const std::vector<hwc_transform_t> Hwc2TestTransform::mDefaultTransforms = {
638 static_cast<hwc_transform_t>(0),
639};
640
641const 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
648const 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};
Marissa Wallf7618ed2016-12-15 12:34:39 -0800658
659
660Hwc2TestVisibleRegion::~Hwc2TestVisibleRegion()
661{
662 release();
663}
664
665std::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
680void 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
702hwc_region_t Hwc2TestVisibleRegion::get() const
703{
704 return mVisibleRegion;
705}
706
707void Hwc2TestVisibleRegion::release()
708{
709 if (mVisibleRegion.numRects > 0 && mVisibleRegion.rects)
710 delete[] mVisibleRegion.rects;
711 mVisibleRegion.rects = nullptr;
712 mVisibleRegion.numRects = 0;
713}
Marissa Wall1cd789c2017-01-27 12:55:36 -0800714
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 */
730const std::array<bool, 6> Hwc2TestBufferArea::mCompositionSupport = {{
731 false, true, true, false, true, true,
732}};
733
734/* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */
735const std::array<bool, 6> Hwc2TestBlendMode::mCompositionSupport = {{
736 false, true, true, false, true, true,
737}};
738
739/* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */
740const std::array<bool, 6> Hwc2TestColor::mCompositionSupport = {{
741 false, false, false, true, false, false,
742}};
743
744/* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */
745const std::array<bool, 6> Hwc2TestComposition::mCompositionSupport = {{
746 false, true, true, true, true, true,
747}};
748
749/* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */
750const std::array<bool, 6> Hwc2TestDataspace::mCompositionSupport = {{
751 false, true, true, true, true, false,
752}};
753
754/* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */
Marissa Wallbad1bc72017-02-21 14:33:46 -0800755const std::array<bool, 6> Hwc2TestDisplayDimension::mCompositionSupport = {{
756 false, true, true, true, true, true,
757}};
758
759/* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */
Marissa Wall1cd789c2017-01-27 12:55:36 -0800760const std::array<bool, 6> Hwc2TestDisplayFrame::mCompositionSupport = {{
761 false, true, true, true, false, true,
762}};
763
764/* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */
765const std::array<bool, 6> Hwc2TestPlaneAlpha::mCompositionSupport = {{
766 false, true, true, true, true, true,
767}};
768
769/* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */
770const std::array<bool, 6> Hwc2TestSourceCrop::mCompositionSupport = {{
771 false, true, true, false, true, false,
772}};
773
774/* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */
775const std::array<bool, 6> Hwc2TestSurfaceDamage::mCompositionSupport = {{
776 false, false, true, false, true, false,
777}};
778
779/* INVALID CLIENT DEVICE COLOR CURSOR SIDEBAND */
780const std::array<bool, 6> Hwc2TestTransform::mCompositionSupport = {{
781 false, true, true, false, true, true,
782}};