blob: 3d9253f917efbe5c08c695d483cbbcb37191211f [file] [log] [blame]
ramindanibab8ba92021-11-18 01:24:11 +00001/**
2 * Copyright (c) 2021, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "graphics_composer_aidl_hal_readback_tests@3"
18
19#include <aidl/Gtest.h>
20#include <aidl/Vintf.h>
Brian Lindahle887a252023-01-17 14:54:19 -070021#include <aidl/android/hardware/graphics/common/BufferUsage.h>
Ady Abraham46219f52021-12-20 09:44:31 -080022#include <aidl/android/hardware/graphics/composer3/IComposer.h>
ramindanibab8ba92021-11-18 01:24:11 +000023#include <gtest/gtest.h>
Alec Mouri51067012022-01-06 17:28:39 -080024#include <ui/DisplayId.h>
25#include <ui/DisplayIdentification.h>
ramindanibab8ba92021-11-18 01:24:11 +000026#include <ui/GraphicBuffer.h>
ramindanibab8ba92021-11-18 01:24:11 +000027#include <ui/PixelFormat.h>
28#include <ui/Rect.h>
ramindani458e53e2022-02-23 17:30:16 +000029#include "GraphicsComposerCallback.h"
30#include "ReadbackVts.h"
31#include "RenderEngineVts.h"
32#include "VtsComposerClient.h"
Alec Mouri51067012022-01-06 17:28:39 -080033
ramindanibab8ba92021-11-18 01:24:11 +000034namespace aidl::android::hardware::graphics::composer3::vts {
35namespace {
36
37using ::android::Rect;
38using common::Dataspace;
39using common::PixelFormat;
40
41class GraphicsCompositionTestBase : public ::testing::Test {
42 protected:
43 void SetUpBase(const std::string& name) {
ramindanidcecfd42022-02-03 23:52:19 +000044 mComposerClient = std::make_shared<VtsComposerClient>(name);
45 ASSERT_TRUE(mComposerClient->createClient().isOk());
ramindanibab8ba92021-11-18 01:24:11 +000046
ramindanidcecfd42022-02-03 23:52:19 +000047 const auto& [status, displays] = mComposerClient->getDisplays();
48 ASSERT_TRUE(status.isOk());
49 mDisplays = displays;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -040050 mWriter.reset(new ComposerClientWriter(getPrimaryDisplayId()));
ramindanibab8ba92021-11-18 01:24:11 +000051
52 setTestColorModes();
53
54 // explicitly disable vsync
ramindanidcecfd42022-02-03 23:52:19 +000055 for (const auto& display : mDisplays) {
56 EXPECT_TRUE(mComposerClient->setVsync(display.getDisplayId(), /*enable*/ false).isOk());
57 }
58 mComposerClient->setVsyncAllowed(/*isAllowed*/ false);
ramindanibab8ba92021-11-18 01:24:11 +000059
ramindanidcecfd42022-02-03 23:52:19 +000060 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindanibab8ba92021-11-18 01:24:11 +000061
Alec Mouri19e90fa2024-05-13 17:09:25 +000062 const auto format = getHasReadbackBuffer() ? mPixelFormat : common::PixelFormat::RGBA_8888;
63
ramindanibab8ba92021-11-18 01:24:11 +000064 ASSERT_NO_FATAL_FAILURE(
65 mTestRenderEngine = std::unique_ptr<TestRenderEngine>(new TestRenderEngine(
66 ::android::renderengine::RenderEngineCreationArgs::Builder()
Alec Mouri19e90fa2024-05-13 17:09:25 +000067 .setPixelFormat(static_cast<int>(format))
ramindanibab8ba92021-11-18 01:24:11 +000068 .setImageCacheSize(TestRenderEngine::sMaxFrameBufferAcquireBuffers)
ramindanibab8ba92021-11-18 01:24:11 +000069 .setEnableProtectedContext(false)
70 .setPrecacheToneMapperShaderOnly(false)
71 .setContextPriority(::android::renderengine::RenderEngine::
72 ContextPriority::HIGH)
73 .build())));
74
Alec Mourif6c039a2023-10-06 23:02:17 +000075 mClientCompositionDisplaySettings.physicalDisplay =
76 Rect(getDisplayWidth(), getDisplayHeight());
77 mClientCompositionDisplaySettings.clip = mClientCompositionDisplaySettings.physicalDisplay;
ramindanibab8ba92021-11-18 01:24:11 +000078
Brian Lindahle887a252023-01-17 14:54:19 -070079 mTestRenderEngine->initGraphicBuffer(
80 static_cast<uint32_t>(getDisplayWidth()), static_cast<uint32_t>(getDisplayHeight()),
81 /*layerCount*/ 1U,
82 static_cast<uint64_t>(
83 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
84 static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
85 static_cast<uint64_t>(common::BufferUsage::GPU_RENDER_TARGET)));
Alec Mourif6c039a2023-10-06 23:02:17 +000086 mTestRenderEngine->setDisplaySettings(mClientCompositionDisplaySettings);
ramindanibab8ba92021-11-18 01:24:11 +000087 }
88
89 void TearDown() override {
Leon Scroggins III94f4b202024-01-09 11:43:45 -050090 ASSERT_FALSE(mDisplays.empty());
ramindanidcecfd42022-02-03 23:52:19 +000091 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
Ady Abrahama00d2462023-12-26 14:21:20 -080092 ASSERT_TRUE(mComposerClient->tearDown(mWriter.get()));
ramindanidcecfd42022-02-03 23:52:19 +000093 mComposerClient.reset();
Ady Abraham3192f3d2021-12-03 16:08:56 -080094 const auto errors = mReader.takeErrors();
95 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcecfd42022-02-03 23:52:19 +000096 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
ramindanibab8ba92021-11-18 01:24:11 +000097 }
98
ramindanidcecfd42022-02-03 23:52:19 +000099 const VtsDisplay& getPrimaryDisplay() const { return mDisplays[0]; }
100
101 int64_t getPrimaryDisplayId() const { return getPrimaryDisplay().getDisplayId(); }
102
103 int64_t getInvalidDisplayId() const { return mComposerClient->getInvalidDisplayId(); }
104
105 int32_t getDisplayWidth() const { return getPrimaryDisplay().getDisplayWidth(); }
106
107 int32_t getDisplayHeight() const { return getPrimaryDisplay().getDisplayHeight(); }
108
ramindanid5751092022-04-22 22:30:20 +0000109 void assertServiceSpecificError(const ScopedAStatus& status, int32_t serviceSpecificError) {
110 ASSERT_EQ(status.getExceptionCode(), EX_SERVICE_SPECIFIC);
111 ASSERT_EQ(status.getServiceSpecificError(), serviceSpecificError);
112 }
113
Brian Lindahle887a252023-01-17 14:54:19 -0700114 std::pair<bool, ::android::sp<::android::GraphicBuffer>> allocateBuffer(uint32_t usage) {
115 const auto width = static_cast<uint32_t>(getDisplayWidth());
116 const auto height = static_cast<uint32_t>(getDisplayHeight());
117
118 const auto& graphicBuffer = ::android::sp<::android::GraphicBuffer>::make(
119 width, height, ::android::PIXEL_FORMAT_RGBA_8888,
120 /*layerCount*/ 1u, usage, "VtsHalGraphicsComposer3_ReadbackTest");
ramindani0a2bee42022-02-10 01:27:42 +0000121
122 if (graphicBuffer && ::android::OK == graphicBuffer->initCheck()) {
Brian Lindahle887a252023-01-17 14:54:19 -0700123 return {true, graphicBuffer};
ramindani0a2bee42022-02-10 01:27:42 +0000124 }
Brian Lindahle887a252023-01-17 14:54:19 -0700125 return {false, graphicBuffer};
ramindanibab8ba92021-11-18 01:24:11 +0000126 }
127
ramindanibab8ba92021-11-18 01:24:11 +0000128 void writeLayers(const std::vector<std::shared_ptr<TestLayer>>& layers) {
ramindanidcecfd42022-02-03 23:52:19 +0000129 for (const auto& layer : layers) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400130 layer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000131 }
132 execute();
133 }
134
135 void execute() {
Huihong Luo651806f2023-04-21 18:48:48 +0000136 auto commands = mWriter->takePendingCommands();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800137 if (commands.empty()) {
Ady Abraham3192f3d2021-12-03 16:08:56 -0800138 return;
ramindanibab8ba92021-11-18 01:24:11 +0000139 }
140
ramindanidcecfd42022-02-03 23:52:19 +0000141 auto [status, results] = mComposerClient->executeCommands(commands);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800142 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
ramindanibab8ba92021-11-18 01:24:11 +0000143
Ady Abraham46219f52021-12-20 09:44:31 -0800144 mReader.parse(std::move(results));
ramindanibab8ba92021-11-18 01:24:11 +0000145 }
146
ramindani44c952f2022-02-28 23:29:29 +0000147 bool getHasReadbackBuffer() {
ramindanidcecfd42022-02-03 23:52:19 +0000148 auto [status, readBackBufferAttributes] =
149 mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
150 if (status.isOk()) {
151 mPixelFormat = readBackBufferAttributes.format;
152 mDataspace = readBackBufferAttributes.dataspace;
ramindani44c952f2022-02-28 23:29:29 +0000153 return ReadbackHelper::readbackSupported(mPixelFormat, mDataspace);
ramindanidcecfd42022-02-03 23:52:19 +0000154 }
ramindanid5751092022-04-22 22:30:20 +0000155 EXPECT_NO_FATAL_FAILURE(
156 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani44c952f2022-02-28 23:29:29 +0000157 return false;
ramindanib27f33b2021-12-03 19:36:10 +0000158 }
159
ramindanidcecfd42022-02-03 23:52:19 +0000160 std::shared_ptr<VtsComposerClient> mComposerClient;
161 std::vector<VtsDisplay> mDisplays;
162 // use the slot count usually set by SF
ramindanibab8ba92021-11-18 01:24:11 +0000163 std::vector<ColorMode> mTestColorModes;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400164 std::unique_ptr<ComposerClientWriter> mWriter;
Ady Abraham91c9d1a2021-12-15 18:14:45 -0800165 ComposerClientReader mReader;
ramindanibab8ba92021-11-18 01:24:11 +0000166 std::unique_ptr<TestRenderEngine> mTestRenderEngine;
ramindanibab8ba92021-11-18 01:24:11 +0000167 common::PixelFormat mPixelFormat;
168 common::Dataspace mDataspace;
Alec Mourif6c039a2023-10-06 23:02:17 +0000169 ::android::renderengine::DisplaySettings mClientCompositionDisplaySettings;
ramindanibab8ba92021-11-18 01:24:11 +0000170
171 static constexpr uint32_t kClientTargetSlotCount = 64;
172
173 private:
ramindanibab8ba92021-11-18 01:24:11 +0000174 void setTestColorModes() {
175 mTestColorModes.clear();
ramindanidcecfd42022-02-03 23:52:19 +0000176 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
177 ASSERT_TRUE(status.isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000178
179 for (ColorMode mode : modes) {
180 if (std::find(ReadbackHelper::colorModes.begin(), ReadbackHelper::colorModes.end(),
181 mode) != ReadbackHelper::colorModes.end()) {
182 mTestColorModes.push_back(mode);
183 }
184 }
185 }
186};
187
188class GraphicsCompositionTest : public GraphicsCompositionTestBase,
189 public testing::WithParamInterface<std::string> {
190 public:
191 void SetUp() override { SetUpBase(GetParam()); }
192};
193
194TEST_P(GraphicsCompositionTest, SingleSolidColorLayer) {
195 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000196 EXPECT_TRUE(mComposerClient
197 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
198 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000199
ramindani44c952f2022-02-28 23:29:29 +0000200 bool isSupported;
201 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000202 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000203 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
204 return;
205 }
206
Ady Abrahama00d2462023-12-26 14:21:20 -0800207 auto layer =
208 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
ramindanidcecfd42022-02-03 23:52:19 +0000209 common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000210 layer->setColor(BLUE);
211 layer->setDisplayFrame(coloredSquare);
212 layer->setZOrder(10);
213
214 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
215
216 // expected color for each pixel
ramindanidcecfd42022-02-03 23:52:19 +0000217 std::vector<Color> expectedColors(
218 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
219 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), coloredSquare, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000220
ramindanidcecfd42022-02-03 23:52:19 +0000221 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700222 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000223 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
224
225 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800226 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -0800227 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
228 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +0000229 execute();
230 // if hwc cannot handle and asks for composition change,
231 // just succeed the test
ramindanidcecfd42022-02-03 23:52:19 +0000232 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000233 GTEST_SUCCEED();
234 return;
235 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800236 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400237 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000238 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800239 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000240
241 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
242 mTestRenderEngine->setRenderLayers(layers);
243 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
244 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
245 }
246}
247
248TEST_P(GraphicsCompositionTest, SetLayerBuffer) {
249 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000250 EXPECT_TRUE(mComposerClient
251 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
252 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000253
ramindani44c952f2022-02-28 23:29:29 +0000254 bool isSupported;
255 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000256 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000257 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
258 return;
259 }
260
ramindanidcecfd42022-02-03 23:52:19 +0000261 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700262 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000263 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000264 std::vector<Color> expectedColors(
265 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
266 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
267 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
268 ReadbackHelper::fillColorsArea(
269 expectedColors, getDisplayWidth(),
270 {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
271 ReadbackHelper::fillColorsArea(
272 expectedColors, getDisplayWidth(),
273 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000274
275 auto layer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000276 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
Ady Abrahama00d2462023-12-26 14:21:20 -0800277 getDisplayHeight(), common::PixelFormat::RGBA_8888, *mWriter);
ramindanidcecfd42022-02-03 23:52:19 +0000278 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000279 layer->setZOrder(10);
Alec Mourif6c039a2023-10-06 23:02:17 +0000280 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +0000281 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
282
283 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
284
285 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800286 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -0800287 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
288 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +0000289 execute();
290
ramindanidcecfd42022-02-03 23:52:19 +0000291 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000292 GTEST_SUCCEED();
293 return;
294 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800295 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000296
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400297 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000298 execute();
299
Ady Abraham3192f3d2021-12-03 16:08:56 -0800300 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000301
302 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
303 mTestRenderEngine->setRenderLayers(layers);
304 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
305 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
306 }
307}
308
309TEST_P(GraphicsCompositionTest, SetLayerBufferNoEffect) {
310 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000311 EXPECT_TRUE(mComposerClient
312 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
313 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000314
ramindani44c952f2022-02-28 23:29:29 +0000315 bool isSupported;
316 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000317 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000318 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
319 return;
320 }
321
Ady Abrahama00d2462023-12-26 14:21:20 -0800322 auto layer =
323 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
ramindanidcecfd42022-02-03 23:52:19 +0000324 common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000325 layer->setColor(BLUE);
326 layer->setDisplayFrame(coloredSquare);
327 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400328 layer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000329
330 // This following buffer call should have no effect
Brian Lindahle887a252023-01-17 14:54:19 -0700331 const auto usage = static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
332 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN);
333 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(usage);
334 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000335 const auto& buffer = graphicBuffer->handle;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400336 mWriter->setLayerBuffer(getPrimaryDisplayId(), layer->getLayer(), /*slot*/ 0, buffer,
337 /*acquireFence*/ -1);
ramindanibab8ba92021-11-18 01:24:11 +0000338
339 // expected color for each pixel
ramindanidcecfd42022-02-03 23:52:19 +0000340 std::vector<Color> expectedColors(
341 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
342 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), coloredSquare, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000343
ramindanidcecfd42022-02-03 23:52:19 +0000344 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700345 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000346 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
347
ramindanicdcfcaf2023-11-09 10:00:10 -0800348 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
349 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +0000350 execute();
351
ramindanidcecfd42022-02-03 23:52:19 +0000352 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000353 GTEST_SUCCEED();
354 return;
355 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800356 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400357 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000358 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800359 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000360
361 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
362 }
363}
364
ramindanib27f33b2021-12-03 19:36:10 +0000365TEST_P(GraphicsCompositionTest, SetReadbackBuffer) {
ramindani44c952f2022-02-28 23:29:29 +0000366 bool isSupported;
367 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000368 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000369 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
370 return;
371 }
372
ramindanidcecfd42022-02-03 23:52:19 +0000373 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700374 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanib27f33b2021-12-03 19:36:10 +0000375
376 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
377}
378
ramindanidcecfd42022-02-03 23:52:19 +0000379TEST_P(GraphicsCompositionTest, SetReadbackBuffer_BadDisplay) {
ramindani44c952f2022-02-28 23:29:29 +0000380 bool isSupported;
381 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000382 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000383 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
384 return;
385 }
386
Brian Lindahle887a252023-01-17 14:54:19 -0700387 const auto usage = static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
388 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN);
389 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(usage);
390 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000391 const auto& bufferHandle = graphicBuffer->handle;
ramindanib27f33b2021-12-03 19:36:10 +0000392 ::ndk::ScopedFileDescriptor fence = ::ndk::ScopedFileDescriptor(-1);
393
ramindanidcecfd42022-02-03 23:52:19 +0000394 const auto status =
395 mComposerClient->setReadbackBuffer(getInvalidDisplayId(), bufferHandle, fence);
ramindanib27f33b2021-12-03 19:36:10 +0000396
ramindanidcecfd42022-02-03 23:52:19 +0000397 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000398 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanib27f33b2021-12-03 19:36:10 +0000399}
400
ramindanidcecfd42022-02-03 23:52:19 +0000401TEST_P(GraphicsCompositionTest, SetReadbackBuffer_BadParameter) {
ramindani44c952f2022-02-28 23:29:29 +0000402 bool isSupported;
403 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000404 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000405 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
406 return;
407 }
408
ramindanidcecfd42022-02-03 23:52:19 +0000409 const native_handle_t bufferHandle{};
ramindanib27f33b2021-12-03 19:36:10 +0000410 ndk::ScopedFileDescriptor releaseFence = ndk::ScopedFileDescriptor(-1);
ramindanidcecfd42022-02-03 23:52:19 +0000411 const auto status =
412 mComposerClient->setReadbackBuffer(getPrimaryDisplayId(), &bufferHandle, releaseFence);
ramindanib27f33b2021-12-03 19:36:10 +0000413
ramindanidcecfd42022-02-03 23:52:19 +0000414 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000415 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanib27f33b2021-12-03 19:36:10 +0000416}
417
418TEST_P(GraphicsCompositionTest, GetReadbackBufferFenceInactive) {
ramindani44c952f2022-02-28 23:29:29 +0000419 bool isSupported;
420 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000421 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000422 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
423 return;
424 }
425
ramindanidcecfd42022-02-03 23:52:19 +0000426 const auto& [status, releaseFence] =
427 mComposerClient->getReadbackBufferFence(getPrimaryDisplayId());
ramindanib27f33b2021-12-03 19:36:10 +0000428
ramindanidcecfd42022-02-03 23:52:19 +0000429 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000430 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Alec Mouri62ae37b2022-01-20 17:16:38 -0800431 EXPECT_EQ(-1, releaseFence.get());
ramindanib27f33b2021-12-03 19:36:10 +0000432}
433
ramindanibab8ba92021-11-18 01:24:11 +0000434TEST_P(GraphicsCompositionTest, ClientComposition) {
ramindanidcecfd42022-02-03 23:52:19 +0000435 EXPECT_TRUE(
436 mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)
437 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000438
439 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000440 EXPECT_TRUE(mComposerClient
441 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
ramindanibab8ba92021-11-18 01:24:11 +0000442 .isOk());
443
ramindani44c952f2022-02-28 23:29:29 +0000444 bool isSupported;
445 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000446 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000447 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
448 return;
449 }
450
ramindanidcecfd42022-02-03 23:52:19 +0000451 std::vector<Color> expectedColors(
452 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
453 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
454 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
455 ReadbackHelper::fillColorsArea(
456 expectedColors, getDisplayWidth(),
457 {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
458 ReadbackHelper::fillColorsArea(
459 expectedColors, getDisplayWidth(),
460 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000461
Ady Abrahama00d2462023-12-26 14:21:20 -0800462 auto layer = std::make_shared<TestBufferLayer>(
463 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
464 getDisplayHeight(), PixelFormat::RGBA_FP16, *mWriter);
ramindanidcecfd42022-02-03 23:52:19 +0000465 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000466 layer->setZOrder(10);
Alec Mourif6c039a2023-10-06 23:02:17 +0000467 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +0000468
469 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
470
ramindanidcecfd42022-02-03 23:52:19 +0000471 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700472 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000473 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
474 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800475 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -0800476 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
477 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +0000478 execute();
479
ramindanidcecfd42022-02-03 23:52:19 +0000480 auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800481 if (!changedCompositionTypes.empty()) {
Ady Abraham3192f3d2021-12-03 16:08:56 -0800482 ASSERT_EQ(1, changedCompositionTypes.size());
Ady Abraham46219f52021-12-20 09:44:31 -0800483 ASSERT_EQ(Composition::CLIENT, changedCompositionTypes[0].composition);
ramindanibab8ba92021-11-18 01:24:11 +0000484
485 PixelFormat clientFormat = PixelFormat::RGBA_8888;
Brian Lindahle887a252023-01-17 14:54:19 -0700486 auto clientUsage = static_cast<uint32_t>(
487 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN) |
488 static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
489 static_cast<uint32_t>(common::BufferUsage::COMPOSER_CLIENT_TARGET));
ramindanibab8ba92021-11-18 01:24:11 +0000490 Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
ramindanidcecfd42022-02-03 23:52:19 +0000491 common::Rect damage{0, 0, getDisplayWidth(), getDisplayHeight()};
ramindanibab8ba92021-11-18 01:24:11 +0000492
493 // create client target buffer
Brian Lindahle887a252023-01-17 14:54:19 -0700494 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(clientUsage);
495 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000496 const auto& buffer = graphicBuffer->handle;
ramindanibab8ba92021-11-18 01:24:11 +0000497 void* clientBufData;
ramindani0a2bee42022-02-10 01:27:42 +0000498 const auto stride = static_cast<uint32_t>(graphicBuffer->stride);
499 graphicBuffer->lock(clientUsage, layer->getAccessRegion(), &clientBufData);
ramindanibab8ba92021-11-18 01:24:11 +0000500
501 ASSERT_NO_FATAL_FAILURE(
ramindani0a2bee42022-02-10 01:27:42 +0000502 ReadbackHelper::fillBuffer(layer->getWidth(), layer->getHeight(), stride,
ramindanibab8ba92021-11-18 01:24:11 +0000503 clientBufData, clientFormat, expectedColors));
ramindanib1144212022-02-10 01:51:24 +0000504 int32_t clientFence;
505 const auto unlockStatus = graphicBuffer->unlockAsync(&clientFence);
506 ASSERT_EQ(::android::OK, unlockStatus);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400507 mWriter->setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, buffer, clientFence,
Alec Mouri8062f1f2023-09-06 02:14:47 +0000508 clientDataspace, std::vector<common::Rect>(1, damage), 1.f);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400509 layer->setToClientComposition(*mWriter);
ramindanicdcfcaf2023-11-09 10:00:10 -0800510 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
511 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +0000512 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000513 changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800514 ASSERT_TRUE(changedCompositionTypes.empty());
ramindanibab8ba92021-11-18 01:24:11 +0000515 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800516 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000517
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400518 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000519 execute();
520
Ady Abraham3192f3d2021-12-03 16:08:56 -0800521 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000522
523 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
524 }
525}
526
Sally Qi0ca29272024-02-23 11:07:08 -0800527TEST_P(GraphicsCompositionTest, MixedColorSpaces) {
528 ASSERT_TRUE(
529 mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)
530 .isOk());
531 const auto& [status, properties] = mComposerClient->getOverlaySupport();
532 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
533 status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED) {
534 GTEST_SUCCEED() << "getOverlaySupport is not supported";
535 return;
536 }
537
538 if (properties.supportMixedColorSpaces == false) {
539 GTEST_SUCCEED() << "supportMixedColorSpaces is not supported";
540 return;
541 }
542
543 for (ColorMode mode : mTestColorModes) {
544 EXPECT_TRUE(mComposerClient
545 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
546 .isOk());
547
548 bool isSupported;
549 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
550 if (!isSupported) {
551 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
552 return;
553 }
554
555 // sRGB layer
556 auto srgbLayer = std::make_shared<TestBufferLayer>(
557 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
558 getDisplayHeight() / 2, PixelFormat::RGBA_8888, *mWriter);
559 std::vector<Color> sRgbDeviceColors(srgbLayer->getWidth() * srgbLayer->getHeight());
560 ReadbackHelper::fillColorsArea(sRgbDeviceColors, getDisplayWidth(),
561 {0, 0, static_cast<int32_t>(srgbLayer->getWidth()),
562 static_cast<int32_t>(srgbLayer->getHeight())},
563 GREEN);
564 srgbLayer->setDisplayFrame({0, 0, static_cast<int32_t>(srgbLayer->getWidth()),
565 static_cast<int32_t>(srgbLayer->getHeight())});
566 srgbLayer->setZOrder(10);
567 srgbLayer->setDataspace(Dataspace::SRGB);
568 ASSERT_NO_FATAL_FAILURE(srgbLayer->setBuffer(sRgbDeviceColors));
569
570 // display P3 layer
571 auto displayP3Layer = std::make_shared<TestBufferLayer>(
572 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
573 getDisplayHeight() / 2, PixelFormat::RGBA_8888, *mWriter);
574 std::vector<Color> displayP3DeviceColors(
575 static_cast<size_t>(displayP3Layer->getWidth() * displayP3Layer->getHeight()));
576 ReadbackHelper::fillColorsArea(displayP3DeviceColors, getDisplayWidth(),
577 {0, 0, static_cast<int32_t>(displayP3Layer->getWidth()),
578 static_cast<int32_t>(displayP3Layer->getHeight())},
579 RED);
580 displayP3Layer->setDisplayFrame(
581 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()});
582 displayP3Layer->setZOrder(10);
583 displayP3Layer->setDataspace(Dataspace::DISPLAY_P3);
584 ASSERT_NO_FATAL_FAILURE(displayP3Layer->setBuffer(displayP3DeviceColors));
585
586 writeLayers({srgbLayer, displayP3Layer});
587
588 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
589 VtsComposerClient::kNoFrameIntervalNs);
590 execute();
591
592 auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
593 ASSERT_TRUE(changedCompositionTypes.empty());
594
595 mWriter->presentDisplay(getPrimaryDisplayId());
596 execute();
597
598 changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
599 ASSERT_TRUE(changedCompositionTypes.empty());
600 ASSERT_TRUE(mReader.takeErrors().empty());
601 }
602}
603
ramindanibab8ba92021-11-18 01:24:11 +0000604TEST_P(GraphicsCompositionTest, DeviceAndClientComposition) {
ramindanidcecfd42022-02-03 23:52:19 +0000605 ASSERT_TRUE(
606 mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)
607 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000608
609 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000610 EXPECT_TRUE(mComposerClient
611 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
612 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000613
ramindani44c952f2022-02-28 23:29:29 +0000614 bool isSupported;
615 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000616 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000617 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
618 return;
619 }
620
ramindanidcecfd42022-02-03 23:52:19 +0000621 std::vector<Color> expectedColors(
622 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
623 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
624 {0, 0, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
625 ReadbackHelper::fillColorsArea(
626 expectedColors, getDisplayWidth(),
627 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000628
ramindanidcecfd42022-02-03 23:52:19 +0000629 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700630 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000631 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
632
633 auto deviceLayer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000634 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
Ady Abrahama00d2462023-12-26 14:21:20 -0800635 getDisplayHeight() / 2, PixelFormat::RGBA_8888, *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000636 std::vector<Color> deviceColors(deviceLayer->getWidth() * deviceLayer->getHeight());
637 ReadbackHelper::fillColorsArea(deviceColors, static_cast<int32_t>(deviceLayer->getWidth()),
638 {0, 0, static_cast<int32_t>(deviceLayer->getWidth()),
639 static_cast<int32_t>(deviceLayer->getHeight())},
640 GREEN);
641 deviceLayer->setDisplayFrame({0, 0, static_cast<int32_t>(deviceLayer->getWidth()),
642 static_cast<int32_t>(deviceLayer->getHeight())});
643 deviceLayer->setZOrder(10);
Alec Mourif6c039a2023-10-06 23:02:17 +0000644 deviceLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +0000645 ASSERT_NO_FATAL_FAILURE(deviceLayer->setBuffer(deviceColors));
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400646 deviceLayer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000647
648 PixelFormat clientFormat = PixelFormat::RGBA_8888;
Brian Lindahle887a252023-01-17 14:54:19 -0700649 auto clientUsage = static_cast<uint32_t>(
650 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
651 static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
652 static_cast<uint32_t>(common::BufferUsage::COMPOSER_CLIENT_TARGET));
ramindanibab8ba92021-11-18 01:24:11 +0000653 Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
ramindanidcecfd42022-02-03 23:52:19 +0000654 int32_t clientWidth = getDisplayWidth();
655 int32_t clientHeight = getDisplayHeight() / 2;
ramindanibab8ba92021-11-18 01:24:11 +0000656
657 auto clientLayer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000658 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), clientWidth,
Ady Abrahama00d2462023-12-26 14:21:20 -0800659 clientHeight, PixelFormat::RGBA_FP16, *mWriter, Composition::DEVICE);
ramindanidcecfd42022-02-03 23:52:19 +0000660 common::Rect clientFrame = {0, getDisplayHeight() / 2, getDisplayWidth(),
661 getDisplayHeight()};
ramindanibab8ba92021-11-18 01:24:11 +0000662 clientLayer->setDisplayFrame(clientFrame);
663 clientLayer->setZOrder(0);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400664 clientLayer->write(*mWriter);
ramindanicdcfcaf2023-11-09 10:00:10 -0800665 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
666 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +0000667 execute();
668
ramindanidcecfd42022-02-03 23:52:19 +0000669 auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800670 if (changedCompositionTypes.size() != 1) {
ramindanibab8ba92021-11-18 01:24:11 +0000671 continue;
672 }
673 // create client target buffer
Ady Abraham46219f52021-12-20 09:44:31 -0800674 ASSERT_EQ(Composition::CLIENT, changedCompositionTypes[0].composition);
Brian Lindahle887a252023-01-17 14:54:19 -0700675 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(clientUsage);
676 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000677 const auto& buffer = graphicBuffer->handle;
ramindanibab8ba92021-11-18 01:24:11 +0000678
679 void* clientBufData;
ramindani0a2bee42022-02-10 01:27:42 +0000680 graphicBuffer->lock(clientUsage, {0, 0, getDisplayWidth(), getDisplayHeight()},
681 &clientBufData);
ramindanibab8ba92021-11-18 01:24:11 +0000682
ramindanidcecfd42022-02-03 23:52:19 +0000683 std::vector<Color> clientColors(
684 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
685 ReadbackHelper::fillColorsArea(clientColors, getDisplayWidth(), clientFrame, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000686 ASSERT_NO_FATAL_FAILURE(ReadbackHelper::fillBuffer(
ramindanidcecfd42022-02-03 23:52:19 +0000687 static_cast<uint32_t>(getDisplayWidth()), static_cast<uint32_t>(getDisplayHeight()),
ramindani0a2bee42022-02-10 01:27:42 +0000688 graphicBuffer->getStride(), clientBufData, clientFormat, clientColors));
ramindanib1144212022-02-10 01:51:24 +0000689 int32_t clientFence;
690 const auto unlockStatus = graphicBuffer->unlockAsync(&clientFence);
691 ASSERT_EQ(::android::OK, unlockStatus);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400692 mWriter->setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, buffer, clientFence,
Alec Mouri8062f1f2023-09-06 02:14:47 +0000693 clientDataspace, std::vector<common::Rect>(1, clientFrame), 1.f);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400694 clientLayer->setToClientComposition(*mWriter);
ramindanicdcfcaf2023-11-09 10:00:10 -0800695 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
696 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +0000697 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000698 changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800699 ASSERT_TRUE(changedCompositionTypes.empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800700 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000701
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400702 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000703 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800704 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000705 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
706 }
707}
708
709TEST_P(GraphicsCompositionTest, SetLayerDamage) {
710 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000711 EXPECT_TRUE(mComposerClient
712 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
713 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000714
ramindani44c952f2022-02-28 23:29:29 +0000715 bool isSupported;
716 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000717 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000718 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
719 return;
720 }
721
ramindanidcecfd42022-02-03 23:52:19 +0000722 common::Rect redRect = {0, 0, getDisplayWidth() / 4, getDisplayHeight() / 4};
ramindanibab8ba92021-11-18 01:24:11 +0000723
ramindanidcecfd42022-02-03 23:52:19 +0000724 std::vector<Color> expectedColors(
725 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
726 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000727
Ady Abrahama00d2462023-12-26 14:21:20 -0800728 auto layer = std::make_shared<TestBufferLayer>(
729 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
730 getDisplayHeight(), PixelFormat::RGBA_8888, *mWriter);
ramindanidcecfd42022-02-03 23:52:19 +0000731 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000732 layer->setZOrder(10);
Alec Mourif6c039a2023-10-06 23:02:17 +0000733 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +0000734 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
735
736 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
737
ramindanidcecfd42022-02-03 23:52:19 +0000738 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700739 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000740 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
741
742 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800743 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -0800744 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
745 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +0000746 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000747 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000748 GTEST_SUCCEED();
749 return;
750 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800751 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400752 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000753 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800754 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000755
756 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
757
758 // update surface damage and recheck
ramindanidcecfd42022-02-03 23:52:19 +0000759 redRect = {getDisplayWidth() / 4, getDisplayHeight() / 4, getDisplayWidth() / 2,
760 getDisplayHeight() / 2};
761 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
762 getDisplayWidth());
763 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000764
765 ASSERT_NO_FATAL_FAILURE(layer->fillBuffer(expectedColors));
766 layer->setSurfaceDamage(
ramindanidcecfd42022-02-03 23:52:19 +0000767 std::vector<common::Rect>(1, {0, 0, getDisplayWidth() / 2, getDisplayWidth() / 2}));
ramindanibab8ba92021-11-18 01:24:11 +0000768
769 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
770
771 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800772 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -0800773 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
774 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +0000775 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800776 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcecfd42022-02-03 23:52:19 +0000777 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400778 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000779 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800780 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000781
782 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
783 }
784}
785
786TEST_P(GraphicsCompositionTest, SetLayerPlaneAlpha) {
787 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000788 EXPECT_TRUE(mComposerClient
789 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
790 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000791
ramindani44c952f2022-02-28 23:29:29 +0000792 bool isSupported;
793 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000794 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000795 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
796 return;
797 }
798
Ady Abrahama00d2462023-12-26 14:21:20 -0800799 auto layer =
800 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000801 layer->setColor(RED);
ramindanidcecfd42022-02-03 23:52:19 +0000802 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000803 layer->setZOrder(10);
804 layer->setAlpha(0);
805 layer->setBlendMode(BlendMode::PREMULTIPLIED);
806
807 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
808
ramindanidcecfd42022-02-03 23:52:19 +0000809 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700810 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000811
812 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
813
814 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800815 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -0800816 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
817 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +0000818 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000819 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000820 GTEST_SUCCEED();
821 return;
822 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800823 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000824
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400825 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000826 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800827 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000828
ramindanidcecfd42022-02-03 23:52:19 +0000829 std::vector<Color> expectedColors(
830 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +0000831
832 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
833 mTestRenderEngine->setRenderLayers(layers);
834 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
835 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
836 }
837}
838
839TEST_P(GraphicsCompositionTest, SetLayerSourceCrop) {
840 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000841 EXPECT_TRUE(mComposerClient
842 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
843 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000844
ramindani44c952f2022-02-28 23:29:29 +0000845 bool isSupported;
846 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000847 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000848 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
849 return;
850 }
851
ramindanidcecfd42022-02-03 23:52:19 +0000852 std::vector<Color> expectedColors(
853 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
854 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
855 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
856 ReadbackHelper::fillColorsArea(
857 expectedColors, getDisplayWidth(),
858 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000859
Ady Abrahama00d2462023-12-26 14:21:20 -0800860 auto layer = std::make_shared<TestBufferLayer>(
861 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
862 getDisplayHeight(), PixelFormat::RGBA_8888, *mWriter);
ramindanidcecfd42022-02-03 23:52:19 +0000863 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000864 layer->setZOrder(10);
Alec Mourif6c039a2023-10-06 23:02:17 +0000865 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanidcecfd42022-02-03 23:52:19 +0000866 layer->setSourceCrop({0, static_cast<float>(getDisplayHeight() / 2),
867 static_cast<float>(getDisplayWidth()),
868 static_cast<float>(getDisplayHeight())});
ramindanibab8ba92021-11-18 01:24:11 +0000869 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
870
871 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
872
873 // update expected colors to match crop
ramindanidcecfd42022-02-03 23:52:19 +0000874 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
875 {0, 0, getDisplayWidth(), getDisplayHeight()}, BLUE);
876 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700877 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000878 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
879 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800880 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -0800881 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
882 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +0000883 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000884 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000885 GTEST_SUCCEED();
886 return;
887 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800888 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400889 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000890 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800891 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000892 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
893 mTestRenderEngine->setRenderLayers(layers);
894 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
895 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
896 }
897}
898
899TEST_P(GraphicsCompositionTest, SetLayerZOrder) {
900 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000901 EXPECT_TRUE(mComposerClient
902 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
903 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000904
ramindani44c952f2022-02-28 23:29:29 +0000905 bool isSupported;
906 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000907 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000908 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
909 return;
910 }
911
ramindanidcecfd42022-02-03 23:52:19 +0000912 common::Rect redRect = {0, 0, getDisplayWidth(), getDisplayHeight() / 2};
913 common::Rect blueRect = {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight()};
Ady Abrahama00d2462023-12-26 14:21:20 -0800914 auto redLayer =
915 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000916 redLayer->setColor(RED);
917 redLayer->setDisplayFrame(redRect);
918
Ady Abrahama00d2462023-12-26 14:21:20 -0800919 auto blueLayer =
920 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000921 blueLayer->setColor(BLUE);
922 blueLayer->setDisplayFrame(blueRect);
923 blueLayer->setZOrder(5);
924
925 std::vector<std::shared_ptr<TestLayer>> layers = {redLayer, blueLayer};
ramindanidcecfd42022-02-03 23:52:19 +0000926 std::vector<Color> expectedColors(
927 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +0000928
929 // red in front of blue
930 redLayer->setZOrder(10);
931
932 // fill blue first so that red will overwrite on overlap
ramindanidcecfd42022-02-03 23:52:19 +0000933 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), blueRect, BLUE);
934 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000935
ramindanidcecfd42022-02-03 23:52:19 +0000936 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700937 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000938 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
939
940 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800941 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -0800942 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
943 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +0000944 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000945 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000946 GTEST_SUCCEED();
947 return;
948 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400949 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000950 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800951 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000952
953 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
954
955 redLayer->setZOrder(1);
ramindanidcecfd42022-02-03 23:52:19 +0000956 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
957 getDisplayWidth());
958 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
959 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), blueRect, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000960
961 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
962
963 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800964 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -0800965 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
966 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +0000967 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000968 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800969 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400970 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000971 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800972 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000973
974 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
975 mTestRenderEngine->setRenderLayers(layers);
976 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
977 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
978 }
979}
980
Alec Mourib1f16722022-02-07 13:03:44 -0800981TEST_P(GraphicsCompositionTest, SetLayerBrightnessDims) {
Alec Mouri51067012022-01-06 17:28:39 -0800982 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000983 EXPECT_TRUE(mComposerClient
984 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
985 .isOk());
Alec Mouri51067012022-01-06 17:28:39 -0800986
ramindani44c952f2022-02-28 23:29:29 +0000987 bool isSupported;
988 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000989 if (!isSupported) {
Alec Mouri51067012022-01-06 17:28:39 -0800990 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace for "
991 "color mode: "
992 << toString(mode);
993 continue;
994 }
ramindanidcecfd42022-02-03 23:52:19 +0000995 const common::Rect redRect = {0, 0, getDisplayWidth(), getDisplayHeight() / 2};
996 const common::Rect dimmerRedRect = {0, getDisplayHeight() / 2, getDisplayWidth(),
997 getDisplayHeight()};
Alec Mouri712b3d92023-09-29 00:21:37 +0000998
999 static constexpr float kMaxBrightnessNits = 300.f;
1000
ramindanidcecfd42022-02-03 23:52:19 +00001001 const auto redLayer =
Ady Abrahama00d2462023-12-26 14:21:20 -08001002 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
Alec Mouri51067012022-01-06 17:28:39 -08001003 redLayer->setColor(RED);
1004 redLayer->setDisplayFrame(redRect);
Alec Mouri712b3d92023-09-29 00:21:37 +00001005 redLayer->setWhitePointNits(kMaxBrightnessNits);
Alec Mourib1f16722022-02-07 13:03:44 -08001006 redLayer->setBrightness(1.f);
Alec Mouri51067012022-01-06 17:28:39 -08001007
1008 const auto dimmerRedLayer =
Ady Abrahama00d2462023-12-26 14:21:20 -08001009 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
Alec Mouri51067012022-01-06 17:28:39 -08001010 dimmerRedLayer->setColor(RED);
1011 dimmerRedLayer->setDisplayFrame(dimmerRedRect);
1012 // Intentionally use a small dimming ratio as some implementations may be more likely to
1013 // kick into GPU composition to apply dithering when the dimming ratio is high.
1014 static constexpr float kDimmingRatio = 0.9f;
Alec Mouri712b3d92023-09-29 00:21:37 +00001015 dimmerRedLayer->setWhitePointNits(kMaxBrightnessNits * kDimmingRatio);
Alec Mourib1f16722022-02-07 13:03:44 -08001016 dimmerRedLayer->setBrightness(kDimmingRatio);
Alec Mouri51067012022-01-06 17:28:39 -08001017
1018 const std::vector<std::shared_ptr<TestLayer>> layers = {redLayer, dimmerRedLayer};
ramindanidcecfd42022-02-03 23:52:19 +00001019 std::vector<Color> expectedColors(
1020 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
Alec Mouri51067012022-01-06 17:28:39 -08001021
ramindanidcecfd42022-02-03 23:52:19 +00001022 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
1023 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), dimmerRedRect, DIM_RED);
Alec Mouri51067012022-01-06 17:28:39 -08001024
ramindanidcecfd42022-02-03 23:52:19 +00001025 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001026 getDisplayHeight(), mPixelFormat, mDataspace);
Alec Mouri51067012022-01-06 17:28:39 -08001027 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1028
1029 writeLayers(layers);
1030 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -08001031 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
1032 VtsComposerClient::kNoFrameIntervalNs);
Alec Mouri51067012022-01-06 17:28:39 -08001033 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001034 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
Alec Mouri51067012022-01-06 17:28:39 -08001035 GTEST_SUCCEED()
1036 << "Readback verification not supported for GPU composition for color mode: "
1037 << toString(mode);
1038 continue;
1039 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001040 mWriter->presentDisplay(getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001041 execute();
1042 ASSERT_TRUE(mReader.takeErrors().empty());
1043
1044 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1045 mTestRenderEngine->setRenderLayers(layers);
1046 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1047 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1048 }
1049}
1050
ramindanibab8ba92021-11-18 01:24:11 +00001051class GraphicsBlendModeCompositionTest
1052 : public GraphicsCompositionTestBase,
1053 public testing::WithParamInterface<std::tuple<std::string, std::string>> {
1054 public:
1055 void SetUp() override {
1056 SetUpBase(std::get<0>(GetParam()));
ramindanib636af22022-02-10 02:55:56 +00001057 // TODO(b/219590743) we should remove the below SRGB color mode
1058 // once we have the BlendMode test fix for all the versions of the ColorMode
ramindania4e76362022-03-02 01:48:06 +00001059 mTestColorModes.erase(
1060 std::remove_if(mTestColorModes.begin(), mTestColorModes.end(),
1061 [](ColorMode mode) { return mode != ColorMode::SRGB; }),
1062 mTestColorModes.end());
ramindanibab8ba92021-11-18 01:24:11 +00001063 mBackgroundColor = BLACK;
1064 mTopLayerColor = RED;
1065 }
1066
1067 void setBackgroundColor(Color color) { mBackgroundColor = color; }
1068
1069 void setTopLayerColor(Color color) { mTopLayerColor = color; }
1070
1071 void setUpLayers(BlendMode blendMode) {
1072 mLayers.clear();
ramindanidcecfd42022-02-03 23:52:19 +00001073 std::vector<Color> topLayerPixelColors(
1074 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1075 ReadbackHelper::fillColorsArea(topLayerPixelColors, getDisplayWidth(),
1076 {0, 0, getDisplayWidth(), getDisplayHeight()},
1077 mTopLayerColor);
ramindanibab8ba92021-11-18 01:24:11 +00001078
ramindanidcecfd42022-02-03 23:52:19 +00001079 auto backgroundLayer =
Ady Abrahama00d2462023-12-26 14:21:20 -08001080 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
ramindanidcecfd42022-02-03 23:52:19 +00001081 backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001082 backgroundLayer->setZOrder(0);
1083 backgroundLayer->setColor(mBackgroundColor);
1084
Ady Abrahama00d2462023-12-26 14:21:20 -08001085 auto layer = std::make_shared<TestBufferLayer>(
1086 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
1087 getDisplayHeight(), PixelFormat::RGBA_8888, *mWriter);
ramindanidcecfd42022-02-03 23:52:19 +00001088 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001089 layer->setZOrder(10);
Alec Mourif6c039a2023-10-06 23:02:17 +00001090 layer->setDataspace(Dataspace::UNKNOWN);
ramindanibab8ba92021-11-18 01:24:11 +00001091 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(topLayerPixelColors));
1092
1093 layer->setBlendMode(blendMode);
1094 layer->setAlpha(std::stof(std::get<1>(GetParam())));
1095
1096 mLayers.push_back(backgroundLayer);
1097 mLayers.push_back(layer);
1098 }
1099
1100 void setExpectedColors(std::vector<Color>& expectedColors) {
1101 ASSERT_EQ(2, mLayers.size());
ramindanidcecfd42022-02-03 23:52:19 +00001102 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
1103 getDisplayWidth());
ramindanibab8ba92021-11-18 01:24:11 +00001104
1105 auto layer = mLayers[1];
1106 BlendMode blendMode = layer->getBlendMode();
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001107 float alpha = mTopLayerColor.a * layer->getAlpha();
ramindanibab8ba92021-11-18 01:24:11 +00001108 if (blendMode == BlendMode::NONE) {
1109 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001110 expectedColor.r = mTopLayerColor.r * layer->getAlpha();
1111 expectedColor.g = mTopLayerColor.g * layer->getAlpha();
1112 expectedColor.b = mTopLayerColor.b * layer->getAlpha();
1113 expectedColor.a = alpha;
ramindanibab8ba92021-11-18 01:24:11 +00001114 }
1115 } else if (blendMode == BlendMode::PREMULTIPLIED) {
1116 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001117 expectedColor.r =
1118 mTopLayerColor.r * layer->getAlpha() + mBackgroundColor.r * (1.0f - alpha);
1119 expectedColor.g =
1120 mTopLayerColor.g * layer->getAlpha() + mBackgroundColor.g * (1.0f - alpha);
1121 expectedColor.b =
1122 mTopLayerColor.b * layer->getAlpha() + mBackgroundColor.b * (1.0f - alpha);
1123 expectedColor.a = alpha + mBackgroundColor.a * (1.0f - alpha);
ramindanibab8ba92021-11-18 01:24:11 +00001124 }
1125 } else if (blendMode == BlendMode::COVERAGE) {
1126 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001127 expectedColor.r = mTopLayerColor.r * alpha + mBackgroundColor.r * (1.0f - alpha);
1128 expectedColor.g = mTopLayerColor.g * alpha + mBackgroundColor.g * (1.0f - alpha);
1129 expectedColor.b = mTopLayerColor.b * alpha + mBackgroundColor.b * (1.0f - alpha);
1130 expectedColor.a = mTopLayerColor.a * alpha + mBackgroundColor.a * (1.0f - alpha);
ramindanibab8ba92021-11-18 01:24:11 +00001131 }
1132 }
1133 }
1134
1135 protected:
1136 std::vector<std::shared_ptr<TestLayer>> mLayers;
1137 Color mBackgroundColor;
1138 Color mTopLayerColor;
1139};
ramindanic7585d92022-04-15 18:30:41 +00001140
1141TEST_P(GraphicsBlendModeCompositionTest, None) {
ramindanibab8ba92021-11-18 01:24:11 +00001142 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001143 EXPECT_TRUE(mComposerClient
1144 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1145 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001146
ramindani44c952f2022-02-28 23:29:29 +00001147 bool isSupported;
1148 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001149 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001150 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1151 return;
1152 }
1153
ramindanidcecfd42022-02-03 23:52:19 +00001154 std::vector<Color> expectedColors(
1155 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001156
1157 setBackgroundColor(BLACK);
1158 setTopLayerColor(TRANSLUCENT_RED);
1159 setUpLayers(BlendMode::NONE);
1160 setExpectedColors(expectedColors);
1161
ramindanidcecfd42022-02-03 23:52:19 +00001162 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001163 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001164 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1165 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001166 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -08001167 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
1168 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +00001169 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001170 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001171 GTEST_SUCCEED();
1172 return;
1173 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001174 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001175 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001176 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001177 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001178
1179 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1180 mTestRenderEngine->setRenderLayers(mLayers);
1181 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1182 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1183 }
1184}
1185
ramindani07e6f842022-02-15 15:28:33 +00001186TEST_P(GraphicsBlendModeCompositionTest, Coverage) {
ramindanibab8ba92021-11-18 01:24:11 +00001187 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001188 EXPECT_TRUE(mComposerClient
1189 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1190 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001191
ramindani44c952f2022-02-28 23:29:29 +00001192 bool isSupported;
1193 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001194 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001195 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1196 return;
1197 }
1198
ramindanidcecfd42022-02-03 23:52:19 +00001199 std::vector<Color> expectedColors(
1200 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001201
1202 setBackgroundColor(BLACK);
1203 setTopLayerColor(TRANSLUCENT_RED);
1204
1205 setUpLayers(BlendMode::COVERAGE);
1206 setExpectedColors(expectedColors);
1207
ramindanidcecfd42022-02-03 23:52:19 +00001208 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001209 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001210 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1211 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001212 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -08001213 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
1214 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +00001215 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001216 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001217 GTEST_SUCCEED();
1218 return;
1219 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001220 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001221 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001222 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001223 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001224 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1225 }
1226}
1227
1228TEST_P(GraphicsBlendModeCompositionTest, Premultiplied) {
1229 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001230 EXPECT_TRUE(mComposerClient
1231 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1232 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001233
ramindani44c952f2022-02-28 23:29:29 +00001234 bool isSupported;
1235 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001236 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001237 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1238 return;
1239 }
ramindanibab8ba92021-11-18 01:24:11 +00001240
ramindanidcecfd42022-02-03 23:52:19 +00001241 std::vector<Color> expectedColors(
1242 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001243
1244 setBackgroundColor(BLACK);
1245 setTopLayerColor(TRANSLUCENT_RED);
1246 setUpLayers(BlendMode::PREMULTIPLIED);
1247 setExpectedColors(expectedColors);
1248
ramindanidcecfd42022-02-03 23:52:19 +00001249 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001250 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001251 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1252 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001253 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -08001254 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
1255 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +00001256 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001257 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001258 GTEST_SUCCEED();
1259 return;
1260 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001261 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001262 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001263 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001264 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001265 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1266 mTestRenderEngine->setRenderLayers(mLayers);
1267 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1268 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1269 }
1270}
1271
1272class GraphicsTransformCompositionTest : public GraphicsCompositionTest {
1273 protected:
1274 void SetUp() override {
1275 GraphicsCompositionTest::SetUp();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001276
ramindanidcecfd42022-02-03 23:52:19 +00001277 auto backgroundLayer =
Ady Abrahama00d2462023-12-26 14:21:20 -08001278 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId(), *mWriter);
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001279 backgroundLayer->setColor({0.0f, 0.0f, 0.0f, 0.0f});
ramindanidcecfd42022-02-03 23:52:19 +00001280 backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001281 backgroundLayer->setZOrder(0);
1282
ramindanidcecfd42022-02-03 23:52:19 +00001283 mSideLength =
1284 getDisplayWidth() < getDisplayHeight() ? getDisplayWidth() : getDisplayHeight();
ramindanibab8ba92021-11-18 01:24:11 +00001285 common::Rect redRect = {0, 0, mSideLength / 2, mSideLength / 2};
1286 common::Rect blueRect = {mSideLength / 2, mSideLength / 2, mSideLength, mSideLength};
1287
ramindani0a2bee42022-02-10 01:27:42 +00001288 mLayer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
1289 getPrimaryDisplayId(), mSideLength, mSideLength,
Ady Abrahama00d2462023-12-26 14:21:20 -08001290 PixelFormat::RGBA_8888, *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001291 mLayer->setDisplayFrame({0, 0, mSideLength, mSideLength});
1292 mLayer->setZOrder(10);
1293
1294 std::vector<Color> baseColors(static_cast<size_t>(mSideLength * mSideLength));
1295 ReadbackHelper::fillColorsArea(baseColors, mSideLength, redRect, RED);
1296 ReadbackHelper::fillColorsArea(baseColors, mSideLength, blueRect, BLUE);
1297 ASSERT_NO_FATAL_FAILURE(mLayer->setBuffer(baseColors));
1298 mLayers = {backgroundLayer, mLayer};
1299 }
1300
1301 protected:
1302 std::shared_ptr<TestBufferLayer> mLayer;
1303 std::vector<std::shared_ptr<TestLayer>> mLayers;
1304 int mSideLength;
1305};
1306
1307TEST_P(GraphicsTransformCompositionTest, FLIP_H) {
1308 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001309 auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), mode,
1310 RenderIntent::COLORIMETRIC);
ramindanid5751092022-04-22 22:30:20 +00001311 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
ramindanidcecfd42022-02-03 23:52:19 +00001312 (status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED ||
1313 status.getServiceSpecificError() == IComposerClient::EX_BAD_PARAMETER)) {
ramindanibab8ba92021-11-18 01:24:11 +00001314 SUCCEED() << "ColorMode not supported, skip test";
1315 return;
1316 }
1317
ramindani44c952f2022-02-28 23:29:29 +00001318 bool isSupported;
1319 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001320 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001321 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1322 return;
1323 }
ramindanidcecfd42022-02-03 23:52:19 +00001324 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001325 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001326 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1327 mLayer->setTransform(Transform::FLIP_H);
Alec Mourif6c039a2023-10-06 23:02:17 +00001328 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +00001329
ramindanidcecfd42022-02-03 23:52:19 +00001330 std::vector<Color> expectedColors(
1331 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1332 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001333 {mSideLength / 2, 0, mSideLength, mSideLength / 2}, RED);
ramindanidcecfd42022-02-03 23:52:19 +00001334 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001335 {0, mSideLength / 2, mSideLength / 2, mSideLength}, BLUE);
1336
1337 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001338 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -08001339 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
1340 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +00001341 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001342 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001343 GTEST_SUCCEED();
1344 return;
1345 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001346 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001347 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001348 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001349 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001350
1351 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1352 mTestRenderEngine->setRenderLayers(mLayers);
1353 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1354 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1355 }
1356}
1357
1358TEST_P(GraphicsTransformCompositionTest, FLIP_V) {
1359 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001360 EXPECT_TRUE(mComposerClient
1361 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1362 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001363
ramindani44c952f2022-02-28 23:29:29 +00001364 bool isSupported;
1365 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001366 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001367 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1368 return;
1369 }
ramindanidcecfd42022-02-03 23:52:19 +00001370 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001371 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001372 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1373
1374 mLayer->setTransform(Transform::FLIP_V);
Alec Mourif6c039a2023-10-06 23:02:17 +00001375 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +00001376
ramindanidcecfd42022-02-03 23:52:19 +00001377 std::vector<Color> expectedColors(
1378 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1379 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001380 {0, mSideLength / 2, mSideLength / 2, mSideLength}, RED);
ramindanidcecfd42022-02-03 23:52:19 +00001381 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001382 {mSideLength / 2, 0, mSideLength, mSideLength / 2}, BLUE);
1383
1384 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001385 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -08001386 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
1387 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +00001388 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001389 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001390 GTEST_SUCCEED();
1391 return;
1392 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001393 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001394 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001395 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001396 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001397 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1398 mTestRenderEngine->setRenderLayers(mLayers);
1399 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1400 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1401 }
1402}
1403
1404TEST_P(GraphicsTransformCompositionTest, ROT_180) {
1405 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001406 EXPECT_TRUE(mComposerClient
1407 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1408 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001409
ramindani44c952f2022-02-28 23:29:29 +00001410 bool isSupported;
1411 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001412 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001413 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1414 return;
1415 }
ramindanidcecfd42022-02-03 23:52:19 +00001416 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001417 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001418 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1419
1420 mLayer->setTransform(Transform::ROT_180);
Alec Mourif6c039a2023-10-06 23:02:17 +00001421 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +00001422
ramindanidcecfd42022-02-03 23:52:19 +00001423 std::vector<Color> expectedColors(
1424 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1425 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001426 {mSideLength / 2, mSideLength / 2, mSideLength, mSideLength},
1427 RED);
ramindanidcecfd42022-02-03 23:52:19 +00001428 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001429 {0, 0, mSideLength / 2, mSideLength / 2}, BLUE);
1430
1431 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001432 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -08001433 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
1434 VtsComposerClient::kNoFrameIntervalNs);
ramindanibab8ba92021-11-18 01:24:11 +00001435 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001436 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001437 GTEST_SUCCEED();
1438 return;
1439 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001440 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001441 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001442 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001443 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001444 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1445 mTestRenderEngine->setRenderLayers(mLayers);
1446 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1447 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1448 }
1449}
1450
Alec Mourif6c039a2023-10-06 23:02:17 +00001451class GraphicsColorManagementCompositionTest
1452 : public GraphicsCompositionTestBase,
1453 public testing::WithParamInterface<std::tuple<std::string, Dataspace, Dataspace, Dataspace>> {
1454 public:
1455 void SetUp() override {
1456 SetUpBase(std::get<0>(GetParam()));
1457 // for some reason only sRGB reliably works
1458 mTestColorModes.erase(
1459 std::remove_if(mTestColorModes.begin(), mTestColorModes.end(),
1460 [](ColorMode mode) { return mode != ColorMode::SRGB; }),
1461 mTestColorModes.end());
1462 auto standard = std::get<1>(GetParam());
1463 auto transfer = std::get<2>(GetParam());
1464 auto range = std::get<3>(GetParam());
1465
1466 mLayerDataspace = static_cast<Dataspace>(static_cast<int32_t>(standard) |
1467 static_cast<int32_t>(transfer) |
1468 static_cast<int32_t>(range));
1469 ALOGD("Invoking test for dataspace: {%s, %s, %s}", toString(standard).c_str(),
1470 toString(transfer).c_str(), toString(range).c_str());
1471 }
1472
1473 void makeLayer() {
1474 mLayer = std::make_shared<TestBufferLayer>(
1475 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
Ady Abrahama00d2462023-12-26 14:21:20 -08001476 getDisplayHeight(), common::PixelFormat::RGBA_8888, *mWriter);
Alec Mourif6c039a2023-10-06 23:02:17 +00001477 mLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
1478 mLayer->setZOrder(10);
1479 mLayer->setAlpha(1.f);
1480 mLayer->setDataspace(mLayerDataspace);
1481 }
1482
1483 void fillColor(Color color) {
1484 std::vector<Color> baseColors(static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1485 ReadbackHelper::fillColorsArea(baseColors, getDisplayWidth(),
1486 common::Rect{.left = 0,
1487 .top = 0,
1488 .right = getDisplayWidth(),
1489 .bottom = getDisplayHeight()},
1490 color);
1491 ASSERT_NO_FATAL_FAILURE(mLayer->setBuffer(baseColors));
1492 }
1493
1494 Dataspace mLayerDataspace;
1495 std::shared_ptr<TestBufferLayer> mLayer;
1496};
1497
1498TEST_P(GraphicsColorManagementCompositionTest, ColorConversion) {
1499 for (ColorMode mode : mTestColorModes) {
1500 EXPECT_TRUE(mComposerClient
1501 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1502 .isOk());
1503
1504 bool isSupported;
1505 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
1506 if (!isSupported) {
1507 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1508 return;
1509 }
1510
1511 mClientCompositionDisplaySettings.outputDataspace =
1512 static_cast<::android::ui::Dataspace>(mDataspace);
1513 mTestRenderEngine->setDisplaySettings(mClientCompositionDisplaySettings);
1514
1515 makeLayer();
1516 for (auto color : {LIGHT_RED, LIGHT_GREEN, LIGHT_BLUE}) {
1517 ALOGD("Testing color: %f, %f, %f, %f with color mode: %d", color.r, color.g, color.b,
1518 color.a, mode);
1519 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
1520 getDisplayHeight(), mPixelFormat, mDataspace);
1521 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1522 fillColor(color);
1523 writeLayers({mLayer});
1524 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
1525
1526 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanicdcfcaf2023-11-09 10:00:10 -08001527 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp,
1528 VtsComposerClient::kNoFrameIntervalNs);
Alec Mourif6c039a2023-10-06 23:02:17 +00001529 execute();
1530 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
1531 continue;
1532 }
1533 ASSERT_TRUE(mReader.takeErrors().empty());
1534 mWriter->presentDisplay(getPrimaryDisplayId());
1535 execute();
1536 ASSERT_TRUE(mReader.takeErrors().empty());
1537
1538 mTestRenderEngine->setRenderLayers({mLayer});
1539 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1540 ASSERT_NO_FATAL_FAILURE(
1541 mTestRenderEngine->checkColorBuffer(readbackBuffer.getBuffer()));
1542 }
1543 }
1544}
1545
ramindanibab8ba92021-11-18 01:24:11 +00001546GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsCompositionTest);
1547INSTANTIATE_TEST_SUITE_P(
1548 PerInstance, GraphicsCompositionTest,
1549 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
1550 ::android::PrintInstanceNameToString);
1551
1552GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsBlendModeCompositionTest);
1553INSTANTIATE_TEST_SUITE_P(BlendMode, GraphicsBlendModeCompositionTest,
1554 testing::Combine(testing::ValuesIn(::android::getAidlHalInstanceNames(
1555 IComposer::descriptor)),
1556 testing::Values("0.2", "1.0")));
1557
1558GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsTransformCompositionTest);
1559INSTANTIATE_TEST_SUITE_P(
1560 PerInstance, GraphicsTransformCompositionTest,
1561 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
1562 ::android::PrintInstanceNameToString);
1563
Alec Mourif6c039a2023-10-06 23:02:17 +00001564GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsColorManagementCompositionTest);
1565INSTANTIATE_TEST_SUITE_P(PerInstance, GraphicsColorManagementCompositionTest,
1566 testing::Combine(testing::ValuesIn(::android::getAidlHalInstanceNames(
1567 IComposer::descriptor)),
1568 // Only check sRGB, but verify that extended range
1569 // doesn't trigger any gamma shifts
1570 testing::Values(Dataspace::STANDARD_BT709),
1571 testing::Values(Dataspace::TRANSFER_SRGB),
1572 // Don't test limited range until we send YUV overlays
1573 testing::Values(Dataspace::RANGE_FULL,
1574 Dataspace::RANGE_EXTENDED)));
1575
ramindanibab8ba92021-11-18 01:24:11 +00001576} // namespace
Ady Abraham3192f3d2021-12-03 16:08:56 -08001577} // namespace aidl::android::hardware::graphics::composer3::vts