16bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall/*
26bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * Copyright (C) 2016 The Android Open Source Project
36bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall *
46bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * Licensed under the Apache License, Version 2.0 (the "License");
56bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * you may not use this file except in compliance with the License.
66bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * You may obtain a copy of the License at
76bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall *
86bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall *      http://www.apache.org/licenses/LICENSE-2.0
96bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall *
106bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * Unless required by applicable law or agreed to in writing, software
116bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * distributed under the License is distributed on an "AS IS" BASIS,
126bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * See the License for the specific language governing permissions and
146bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall * limitations under the License.
156bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall */
166bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
176bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall#include <sstream>
18ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall#include <cutils/log.h>
19f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall#include <ui/Rect.h>
206bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
215a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall#define HWC2_INCLUDE_STRINGIFICATION
225a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall#define HWC2_USE_CPP11
235a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall#include <hardware/hwcomposer2.h>
245a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall#undef HWC2_INCLUDE_STRINGIFICATION
255a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall#undef HWC2_USE_CPP11
265a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
275a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall#include "Hwc2TestBuffer.h"
286bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall#include "Hwc2TestProperties.h"
296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
30c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallHwc2TestBufferArea::Hwc2TestBufferArea(Hwc2TestCoverage coverage,
31c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        const Area& displayArea)
321cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    : Hwc2TestProperty(mBufferAreas, mCompositionSupport),
33c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall      mScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteScalars:
34c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            (coverage == Hwc2TestCoverage::Basic)? mBasicScalars:
35c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            mDefaultScalars),
36c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall      mDisplayArea(displayArea)
37c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
38c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    update();
39c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
40c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
41c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallstd::string Hwc2TestBufferArea::dump() const
42c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
43c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    std::stringstream dmp;
44c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    const Area& curr = get();
45c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    dmp << "\tbuffer area: width " << curr.width << ", height " << curr.height
46c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            << "\n";
47c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    return dmp.str();
48c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
49c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
505a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wallvoid Hwc2TestBufferArea::setDependent(Hwc2TestBuffer* buffer)
515a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall{
525a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    mBuffer = buffer;
535a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (buffer) {
545a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        buffer->updateBufferArea(get());
555a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    }
565a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall}
575a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall
58c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid Hwc2TestBufferArea::setDependent(Hwc2TestSourceCrop* sourceCrop)
59c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
60c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    mSourceCrop = sourceCrop;
61ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    if (mSourceCrop) {
62ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        mSourceCrop->updateBufferArea(get());
63ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    }
64ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
65ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
66ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallvoid Hwc2TestBufferArea::setDependent(Hwc2TestSurfaceDamage* surfaceDamage)
67ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
68ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    mSurfaceDamage = surfaceDamage;
69ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    if (mSurfaceDamage) {
70ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        mSurfaceDamage->updateBufferArea(get());
71ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    }
72c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
73c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
74c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid Hwc2TestBufferArea::update()
75c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
76c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    mBufferAreas.clear();
77c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
78c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    if (mDisplayArea.width == 0 && mDisplayArea.height == 0) {
79c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        mBufferAreas.push_back({0, 0});
80c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        return;
81c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    }
82c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
83c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    for (auto scalar : mScalars) {
84c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        mBufferAreas.push_back({static_cast<int32_t>(scalar * mDisplayArea.width),
85c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                static_cast<int32_t>(scalar * mDisplayArea.height)});
86c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    }
87c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
88c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    updateDependents();
89c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
90c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
91c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid Hwc2TestBufferArea::updateDependents()
92c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
93c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    const Area& curr = get();
94c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
955a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall    if (mBuffer)
965a240aaf0e3a1dd52be6a8d0811ec727369a210dMarissa Wall        mBuffer->updateBufferArea(curr);
97c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    if (mSourceCrop)
98c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        mSourceCrop->updateBufferArea(curr);
99ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    if (mSurfaceDamage)
100ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        mSurfaceDamage->updateBufferArea(curr);
101c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
102c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
103c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallconst std::vector<float> Hwc2TestBufferArea::mDefaultScalars = {
104c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    1.0f,
105c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall};
106c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
107c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallconst std::vector<float> Hwc2TestBufferArea::mBasicScalars = {
108c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    1.0f, 0.5f,
109c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall};
110c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
111c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallconst std::vector<float> Hwc2TestBufferArea::mCompleteScalars = {
112c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    1.0f, 0.75f, 0.5f
113c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall};
114c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
115c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
116ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa WallHwc2TestBlendMode::Hwc2TestBlendMode(Hwc2TestCoverage coverage)
117ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    : Hwc2TestProperty(coverage, mCompleteBlendModes, mBasicBlendModes,
1181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            mDefaultBlendModes, mCompositionSupport) { }
119ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
120ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallstd::string Hwc2TestBlendMode::dump() const
121ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall{
122ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    std::stringstream dmp;
123ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    dmp << "\tblend mode: " << getBlendModeName(get()) << "\n";
124ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    return dmp.str();
125ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall}
126ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
127ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallvoid Hwc2TestBlendMode::setDependent(Hwc2TestColor* color)
128ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
129ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    mColor = color;
130ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    updateDependents();
131ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
132ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
133ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallvoid Hwc2TestBlendMode::updateDependents()
134ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
135ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (mColor)
136ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        mColor->updateBlendMode(get());
137ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
138ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
139ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallconst std::vector<hwc2_blend_mode_t> Hwc2TestBlendMode::mDefaultBlendModes = {
140ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    HWC2_BLEND_MODE_NONE,
141ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall};
142ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
143ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallconst std::vector<hwc2_blend_mode_t> Hwc2TestBlendMode::mBasicBlendModes = {
144ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    HWC2_BLEND_MODE_NONE,
145ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    HWC2_BLEND_MODE_PREMULTIPLIED,
146ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall};
147ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
148ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wallconst std::vector<hwc2_blend_mode_t> Hwc2TestBlendMode::mCompleteBlendModes = {
149ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    HWC2_BLEND_MODE_NONE,
150ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    HWC2_BLEND_MODE_PREMULTIPLIED,
151ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    HWC2_BLEND_MODE_COVERAGE,
152ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall};
153ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
154ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall
155ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa WallHwc2TestColor::Hwc2TestColor(Hwc2TestCoverage coverage,
156ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        hwc2_blend_mode_t blendMode)
1571cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    : Hwc2TestProperty(mColors, mCompositionSupport),
158ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall      mBaseColors((coverage == Hwc2TestCoverage::Complete)? mCompleteBaseColors:
159ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            (coverage == Hwc2TestCoverage::Basic)? mBasicBaseColors:
160ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            mDefaultBaseColors),
161ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall      mBlendMode(blendMode)
162ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
163ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    update();
164ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
165ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
166ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallstd::string Hwc2TestColor::dump() const
167ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
168ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    std::stringstream dmp;
169ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    const hwc_color_t& color = get();
170ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    dmp << "\tcolor: r " << std::to_string(color.r) << ", g "
171ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            << std::to_string(color.g) << ", b " << std::to_string(color.b)
172ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            << ", a " << std::to_string(color.a) << "\n";
173ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    return dmp.str();
174ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
175ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
176ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallvoid Hwc2TestColor::updateBlendMode(hwc2_blend_mode_t blendMode)
177ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
178ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    mBlendMode = blendMode;
179ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    update();
180ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
181ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
182ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallvoid Hwc2TestColor::update()
183ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall{
184ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    if (mBlendMode != HWC2_BLEND_MODE_PREMULTIPLIED) {
185ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        mColors = mBaseColors;
186ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        return;
187ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    }
188ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
189ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    mColors.clear();
190ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
191ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    for (const hwc_color_t& baseColor : mBaseColors) {
192ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        if (baseColor.a >= baseColor.r && baseColor.a >= baseColor.g
193ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall                && baseColor.a >= baseColor.b) {
194ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall            mColors.push_back(baseColor);
195ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall        }
196ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    }
197ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
198ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall}
199ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
200ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallconst std::vector<hwc_color_t> Hwc2TestColor::mDefaultBaseColors = {
201ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX},
202ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall};
203ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
204ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallconst std::vector<hwc_color_t> Hwc2TestColor::mBasicBaseColors = {
205ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX},
206ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {        0,         0,         0,         0},
207ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall};
208ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
209ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wallconst std::vector<hwc_color_t> Hwc2TestColor::mCompleteBaseColors = {
210ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX},
211ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {UINT8_MAX, UINT8_MAX, UINT8_MAX,         0},
212ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {UINT8_MAX, UINT8_MAX,         0, UINT8_MAX},
213ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {UINT8_MAX, UINT8_MAX,         0,         0},
214ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {UINT8_MAX,         0, UINT8_MAX, UINT8_MAX},
215ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {UINT8_MAX,         0, UINT8_MAX,         0},
216ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {UINT8_MAX,         0,         0, UINT8_MAX},
217ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {UINT8_MAX,         0,         0,         0},
218ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {        0, UINT8_MAX, UINT8_MAX, UINT8_MAX},
219ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {        0, UINT8_MAX, UINT8_MAX,         0},
220ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {        0, UINT8_MAX,         0, UINT8_MAX},
221ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {        0, UINT8_MAX,         0,         0},
222ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {        0,         0, UINT8_MAX, UINT8_MAX},
223ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {        0,         0, UINT8_MAX,         0},
224ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {        0,         0,         0, UINT8_MAX},
225ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall    {        0,         0,         0,         0},
226ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall};
227ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
228ee24278db26505369c0e917d2a83e7e9fda36e4cMarissa Wall
2296bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa WallHwc2TestComposition::Hwc2TestComposition(Hwc2TestCoverage coverage)
230ffc67daf8b834ff2206d221ce15809cd5f21be55Marissa Wall    : Hwc2TestProperty(coverage, mCompleteCompositions, mBasicCompositions,
2311cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            mDefaultCompositions, mCompositionSupport) { }
2326bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
2336bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallstd::string Hwc2TestComposition::dump() const
2346bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall{
2356bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    std::stringstream dmp;
2366bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    dmp << "\tcomposition: " << getCompositionName(get()) << "\n";
2376bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    return dmp.str();
2386bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall}
2396bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
2406bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallconst std::vector<hwc2_composition_t> Hwc2TestComposition::mDefaultCompositions = {
2416bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    HWC2_COMPOSITION_DEVICE,
2426bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall};
2436bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
2446bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallconst std::vector<hwc2_composition_t> Hwc2TestComposition::mBasicCompositions = {
2456bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    HWC2_COMPOSITION_CLIENT,
2466bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    HWC2_COMPOSITION_DEVICE,
2476bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall};
2486bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall
2496bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wallconst std::vector<hwc2_composition_t> Hwc2TestComposition::mCompleteCompositions = {
2506bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    HWC2_COMPOSITION_CLIENT,
2516bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    HWC2_COMPOSITION_DEVICE,
2526bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    HWC2_COMPOSITION_SOLID_COLOR,
2536bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    HWC2_COMPOSITION_CURSOR,
2546bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall    HWC2_COMPOSITION_SIDEBAND,
2556bd8bfde4a965b743d3d4ebff5fdaa3db03a4bbcMarissa Wall};
256b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
257b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
258b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa WallHwc2TestDataspace::Hwc2TestDataspace(Hwc2TestCoverage coverage)
259b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    : Hwc2TestProperty(coverage, completeDataspaces, basicDataspaces,
2601cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            defaultDataspaces, mCompositionSupport) { }
261b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
262b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wallstd::string Hwc2TestDataspace::dump() const
263b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall{
264b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    std::stringstream dmp;
26534beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    dmp << "\tdataspace: " << static_cast<int32_t>(get()) << "\n";
266b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall    return dmp.str();
267b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall}
268b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
26934beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Linconst std::vector<android::ui::Dataspace> Hwc2TestDataspace::defaultDataspaces = {
27034beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::UNKNOWN,
271b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall};
272b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
27334beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Linconst std::vector<android::ui::Dataspace> Hwc2TestDataspace::basicDataspaces = {
27434beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::UNKNOWN,
27534beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::V0_SRGB,
276b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall};
277b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall
27834beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Linconst std::vector<android::ui::Dataspace> Hwc2TestDataspace::completeDataspaces = {
27934beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::UNKNOWN,
28034beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::ARBITRARY,
28134beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::STANDARD_SHIFT,
28234beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::STANDARD_MASK,
28334beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::STANDARD_UNSPECIFIED,
28434beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::STANDARD_BT709,
28534beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::STANDARD_BT601_625,
28634beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::STANDARD_BT601_625_UNADJUSTED,
28734beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::STANDARD_BT601_525,
28834beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::STANDARD_BT601_525_UNADJUSTED,
28934beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::STANDARD_BT2020,
29034beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::STANDARD_BT2020_CONSTANT_LUMINANCE,
29134beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::STANDARD_BT470M,
29234beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::STANDARD_FILM,
29334beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::TRANSFER_SHIFT,
29434beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::TRANSFER_MASK,
29534beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::TRANSFER_UNSPECIFIED,
29634beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::TRANSFER_LINEAR,
29734beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::TRANSFER_SRGB,
29834beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::TRANSFER_SMPTE_170M,
29934beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::TRANSFER_GAMMA2_2,
30034beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::TRANSFER_GAMMA2_8,
30134beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::TRANSFER_ST2084,
30234beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::TRANSFER_HLG,
30334beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::RANGE_SHIFT,
30434beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::RANGE_MASK,
30534beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::RANGE_UNSPECIFIED,
30634beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::RANGE_FULL,
30734beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::RANGE_LIMITED,
30834beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::SRGB_LINEAR,
30934beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::V0_SRGB_LINEAR,
31034beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::SRGB,
31134beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::V0_SRGB,
31234beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::JFIF,
31334beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::V0_JFIF,
31434beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::BT601_625,
31534beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::V0_BT601_625,
31634beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::BT601_525,
31734beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::V0_BT601_525,
31834beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::BT709,
31934beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::V0_BT709,
32034beb7a0ff0494b0c5ad81104171f8a49e599163Peiyong Lin    android::ui::Dataspace::DEPTH,
321b72b5c9ef4a6235c5bc2c4a3cceb23baf963815bMarissa Wall};
3222b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
3232b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
324bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallHwc2TestDisplayDimension::Hwc2TestDisplayDimension(Hwc2TestCoverage coverage)
325bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    : Hwc2TestProperty(
326bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            (coverage == Hwc2TestCoverage::Complete)? mCompleteDisplayDimensions:
327bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            (coverage == Hwc2TestCoverage::Basic)? mBasicDisplayDimensions:
328bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall            mDefaultDisplayDimensions, mCompositionSupport) { }
329bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
330bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wallstd::string Hwc2TestDisplayDimension::dump() const
331bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
332bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    std::stringstream dmp;
333bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    const UnsignedArea& curr = get();
334bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    dmp << "\tdisplay dimension: " << curr.width<< " x " << curr.height<< "\n";
335bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    return dmp.str();
336bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
337bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
3383f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jrvoid Hwc2TestDisplayDimension::setDependent(Hwc2TestVirtualBuffer* buffer)
339bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
3403f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    mBuffers.insert(buffer);
341bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    updateDependents();
342bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
343bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
344bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wallvoid Hwc2TestDisplayDimension::updateDependents()
345bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
346bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    const UnsignedArea& curr = get();
347bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
3483f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    for (Hwc2TestVirtualBuffer* buffer : mBuffers)
3493f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr        buffer->updateBufferArea({static_cast<int32_t>(curr.width),
350bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall                static_cast<int32_t>(curr.height)});
351bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
352bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
353bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wallconst std::vector<UnsignedArea>
354bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        Hwc2TestDisplayDimension::mDefaultDisplayDimensions = {
355bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {1920, 1080},
356bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall};
357bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
358bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wallconst std::vector<UnsignedArea>
359bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        Hwc2TestDisplayDimension::mBasicDisplayDimensions = {
360bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {640, 480},
361bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {1280, 720},
362bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {1920, 1080},
363bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {1920, 1200},
364bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall};
365bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
366bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wallconst std::vector<UnsignedArea>
367bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        Hwc2TestDisplayDimension::mCompleteDisplayDimensions = {
368bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {320, 240},
369bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {480, 320},
370bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {640, 480},
371bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {1280, 720},
372bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {1920, 1080},
373bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {1920, 1200},
374bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {2560, 1440},
375bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {2560, 1600},
376bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {3840, 2160},
377bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    {4096, 2160},
378bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall};
379bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
380bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
381600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa WallHwc2TestDisplayFrame::Hwc2TestDisplayFrame(Hwc2TestCoverage coverage,
382600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        const Area& displayArea)
3831cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    : Hwc2TestProperty(mDisplayFrames, mCompositionSupport),
384600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall      mFrectScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteFrectScalars:
385600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            (coverage == Hwc2TestCoverage::Basic)? mBasicFrectScalars:
386600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            mDefaultFrectScalars),
387600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall      mDisplayArea(displayArea)
388600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
389600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    update();
390600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
391600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
392600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallstd::string Hwc2TestDisplayFrame::dump() const
393600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
394600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    std::stringstream dmp;
395600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    const hwc_rect_t& displayFrame = get();
396600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    dmp << "\tdisplay frame: left " << displayFrame.left << ", top "
397600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            << displayFrame.top << ", right " << displayFrame.right
398600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall            << ", bottom " << displayFrame.bottom << "\n";
399600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    return dmp.str();
400600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
401600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
402600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallvoid Hwc2TestDisplayFrame::update()
403600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall{
404600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    mDisplayFrames.clear();
405600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
406600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    if (mDisplayArea.width == 0 && mDisplayArea.height == 0) {
407600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        mDisplayFrames.push_back({0, 0, 0, 0});
408600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        return;
409600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
410600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
411600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    for (const auto& frectScalar : mFrectScalars) {
412600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall        mDisplayFrames.push_back({
413600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                static_cast<int>(frectScalar.left * mDisplayArea.width),
414600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                static_cast<int>(frectScalar.top * mDisplayArea.height),
415600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                static_cast<int>(frectScalar.right * mDisplayArea.width),
416600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall                static_cast<int>(frectScalar.bottom * mDisplayArea.height)});
417600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    }
418600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall}
419600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
420600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallconst std::vector<hwc_frect_t> Hwc2TestDisplayFrame::mDefaultFrectScalars = {
421600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {0.0, 0.0, 1.0, 1.0},
422600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall};
423600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
424600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallconst std::vector<hwc_frect_t> Hwc2TestDisplayFrame::mBasicFrectScalars = {
425600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {0.0, 0.0, 1.0, 1.0},
426600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {0.0, 0.0, 1.0, 0.05},
427600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {0.0, 0.95, 1.0, 1.0},
428600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall};
429600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
430600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wallconst std::vector<hwc_frect_t> Hwc2TestDisplayFrame::mCompleteFrectScalars = {
431600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {0.0, 0.0, 1.0, 1.0},
432600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {0.0, 0.05, 1.0, 0.95},
433600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {0.0, 0.05, 1.0, 1.0},
434600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {0.0, 0.0, 1.0, 0.05},
435600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {0.0, 0.95, 1.0, 1.0},
436600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {0.25, 0.0, 0.75, 0.35},
437600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall    {0.25, 0.25, 0.75, 0.75},
438600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall};
439600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
440600a73b6110d6fdcebe072a9d8e2dbbe6de1c6b7Marissa Wall
4412b1f53060ea8587a428f826cf7890354ff124722Marissa WallHwc2TestPlaneAlpha::Hwc2TestPlaneAlpha(Hwc2TestCoverage coverage)
4422b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    : Hwc2TestProperty(coverage, mCompletePlaneAlphas, mBasicPlaneAlphas,
4431cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            mDefaultPlaneAlphas, mCompositionSupport) { }
4442b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
4452b1f53060ea8587a428f826cf7890354ff124722Marissa Wallstd::string Hwc2TestPlaneAlpha::dump() const
4462b1f53060ea8587a428f826cf7890354ff124722Marissa Wall{
4472b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    std::stringstream dmp;
4482b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    dmp << "\tplane alpha: " << get() << "\n";
4492b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    return dmp.str();
4502b1f53060ea8587a428f826cf7890354ff124722Marissa Wall}
4512b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
4522b1f53060ea8587a428f826cf7890354ff124722Marissa Wallconst std::vector<float> Hwc2TestPlaneAlpha::mDefaultPlaneAlphas = {
4532b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    1.0f,
4542b1f53060ea8587a428f826cf7890354ff124722Marissa Wall};
4552b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
4562b1f53060ea8587a428f826cf7890354ff124722Marissa Wallconst std::vector<float> Hwc2TestPlaneAlpha::mBasicPlaneAlphas = {
4572b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    1.0f, 0.0f,
4582b1f53060ea8587a428f826cf7890354ff124722Marissa Wall};
4592b1f53060ea8587a428f826cf7890354ff124722Marissa Wall
4602b1f53060ea8587a428f826cf7890354ff124722Marissa Wallconst std::vector<float> Hwc2TestPlaneAlpha::mCompletePlaneAlphas = {
4612b1f53060ea8587a428f826cf7890354ff124722Marissa Wall    1.0f, 0.75f, 0.5f, 0.25f, 0.0f,
4622b1f53060ea8587a428f826cf7890354ff124722Marissa Wall};
463ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
464ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
465c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa WallHwc2TestSourceCrop::Hwc2TestSourceCrop(Hwc2TestCoverage coverage,
466c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        const Area& bufferArea)
4671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    : Hwc2TestProperty(mSourceCrops, mCompositionSupport),
468c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall      mFrectScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteFrectScalars:
469c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            (coverage == Hwc2TestCoverage::Basic)? mBasicFrectScalars:
470c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            mDefaultFrectScalars),
471c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall      mBufferArea(bufferArea)
472c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
473c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    update();
474c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
475c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
476c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallstd::string Hwc2TestSourceCrop::dump() const
477c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
478c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    std::stringstream dmp;
479c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    const hwc_frect_t& sourceCrop = get();
480c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    dmp << "\tsource crop: left " << sourceCrop.left << ", top "
481c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            << sourceCrop.top << ", right " << sourceCrop.right << ", bottom "
482c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall            << sourceCrop.bottom << "\n";
483c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    return dmp.str();
484c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
485c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
486c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid Hwc2TestSourceCrop::updateBufferArea(const Area& bufferArea)
487c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
488c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    mBufferArea = bufferArea;
489c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    update();
490c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
491c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
492c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallvoid Hwc2TestSourceCrop::update()
493c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall{
494c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    mSourceCrops.clear();
495c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
496c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    if (mBufferArea.width == 0 && mBufferArea.height == 0) {
497c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        mSourceCrops.push_back({0, 0, 0, 0});
498c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        return;
499c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    }
500c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
501c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    for (const auto& frectScalar : mFrectScalars) {
502c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall        mSourceCrops.push_back({
503c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                frectScalar.left * mBufferArea.width,
504c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                frectScalar.top * mBufferArea.height,
505c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                frectScalar.right * mBufferArea.width,
506c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall                frectScalar.bottom * mBufferArea.height});
507c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    }
508c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall}
509c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
510c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallconst std::vector<hwc_frect_t> Hwc2TestSourceCrop::mDefaultFrectScalars = {
511c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {0.0, 0.0, 1.0, 1.0},
512c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall};
513c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
514c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallconst std::vector<hwc_frect_t> Hwc2TestSourceCrop::mBasicFrectScalars = {
515c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {0.0, 0.0, 1.0, 1.0},
516c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {0.0, 0.0, 0.5, 0.5},
517c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {0.5, 0.5, 1.0, 1.0},
518c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall};
519c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
520c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wallconst std::vector<hwc_frect_t> Hwc2TestSourceCrop::mCompleteFrectScalars = {
521c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {0.0, 0.0, 1.0, 1.0},
522c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {0.0, 0.0, 0.5, 0.5},
523c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {0.5, 0.5, 1.0, 1.0},
524c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {0.0, 0.0, 0.25, 0.25},
525c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall    {0.25, 0.25, 0.75, 0.75},
526c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall};
527c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
528c57468f1f6dfc870bea10e814a686793e64f6cf3Marissa Wall
529ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallHwc2TestSurfaceDamage::Hwc2TestSurfaceDamage(Hwc2TestCoverage coverage)
5301cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    : Hwc2TestProperty(mSurfaceDamages, mCompositionSupport),
531ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall      mRegionScalars((coverage == Hwc2TestCoverage::Complete)? mCompleteRegionScalars:
532ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            (coverage == Hwc2TestCoverage::Basic)? mBasicRegionScalars:
533ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            mDefaultRegionScalars)
534ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
535ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    update();
536ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
537ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
538ad761818a4426b4e6a0696ba90e05056aa35553cMarissa WallHwc2TestSurfaceDamage::~Hwc2TestSurfaceDamage()
539ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
540ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    freeSurfaceDamages();
541ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
542ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
543ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallstd::string Hwc2TestSurfaceDamage::dump() const
544ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
545ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    std::stringstream dmp;
546ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
547ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    const hwc_region_t& curr = get();
548ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    dmp << "\tsurface damage: region count " << curr.numRects << "\n";
549ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    for (size_t i = 0; i < curr.numRects; i++) {
550ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        const hwc_rect_t& rect = curr.rects[i];
551ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        dmp << "\t\trect: left " << rect.left << ", top " << rect.top
552ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                << ", right " << rect.right << ", bottom " << rect.bottom << "\n";
553ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    }
554ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
555ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    return dmp.str();
556ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
557ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
558ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallvoid Hwc2TestSurfaceDamage::updateBufferArea(const Area& bufferArea)
559ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
560ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    mBufferArea = bufferArea;
561ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    update();
562ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
563ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
564ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallvoid Hwc2TestSurfaceDamage::update()
565ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
566ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    freeSurfaceDamages();
567ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
568ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    if (mBufferArea.width == 0 && mBufferArea.height == 0) {
569ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        mSurfaceDamages.push_back({0, nullptr});
570ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        return;
571ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    }
572ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
573ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    hwc_region_t damage;
574ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
575ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    for (const auto& regionScalar : mRegionScalars) {
576ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        damage.numRects = regionScalar.size();
577ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
578ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        if (damage.numRects > 0) {
579ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            hwc_rect_t* rects = new hwc_rect_t[damage.numRects];
580ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            if (!rects) {
581ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                ALOGW("failed to allocate new hwc_rect_t array");
582ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                continue;
583ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            }
584ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
585ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            for (size_t i = 0; i < damage.numRects; i++) {
586ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                rects[i].left = regionScalar[i].left * mBufferArea.width;
587ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                rects[i].top = regionScalar[i].top * mBufferArea.height;
588ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                rects[i].right = regionScalar[i].right * mBufferArea.width;
589ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall                rects[i].bottom = regionScalar[i].bottom * mBufferArea.height;
590ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            }
591ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
592ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            damage.rects = static_cast<hwc_rect_t const*>(rects);
593ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        } else {
594ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            damage.rects = nullptr;
595ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        }
596ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
597ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        mSurfaceDamages.push_back(damage);
598ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    }
599ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
600ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
601ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallvoid Hwc2TestSurfaceDamage::freeSurfaceDamages()
602ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall{
603ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    for (const auto& surfaceDamage : mSurfaceDamages) {
604ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall        if (surfaceDamage.numRects > 0 && surfaceDamage.rects)
605ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall            delete[] surfaceDamage.rects;
606ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    }
607ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    mSurfaceDamages.clear();
608ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall}
609ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
610ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallconst std::vector<std::vector<hwc_frect_t>> Hwc2TestSurfaceDamage::mDefaultRegionScalars = {
611ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    {{}},
612ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall};
613ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
614ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallconst std::vector<std::vector<hwc_frect_t>> Hwc2TestSurfaceDamage::mBasicRegionScalars = {
615ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    {{}},
616ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    {{0.0, 0.0, 1.0, 1.0}},
617ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall};
618ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
619ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wallconst std::vector<std::vector<hwc_frect_t>> Hwc2TestSurfaceDamage::mCompleteRegionScalars = {
620ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    {{}},
621ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    {{0.0, 0.0, 1.0, 1.0}},
622ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall    {{0.0, 0.0, 0.5, 0.5}, {0.5, 0.5, 1.0, 1.0}},
623ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall};
624ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
625ad761818a4426b4e6a0696ba90e05056aa35553cMarissa Wall
626ac10819373b1ed4901f26c822484a789a7ca4be0Marissa WallHwc2TestTransform::Hwc2TestTransform(Hwc2TestCoverage coverage)
627ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    : Hwc2TestProperty(coverage, mCompleteTransforms, mBasicTransforms,
6281cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall            mDefaultTransforms, mCompositionSupport) { }
629ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
630ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallstd::string Hwc2TestTransform::dump() const
631ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall{
632ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    std::stringstream dmp;
633ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    dmp << "\ttransform: " << getTransformName(get()) << "\n";
634ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    return dmp.str();
635ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall}
636ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
637ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallconst std::vector<hwc_transform_t> Hwc2TestTransform::mDefaultTransforms = {
638ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    static_cast<hwc_transform_t>(0),
639ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall};
640ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
641ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallconst std::vector<hwc_transform_t> Hwc2TestTransform::mBasicTransforms = {
642ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    static_cast<hwc_transform_t>(0),
643ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    HWC_TRANSFORM_FLIP_H,
644ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    HWC_TRANSFORM_FLIP_V,
645ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    HWC_TRANSFORM_ROT_90,
646ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall};
647ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall
648ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wallconst std::vector<hwc_transform_t> Hwc2TestTransform::mCompleteTransforms = {
649ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    static_cast<hwc_transform_t>(0),
650ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    HWC_TRANSFORM_FLIP_H,
651ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    HWC_TRANSFORM_FLIP_V,
652ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    HWC_TRANSFORM_ROT_90,
653ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    HWC_TRANSFORM_ROT_180,
654ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    HWC_TRANSFORM_ROT_270,
655ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    HWC_TRANSFORM_FLIP_H_ROT_90,
656ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall    HWC_TRANSFORM_FLIP_V_ROT_90,
657ac10819373b1ed4901f26c822484a789a7ca4be0Marissa Wall};
658f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
659f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
660f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa WallHwc2TestVisibleRegion::~Hwc2TestVisibleRegion()
661f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
662f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    release();
663f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
664f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
665f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallstd::string Hwc2TestVisibleRegion::dump() const
666f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
667f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    std::stringstream dmp;
668f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
669f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    const hwc_region_t& curr = get();
670f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    dmp << "\tvisible region: region count " << curr.numRects << "\n";
671f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    for (size_t i = 0; i < curr.numRects; i++) {
672f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        const hwc_rect_t& rect = curr.rects[i];
673f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        dmp << "\t\trect: left " << rect.left << ", top " << rect.top
674f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall                << ", right " << rect.right << ", bottom " << rect.bottom << "\n";
675f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    }
676f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
677f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    return dmp.str();
678f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
679f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
680f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallvoid Hwc2TestVisibleRegion::set(const android::Region& visibleRegion)
681f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
682f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    release();
683f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
684f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    size_t size = 0;
685f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    const android::Rect* rects = visibleRegion.getArray(&size);
686f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
687f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    mVisibleRegion.numRects = size;
688f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    mVisibleRegion.rects = nullptr;
689f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
690f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    if (size > 0) {
691f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        hwc_rect_t* hwcRects = new hwc_rect_t[size];
692f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        for (size_t i = 0; i < size; i++) {
693f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            hwcRects[i].left = rects[i].left;
694f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            hwcRects[i].top = rects[i].top;
695f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            hwcRects[i].right = rects[i].right;
696f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall            hwcRects[i].bottom = rects[i].bottom;
697f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        }
698f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        mVisibleRegion.rects = hwcRects;
699f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    }
700f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
701f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
702f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallhwc_region_t Hwc2TestVisibleRegion::get() const
703f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
704f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    return mVisibleRegion;
705f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
706f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall
707f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wallvoid Hwc2TestVisibleRegion::release()
708f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall{
709f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    if (mVisibleRegion.numRects > 0 && mVisibleRegion.rects)
710f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall        delete[] mVisibleRegion.rects;
711f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    mVisibleRegion.rects = nullptr;
712f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall    mVisibleRegion.numRects = 0;
713f7618ed1b4d806e06c872c0fccce57163cf93b6aMarissa Wall}
7141cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
7151cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/* Identifies which layer properties are supported by each composition type.
7161cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall * hwc2_composition_t values range from:
7171cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall *  HWC2_COMPOSITION_INVALID = 0,
7181cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall *  HWC2_COMPOSITION_CLIENT = 1,
7191cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall *  HWC2_COMPOSITION_DEVICE = 2,
7201cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall *  HWC2_COMPOSITION_SOLID_COLOR = 3,
7211cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall *  HWC2_COMPOSITION_CURSOR = 4,
7221cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall *  HWC2_COMPOSITION_SIDEBAND = 5,
7231cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall *
7241cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall * Each property array can be indexed by a hwc2_composition_t value.
7251cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall * By using an array instead of a more complex data structure, runtimes for
7261cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall * some test cases showed a noticeable improvement.
7271cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall */
7281cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
7291cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
7301cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallconst std::array<bool, 6> Hwc2TestBufferArea::mCompositionSupport = {{
7311cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    false,   true,    true,    false,   true,    true,
7321cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}};
7331cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
7341cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
7351cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallconst std::array<bool, 6> Hwc2TestBlendMode::mCompositionSupport = {{
7361cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    false,   true,    true,    false,   true,    true,
7371cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}};
7381cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
7391cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
7401cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallconst std::array<bool, 6> Hwc2TestColor::mCompositionSupport = {{
7411cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    false,   false,   false,   true,    false,   false,
7421cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}};
7431cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
7441cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
7451cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallconst std::array<bool, 6> Hwc2TestComposition::mCompositionSupport = {{
7461cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    false,   true,    true,    true,    true,    true,
7471cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}};
7481cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
7491cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
7501cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallconst std::array<bool, 6> Hwc2TestDataspace::mCompositionSupport = {{
7511cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    false,   true,    true,    true,    true,    false,
7521cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}};
7531cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
7541cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
755bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wallconst std::array<bool, 6> Hwc2TestDisplayDimension::mCompositionSupport = {{
756bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    false,   true,    true,    true,    true,    true,
757bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}};
758bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
759bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
7601cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallconst std::array<bool, 6> Hwc2TestDisplayFrame::mCompositionSupport = {{
7611cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    false,   true,    true,    true,    false,   true,
7621cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}};
7631cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
7641cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
7651cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallconst std::array<bool, 6> Hwc2TestPlaneAlpha::mCompositionSupport = {{
7661cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    false,   true,    true,    true,    true,    true,
7671cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}};
7681cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
7691cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
7701cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallconst std::array<bool, 6> Hwc2TestSourceCrop::mCompositionSupport = {{
7711cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    false,   true,    true,    false,   true,    false,
7721cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}};
7731cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
7741cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
7751cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallconst std::array<bool, 6> Hwc2TestSurfaceDamage::mCompositionSupport = {{
7761cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    false,   false,   true,    false,   true,    false,
7771cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}};
7781cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall
7791cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall/*  INVALID  CLIENT   DEVICE   COLOR    CURSOR   SIDEBAND */
7801cd789cd2b300427467586f4ec721a8123f118b7Marissa Wallconst std::array<bool, 6> Hwc2TestTransform::mCompositionSupport = {{
7811cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall    false,   true,    true,    false,   true,    true,
7821cd789cd2b300427467586f4ec721a8123f118b7Marissa Wall}};
783