blob: 269abd150d1107feb807563a27c42370778a4cdc [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
34// tinyxml2 does implicit conversions >:(
35#pragma clang diagnostic push
36#pragma clang diagnostic ignored "-Wconversion"
37#include <tinyxml2.h>
38#pragma clang diagnostic pop
ramindanibab8ba92021-11-18 01:24:11 +000039
40namespace aidl::android::hardware::graphics::composer3::vts {
41namespace {
42
43using ::android::Rect;
44using common::Dataspace;
45using common::PixelFormat;
46
47class GraphicsCompositionTestBase : public ::testing::Test {
48 protected:
49 void SetUpBase(const std::string& name) {
ramindanidcecfd42022-02-03 23:52:19 +000050 mComposerClient = std::make_shared<VtsComposerClient>(name);
51 ASSERT_TRUE(mComposerClient->createClient().isOk());
ramindanibab8ba92021-11-18 01:24:11 +000052
ramindanidcecfd42022-02-03 23:52:19 +000053 const auto& [status, displays] = mComposerClient->getDisplays();
54 ASSERT_TRUE(status.isOk());
55 mDisplays = displays;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -040056 mWriter.reset(new ComposerClientWriter(getPrimaryDisplayId()));
ramindanibab8ba92021-11-18 01:24:11 +000057
58 setTestColorModes();
59
60 // explicitly disable vsync
ramindanidcecfd42022-02-03 23:52:19 +000061 for (const auto& display : mDisplays) {
62 EXPECT_TRUE(mComposerClient->setVsync(display.getDisplayId(), /*enable*/ false).isOk());
63 }
64 mComposerClient->setVsyncAllowed(/*isAllowed*/ false);
ramindanibab8ba92021-11-18 01:24:11 +000065
ramindanidcecfd42022-02-03 23:52:19 +000066 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindanibab8ba92021-11-18 01:24:11 +000067
68 ASSERT_NO_FATAL_FAILURE(
69 mTestRenderEngine = std::unique_ptr<TestRenderEngine>(new TestRenderEngine(
70 ::android::renderengine::RenderEngineCreationArgs::Builder()
71 .setPixelFormat(static_cast<int>(common::PixelFormat::RGBA_8888))
72 .setImageCacheSize(TestRenderEngine::sMaxFrameBufferAcquireBuffers)
73 .setUseColorManagerment(true)
74 .setEnableProtectedContext(false)
75 .setPrecacheToneMapperShaderOnly(false)
76 .setContextPriority(::android::renderengine::RenderEngine::
77 ContextPriority::HIGH)
78 .build())));
79
80 ::android::renderengine::DisplaySettings clientCompositionDisplay;
ramindanidcecfd42022-02-03 23:52:19 +000081 clientCompositionDisplay.physicalDisplay = Rect(getDisplayWidth(), getDisplayHeight());
ramindanibab8ba92021-11-18 01:24:11 +000082 clientCompositionDisplay.clip = clientCompositionDisplay.physicalDisplay;
83
Brian Lindahle887a252023-01-17 14:54:19 -070084 mTestRenderEngine->initGraphicBuffer(
85 static_cast<uint32_t>(getDisplayWidth()), static_cast<uint32_t>(getDisplayHeight()),
86 /*layerCount*/ 1U,
87 static_cast<uint64_t>(
88 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
89 static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
90 static_cast<uint64_t>(common::BufferUsage::GPU_RENDER_TARGET)));
ramindanibab8ba92021-11-18 01:24:11 +000091 mTestRenderEngine->setDisplaySettings(clientCompositionDisplay);
92 }
93
94 void TearDown() override {
ramindanidcecfd42022-02-03 23:52:19 +000095 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
96 ASSERT_TRUE(mComposerClient->tearDown());
97 mComposerClient.reset();
Ady Abraham3192f3d2021-12-03 16:08:56 -080098 const auto errors = mReader.takeErrors();
99 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcecfd42022-02-03 23:52:19 +0000100 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
ramindanibab8ba92021-11-18 01:24:11 +0000101 }
102
ramindanidcecfd42022-02-03 23:52:19 +0000103 const VtsDisplay& getPrimaryDisplay() const { return mDisplays[0]; }
104
105 int64_t getPrimaryDisplayId() const { return getPrimaryDisplay().getDisplayId(); }
106
107 int64_t getInvalidDisplayId() const { return mComposerClient->getInvalidDisplayId(); }
108
109 int32_t getDisplayWidth() const { return getPrimaryDisplay().getDisplayWidth(); }
110
111 int32_t getDisplayHeight() const { return getPrimaryDisplay().getDisplayHeight(); }
112
ramindanid5751092022-04-22 22:30:20 +0000113 void assertServiceSpecificError(const ScopedAStatus& status, int32_t serviceSpecificError) {
114 ASSERT_EQ(status.getExceptionCode(), EX_SERVICE_SPECIFIC);
115 ASSERT_EQ(status.getServiceSpecificError(), serviceSpecificError);
116 }
117
Brian Lindahle887a252023-01-17 14:54:19 -0700118 std::pair<bool, ::android::sp<::android::GraphicBuffer>> allocateBuffer(uint32_t usage) {
119 const auto width = static_cast<uint32_t>(getDisplayWidth());
120 const auto height = static_cast<uint32_t>(getDisplayHeight());
121
122 const auto& graphicBuffer = ::android::sp<::android::GraphicBuffer>::make(
123 width, height, ::android::PIXEL_FORMAT_RGBA_8888,
124 /*layerCount*/ 1u, usage, "VtsHalGraphicsComposer3_ReadbackTest");
ramindani0a2bee42022-02-10 01:27:42 +0000125
126 if (graphicBuffer && ::android::OK == graphicBuffer->initCheck()) {
Brian Lindahle887a252023-01-17 14:54:19 -0700127 return {true, graphicBuffer};
ramindani0a2bee42022-02-10 01:27:42 +0000128 }
Brian Lindahle887a252023-01-17 14:54:19 -0700129 return {false, graphicBuffer};
ramindanibab8ba92021-11-18 01:24:11 +0000130 }
131
Alec Mouri51067012022-01-06 17:28:39 -0800132 // Gets the per-display XML config
133 std::unique_ptr<tinyxml2::XMLDocument> getDisplayConfigXml(int64_t display) {
Alec Mouribe1b4d62023-07-20 19:11:37 +0000134
135 if (auto document = getDisplayConfigXmlByStableId(getStableDisplayId(display));
136 document != nullptr) {
Alec Mouri51067012022-01-06 17:28:39 -0800137 return document;
Alec Mouri51067012022-01-06 17:28:39 -0800138 }
Alec Mouribe1b4d62023-07-20 19:11:37 +0000139
140 // Fallback to looking up a per-port config if no config exists for the full ID
141 if (auto document = getDisplayConfigXmlByPort(getPort(display)); document != nullptr) {
142 return document;
143 }
144
145 return nullptr;
Alec Mouri51067012022-01-06 17:28:39 -0800146 }
147
148 // Gets the max display brightness for this display.
149 // If the display config xml does not exist, then assume that the display is not well-configured
150 // enough to provide a display brightness, so return nullopt.
151 std::optional<float> getMaxDisplayBrightnessNits(int64_t display) {
152 const auto document = getDisplayConfigXml(display);
153 if (!document) {
154 // Assume the device doesn't support display brightness
155 return std::nullopt;
156 }
157
158 const auto root = document->RootElement();
159 if (!root) {
160 // If there's somehow no root element, then this isn't a valid config
161 return std::nullopt;
162 }
163
164 const auto screenBrightnessMap = root->FirstChildElement("screenBrightnessMap");
165 if (!screenBrightnessMap) {
166 // A valid display config must have a screen brightness map
167 return std::nullopt;
168 }
169
170 auto point = screenBrightnessMap->FirstChildElement("point");
171 float maxNits = -1.f;
172 while (point != nullptr) {
173 const auto nits = point->FirstChildElement("nits");
174 if (nits) {
175 maxNits = std::max(maxNits, nits->FloatText(-1.f));
176 }
177 point = point->NextSiblingElement("point");
178 }
179
180 if (maxNits < 0.f) {
181 // If we got here, then there were no point elements containing a nit value, so this
182 // config isn't valid
183 return std::nullopt;
184 }
185
186 return maxNits;
187 }
188
ramindanibab8ba92021-11-18 01:24:11 +0000189 void writeLayers(const std::vector<std::shared_ptr<TestLayer>>& layers) {
ramindanidcecfd42022-02-03 23:52:19 +0000190 for (const auto& layer : layers) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400191 layer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000192 }
193 execute();
194 }
195
196 void execute() {
Huihong Luo651806f2023-04-21 18:48:48 +0000197 auto commands = mWriter->takePendingCommands();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800198 if (commands.empty()) {
Ady Abraham3192f3d2021-12-03 16:08:56 -0800199 return;
ramindanibab8ba92021-11-18 01:24:11 +0000200 }
201
ramindanidcecfd42022-02-03 23:52:19 +0000202 auto [status, results] = mComposerClient->executeCommands(commands);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800203 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
ramindanibab8ba92021-11-18 01:24:11 +0000204
Ady Abraham46219f52021-12-20 09:44:31 -0800205 mReader.parse(std::move(results));
ramindanibab8ba92021-11-18 01:24:11 +0000206 }
207
ramindani44c952f2022-02-28 23:29:29 +0000208 bool getHasReadbackBuffer() {
ramindanidcecfd42022-02-03 23:52:19 +0000209 auto [status, readBackBufferAttributes] =
210 mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
211 if (status.isOk()) {
212 mPixelFormat = readBackBufferAttributes.format;
213 mDataspace = readBackBufferAttributes.dataspace;
ramindani44c952f2022-02-28 23:29:29 +0000214 return ReadbackHelper::readbackSupported(mPixelFormat, mDataspace);
ramindanidcecfd42022-02-03 23:52:19 +0000215 }
ramindanid5751092022-04-22 22:30:20 +0000216 EXPECT_NO_FATAL_FAILURE(
217 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani44c952f2022-02-28 23:29:29 +0000218 return false;
ramindanib27f33b2021-12-03 19:36:10 +0000219 }
220
ramindanidcecfd42022-02-03 23:52:19 +0000221 std::shared_ptr<VtsComposerClient> mComposerClient;
222 std::vector<VtsDisplay> mDisplays;
223 // use the slot count usually set by SF
ramindanibab8ba92021-11-18 01:24:11 +0000224 std::vector<ColorMode> mTestColorModes;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400225 std::unique_ptr<ComposerClientWriter> mWriter;
Ady Abraham91c9d1a2021-12-15 18:14:45 -0800226 ComposerClientReader mReader;
ramindanibab8ba92021-11-18 01:24:11 +0000227 std::unique_ptr<TestRenderEngine> mTestRenderEngine;
ramindanibab8ba92021-11-18 01:24:11 +0000228 common::PixelFormat mPixelFormat;
229 common::Dataspace mDataspace;
230
231 static constexpr uint32_t kClientTargetSlotCount = 64;
232
233 private:
ramindanibab8ba92021-11-18 01:24:11 +0000234 void setTestColorModes() {
235 mTestColorModes.clear();
ramindanidcecfd42022-02-03 23:52:19 +0000236 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
237 ASSERT_TRUE(status.isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000238
239 for (ColorMode mode : modes) {
240 if (std::find(ReadbackHelper::colorModes.begin(), ReadbackHelper::colorModes.end(),
241 mode) != ReadbackHelper::colorModes.end()) {
242 mTestColorModes.push_back(mode);
243 }
244 }
245 }
Alec Mouribe1b4d62023-07-20 19:11:37 +0000246
247 uint8_t getPort(int64_t display) {
248 const auto& [status, identification] =
249 mComposerClient->getDisplayIdentificationData(display);
250 EXPECT_TRUE(status.isOk());
251 return static_cast<uint8_t>(identification.port);
252 }
253
254 uint64_t getStableDisplayId(int64_t display) {
255 const auto& [status, identification] =
256 mComposerClient->getDisplayIdentificationData(display);
257 EXPECT_TRUE(status.isOk());
258
259 if (const auto info = ::android::parseDisplayIdentificationData(
260 static_cast<uint8_t>(identification.port), identification.data)) {
261 return info->id.value;
262 }
263
264 return ::android::PhysicalDisplayId::fromPort(static_cast<uint8_t>(identification.port))
265 .value;
266 }
267
268 std::unique_ptr<tinyxml2::XMLDocument> loadXml(const std::string& path) {
269 auto document = std::make_unique<tinyxml2::XMLDocument>();
270 const tinyxml2::XMLError error = document->LoadFile(path.c_str());
271 if (error != tinyxml2::XML_SUCCESS) {
272 ALOGD("%s: Failed to load config file: %s", __func__, path.c_str());
273 return nullptr;
274 }
275
276 ALOGD("%s: Successfully loaded config file: %s", __func__, path.c_str());
277 return document;
278 }
279
280 std::unique_ptr<tinyxml2::XMLDocument> getDisplayConfigXmlByPort(uint8_t port) {
281 std::stringstream pathBuilder;
282 pathBuilder << "/vendor/etc/displayconfig/display_port_" << static_cast<uint32_t>(port)
283 << ".xml";
284 return loadXml(pathBuilder.str());
285 }
286
287 std::unique_ptr<tinyxml2::XMLDocument> getDisplayConfigXmlByStableId(uint64_t stableId) {
288 std::stringstream pathBuilder;
289 pathBuilder << "/vendor/etc/displayconfig/display_id_" << stableId
290 << ".xml";
291 return loadXml(pathBuilder.str());
292 }
ramindanibab8ba92021-11-18 01:24:11 +0000293};
294
295class GraphicsCompositionTest : public GraphicsCompositionTestBase,
296 public testing::WithParamInterface<std::string> {
297 public:
298 void SetUp() override { SetUpBase(GetParam()); }
299};
300
301TEST_P(GraphicsCompositionTest, SingleSolidColorLayer) {
302 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000303 EXPECT_TRUE(mComposerClient
304 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
305 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000306
ramindani44c952f2022-02-28 23:29:29 +0000307 bool isSupported;
308 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000309 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000310 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
311 return;
312 }
313
ramindanidcecfd42022-02-03 23:52:19 +0000314 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
315 common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000316 layer->setColor(BLUE);
317 layer->setDisplayFrame(coloredSquare);
318 layer->setZOrder(10);
319
320 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
321
322 // expected color for each pixel
ramindanidcecfd42022-02-03 23:52:19 +0000323 std::vector<Color> expectedColors(
324 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
325 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), coloredSquare, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000326
ramindanidcecfd42022-02-03 23:52:19 +0000327 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700328 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000329 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
330
331 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800332 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400333 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000334 execute();
335 // if hwc cannot handle and asks for composition change,
336 // just succeed the test
ramindanidcecfd42022-02-03 23:52:19 +0000337 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000338 GTEST_SUCCEED();
339 return;
340 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800341 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400342 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000343 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800344 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000345
346 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
347 mTestRenderEngine->setRenderLayers(layers);
348 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
349 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
350 }
351}
352
353TEST_P(GraphicsCompositionTest, SetLayerBuffer) {
354 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000355 EXPECT_TRUE(mComposerClient
356 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
357 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000358
ramindani44c952f2022-02-28 23:29:29 +0000359 bool isSupported;
360 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000361 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000362 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
363 return;
364 }
365
ramindanidcecfd42022-02-03 23:52:19 +0000366 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700367 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000368 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000369 std::vector<Color> expectedColors(
370 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
371 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
372 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
373 ReadbackHelper::fillColorsArea(
374 expectedColors, getDisplayWidth(),
375 {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
376 ReadbackHelper::fillColorsArea(
377 expectedColors, getDisplayWidth(),
378 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000379
380 auto layer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000381 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
382 getDisplayHeight(), common::PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000383 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000384 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400385 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000386 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
387
388 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
389
390 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800391 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400392 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000393 execute();
394
ramindanidcecfd42022-02-03 23:52:19 +0000395 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000396 GTEST_SUCCEED();
397 return;
398 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800399 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000400
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400401 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000402 execute();
403
Ady Abraham3192f3d2021-12-03 16:08:56 -0800404 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000405
406 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
407 mTestRenderEngine->setRenderLayers(layers);
408 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
409 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
410 }
411}
412
413TEST_P(GraphicsCompositionTest, SetLayerBufferNoEffect) {
414 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000415 EXPECT_TRUE(mComposerClient
416 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
417 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000418
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) {
ramindanibab8ba92021-11-18 01:24:11 +0000422 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
423 return;
424 }
425
ramindanidcecfd42022-02-03 23:52:19 +0000426 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
427 common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000428 layer->setColor(BLUE);
429 layer->setDisplayFrame(coloredSquare);
430 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400431 layer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000432
433 // This following buffer call should have no effect
Brian Lindahle887a252023-01-17 14:54:19 -0700434 const auto usage = static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
435 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN);
436 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(usage);
437 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000438 const auto& buffer = graphicBuffer->handle;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400439 mWriter->setLayerBuffer(getPrimaryDisplayId(), layer->getLayer(), /*slot*/ 0, buffer,
440 /*acquireFence*/ -1);
ramindanibab8ba92021-11-18 01:24:11 +0000441
442 // expected color for each pixel
ramindanidcecfd42022-02-03 23:52:19 +0000443 std::vector<Color> expectedColors(
444 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
445 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), coloredSquare, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000446
ramindanidcecfd42022-02-03 23:52:19 +0000447 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700448 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000449 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
450
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400451 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000452 execute();
453
ramindanidcecfd42022-02-03 23:52:19 +0000454 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000455 GTEST_SUCCEED();
456 return;
457 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800458 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400459 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000460 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800461 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000462
463 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
464 }
465}
466
ramindanib27f33b2021-12-03 19:36:10 +0000467TEST_P(GraphicsCompositionTest, SetReadbackBuffer) {
ramindani44c952f2022-02-28 23:29:29 +0000468 bool isSupported;
469 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000470 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000471 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
472 return;
473 }
474
ramindanidcecfd42022-02-03 23:52:19 +0000475 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700476 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanib27f33b2021-12-03 19:36:10 +0000477
478 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
479}
480
ramindanidcecfd42022-02-03 23:52:19 +0000481TEST_P(GraphicsCompositionTest, SetReadbackBuffer_BadDisplay) {
ramindani44c952f2022-02-28 23:29:29 +0000482 bool isSupported;
483 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000484 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000485 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
486 return;
487 }
488
Brian Lindahle887a252023-01-17 14:54:19 -0700489 const auto usage = static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
490 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN);
491 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(usage);
492 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000493 const auto& bufferHandle = graphicBuffer->handle;
ramindanib27f33b2021-12-03 19:36:10 +0000494 ::ndk::ScopedFileDescriptor fence = ::ndk::ScopedFileDescriptor(-1);
495
ramindanidcecfd42022-02-03 23:52:19 +0000496 const auto status =
497 mComposerClient->setReadbackBuffer(getInvalidDisplayId(), bufferHandle, fence);
ramindanib27f33b2021-12-03 19:36:10 +0000498
ramindanidcecfd42022-02-03 23:52:19 +0000499 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000500 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanib27f33b2021-12-03 19:36:10 +0000501}
502
ramindanidcecfd42022-02-03 23:52:19 +0000503TEST_P(GraphicsCompositionTest, SetReadbackBuffer_BadParameter) {
ramindani44c952f2022-02-28 23:29:29 +0000504 bool isSupported;
505 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000506 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000507 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
508 return;
509 }
510
ramindanidcecfd42022-02-03 23:52:19 +0000511 const native_handle_t bufferHandle{};
ramindanib27f33b2021-12-03 19:36:10 +0000512 ndk::ScopedFileDescriptor releaseFence = ndk::ScopedFileDescriptor(-1);
ramindanidcecfd42022-02-03 23:52:19 +0000513 const auto status =
514 mComposerClient->setReadbackBuffer(getPrimaryDisplayId(), &bufferHandle, releaseFence);
ramindanib27f33b2021-12-03 19:36:10 +0000515
ramindanidcecfd42022-02-03 23:52:19 +0000516 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000517 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanib27f33b2021-12-03 19:36:10 +0000518}
519
520TEST_P(GraphicsCompositionTest, GetReadbackBufferFenceInactive) {
ramindani44c952f2022-02-28 23:29:29 +0000521 bool isSupported;
522 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000523 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000524 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
525 return;
526 }
527
ramindanidcecfd42022-02-03 23:52:19 +0000528 const auto& [status, releaseFence] =
529 mComposerClient->getReadbackBufferFence(getPrimaryDisplayId());
ramindanib27f33b2021-12-03 19:36:10 +0000530
ramindanidcecfd42022-02-03 23:52:19 +0000531 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000532 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Alec Mouri62ae37b2022-01-20 17:16:38 -0800533 EXPECT_EQ(-1, releaseFence.get());
ramindanib27f33b2021-12-03 19:36:10 +0000534}
535
ramindanibab8ba92021-11-18 01:24:11 +0000536TEST_P(GraphicsCompositionTest, ClientComposition) {
ramindanidcecfd42022-02-03 23:52:19 +0000537 EXPECT_TRUE(
538 mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)
539 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000540
541 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000542 EXPECT_TRUE(mComposerClient
543 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
ramindanibab8ba92021-11-18 01:24:11 +0000544 .isOk());
545
ramindani44c952f2022-02-28 23:29:29 +0000546 bool isSupported;
547 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000548 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000549 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
550 return;
551 }
552
ramindanidcecfd42022-02-03 23:52:19 +0000553 std::vector<Color> expectedColors(
554 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
555 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
556 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
557 ReadbackHelper::fillColorsArea(
558 expectedColors, getDisplayWidth(),
559 {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
560 ReadbackHelper::fillColorsArea(
561 expectedColors, getDisplayWidth(),
562 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000563
ramindani0a2bee42022-02-10 01:27:42 +0000564 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
565 getPrimaryDisplayId(), getDisplayWidth(),
566 getDisplayHeight(), PixelFormat::RGBA_FP16);
ramindanidcecfd42022-02-03 23:52:19 +0000567 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000568 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400569 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000570
571 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
572
ramindanidcecfd42022-02-03 23:52:19 +0000573 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700574 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000575 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
576 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800577 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400578 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000579 execute();
580
ramindanidcecfd42022-02-03 23:52:19 +0000581 auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800582 if (!changedCompositionTypes.empty()) {
Ady Abraham3192f3d2021-12-03 16:08:56 -0800583 ASSERT_EQ(1, changedCompositionTypes.size());
Ady Abraham46219f52021-12-20 09:44:31 -0800584 ASSERT_EQ(Composition::CLIENT, changedCompositionTypes[0].composition);
ramindanibab8ba92021-11-18 01:24:11 +0000585
586 PixelFormat clientFormat = PixelFormat::RGBA_8888;
Brian Lindahle887a252023-01-17 14:54:19 -0700587 auto clientUsage = static_cast<uint32_t>(
588 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN) |
589 static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
590 static_cast<uint32_t>(common::BufferUsage::COMPOSER_CLIENT_TARGET));
ramindanibab8ba92021-11-18 01:24:11 +0000591 Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
ramindanidcecfd42022-02-03 23:52:19 +0000592 common::Rect damage{0, 0, getDisplayWidth(), getDisplayHeight()};
ramindanibab8ba92021-11-18 01:24:11 +0000593
594 // create client target buffer
Brian Lindahle887a252023-01-17 14:54:19 -0700595 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(clientUsage);
596 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000597 const auto& buffer = graphicBuffer->handle;
ramindanibab8ba92021-11-18 01:24:11 +0000598 void* clientBufData;
ramindani0a2bee42022-02-10 01:27:42 +0000599 const auto stride = static_cast<uint32_t>(graphicBuffer->stride);
600 graphicBuffer->lock(clientUsage, layer->getAccessRegion(), &clientBufData);
ramindanibab8ba92021-11-18 01:24:11 +0000601
602 ASSERT_NO_FATAL_FAILURE(
ramindani0a2bee42022-02-10 01:27:42 +0000603 ReadbackHelper::fillBuffer(layer->getWidth(), layer->getHeight(), stride,
ramindanibab8ba92021-11-18 01:24:11 +0000604 clientBufData, clientFormat, expectedColors));
ramindanib1144212022-02-10 01:51:24 +0000605 int32_t clientFence;
606 const auto unlockStatus = graphicBuffer->unlockAsync(&clientFence);
607 ASSERT_EQ(::android::OK, unlockStatus);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400608 mWriter->setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, buffer, clientFence,
609 clientDataspace, std::vector<common::Rect>(1, damage));
610 layer->setToClientComposition(*mWriter);
611 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000612 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000613 changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800614 ASSERT_TRUE(changedCompositionTypes.empty());
ramindanibab8ba92021-11-18 01:24:11 +0000615 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800616 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000617
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400618 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000619 execute();
620
Ady Abraham3192f3d2021-12-03 16:08:56 -0800621 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000622
623 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
624 }
625}
626
627TEST_P(GraphicsCompositionTest, DeviceAndClientComposition) {
ramindanidcecfd42022-02-03 23:52:19 +0000628 ASSERT_TRUE(
629 mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)
630 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000631
632 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000633 EXPECT_TRUE(mComposerClient
634 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
635 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000636
ramindani44c952f2022-02-28 23:29:29 +0000637 bool isSupported;
638 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000639 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000640 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
641 return;
642 }
643
ramindanidcecfd42022-02-03 23:52:19 +0000644 std::vector<Color> expectedColors(
645 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
646 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
647 {0, 0, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
648 ReadbackHelper::fillColorsArea(
649 expectedColors, getDisplayWidth(),
650 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000651
ramindanidcecfd42022-02-03 23:52:19 +0000652 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700653 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000654 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
655
656 auto deviceLayer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000657 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
658 getDisplayHeight() / 2, PixelFormat::RGBA_8888);
ramindanibab8ba92021-11-18 01:24:11 +0000659 std::vector<Color> deviceColors(deviceLayer->getWidth() * deviceLayer->getHeight());
660 ReadbackHelper::fillColorsArea(deviceColors, static_cast<int32_t>(deviceLayer->getWidth()),
661 {0, 0, static_cast<int32_t>(deviceLayer->getWidth()),
662 static_cast<int32_t>(deviceLayer->getHeight())},
663 GREEN);
664 deviceLayer->setDisplayFrame({0, 0, static_cast<int32_t>(deviceLayer->getWidth()),
665 static_cast<int32_t>(deviceLayer->getHeight())});
666 deviceLayer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400667 deviceLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000668 ASSERT_NO_FATAL_FAILURE(deviceLayer->setBuffer(deviceColors));
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400669 deviceLayer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000670
671 PixelFormat clientFormat = PixelFormat::RGBA_8888;
Brian Lindahle887a252023-01-17 14:54:19 -0700672 auto clientUsage = static_cast<uint32_t>(
673 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
674 static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
675 static_cast<uint32_t>(common::BufferUsage::COMPOSER_CLIENT_TARGET));
ramindanibab8ba92021-11-18 01:24:11 +0000676 Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
ramindanidcecfd42022-02-03 23:52:19 +0000677 int32_t clientWidth = getDisplayWidth();
678 int32_t clientHeight = getDisplayHeight() / 2;
ramindanibab8ba92021-11-18 01:24:11 +0000679
680 auto clientLayer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000681 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), clientWidth,
682 clientHeight, PixelFormat::RGBA_FP16, Composition::DEVICE);
ramindanidcecfd42022-02-03 23:52:19 +0000683 common::Rect clientFrame = {0, getDisplayHeight() / 2, getDisplayWidth(),
684 getDisplayHeight()};
ramindanibab8ba92021-11-18 01:24:11 +0000685 clientLayer->setDisplayFrame(clientFrame);
686 clientLayer->setZOrder(0);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400687 clientLayer->write(*mWriter);
688 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000689 execute();
690
ramindanidcecfd42022-02-03 23:52:19 +0000691 auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800692 if (changedCompositionTypes.size() != 1) {
ramindanibab8ba92021-11-18 01:24:11 +0000693 continue;
694 }
695 // create client target buffer
Ady Abraham46219f52021-12-20 09:44:31 -0800696 ASSERT_EQ(Composition::CLIENT, changedCompositionTypes[0].composition);
Brian Lindahle887a252023-01-17 14:54:19 -0700697 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(clientUsage);
698 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000699 const auto& buffer = graphicBuffer->handle;
ramindanibab8ba92021-11-18 01:24:11 +0000700
701 void* clientBufData;
ramindani0a2bee42022-02-10 01:27:42 +0000702 graphicBuffer->lock(clientUsage, {0, 0, getDisplayWidth(), getDisplayHeight()},
703 &clientBufData);
ramindanibab8ba92021-11-18 01:24:11 +0000704
ramindanidcecfd42022-02-03 23:52:19 +0000705 std::vector<Color> clientColors(
706 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
707 ReadbackHelper::fillColorsArea(clientColors, getDisplayWidth(), clientFrame, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000708 ASSERT_NO_FATAL_FAILURE(ReadbackHelper::fillBuffer(
ramindanidcecfd42022-02-03 23:52:19 +0000709 static_cast<uint32_t>(getDisplayWidth()), static_cast<uint32_t>(getDisplayHeight()),
ramindani0a2bee42022-02-10 01:27:42 +0000710 graphicBuffer->getStride(), clientBufData, clientFormat, clientColors));
ramindanib1144212022-02-10 01:51:24 +0000711 int32_t clientFence;
712 const auto unlockStatus = graphicBuffer->unlockAsync(&clientFence);
713 ASSERT_EQ(::android::OK, unlockStatus);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400714 mWriter->setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, buffer, clientFence,
715 clientDataspace, std::vector<common::Rect>(1, clientFrame));
716 clientLayer->setToClientComposition(*mWriter);
717 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000718 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000719 changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800720 ASSERT_TRUE(changedCompositionTypes.empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800721 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000722
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400723 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000724 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800725 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000726 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
727 }
728}
729
730TEST_P(GraphicsCompositionTest, SetLayerDamage) {
731 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000732 EXPECT_TRUE(mComposerClient
733 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
734 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000735
ramindani44c952f2022-02-28 23:29:29 +0000736 bool isSupported;
737 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000738 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000739 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
740 return;
741 }
742
ramindanidcecfd42022-02-03 23:52:19 +0000743 common::Rect redRect = {0, 0, getDisplayWidth() / 4, getDisplayHeight() / 4};
ramindanibab8ba92021-11-18 01:24:11 +0000744
ramindanidcecfd42022-02-03 23:52:19 +0000745 std::vector<Color> expectedColors(
746 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
747 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000748
ramindani0a2bee42022-02-10 01:27:42 +0000749 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
750 getPrimaryDisplayId(), getDisplayWidth(),
751 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000752 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000753 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400754 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000755 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
756
757 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
758
ramindanidcecfd42022-02-03 23:52:19 +0000759 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700760 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000761 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
762
763 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800764 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400765 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000766 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000767 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000768 GTEST_SUCCEED();
769 return;
770 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800771 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400772 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000773 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800774 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000775
776 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
777
778 // update surface damage and recheck
ramindanidcecfd42022-02-03 23:52:19 +0000779 redRect = {getDisplayWidth() / 4, getDisplayHeight() / 4, getDisplayWidth() / 2,
780 getDisplayHeight() / 2};
781 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
782 getDisplayWidth());
783 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000784
785 ASSERT_NO_FATAL_FAILURE(layer->fillBuffer(expectedColors));
786 layer->setSurfaceDamage(
ramindanidcecfd42022-02-03 23:52:19 +0000787 std::vector<common::Rect>(1, {0, 0, getDisplayWidth() / 2, getDisplayWidth() / 2}));
ramindanibab8ba92021-11-18 01:24:11 +0000788
789 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
790
791 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800792 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400793 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000794 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800795 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcecfd42022-02-03 23:52:19 +0000796 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400797 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000798 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800799 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000800
801 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
802 }
803}
804
805TEST_P(GraphicsCompositionTest, SetLayerPlaneAlpha) {
806 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000807 EXPECT_TRUE(mComposerClient
808 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
809 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000810
ramindani44c952f2022-02-28 23:29:29 +0000811 bool isSupported;
812 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000813 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000814 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
815 return;
816 }
817
ramindanidcecfd42022-02-03 23:52:19 +0000818 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000819 layer->setColor(RED);
ramindanidcecfd42022-02-03 23:52:19 +0000820 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000821 layer->setZOrder(10);
822 layer->setAlpha(0);
823 layer->setBlendMode(BlendMode::PREMULTIPLIED);
824
825 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
826
ramindanidcecfd42022-02-03 23:52:19 +0000827 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700828 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000829
830 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
831
832 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800833 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400834 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000835 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000836 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000837 GTEST_SUCCEED();
838 return;
839 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800840 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000841
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400842 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000843 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800844 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000845
ramindanidcecfd42022-02-03 23:52:19 +0000846 std::vector<Color> expectedColors(
847 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +0000848
849 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
850 mTestRenderEngine->setRenderLayers(layers);
851 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
852 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
853 }
854}
855
856TEST_P(GraphicsCompositionTest, SetLayerSourceCrop) {
857 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000858 EXPECT_TRUE(mComposerClient
859 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
860 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000861
ramindani44c952f2022-02-28 23:29:29 +0000862 bool isSupported;
863 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000864 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000865 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
866 return;
867 }
868
ramindanidcecfd42022-02-03 23:52:19 +0000869 std::vector<Color> expectedColors(
870 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
871 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
872 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
873 ReadbackHelper::fillColorsArea(
874 expectedColors, getDisplayWidth(),
875 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000876
ramindani0a2bee42022-02-10 01:27:42 +0000877 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
878 getPrimaryDisplayId(), getDisplayWidth(),
879 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000880 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000881 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400882 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanidcecfd42022-02-03 23:52:19 +0000883 layer->setSourceCrop({0, static_cast<float>(getDisplayHeight() / 2),
884 static_cast<float>(getDisplayWidth()),
885 static_cast<float>(getDisplayHeight())});
ramindanibab8ba92021-11-18 01:24:11 +0000886 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
887
888 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
889
890 // update expected colors to match crop
ramindanidcecfd42022-02-03 23:52:19 +0000891 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
892 {0, 0, getDisplayWidth(), getDisplayHeight()}, BLUE);
893 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700894 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000895 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
896 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800897 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400898 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000899 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000900 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000901 GTEST_SUCCEED();
902 return;
903 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800904 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400905 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000906 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800907 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000908 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
909 mTestRenderEngine->setRenderLayers(layers);
910 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
911 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
912 }
913}
914
915TEST_P(GraphicsCompositionTest, SetLayerZOrder) {
916 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000917 EXPECT_TRUE(mComposerClient
918 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
919 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000920
ramindani44c952f2022-02-28 23:29:29 +0000921 bool isSupported;
922 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000923 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000924 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
925 return;
926 }
927
ramindanidcecfd42022-02-03 23:52:19 +0000928 common::Rect redRect = {0, 0, getDisplayWidth(), getDisplayHeight() / 2};
929 common::Rect blueRect = {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight()};
930 auto redLayer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000931 redLayer->setColor(RED);
932 redLayer->setDisplayFrame(redRect);
933
ramindanidcecfd42022-02-03 23:52:19 +0000934 auto blueLayer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000935 blueLayer->setColor(BLUE);
936 blueLayer->setDisplayFrame(blueRect);
937 blueLayer->setZOrder(5);
938
939 std::vector<std::shared_ptr<TestLayer>> layers = {redLayer, blueLayer};
ramindanidcecfd42022-02-03 23:52:19 +0000940 std::vector<Color> expectedColors(
941 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +0000942
943 // red in front of blue
944 redLayer->setZOrder(10);
945
946 // fill blue first so that red will overwrite on overlap
ramindanidcecfd42022-02-03 23:52:19 +0000947 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), blueRect, BLUE);
948 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000949
ramindanidcecfd42022-02-03 23:52:19 +0000950 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700951 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000952 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
953
954 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800955 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400956 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000957 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000958 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000959 GTEST_SUCCEED();
960 return;
961 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400962 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000963 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800964 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000965
966 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
967
968 redLayer->setZOrder(1);
ramindanidcecfd42022-02-03 23:52:19 +0000969 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
970 getDisplayWidth());
971 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
972 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), blueRect, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000973
974 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
975
976 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800977 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400978 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000979 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000980 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800981 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400982 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000983 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800984 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000985
986 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
987 mTestRenderEngine->setRenderLayers(layers);
988 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
989 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
990 }
991}
992
Alec Mourib1f16722022-02-07 13:03:44 -0800993TEST_P(GraphicsCompositionTest, SetLayerBrightnessDims) {
ramindanidcecfd42022-02-03 23:52:19 +0000994 const auto& [status, capabilities] =
995 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
996 ASSERT_TRUE(status.isOk());
Alec Mouri51067012022-01-06 17:28:39 -0800997
998 const bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
999 DisplayCapability::BRIGHTNESS) != capabilities.end();
1000
1001 if (!brightnessSupport) {
1002 GTEST_SUCCEED() << "Cannot verify dimming behavior without brightness support";
1003 return;
1004 }
1005
1006 const std::optional<float> maxBrightnessNitsOptional =
ramindanidcecfd42022-02-03 23:52:19 +00001007 getMaxDisplayBrightnessNits(getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001008
1009 ASSERT_TRUE(maxBrightnessNitsOptional.has_value());
1010
1011 const float maxBrightnessNits = *maxBrightnessNitsOptional;
1012
1013 // Preconditions to successfully run are knowing the max brightness and successfully applying
1014 // the max brightness
1015 ASSERT_GT(maxBrightnessNits, 0.f);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001016 mWriter->setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.f, maxBrightnessNits);
Alec Mouri51067012022-01-06 17:28:39 -08001017 execute();
1018 ASSERT_TRUE(mReader.takeErrors().empty());
1019
1020 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001021 EXPECT_TRUE(mComposerClient
1022 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1023 .isOk());
Alec Mouri51067012022-01-06 17:28:39 -08001024
ramindani44c952f2022-02-28 23:29:29 +00001025 bool isSupported;
1026 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001027 if (!isSupported) {
Alec Mouri51067012022-01-06 17:28:39 -08001028 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace for "
1029 "color mode: "
1030 << toString(mode);
1031 continue;
1032 }
ramindanidcecfd42022-02-03 23:52:19 +00001033 const common::Rect redRect = {0, 0, getDisplayWidth(), getDisplayHeight() / 2};
1034 const common::Rect dimmerRedRect = {0, getDisplayHeight() / 2, getDisplayWidth(),
1035 getDisplayHeight()};
1036 const auto redLayer =
1037 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001038 redLayer->setColor(RED);
1039 redLayer->setDisplayFrame(redRect);
1040 redLayer->setWhitePointNits(maxBrightnessNits);
Alec Mourib1f16722022-02-07 13:03:44 -08001041 redLayer->setBrightness(1.f);
Alec Mouri51067012022-01-06 17:28:39 -08001042
1043 const auto dimmerRedLayer =
ramindanidcecfd42022-02-03 23:52:19 +00001044 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001045 dimmerRedLayer->setColor(RED);
1046 dimmerRedLayer->setDisplayFrame(dimmerRedRect);
1047 // Intentionally use a small dimming ratio as some implementations may be more likely to
1048 // kick into GPU composition to apply dithering when the dimming ratio is high.
1049 static constexpr float kDimmingRatio = 0.9f;
1050 dimmerRedLayer->setWhitePointNits(maxBrightnessNits * kDimmingRatio);
Alec Mourib1f16722022-02-07 13:03:44 -08001051 dimmerRedLayer->setBrightness(kDimmingRatio);
Alec Mouri51067012022-01-06 17:28:39 -08001052
1053 const std::vector<std::shared_ptr<TestLayer>> layers = {redLayer, dimmerRedLayer};
ramindanidcecfd42022-02-03 23:52:19 +00001054 std::vector<Color> expectedColors(
1055 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
Alec Mouri51067012022-01-06 17:28:39 -08001056
ramindanidcecfd42022-02-03 23:52:19 +00001057 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
1058 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), dimmerRedRect, DIM_RED);
Alec Mouri51067012022-01-06 17:28:39 -08001059
ramindanidcecfd42022-02-03 23:52:19 +00001060 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001061 getDisplayHeight(), mPixelFormat, mDataspace);
Alec Mouri51067012022-01-06 17:28:39 -08001062 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1063
1064 writeLayers(layers);
1065 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001066 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
Alec Mouri51067012022-01-06 17:28:39 -08001067 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001068 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
Alec Mouri51067012022-01-06 17:28:39 -08001069 GTEST_SUCCEED()
1070 << "Readback verification not supported for GPU composition for color mode: "
1071 << toString(mode);
1072 continue;
1073 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001074 mWriter->presentDisplay(getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001075 execute();
1076 ASSERT_TRUE(mReader.takeErrors().empty());
1077
1078 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1079 mTestRenderEngine->setRenderLayers(layers);
1080 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1081 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1082 }
1083}
1084
ramindanibab8ba92021-11-18 01:24:11 +00001085class GraphicsBlendModeCompositionTest
1086 : public GraphicsCompositionTestBase,
1087 public testing::WithParamInterface<std::tuple<std::string, std::string>> {
1088 public:
1089 void SetUp() override {
1090 SetUpBase(std::get<0>(GetParam()));
ramindanib636af22022-02-10 02:55:56 +00001091 // TODO(b/219590743) we should remove the below SRGB color mode
1092 // once we have the BlendMode test fix for all the versions of the ColorMode
ramindania4e76362022-03-02 01:48:06 +00001093 mTestColorModes.erase(
1094 std::remove_if(mTestColorModes.begin(), mTestColorModes.end(),
1095 [](ColorMode mode) { return mode != ColorMode::SRGB; }),
1096 mTestColorModes.end());
ramindanibab8ba92021-11-18 01:24:11 +00001097 mBackgroundColor = BLACK;
1098 mTopLayerColor = RED;
1099 }
1100
1101 void setBackgroundColor(Color color) { mBackgroundColor = color; }
1102
1103 void setTopLayerColor(Color color) { mTopLayerColor = color; }
1104
1105 void setUpLayers(BlendMode blendMode) {
1106 mLayers.clear();
ramindanidcecfd42022-02-03 23:52:19 +00001107 std::vector<Color> topLayerPixelColors(
1108 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1109 ReadbackHelper::fillColorsArea(topLayerPixelColors, getDisplayWidth(),
1110 {0, 0, getDisplayWidth(), getDisplayHeight()},
1111 mTopLayerColor);
ramindanibab8ba92021-11-18 01:24:11 +00001112
ramindanidcecfd42022-02-03 23:52:19 +00001113 auto backgroundLayer =
1114 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
1115 backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001116 backgroundLayer->setZOrder(0);
1117 backgroundLayer->setColor(mBackgroundColor);
1118
ramindani0a2bee42022-02-10 01:27:42 +00001119 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
1120 getPrimaryDisplayId(), getDisplayWidth(),
1121 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +00001122 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001123 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001124 layer->setDataspace(Dataspace::UNKNOWN, *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001125 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(topLayerPixelColors));
1126
1127 layer->setBlendMode(blendMode);
1128 layer->setAlpha(std::stof(std::get<1>(GetParam())));
1129
1130 mLayers.push_back(backgroundLayer);
1131 mLayers.push_back(layer);
1132 }
1133
1134 void setExpectedColors(std::vector<Color>& expectedColors) {
1135 ASSERT_EQ(2, mLayers.size());
ramindanidcecfd42022-02-03 23:52:19 +00001136 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
1137 getDisplayWidth());
ramindanibab8ba92021-11-18 01:24:11 +00001138
1139 auto layer = mLayers[1];
1140 BlendMode blendMode = layer->getBlendMode();
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001141 float alpha = mTopLayerColor.a * layer->getAlpha();
ramindanibab8ba92021-11-18 01:24:11 +00001142 if (blendMode == BlendMode::NONE) {
1143 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001144 expectedColor.r = mTopLayerColor.r * layer->getAlpha();
1145 expectedColor.g = mTopLayerColor.g * layer->getAlpha();
1146 expectedColor.b = mTopLayerColor.b * layer->getAlpha();
1147 expectedColor.a = alpha;
ramindanibab8ba92021-11-18 01:24:11 +00001148 }
1149 } else if (blendMode == BlendMode::PREMULTIPLIED) {
1150 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001151 expectedColor.r =
1152 mTopLayerColor.r * layer->getAlpha() + mBackgroundColor.r * (1.0f - alpha);
1153 expectedColor.g =
1154 mTopLayerColor.g * layer->getAlpha() + mBackgroundColor.g * (1.0f - alpha);
1155 expectedColor.b =
1156 mTopLayerColor.b * layer->getAlpha() + mBackgroundColor.b * (1.0f - alpha);
1157 expectedColor.a = alpha + mBackgroundColor.a * (1.0f - alpha);
ramindanibab8ba92021-11-18 01:24:11 +00001158 }
1159 } else if (blendMode == BlendMode::COVERAGE) {
1160 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001161 expectedColor.r = mTopLayerColor.r * alpha + mBackgroundColor.r * (1.0f - alpha);
1162 expectedColor.g = mTopLayerColor.g * alpha + mBackgroundColor.g * (1.0f - alpha);
1163 expectedColor.b = mTopLayerColor.b * alpha + mBackgroundColor.b * (1.0f - alpha);
1164 expectedColor.a = mTopLayerColor.a * alpha + mBackgroundColor.a * (1.0f - alpha);
ramindanibab8ba92021-11-18 01:24:11 +00001165 }
1166 }
1167 }
1168
1169 protected:
1170 std::vector<std::shared_ptr<TestLayer>> mLayers;
1171 Color mBackgroundColor;
1172 Color mTopLayerColor;
1173};
ramindanic7585d92022-04-15 18:30:41 +00001174
1175TEST_P(GraphicsBlendModeCompositionTest, None) {
ramindanibab8ba92021-11-18 01:24:11 +00001176 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001177 EXPECT_TRUE(mComposerClient
1178 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1179 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001180
ramindani44c952f2022-02-28 23:29:29 +00001181 bool isSupported;
1182 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001183 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001184 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1185 return;
1186 }
1187
ramindanidcecfd42022-02-03 23:52:19 +00001188 std::vector<Color> expectedColors(
1189 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001190
1191 setBackgroundColor(BLACK);
1192 setTopLayerColor(TRANSLUCENT_RED);
1193 setUpLayers(BlendMode::NONE);
1194 setExpectedColors(expectedColors);
1195
ramindanidcecfd42022-02-03 23:52:19 +00001196 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001197 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001198 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1199 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001200 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001201 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001202 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001203 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001204 GTEST_SUCCEED();
1205 return;
1206 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001207 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001208 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001209 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001210 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001211
1212 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1213 mTestRenderEngine->setRenderLayers(mLayers);
1214 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1215 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1216 }
1217}
1218
ramindani07e6f842022-02-15 15:28:33 +00001219TEST_P(GraphicsBlendModeCompositionTest, Coverage) {
ramindanibab8ba92021-11-18 01:24:11 +00001220 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001221 EXPECT_TRUE(mComposerClient
1222 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1223 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001224
ramindani44c952f2022-02-28 23:29:29 +00001225 bool isSupported;
1226 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001227 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001228 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1229 return;
1230 }
1231
ramindanidcecfd42022-02-03 23:52:19 +00001232 std::vector<Color> expectedColors(
1233 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001234
1235 setBackgroundColor(BLACK);
1236 setTopLayerColor(TRANSLUCENT_RED);
1237
1238 setUpLayers(BlendMode::COVERAGE);
1239 setExpectedColors(expectedColors);
1240
ramindanidcecfd42022-02-03 23:52:19 +00001241 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001242 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001243 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1244 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001245 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001246 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001247 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001248 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001249 GTEST_SUCCEED();
1250 return;
1251 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001252 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001253 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001254 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001255 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001256 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1257 }
1258}
1259
1260TEST_P(GraphicsBlendModeCompositionTest, Premultiplied) {
1261 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001262 EXPECT_TRUE(mComposerClient
1263 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1264 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001265
ramindani44c952f2022-02-28 23:29:29 +00001266 bool isSupported;
1267 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001268 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001269 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1270 return;
1271 }
ramindanibab8ba92021-11-18 01:24:11 +00001272
ramindanidcecfd42022-02-03 23:52:19 +00001273 std::vector<Color> expectedColors(
1274 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001275
1276 setBackgroundColor(BLACK);
1277 setTopLayerColor(TRANSLUCENT_RED);
1278 setUpLayers(BlendMode::PREMULTIPLIED);
1279 setExpectedColors(expectedColors);
1280
ramindanidcecfd42022-02-03 23:52:19 +00001281 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001282 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001283 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1284 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001285 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001286 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001287 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001288 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001289 GTEST_SUCCEED();
1290 return;
1291 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001292 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001293 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001294 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001295 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001296 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1297 mTestRenderEngine->setRenderLayers(mLayers);
1298 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1299 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1300 }
1301}
1302
1303class GraphicsTransformCompositionTest : public GraphicsCompositionTest {
1304 protected:
1305 void SetUp() override {
1306 GraphicsCompositionTest::SetUp();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001307
ramindanidcecfd42022-02-03 23:52:19 +00001308 auto backgroundLayer =
1309 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001310 backgroundLayer->setColor({0.0f, 0.0f, 0.0f, 0.0f});
ramindanidcecfd42022-02-03 23:52:19 +00001311 backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001312 backgroundLayer->setZOrder(0);
1313
ramindanidcecfd42022-02-03 23:52:19 +00001314 mSideLength =
1315 getDisplayWidth() < getDisplayHeight() ? getDisplayWidth() : getDisplayHeight();
ramindanibab8ba92021-11-18 01:24:11 +00001316 common::Rect redRect = {0, 0, mSideLength / 2, mSideLength / 2};
1317 common::Rect blueRect = {mSideLength / 2, mSideLength / 2, mSideLength, mSideLength};
1318
ramindani0a2bee42022-02-10 01:27:42 +00001319 mLayer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
1320 getPrimaryDisplayId(), mSideLength, mSideLength,
1321 PixelFormat::RGBA_8888);
ramindanibab8ba92021-11-18 01:24:11 +00001322 mLayer->setDisplayFrame({0, 0, mSideLength, mSideLength});
1323 mLayer->setZOrder(10);
1324
1325 std::vector<Color> baseColors(static_cast<size_t>(mSideLength * mSideLength));
1326 ReadbackHelper::fillColorsArea(baseColors, mSideLength, redRect, RED);
1327 ReadbackHelper::fillColorsArea(baseColors, mSideLength, blueRect, BLUE);
1328 ASSERT_NO_FATAL_FAILURE(mLayer->setBuffer(baseColors));
1329 mLayers = {backgroundLayer, mLayer};
1330 }
1331
1332 protected:
1333 std::shared_ptr<TestBufferLayer> mLayer;
1334 std::vector<std::shared_ptr<TestLayer>> mLayers;
1335 int mSideLength;
1336};
1337
1338TEST_P(GraphicsTransformCompositionTest, FLIP_H) {
1339 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001340 auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), mode,
1341 RenderIntent::COLORIMETRIC);
ramindanid5751092022-04-22 22:30:20 +00001342 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
ramindanidcecfd42022-02-03 23:52:19 +00001343 (status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED ||
1344 status.getServiceSpecificError() == IComposerClient::EX_BAD_PARAMETER)) {
ramindanibab8ba92021-11-18 01:24:11 +00001345 SUCCEED() << "ColorMode not supported, skip test";
1346 return;
1347 }
1348
ramindani44c952f2022-02-28 23:29:29 +00001349 bool isSupported;
1350 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001351 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001352 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1353 return;
1354 }
ramindanidcecfd42022-02-03 23:52:19 +00001355 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001356 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001357 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1358 mLayer->setTransform(Transform::FLIP_H);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001359 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001360
ramindanidcecfd42022-02-03 23:52:19 +00001361 std::vector<Color> expectedColors(
1362 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1363 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001364 {mSideLength / 2, 0, mSideLength, mSideLength / 2}, RED);
ramindanidcecfd42022-02-03 23:52:19 +00001365 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001366 {0, mSideLength / 2, mSideLength / 2, mSideLength}, BLUE);
1367
1368 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001369 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001370 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001371 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001372 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001373 GTEST_SUCCEED();
1374 return;
1375 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001376 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001377 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001378 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001379 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001380
1381 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1382 mTestRenderEngine->setRenderLayers(mLayers);
1383 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1384 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1385 }
1386}
1387
1388TEST_P(GraphicsTransformCompositionTest, FLIP_V) {
1389 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001390 EXPECT_TRUE(mComposerClient
1391 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1392 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001393
ramindani44c952f2022-02-28 23:29:29 +00001394 bool isSupported;
1395 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001396 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001397 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1398 return;
1399 }
ramindanidcecfd42022-02-03 23:52:19 +00001400 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001401 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001402 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1403
1404 mLayer->setTransform(Transform::FLIP_V);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001405 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001406
ramindanidcecfd42022-02-03 23:52:19 +00001407 std::vector<Color> expectedColors(
1408 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1409 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001410 {0, mSideLength / 2, mSideLength / 2, mSideLength}, RED);
ramindanidcecfd42022-02-03 23:52:19 +00001411 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001412 {mSideLength / 2, 0, mSideLength, mSideLength / 2}, BLUE);
1413
1414 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001415 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001416 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001417 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001418 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001419 GTEST_SUCCEED();
1420 return;
1421 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001422 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001423 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001424 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001425 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001426 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1427 mTestRenderEngine->setRenderLayers(mLayers);
1428 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1429 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1430 }
1431}
1432
1433TEST_P(GraphicsTransformCompositionTest, ROT_180) {
1434 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001435 EXPECT_TRUE(mComposerClient
1436 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1437 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001438
ramindani44c952f2022-02-28 23:29:29 +00001439 bool isSupported;
1440 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001441 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001442 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1443 return;
1444 }
ramindanidcecfd42022-02-03 23:52:19 +00001445 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001446 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001447 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1448
1449 mLayer->setTransform(Transform::ROT_180);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001450 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001451
ramindanidcecfd42022-02-03 23:52:19 +00001452 std::vector<Color> expectedColors(
1453 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1454 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001455 {mSideLength / 2, mSideLength / 2, mSideLength, mSideLength},
1456 RED);
ramindanidcecfd42022-02-03 23:52:19 +00001457 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001458 {0, 0, mSideLength / 2, mSideLength / 2}, BLUE);
1459
1460 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001461 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001462 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001463 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001464 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001465 GTEST_SUCCEED();
1466 return;
1467 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001468 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001469 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001470 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001471 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001472 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1473 mTestRenderEngine->setRenderLayers(mLayers);
1474 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1475 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1476 }
1477}
1478
1479GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsCompositionTest);
1480INSTANTIATE_TEST_SUITE_P(
1481 PerInstance, GraphicsCompositionTest,
1482 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
1483 ::android::PrintInstanceNameToString);
1484
1485GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsBlendModeCompositionTest);
1486INSTANTIATE_TEST_SUITE_P(BlendMode, GraphicsBlendModeCompositionTest,
1487 testing::Combine(testing::ValuesIn(::android::getAidlHalInstanceNames(
1488 IComposer::descriptor)),
1489 testing::Values("0.2", "1.0")));
1490
1491GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsTransformCompositionTest);
1492INSTANTIATE_TEST_SUITE_P(
1493 PerInstance, GraphicsTransformCompositionTest,
1494 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
1495 ::android::PrintInstanceNameToString);
1496
1497} // namespace
Ady Abraham3192f3d2021-12-03 16:08:56 -08001498} // namespace aidl::android::hardware::graphics::composer3::vts