xref: /aosp_15_r20/hardware/interfaces/graphics/composer/aidl/vts/ReadbackVts.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /**
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (c) 2021, The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #include "ReadbackVts.h"
18*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/common/BufferUsage.h>
19*4d7e907cSAndroid Build Coastguard Worker #include <cmath>
20*4d7e907cSAndroid Build Coastguard Worker #include "RenderEngineVts.h"
21*4d7e907cSAndroid Build Coastguard Worker #include "renderengine/ExternalTexture.h"
22*4d7e907cSAndroid Build Coastguard Worker #include "renderengine/impl/ExternalTexture.h"
23*4d7e907cSAndroid Build Coastguard Worker 
24*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::graphics::composer3::vts {
25*4d7e907cSAndroid Build Coastguard Worker 
26*4d7e907cSAndroid Build Coastguard Worker const std::vector<ColorMode> ReadbackHelper::colorModes = {ColorMode::SRGB, ColorMode::DISPLAY_P3};
27*4d7e907cSAndroid Build Coastguard Worker const std::vector<Dataspace> ReadbackHelper::dataspaces = {common::Dataspace::SRGB,
28*4d7e907cSAndroid Build Coastguard Worker                                                            common::Dataspace::DISPLAY_P3};
29*4d7e907cSAndroid Build Coastguard Worker 
write(ComposerClientWriter & writer)30*4d7e907cSAndroid Build Coastguard Worker void TestLayer::write(ComposerClientWriter& writer) {
31*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerDisplayFrame(mDisplay, mLayer, mDisplayFrame);
32*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerSourceCrop(mDisplay, mLayer, mSourceCrop);
33*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerZOrder(mDisplay, mLayer, mZOrder);
34*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerSurfaceDamage(mDisplay, mLayer, mSurfaceDamage);
35*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerTransform(mDisplay, mLayer, mTransform);
36*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerPlaneAlpha(mDisplay, mLayer, mAlpha);
37*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerBlendMode(mDisplay, mLayer, mBlendMode);
38*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerBrightness(mDisplay, mLayer, mBrightness);
39*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerDataspace(mDisplay, mLayer, mDataspace);
40*4d7e907cSAndroid Build Coastguard Worker }
41*4d7e907cSAndroid Build Coastguard Worker 
getColorModeString(ColorMode mode)42*4d7e907cSAndroid Build Coastguard Worker std::string ReadbackHelper::getColorModeString(ColorMode mode) {
43*4d7e907cSAndroid Build Coastguard Worker     switch (mode) {
44*4d7e907cSAndroid Build Coastguard Worker         case ColorMode::SRGB:
45*4d7e907cSAndroid Build Coastguard Worker             return {"SRGB"};
46*4d7e907cSAndroid Build Coastguard Worker         case ColorMode::DISPLAY_P3:
47*4d7e907cSAndroid Build Coastguard Worker             return {"DISPLAY_P3"};
48*4d7e907cSAndroid Build Coastguard Worker         default:
49*4d7e907cSAndroid Build Coastguard Worker             return {"Unsupported color mode for readback"};
50*4d7e907cSAndroid Build Coastguard Worker     }
51*4d7e907cSAndroid Build Coastguard Worker }
52*4d7e907cSAndroid Build Coastguard Worker 
getDataspaceString(common::Dataspace dataspace)53*4d7e907cSAndroid Build Coastguard Worker std::string ReadbackHelper::getDataspaceString(common::Dataspace dataspace) {
54*4d7e907cSAndroid Build Coastguard Worker     switch (dataspace) {
55*4d7e907cSAndroid Build Coastguard Worker         case common::Dataspace::SRGB:
56*4d7e907cSAndroid Build Coastguard Worker             return {"SRGB"};
57*4d7e907cSAndroid Build Coastguard Worker         case common::Dataspace::DISPLAY_P3:
58*4d7e907cSAndroid Build Coastguard Worker             return {"DISPLAY_P3"};
59*4d7e907cSAndroid Build Coastguard Worker         case common::Dataspace::UNKNOWN:
60*4d7e907cSAndroid Build Coastguard Worker             return {"UNKNOWN"};
61*4d7e907cSAndroid Build Coastguard Worker         default:
62*4d7e907cSAndroid Build Coastguard Worker             return {"Unsupported dataspace for readback"};
63*4d7e907cSAndroid Build Coastguard Worker     }
64*4d7e907cSAndroid Build Coastguard Worker }
65*4d7e907cSAndroid Build Coastguard Worker 
getDataspaceForColorMode(ColorMode mode)66*4d7e907cSAndroid Build Coastguard Worker Dataspace ReadbackHelper::getDataspaceForColorMode(ColorMode mode) {
67*4d7e907cSAndroid Build Coastguard Worker     switch (mode) {
68*4d7e907cSAndroid Build Coastguard Worker         case ColorMode::DISPLAY_P3:
69*4d7e907cSAndroid Build Coastguard Worker             return Dataspace::DISPLAY_P3;
70*4d7e907cSAndroid Build Coastguard Worker         case ColorMode::SRGB:
71*4d7e907cSAndroid Build Coastguard Worker             return Dataspace::SRGB;
72*4d7e907cSAndroid Build Coastguard Worker         default:
73*4d7e907cSAndroid Build Coastguard Worker             return Dataspace::UNKNOWN;
74*4d7e907cSAndroid Build Coastguard Worker     }
75*4d7e907cSAndroid Build Coastguard Worker }
76*4d7e907cSAndroid Build Coastguard Worker 
toRenderEngineLayerSettings()77*4d7e907cSAndroid Build Coastguard Worker LayerSettings TestLayer::toRenderEngineLayerSettings() {
78*4d7e907cSAndroid Build Coastguard Worker     LayerSettings layerSettings;
79*4d7e907cSAndroid Build Coastguard Worker 
80*4d7e907cSAndroid Build Coastguard Worker     layerSettings.alpha = ::android::half(mAlpha);
81*4d7e907cSAndroid Build Coastguard Worker     layerSettings.disableBlending = mBlendMode == BlendMode::NONE;
82*4d7e907cSAndroid Build Coastguard Worker     layerSettings.source.buffer.isOpaque = mBlendMode == BlendMode::NONE;
83*4d7e907cSAndroid Build Coastguard Worker     layerSettings.geometry.boundaries = ::android::FloatRect(
84*4d7e907cSAndroid Build Coastguard Worker             static_cast<float>(mDisplayFrame.left), static_cast<float>(mDisplayFrame.top),
85*4d7e907cSAndroid Build Coastguard Worker             static_cast<float>(mDisplayFrame.right), static_cast<float>(mDisplayFrame.bottom));
86*4d7e907cSAndroid Build Coastguard Worker 
87*4d7e907cSAndroid Build Coastguard Worker     const ::android::mat4 translation = ::android::mat4::translate(::android::vec4(
88*4d7e907cSAndroid Build Coastguard Worker             (static_cast<uint64_t>(mTransform) & static_cast<uint64_t>(Transform::FLIP_H)
89*4d7e907cSAndroid Build Coastguard Worker                      ? static_cast<float>(-mDisplayFrame.right)
90*4d7e907cSAndroid Build Coastguard Worker                      : 0.0f),
91*4d7e907cSAndroid Build Coastguard Worker             (static_cast<uint64_t>(mTransform) & static_cast<uint64_t>(Transform::FLIP_V)
92*4d7e907cSAndroid Build Coastguard Worker                      ? static_cast<float>(-mDisplayFrame.bottom)
93*4d7e907cSAndroid Build Coastguard Worker                      : 0.0f),
94*4d7e907cSAndroid Build Coastguard Worker             0.0f, 1.0f));
95*4d7e907cSAndroid Build Coastguard Worker 
96*4d7e907cSAndroid Build Coastguard Worker     const ::android::mat4 scale = ::android::mat4::scale(::android::vec4(
97*4d7e907cSAndroid Build Coastguard Worker             static_cast<uint64_t>(mTransform) & static_cast<uint64_t>(Transform::FLIP_H) ? -1.0f
98*4d7e907cSAndroid Build Coastguard Worker                                                                                          : 1.0f,
99*4d7e907cSAndroid Build Coastguard Worker             static_cast<uint64_t>(mTransform) & static_cast<uint64_t>(Transform::FLIP_V) ? -1.0f
100*4d7e907cSAndroid Build Coastguard Worker                                                                                          : 1.0f,
101*4d7e907cSAndroid Build Coastguard Worker             1.0f, 1.0f));
102*4d7e907cSAndroid Build Coastguard Worker 
103*4d7e907cSAndroid Build Coastguard Worker     layerSettings.geometry.positionTransform = scale * translation;
104*4d7e907cSAndroid Build Coastguard Worker     layerSettings.whitePointNits = mWhitePointNits;
105*4d7e907cSAndroid Build Coastguard Worker     layerSettings.sourceDataspace = static_cast<::android::ui::Dataspace>(mDataspace);
106*4d7e907cSAndroid Build Coastguard Worker 
107*4d7e907cSAndroid Build Coastguard Worker     return layerSettings;
108*4d7e907cSAndroid Build Coastguard Worker }
109*4d7e907cSAndroid Build Coastguard Worker 
GetBitsPerChannel(common::PixelFormat pixelFormat)110*4d7e907cSAndroid Build Coastguard Worker int32_t ReadbackHelper::GetBitsPerChannel(common::PixelFormat pixelFormat) {
111*4d7e907cSAndroid Build Coastguard Worker     switch (pixelFormat) {
112*4d7e907cSAndroid Build Coastguard Worker         case common::PixelFormat::RGBA_1010102:
113*4d7e907cSAndroid Build Coastguard Worker             return 10;
114*4d7e907cSAndroid Build Coastguard Worker         case common::PixelFormat::RGBA_8888:
115*4d7e907cSAndroid Build Coastguard Worker         case common::PixelFormat::RGB_888:
116*4d7e907cSAndroid Build Coastguard Worker             return 8;
117*4d7e907cSAndroid Build Coastguard Worker         default:
118*4d7e907cSAndroid Build Coastguard Worker             return -1;
119*4d7e907cSAndroid Build Coastguard Worker     }
120*4d7e907cSAndroid Build Coastguard Worker }
121*4d7e907cSAndroid Build Coastguard Worker 
GetAlphaBits(common::PixelFormat pixelFormat)122*4d7e907cSAndroid Build Coastguard Worker int32_t ReadbackHelper::GetAlphaBits(common::PixelFormat pixelFormat) {
123*4d7e907cSAndroid Build Coastguard Worker     switch (pixelFormat) {
124*4d7e907cSAndroid Build Coastguard Worker         case common::PixelFormat::RGBA_8888:
125*4d7e907cSAndroid Build Coastguard Worker             return 8;
126*4d7e907cSAndroid Build Coastguard Worker         case common::PixelFormat::RGBA_1010102:
127*4d7e907cSAndroid Build Coastguard Worker             return 2;
128*4d7e907cSAndroid Build Coastguard Worker         case common::PixelFormat::RGB_888:
129*4d7e907cSAndroid Build Coastguard Worker             return 0;
130*4d7e907cSAndroid Build Coastguard Worker         default:
131*4d7e907cSAndroid Build Coastguard Worker             return -1;
132*4d7e907cSAndroid Build Coastguard Worker     }
133*4d7e907cSAndroid Build Coastguard Worker }
134*4d7e907cSAndroid Build Coastguard Worker 
fillBuffer(uint32_t width,uint32_t height,uint32_t stride,int32_t bytesPerPixel,void * bufferData,common::PixelFormat pixelFormat,std::vector<Color> desiredPixelColors)135*4d7e907cSAndroid Build Coastguard Worker void ReadbackHelper::fillBuffer(uint32_t width, uint32_t height, uint32_t stride,
136*4d7e907cSAndroid Build Coastguard Worker                                 int32_t bytesPerPixel, void* bufferData,
137*4d7e907cSAndroid Build Coastguard Worker                                 common::PixelFormat pixelFormat,
138*4d7e907cSAndroid Build Coastguard Worker                                 std::vector<Color> desiredPixelColors) {
139*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(pixelFormat == common::PixelFormat::RGB_888 ||
140*4d7e907cSAndroid Build Coastguard Worker                 pixelFormat == common::PixelFormat::RGBA_8888 ||
141*4d7e907cSAndroid Build Coastguard Worker                 pixelFormat == common::PixelFormat::RGBA_1010102);
142*4d7e907cSAndroid Build Coastguard Worker     int32_t bitsPerChannel = GetBitsPerChannel(pixelFormat);
143*4d7e907cSAndroid Build Coastguard Worker     int32_t alphaBits = GetAlphaBits(pixelFormat);
144*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NE(-1, alphaBits);
145*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NE(-1, bitsPerChannel);
146*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NE(-1, bytesPerPixel);
147*4d7e907cSAndroid Build Coastguard Worker 
148*4d7e907cSAndroid Build Coastguard Worker     uint32_t maxValue = (1 << bitsPerChannel) - 1;
149*4d7e907cSAndroid Build Coastguard Worker     uint32_t maxAlphaValue = (1 << alphaBits) - 1;
150*4d7e907cSAndroid Build Coastguard Worker     for (uint32_t row = 0; row < height; row++) {
151*4d7e907cSAndroid Build Coastguard Worker         for (uint32_t col = 0; col < width; col++) {
152*4d7e907cSAndroid Build Coastguard Worker             auto pixel = row * width + col;
153*4d7e907cSAndroid Build Coastguard Worker             Color srcColor = desiredPixelColors[static_cast<size_t>(pixel)];
154*4d7e907cSAndroid Build Coastguard Worker 
155*4d7e907cSAndroid Build Coastguard Worker             uint32_t offset = (row * stride + col) * static_cast<uint32_t>(bytesPerPixel);
156*4d7e907cSAndroid Build Coastguard Worker 
157*4d7e907cSAndroid Build Coastguard Worker             uint32_t* pixelStart = (uint32_t*)((uint8_t*)bufferData + offset);
158*4d7e907cSAndroid Build Coastguard Worker 
159*4d7e907cSAndroid Build Coastguard Worker             uint32_t red = static_cast<uint32_t>(std::round(maxValue * srcColor.r));
160*4d7e907cSAndroid Build Coastguard Worker             uint32_t green = static_cast<uint32_t>(std::round(maxValue * srcColor.g));
161*4d7e907cSAndroid Build Coastguard Worker             uint32_t blue = static_cast<uint32_t>(std::round(maxValue * srcColor.b));
162*4d7e907cSAndroid Build Coastguard Worker 
163*4d7e907cSAndroid Build Coastguard Worker             // Boo we're not word aligned so special case this.
164*4d7e907cSAndroid Build Coastguard Worker             if (pixelFormat == common::PixelFormat::RGB_888) {
165*4d7e907cSAndroid Build Coastguard Worker                 uint8_t* pixelColor = (uint8_t*)pixelStart;
166*4d7e907cSAndroid Build Coastguard Worker                 pixelColor[0] = static_cast<uint8_t>(red);
167*4d7e907cSAndroid Build Coastguard Worker                 pixelColor[1] = static_cast<uint8_t>(green);
168*4d7e907cSAndroid Build Coastguard Worker                 pixelColor[2] = static_cast<uint8_t>(blue);
169*4d7e907cSAndroid Build Coastguard Worker             } else {
170*4d7e907cSAndroid Build Coastguard Worker                 uint32_t alpha = static_cast<uint32_t>(std::round(maxAlphaValue * srcColor.a));
171*4d7e907cSAndroid Build Coastguard Worker                 uint32_t color = (alpha << (32 - alphaBits)) |
172*4d7e907cSAndroid Build Coastguard Worker                                  (blue << (32 - alphaBits - bitsPerChannel)) |
173*4d7e907cSAndroid Build Coastguard Worker                                  (green << (32 - alphaBits - bitsPerChannel * 2)) |
174*4d7e907cSAndroid Build Coastguard Worker                                  (red << (32 - alphaBits - bitsPerChannel * 3));
175*4d7e907cSAndroid Build Coastguard Worker                 *pixelStart = color;
176*4d7e907cSAndroid Build Coastguard Worker             }
177*4d7e907cSAndroid Build Coastguard Worker         }
178*4d7e907cSAndroid Build Coastguard Worker     }
179*4d7e907cSAndroid Build Coastguard Worker }
180*4d7e907cSAndroid Build Coastguard Worker 
clearColors(std::vector<Color> & expectedColors,int32_t width,int32_t height,int32_t displayWidth)181*4d7e907cSAndroid Build Coastguard Worker void ReadbackHelper::clearColors(std::vector<Color>& expectedColors, int32_t width, int32_t height,
182*4d7e907cSAndroid Build Coastguard Worker                                  int32_t displayWidth) {
183*4d7e907cSAndroid Build Coastguard Worker     for (int row = 0; row < height; row++) {
184*4d7e907cSAndroid Build Coastguard Worker         for (int col = 0; col < width; col++) {
185*4d7e907cSAndroid Build Coastguard Worker             int pixel = row * displayWidth + col;
186*4d7e907cSAndroid Build Coastguard Worker             expectedColors[static_cast<size_t>(pixel)] = BLACK;
187*4d7e907cSAndroid Build Coastguard Worker         }
188*4d7e907cSAndroid Build Coastguard Worker     }
189*4d7e907cSAndroid Build Coastguard Worker }
190*4d7e907cSAndroid Build Coastguard Worker 
fillColorsArea(std::vector<Color> & expectedColors,int32_t stride,Rect area,Color color)191*4d7e907cSAndroid Build Coastguard Worker void ReadbackHelper::fillColorsArea(std::vector<Color>& expectedColors, int32_t stride, Rect area,
192*4d7e907cSAndroid Build Coastguard Worker                                     Color color) {
193*4d7e907cSAndroid Build Coastguard Worker     for (int row = area.top; row < area.bottom; row++) {
194*4d7e907cSAndroid Build Coastguard Worker         for (int col = area.left; col < area.right; col++) {
195*4d7e907cSAndroid Build Coastguard Worker             int pixel = row * stride + col;
196*4d7e907cSAndroid Build Coastguard Worker             expectedColors[static_cast<size_t>(pixel)] = color;
197*4d7e907cSAndroid Build Coastguard Worker         }
198*4d7e907cSAndroid Build Coastguard Worker     }
199*4d7e907cSAndroid Build Coastguard Worker }
200*4d7e907cSAndroid Build Coastguard Worker 
readbackSupported(const common::PixelFormat & pixelFormat,const common::Dataspace & dataspace)201*4d7e907cSAndroid Build Coastguard Worker bool ReadbackHelper::readbackSupported(const common::PixelFormat& pixelFormat,
202*4d7e907cSAndroid Build Coastguard Worker                                        const common::Dataspace& dataspace) {
203*4d7e907cSAndroid Build Coastguard Worker     if (pixelFormat != common::PixelFormat::RGB_888 &&
204*4d7e907cSAndroid Build Coastguard Worker         pixelFormat != common::PixelFormat::RGBA_8888 &&
205*4d7e907cSAndroid Build Coastguard Worker         pixelFormat != common::PixelFormat::RGBA_1010102) {
206*4d7e907cSAndroid Build Coastguard Worker         return false;
207*4d7e907cSAndroid Build Coastguard Worker     }
208*4d7e907cSAndroid Build Coastguard Worker     if (std::find(dataspaces.begin(), dataspaces.end(), dataspace) == dataspaces.end()) {
209*4d7e907cSAndroid Build Coastguard Worker         return false;
210*4d7e907cSAndroid Build Coastguard Worker     }
211*4d7e907cSAndroid Build Coastguard Worker     return true;
212*4d7e907cSAndroid Build Coastguard Worker }
213*4d7e907cSAndroid Build Coastguard Worker 
compareColorBuffers(const std::vector<Color> & expectedColors,void * bufferData,const uint32_t stride,int32_t bytesPerPixel,const uint32_t width,const uint32_t height,common::PixelFormat pixelFormat)214*4d7e907cSAndroid Build Coastguard Worker void ReadbackHelper::compareColorBuffers(const std::vector<Color>& expectedColors, void* bufferData,
215*4d7e907cSAndroid Build Coastguard Worker                                          const uint32_t stride, int32_t bytesPerPixel,
216*4d7e907cSAndroid Build Coastguard Worker                                          const uint32_t width, const uint32_t height,
217*4d7e907cSAndroid Build Coastguard Worker                                          common::PixelFormat pixelFormat) {
218*4d7e907cSAndroid Build Coastguard Worker     int32_t bitsPerChannel = GetBitsPerChannel(pixelFormat);
219*4d7e907cSAndroid Build Coastguard Worker     int32_t alphaBits = GetAlphaBits(pixelFormat);
220*4d7e907cSAndroid Build Coastguard Worker     ASSERT_GT(bytesPerPixel, 0);
221*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NE(-1, alphaBits);
222*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NE(-1, bitsPerChannel);
223*4d7e907cSAndroid Build Coastguard Worker     uint32_t maxValue = (1 << bitsPerChannel) - 1;
224*4d7e907cSAndroid Build Coastguard Worker     uint32_t maxAlphaValue = (1 << alphaBits) - 1;
225*4d7e907cSAndroid Build Coastguard Worker     for (uint32_t row = 0; row < height; row++) {
226*4d7e907cSAndroid Build Coastguard Worker         for (uint32_t col = 0; col < width; col++) {
227*4d7e907cSAndroid Build Coastguard Worker             auto pixel = row * width + col;
228*4d7e907cSAndroid Build Coastguard Worker             const Color expectedColor = expectedColors[static_cast<size_t>(pixel)];
229*4d7e907cSAndroid Build Coastguard Worker 
230*4d7e907cSAndroid Build Coastguard Worker             uint32_t offset = (row * stride + col) * static_cast<uint32_t>(bytesPerPixel);
231*4d7e907cSAndroid Build Coastguard Worker             uint32_t* pixelStart = (uint32_t*)((uint8_t*)bufferData + offset);
232*4d7e907cSAndroid Build Coastguard Worker 
233*4d7e907cSAndroid Build Coastguard Worker             uint32_t expectedRed = static_cast<uint32_t>(std::round(maxValue * expectedColor.r));
234*4d7e907cSAndroid Build Coastguard Worker             uint32_t expectedGreen = static_cast<uint32_t>(std::round(maxValue * expectedColor.g));
235*4d7e907cSAndroid Build Coastguard Worker             uint32_t expectedBlue = static_cast<uint32_t>(std::round(maxValue * expectedColor.b));
236*4d7e907cSAndroid Build Coastguard Worker 
237*4d7e907cSAndroid Build Coastguard Worker             // Boo we're not word aligned so special case this.
238*4d7e907cSAndroid Build Coastguard Worker             if (pixelFormat == common::PixelFormat::RGB_888) {
239*4d7e907cSAndroid Build Coastguard Worker                 uint8_t* pixelColor = (uint8_t*)pixelStart;
240*4d7e907cSAndroid Build Coastguard Worker                 ASSERT_EQ(pixelColor[0], static_cast<uint8_t>(expectedRed))
241*4d7e907cSAndroid Build Coastguard Worker                         << "Red channel mismatch at (" << row << ", " << col << ")";
242*4d7e907cSAndroid Build Coastguard Worker                 ASSERT_EQ(pixelColor[1], static_cast<uint8_t>(expectedGreen))
243*4d7e907cSAndroid Build Coastguard Worker                         << "Green channel mismatch at (" << row << ", " << col << ")";
244*4d7e907cSAndroid Build Coastguard Worker                 ASSERT_EQ(pixelColor[2], static_cast<uint8_t>(expectedBlue))
245*4d7e907cSAndroid Build Coastguard Worker                         << "Blue channel mismatch at (" << row << ", " << col << ")";
246*4d7e907cSAndroid Build Coastguard Worker             } else {
247*4d7e907cSAndroid Build Coastguard Worker                 uint32_t expectedAlpha =
248*4d7e907cSAndroid Build Coastguard Worker                         static_cast<uint32_t>(std::round(maxAlphaValue * expectedColor.a));
249*4d7e907cSAndroid Build Coastguard Worker 
250*4d7e907cSAndroid Build Coastguard Worker                 uint32_t actualRed =
251*4d7e907cSAndroid Build Coastguard Worker                         (*pixelStart >> (32 - alphaBits - bitsPerChannel * 3)) & maxValue;
252*4d7e907cSAndroid Build Coastguard Worker                 uint32_t actualGreen =
253*4d7e907cSAndroid Build Coastguard Worker                         (*pixelStart >> (32 - alphaBits - bitsPerChannel * 2)) & maxValue;
254*4d7e907cSAndroid Build Coastguard Worker                 uint32_t actualBlue = (*pixelStart >> (32 - alphaBits - bitsPerChannel)) & maxValue;
255*4d7e907cSAndroid Build Coastguard Worker                 uint32_t actualAlpha = (*pixelStart >> (32 - alphaBits)) & maxAlphaValue;
256*4d7e907cSAndroid Build Coastguard Worker 
257*4d7e907cSAndroid Build Coastguard Worker                 ASSERT_EQ(expectedRed, actualRed)
258*4d7e907cSAndroid Build Coastguard Worker                         << "Red channel mismatch at (" << row << ", " << col << ")";
259*4d7e907cSAndroid Build Coastguard Worker                 ASSERT_EQ(expectedGreen, actualGreen)
260*4d7e907cSAndroid Build Coastguard Worker                         << "Green channel mismatch at (" << row << ", " << col << ")";
261*4d7e907cSAndroid Build Coastguard Worker                 ASSERT_EQ(expectedBlue, actualBlue)
262*4d7e907cSAndroid Build Coastguard Worker                         << "Blue channel mismatch at (" << row << ", " << col << ")";
263*4d7e907cSAndroid Build Coastguard Worker             }
264*4d7e907cSAndroid Build Coastguard Worker         }
265*4d7e907cSAndroid Build Coastguard Worker     }
266*4d7e907cSAndroid Build Coastguard Worker }
267*4d7e907cSAndroid Build Coastguard Worker 
compareColorBuffers(void * expectedBuffer,void * actualBuffer,const uint32_t stride,int32_t bytesPerPixel,const uint32_t width,const uint32_t height,common::PixelFormat pixelFormat)268*4d7e907cSAndroid Build Coastguard Worker void ReadbackHelper::compareColorBuffers(void* expectedBuffer, void* actualBuffer,
269*4d7e907cSAndroid Build Coastguard Worker                                          const uint32_t stride, int32_t bytesPerPixel,
270*4d7e907cSAndroid Build Coastguard Worker                                          const uint32_t width, const uint32_t height,
271*4d7e907cSAndroid Build Coastguard Worker                                          common::PixelFormat pixelFormat) {
272*4d7e907cSAndroid Build Coastguard Worker     int32_t bitsPerChannel = GetBitsPerChannel(pixelFormat);
273*4d7e907cSAndroid Build Coastguard Worker     int32_t alphaBits = GetAlphaBits(pixelFormat);
274*4d7e907cSAndroid Build Coastguard Worker     ASSERT_GT(bytesPerPixel, 0);
275*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NE(-1, alphaBits);
276*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NE(-1, bitsPerChannel);
277*4d7e907cSAndroid Build Coastguard Worker     uint32_t maxValue = (1 << bitsPerChannel) - 1;
278*4d7e907cSAndroid Build Coastguard Worker     uint32_t maxAlphaValue = (1 << alphaBits) - 1;
279*4d7e907cSAndroid Build Coastguard Worker     for (uint32_t row = 0; row < height; row++) {
280*4d7e907cSAndroid Build Coastguard Worker         for (uint32_t col = 0; col < width; col++) {
281*4d7e907cSAndroid Build Coastguard Worker             uint32_t offset = (row * stride + col) * static_cast<uint32_t>(bytesPerPixel);
282*4d7e907cSAndroid Build Coastguard Worker             uint32_t* expectedStart = (uint32_t*)((uint8_t*)expectedBuffer + offset);
283*4d7e907cSAndroid Build Coastguard Worker             uint32_t* actualStart = (uint32_t*)((uint8_t*)actualBuffer + offset);
284*4d7e907cSAndroid Build Coastguard Worker 
285*4d7e907cSAndroid Build Coastguard Worker             // Boo we're not word aligned so special case this.
286*4d7e907cSAndroid Build Coastguard Worker             if (pixelFormat == common::PixelFormat::RGB_888) {
287*4d7e907cSAndroid Build Coastguard Worker                 uint8_t* expectedPixel = (uint8_t*)expectedStart;
288*4d7e907cSAndroid Build Coastguard Worker                 uint8_t* actualPixel = (uint8_t*)actualStart;
289*4d7e907cSAndroid Build Coastguard Worker                 ASSERT_EQ(actualPixel[0], expectedPixel[0])
290*4d7e907cSAndroid Build Coastguard Worker                         << "Red channel mismatch at (" << row << ", " << col << ")";
291*4d7e907cSAndroid Build Coastguard Worker                 ASSERT_EQ(actualPixel[1], expectedPixel[1])
292*4d7e907cSAndroid Build Coastguard Worker                         << "Green channel mismatch at (" << row << ", " << col << ")";
293*4d7e907cSAndroid Build Coastguard Worker                 ASSERT_EQ(actualPixel[2], expectedPixel[2])
294*4d7e907cSAndroid Build Coastguard Worker                         << "Blue channel mismatch at (" << row << ", " << col << ")";
295*4d7e907cSAndroid Build Coastguard Worker             } else {
296*4d7e907cSAndroid Build Coastguard Worker                 uint32_t expectedRed =
297*4d7e907cSAndroid Build Coastguard Worker                         (*expectedStart >> (32 - alphaBits - bitsPerChannel * 3)) & maxValue;
298*4d7e907cSAndroid Build Coastguard Worker                 uint32_t expectedGreen =
299*4d7e907cSAndroid Build Coastguard Worker                         (*expectedStart >> (32 - alphaBits - bitsPerChannel * 2)) & maxValue;
300*4d7e907cSAndroid Build Coastguard Worker                 uint32_t expectedBlue =
301*4d7e907cSAndroid Build Coastguard Worker                         (*expectedStart >> (32 - alphaBits - bitsPerChannel)) & maxValue;
302*4d7e907cSAndroid Build Coastguard Worker                 uint32_t expectedAlpha = (*expectedStart >> (32 - alphaBits)) & maxAlphaValue;
303*4d7e907cSAndroid Build Coastguard Worker 
304*4d7e907cSAndroid Build Coastguard Worker                 uint32_t actualRed =
305*4d7e907cSAndroid Build Coastguard Worker                         (*actualStart >> (32 - alphaBits - bitsPerChannel * 3)) & maxValue;
306*4d7e907cSAndroid Build Coastguard Worker                 uint32_t actualGreen =
307*4d7e907cSAndroid Build Coastguard Worker                         (*actualStart >> (32 - alphaBits - bitsPerChannel * 2)) & maxValue;
308*4d7e907cSAndroid Build Coastguard Worker                 uint32_t actualBlue =
309*4d7e907cSAndroid Build Coastguard Worker                         (*actualStart >> (32 - alphaBits - bitsPerChannel)) & maxValue;
310*4d7e907cSAndroid Build Coastguard Worker                 uint32_t actualAlpha = (*actualStart >> (32 - alphaBits)) & maxAlphaValue;
311*4d7e907cSAndroid Build Coastguard Worker 
312*4d7e907cSAndroid Build Coastguard Worker                 ASSERT_EQ(expectedRed, actualRed)
313*4d7e907cSAndroid Build Coastguard Worker                         << "Red channel mismatch at (" << row << ", " << col << ")";
314*4d7e907cSAndroid Build Coastguard Worker                 ASSERT_EQ(expectedGreen, actualGreen)
315*4d7e907cSAndroid Build Coastguard Worker                         << "Green channel mismatch at (" << row << ", " << col << ")";
316*4d7e907cSAndroid Build Coastguard Worker                 ASSERT_EQ(expectedBlue, actualBlue)
317*4d7e907cSAndroid Build Coastguard Worker                         << "Blue channel mismatch at (" << row << ", " << col << ")";
318*4d7e907cSAndroid Build Coastguard Worker             }
319*4d7e907cSAndroid Build Coastguard Worker         }
320*4d7e907cSAndroid Build Coastguard Worker     }
321*4d7e907cSAndroid Build Coastguard Worker }
322*4d7e907cSAndroid Build Coastguard Worker 
ReadbackBuffer(int64_t display,const std::shared_ptr<VtsComposerClient> & client,int32_t width,int32_t height,common::PixelFormat pixelFormat,common::Dataspace dataspace)323*4d7e907cSAndroid Build Coastguard Worker ReadbackBuffer::ReadbackBuffer(int64_t display, const std::shared_ptr<VtsComposerClient>& client,
324*4d7e907cSAndroid Build Coastguard Worker                                int32_t width, int32_t height, common::PixelFormat pixelFormat,
325*4d7e907cSAndroid Build Coastguard Worker                                common::Dataspace dataspace)
326*4d7e907cSAndroid Build Coastguard Worker     : mComposerClient(client) {
327*4d7e907cSAndroid Build Coastguard Worker     mDisplay = display;
328*4d7e907cSAndroid Build Coastguard Worker 
329*4d7e907cSAndroid Build Coastguard Worker     mPixelFormat = pixelFormat;
330*4d7e907cSAndroid Build Coastguard Worker     mDataspace = dataspace;
331*4d7e907cSAndroid Build Coastguard Worker 
332*4d7e907cSAndroid Build Coastguard Worker     mWidth = static_cast<uint32_t>(width);
333*4d7e907cSAndroid Build Coastguard Worker     mHeight = static_cast<uint32_t>(height);
334*4d7e907cSAndroid Build Coastguard Worker     mLayerCount = 1;
335*4d7e907cSAndroid Build Coastguard Worker     mUsage = static_cast<uint64_t>(static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
336*4d7e907cSAndroid Build Coastguard Worker                                    static_cast<uint64_t>(common::BufferUsage::GPU_TEXTURE));
337*4d7e907cSAndroid Build Coastguard Worker 
338*4d7e907cSAndroid Build Coastguard Worker     mAccessRegion.top = 0;
339*4d7e907cSAndroid Build Coastguard Worker     mAccessRegion.left = 0;
340*4d7e907cSAndroid Build Coastguard Worker     mAccessRegion.right = static_cast<int32_t>(width);
341*4d7e907cSAndroid Build Coastguard Worker     mAccessRegion.bottom = static_cast<int32_t>(height);
342*4d7e907cSAndroid Build Coastguard Worker }
343*4d7e907cSAndroid Build Coastguard Worker 
allocateBuffer()344*4d7e907cSAndroid Build Coastguard Worker ::android::sp<::android::GraphicBuffer> ReadbackBuffer::allocateBuffer() {
345*4d7e907cSAndroid Build Coastguard Worker     return ::android::sp<::android::GraphicBuffer>::make(
346*4d7e907cSAndroid Build Coastguard Worker             mWidth, mHeight, static_cast<::android::PixelFormat>(mPixelFormat), mLayerCount, mUsage,
347*4d7e907cSAndroid Build Coastguard Worker             "ReadbackBuffer");
348*4d7e907cSAndroid Build Coastguard Worker }
349*4d7e907cSAndroid Build Coastguard Worker 
setReadbackBuffer()350*4d7e907cSAndroid Build Coastguard Worker void ReadbackBuffer::setReadbackBuffer() {
351*4d7e907cSAndroid Build Coastguard Worker     mGraphicBuffer = allocateBuffer();
352*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mGraphicBuffer);
353*4d7e907cSAndroid Build Coastguard Worker     ASSERT_EQ(::android::OK, mGraphicBuffer->initCheck());
354*4d7e907cSAndroid Build Coastguard Worker     const auto& bufferHandle = mGraphicBuffer->handle;
355*4d7e907cSAndroid Build Coastguard Worker     ::ndk::ScopedFileDescriptor fence = ::ndk::ScopedFileDescriptor(-1);
356*4d7e907cSAndroid Build Coastguard Worker     EXPECT_TRUE(mComposerClient->setReadbackBuffer(mDisplay, bufferHandle, fence).isOk());
357*4d7e907cSAndroid Build Coastguard Worker }
358*4d7e907cSAndroid Build Coastguard Worker 
checkReadbackBuffer(const std::vector<Color> & expectedColors)359*4d7e907cSAndroid Build Coastguard Worker void ReadbackBuffer::checkReadbackBuffer(const std::vector<Color>& expectedColors) {
360*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mGraphicBuffer);
361*4d7e907cSAndroid Build Coastguard Worker     // lock buffer for reading
362*4d7e907cSAndroid Build Coastguard Worker     const auto& [fenceStatus, bufferFence] = mComposerClient->getReadbackBufferFence(mDisplay);
363*4d7e907cSAndroid Build Coastguard Worker     EXPECT_TRUE(fenceStatus.isOk());
364*4d7e907cSAndroid Build Coastguard Worker 
365*4d7e907cSAndroid Build Coastguard Worker     int bytesPerPixel = -1;
366*4d7e907cSAndroid Build Coastguard Worker     int bytesPerStride = -1;
367*4d7e907cSAndroid Build Coastguard Worker     void* bufData = nullptr;
368*4d7e907cSAndroid Build Coastguard Worker 
369*4d7e907cSAndroid Build Coastguard Worker     auto status = mGraphicBuffer->lockAsync(mUsage, mAccessRegion, &bufData, dup(bufferFence.get()),
370*4d7e907cSAndroid Build Coastguard Worker                                             &bytesPerPixel, &bytesPerStride);
371*4d7e907cSAndroid Build Coastguard Worker     EXPECT_EQ(::android::OK, status);
372*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mPixelFormat == PixelFormat::RGB_888 || mPixelFormat == PixelFormat::RGBA_8888 ||
373*4d7e907cSAndroid Build Coastguard Worker                 mPixelFormat == PixelFormat::RGBA_1010102);
374*4d7e907cSAndroid Build Coastguard Worker     const uint32_t stride = (bytesPerPixel > 0 && bytesPerStride > 0)
375*4d7e907cSAndroid Build Coastguard Worker                                     ? static_cast<uint32_t>(bytesPerStride / bytesPerPixel)
376*4d7e907cSAndroid Build Coastguard Worker                                     : mGraphicBuffer->getStride();
377*4d7e907cSAndroid Build Coastguard Worker     ReadbackHelper::compareColorBuffers(expectedColors, bufData, stride, bytesPerPixel, mWidth,
378*4d7e907cSAndroid Build Coastguard Worker                                         mHeight, mPixelFormat);
379*4d7e907cSAndroid Build Coastguard Worker     status = mGraphicBuffer->unlock();
380*4d7e907cSAndroid Build Coastguard Worker     EXPECT_EQ(::android::OK, status);
381*4d7e907cSAndroid Build Coastguard Worker }
382*4d7e907cSAndroid Build Coastguard Worker 
getBuffer()383*4d7e907cSAndroid Build Coastguard Worker ::android::sp<::android::GraphicBuffer> ReadbackBuffer::getBuffer() {
384*4d7e907cSAndroid Build Coastguard Worker     const auto& [fenceStatus, bufferFence] = mComposerClient->getReadbackBufferFence(mDisplay);
385*4d7e907cSAndroid Build Coastguard Worker     EXPECT_TRUE(fenceStatus.isOk());
386*4d7e907cSAndroid Build Coastguard Worker     if (bufferFence.get() != -1) {
387*4d7e907cSAndroid Build Coastguard Worker         sync_wait(bufferFence.get(), -1);
388*4d7e907cSAndroid Build Coastguard Worker     }
389*4d7e907cSAndroid Build Coastguard Worker     return mGraphicBuffer;
390*4d7e907cSAndroid Build Coastguard Worker }
391*4d7e907cSAndroid Build Coastguard Worker 
write(ComposerClientWriter & writer)392*4d7e907cSAndroid Build Coastguard Worker void TestColorLayer::write(ComposerClientWriter& writer) {
393*4d7e907cSAndroid Build Coastguard Worker     TestLayer::write(writer);
394*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerCompositionType(mDisplay, mLayer, Composition::SOLID_COLOR);
395*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerColor(mDisplay, mLayer, mColor);
396*4d7e907cSAndroid Build Coastguard Worker }
397*4d7e907cSAndroid Build Coastguard Worker 
toRenderEngineLayerSettings()398*4d7e907cSAndroid Build Coastguard Worker LayerSettings TestColorLayer::toRenderEngineLayerSettings() {
399*4d7e907cSAndroid Build Coastguard Worker     LayerSettings layerSettings = TestLayer::toRenderEngineLayerSettings();
400*4d7e907cSAndroid Build Coastguard Worker 
401*4d7e907cSAndroid Build Coastguard Worker     layerSettings.source.solidColor = ::android::half3(mColor.r, mColor.g, mColor.b);
402*4d7e907cSAndroid Build Coastguard Worker     layerSettings.alpha = mAlpha * mColor.a;
403*4d7e907cSAndroid Build Coastguard Worker     return layerSettings;
404*4d7e907cSAndroid Build Coastguard Worker }
405*4d7e907cSAndroid Build Coastguard Worker 
TestBufferLayer(const std::shared_ptr<VtsComposerClient> & client,TestRenderEngine & renderEngine,int64_t display,uint32_t width,uint32_t height,common::PixelFormat format,ComposerClientWriter & writer,Composition composition)406*4d7e907cSAndroid Build Coastguard Worker TestBufferLayer::TestBufferLayer(const std::shared_ptr<VtsComposerClient>& client,
407*4d7e907cSAndroid Build Coastguard Worker                                  TestRenderEngine& renderEngine, int64_t display, uint32_t width,
408*4d7e907cSAndroid Build Coastguard Worker                                  uint32_t height, common::PixelFormat format,
409*4d7e907cSAndroid Build Coastguard Worker                                  ComposerClientWriter& writer, Composition composition)
410*4d7e907cSAndroid Build Coastguard Worker     : TestLayer{client, display, writer}, mRenderEngine(renderEngine) {
411*4d7e907cSAndroid Build Coastguard Worker     mComposition = composition;
412*4d7e907cSAndroid Build Coastguard Worker     mWidth = width;
413*4d7e907cSAndroid Build Coastguard Worker     mHeight = height;
414*4d7e907cSAndroid Build Coastguard Worker     mLayerCount = 1;
415*4d7e907cSAndroid Build Coastguard Worker     mPixelFormat = format;
416*4d7e907cSAndroid Build Coastguard Worker     mUsage = (static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
417*4d7e907cSAndroid Build Coastguard Worker               static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
418*4d7e907cSAndroid Build Coastguard Worker               static_cast<uint64_t>(common::BufferUsage::COMPOSER_OVERLAY) |
419*4d7e907cSAndroid Build Coastguard Worker               static_cast<uint64_t>(common::BufferUsage::GPU_TEXTURE));
420*4d7e907cSAndroid Build Coastguard Worker 
421*4d7e907cSAndroid Build Coastguard Worker     mAccessRegion.top = 0;
422*4d7e907cSAndroid Build Coastguard Worker     mAccessRegion.left = 0;
423*4d7e907cSAndroid Build Coastguard Worker     mAccessRegion.right = static_cast<int32_t>(width);
424*4d7e907cSAndroid Build Coastguard Worker     mAccessRegion.bottom = static_cast<int32_t>(height);
425*4d7e907cSAndroid Build Coastguard Worker 
426*4d7e907cSAndroid Build Coastguard Worker     setSourceCrop({0, 0, (float)width, (float)height});
427*4d7e907cSAndroid Build Coastguard Worker }
428*4d7e907cSAndroid Build Coastguard Worker 
write(ComposerClientWriter & writer)429*4d7e907cSAndroid Build Coastguard Worker void TestBufferLayer::write(ComposerClientWriter& writer) {
430*4d7e907cSAndroid Build Coastguard Worker     TestLayer::write(writer);
431*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerCompositionType(mDisplay, mLayer, mComposition);
432*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerVisibleRegion(mDisplay, mLayer, std::vector<Rect>(1, mDisplayFrame));
433*4d7e907cSAndroid Build Coastguard Worker     if (mGraphicBuffer) {
434*4d7e907cSAndroid Build Coastguard Worker         writer.setLayerBuffer(mDisplay, mLayer, /*slot*/ 0, mGraphicBuffer->handle, mFillFence);
435*4d7e907cSAndroid Build Coastguard Worker     }
436*4d7e907cSAndroid Build Coastguard Worker }
437*4d7e907cSAndroid Build Coastguard Worker 
toRenderEngineLayerSettings()438*4d7e907cSAndroid Build Coastguard Worker LayerSettings TestBufferLayer::toRenderEngineLayerSettings() {
439*4d7e907cSAndroid Build Coastguard Worker     LayerSettings layerSettings = TestLayer::toRenderEngineLayerSettings();
440*4d7e907cSAndroid Build Coastguard Worker     layerSettings.source.buffer.buffer =
441*4d7e907cSAndroid Build Coastguard Worker             std::make_shared<::android::renderengine::impl::ExternalTexture>(
442*4d7e907cSAndroid Build Coastguard Worker                     mGraphicBuffer, mRenderEngine.getInternalRenderEngine(),
443*4d7e907cSAndroid Build Coastguard Worker                     ::android::renderengine::impl::ExternalTexture::Usage::READABLE);
444*4d7e907cSAndroid Build Coastguard Worker 
445*4d7e907cSAndroid Build Coastguard Worker     layerSettings.source.buffer.usePremultipliedAlpha = mBlendMode == BlendMode::PREMULTIPLIED;
446*4d7e907cSAndroid Build Coastguard Worker 
447*4d7e907cSAndroid Build Coastguard Worker     const float scaleX = (mSourceCrop.right - mSourceCrop.left) / (static_cast<float>(mWidth));
448*4d7e907cSAndroid Build Coastguard Worker     const float scaleY = (mSourceCrop.bottom - mSourceCrop.top) / (static_cast<float>(mHeight));
449*4d7e907cSAndroid Build Coastguard Worker     const float translateX = mSourceCrop.left / (static_cast<float>(mWidth));
450*4d7e907cSAndroid Build Coastguard Worker     const float translateY = mSourceCrop.top / (static_cast<float>(mHeight));
451*4d7e907cSAndroid Build Coastguard Worker 
452*4d7e907cSAndroid Build Coastguard Worker     layerSettings.source.buffer.textureTransform =
453*4d7e907cSAndroid Build Coastguard Worker             ::android::mat4::translate(::android::vec4(translateX, translateY, 0.0f, 1.0f)) *
454*4d7e907cSAndroid Build Coastguard Worker             ::android::mat4::scale(::android::vec4(scaleX, scaleY, 1.0f, 1.0f));
455*4d7e907cSAndroid Build Coastguard Worker 
456*4d7e907cSAndroid Build Coastguard Worker     return layerSettings;
457*4d7e907cSAndroid Build Coastguard Worker }
458*4d7e907cSAndroid Build Coastguard Worker 
fillBuffer(std::vector<Color> & expectedColors)459*4d7e907cSAndroid Build Coastguard Worker void TestBufferLayer::fillBuffer(std::vector<Color>& expectedColors) {
460*4d7e907cSAndroid Build Coastguard Worker     void* bufData;
461*4d7e907cSAndroid Build Coastguard Worker     int32_t bytesPerPixel = -1;
462*4d7e907cSAndroid Build Coastguard Worker     int32_t bytesPerStride = -1;
463*4d7e907cSAndroid Build Coastguard Worker     auto status = mGraphicBuffer->lock(mUsage, &bufData, &bytesPerPixel, &bytesPerStride);
464*4d7e907cSAndroid Build Coastguard Worker     const uint32_t stride = (bytesPerPixel > 0 && bytesPerStride > 0)
465*4d7e907cSAndroid Build Coastguard Worker                                     ? static_cast<uint32_t>(bytesPerStride / bytesPerPixel)
466*4d7e907cSAndroid Build Coastguard Worker                                     : mGraphicBuffer->getStride();
467*4d7e907cSAndroid Build Coastguard Worker     EXPECT_EQ(::android::OK, status);
468*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(ReadbackHelper::fillBuffer(mWidth, mHeight, stride, bytesPerPixel,
469*4d7e907cSAndroid Build Coastguard Worker                                                        bufData, mPixelFormat, expectedColors));
470*4d7e907cSAndroid Build Coastguard Worker 
471*4d7e907cSAndroid Build Coastguard Worker     const auto unlockStatus = mGraphicBuffer->unlockAsync(&mFillFence);
472*4d7e907cSAndroid Build Coastguard Worker     ASSERT_EQ(::android::OK, unlockStatus);
473*4d7e907cSAndroid Build Coastguard Worker }
474*4d7e907cSAndroid Build Coastguard Worker 
setBuffer(std::vector<Color> colors)475*4d7e907cSAndroid Build Coastguard Worker void TestBufferLayer::setBuffer(std::vector<Color> colors) {
476*4d7e907cSAndroid Build Coastguard Worker     mGraphicBuffer = allocateBuffer();
477*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mGraphicBuffer);
478*4d7e907cSAndroid Build Coastguard Worker     ASSERT_EQ(::android::OK, mGraphicBuffer->initCheck());
479*4d7e907cSAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(fillBuffer(colors));
480*4d7e907cSAndroid Build Coastguard Worker }
481*4d7e907cSAndroid Build Coastguard Worker 
allocateBuffer()482*4d7e907cSAndroid Build Coastguard Worker ::android::sp<::android::GraphicBuffer> TestBufferLayer::allocateBuffer() {
483*4d7e907cSAndroid Build Coastguard Worker     return ::android::sp<::android::GraphicBuffer>::make(
484*4d7e907cSAndroid Build Coastguard Worker             mWidth, mHeight, static_cast<::android::PixelFormat>(mPixelFormat), mLayerCount, mUsage,
485*4d7e907cSAndroid Build Coastguard Worker             "TestBufferLayer");
486*4d7e907cSAndroid Build Coastguard Worker }
487*4d7e907cSAndroid Build Coastguard Worker 
setToClientComposition(ComposerClientWriter & writer)488*4d7e907cSAndroid Build Coastguard Worker void TestBufferLayer::setToClientComposition(ComposerClientWriter& writer) {
489*4d7e907cSAndroid Build Coastguard Worker     writer.setLayerCompositionType(mDisplay, mLayer, Composition::CLIENT);
490*4d7e907cSAndroid Build Coastguard Worker }
491*4d7e907cSAndroid Build Coastguard Worker 
492*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl::android::hardware::graphics::composer3::vts
493