blob: a83b833eeb90491bc5e439597651b0fb8fc6d680 [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)
ramindanibab8ba92021-11-18 01:24:11 +000073 .setEnableProtectedContext(false)
74 .setPrecacheToneMapperShaderOnly(false)
75 .setContextPriority(::android::renderengine::RenderEngine::
76 ContextPriority::HIGH)
77 .build())));
78
79 ::android::renderengine::DisplaySettings clientCompositionDisplay;
ramindanidcecfd42022-02-03 23:52:19 +000080 clientCompositionDisplay.physicalDisplay = Rect(getDisplayWidth(), getDisplayHeight());
ramindanibab8ba92021-11-18 01:24:11 +000081 clientCompositionDisplay.clip = clientCompositionDisplay.physicalDisplay;
82
Brian Lindahle887a252023-01-17 14:54:19 -070083 mTestRenderEngine->initGraphicBuffer(
84 static_cast<uint32_t>(getDisplayWidth()), static_cast<uint32_t>(getDisplayHeight()),
85 /*layerCount*/ 1U,
86 static_cast<uint64_t>(
87 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
88 static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
89 static_cast<uint64_t>(common::BufferUsage::GPU_RENDER_TARGET)));
ramindanibab8ba92021-11-18 01:24:11 +000090 mTestRenderEngine->setDisplaySettings(clientCompositionDisplay);
91 }
92
93 void TearDown() override {
ramindanidcecfd42022-02-03 23:52:19 +000094 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
95 ASSERT_TRUE(mComposerClient->tearDown());
96 mComposerClient.reset();
Ady Abraham3192f3d2021-12-03 16:08:56 -080097 const auto errors = mReader.takeErrors();
98 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcecfd42022-02-03 23:52:19 +000099 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
ramindanibab8ba92021-11-18 01:24:11 +0000100 }
101
ramindanidcecfd42022-02-03 23:52:19 +0000102 const VtsDisplay& getPrimaryDisplay() const { return mDisplays[0]; }
103
104 int64_t getPrimaryDisplayId() const { return getPrimaryDisplay().getDisplayId(); }
105
106 int64_t getInvalidDisplayId() const { return mComposerClient->getInvalidDisplayId(); }
107
108 int32_t getDisplayWidth() const { return getPrimaryDisplay().getDisplayWidth(); }
109
110 int32_t getDisplayHeight() const { return getPrimaryDisplay().getDisplayHeight(); }
111
ramindanid5751092022-04-22 22:30:20 +0000112 void assertServiceSpecificError(const ScopedAStatus& status, int32_t serviceSpecificError) {
113 ASSERT_EQ(status.getExceptionCode(), EX_SERVICE_SPECIFIC);
114 ASSERT_EQ(status.getServiceSpecificError(), serviceSpecificError);
115 }
116
Brian Lindahle887a252023-01-17 14:54:19 -0700117 std::pair<bool, ::android::sp<::android::GraphicBuffer>> allocateBuffer(uint32_t usage) {
118 const auto width = static_cast<uint32_t>(getDisplayWidth());
119 const auto height = static_cast<uint32_t>(getDisplayHeight());
120
121 const auto& graphicBuffer = ::android::sp<::android::GraphicBuffer>::make(
122 width, height, ::android::PIXEL_FORMAT_RGBA_8888,
123 /*layerCount*/ 1u, usage, "VtsHalGraphicsComposer3_ReadbackTest");
ramindani0a2bee42022-02-10 01:27:42 +0000124
125 if (graphicBuffer && ::android::OK == graphicBuffer->initCheck()) {
Brian Lindahle887a252023-01-17 14:54:19 -0700126 return {true, graphicBuffer};
ramindani0a2bee42022-02-10 01:27:42 +0000127 }
Brian Lindahle887a252023-01-17 14:54:19 -0700128 return {false, graphicBuffer};
ramindanibab8ba92021-11-18 01:24:11 +0000129 }
130
Alec Mouri51067012022-01-06 17:28:39 -0800131 // Gets the per-display XML config
132 std::unique_ptr<tinyxml2::XMLDocument> getDisplayConfigXml(int64_t display) {
Alec Mouribe1b4d62023-07-20 19:11:37 +0000133
134 if (auto document = getDisplayConfigXmlByStableId(getStableDisplayId(display));
135 document != nullptr) {
Alec Mouri51067012022-01-06 17:28:39 -0800136 return document;
Alec Mouri51067012022-01-06 17:28:39 -0800137 }
Alec Mouribe1b4d62023-07-20 19:11:37 +0000138
139 // Fallback to looking up a per-port config if no config exists for the full ID
140 if (auto document = getDisplayConfigXmlByPort(getPort(display)); document != nullptr) {
141 return document;
142 }
143
144 return nullptr;
Alec Mouri51067012022-01-06 17:28:39 -0800145 }
146
147 // Gets the max display brightness for this display.
148 // If the display config xml does not exist, then assume that the display is not well-configured
149 // enough to provide a display brightness, so return nullopt.
150 std::optional<float> getMaxDisplayBrightnessNits(int64_t display) {
151 const auto document = getDisplayConfigXml(display);
152 if (!document) {
153 // Assume the device doesn't support display brightness
154 return std::nullopt;
155 }
156
157 const auto root = document->RootElement();
158 if (!root) {
159 // If there's somehow no root element, then this isn't a valid config
160 return std::nullopt;
161 }
162
163 const auto screenBrightnessMap = root->FirstChildElement("screenBrightnessMap");
164 if (!screenBrightnessMap) {
165 // A valid display config must have a screen brightness map
166 return std::nullopt;
167 }
168
169 auto point = screenBrightnessMap->FirstChildElement("point");
170 float maxNits = -1.f;
171 while (point != nullptr) {
172 const auto nits = point->FirstChildElement("nits");
173 if (nits) {
174 maxNits = std::max(maxNits, nits->FloatText(-1.f));
175 }
176 point = point->NextSiblingElement("point");
177 }
178
179 if (maxNits < 0.f) {
180 // If we got here, then there were no point elements containing a nit value, so this
181 // config isn't valid
182 return std::nullopt;
183 }
184
185 return maxNits;
186 }
187
ramindanibab8ba92021-11-18 01:24:11 +0000188 void writeLayers(const std::vector<std::shared_ptr<TestLayer>>& layers) {
ramindanidcecfd42022-02-03 23:52:19 +0000189 for (const auto& layer : layers) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400190 layer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000191 }
192 execute();
193 }
194
195 void execute() {
Huihong Luo651806f2023-04-21 18:48:48 +0000196 auto commands = mWriter->takePendingCommands();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800197 if (commands.empty()) {
Ady Abraham3192f3d2021-12-03 16:08:56 -0800198 return;
ramindanibab8ba92021-11-18 01:24:11 +0000199 }
200
ramindanidcecfd42022-02-03 23:52:19 +0000201 auto [status, results] = mComposerClient->executeCommands(commands);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800202 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
ramindanibab8ba92021-11-18 01:24:11 +0000203
Ady Abraham46219f52021-12-20 09:44:31 -0800204 mReader.parse(std::move(results));
ramindanibab8ba92021-11-18 01:24:11 +0000205 }
206
ramindani44c952f2022-02-28 23:29:29 +0000207 bool getHasReadbackBuffer() {
ramindanidcecfd42022-02-03 23:52:19 +0000208 auto [status, readBackBufferAttributes] =
209 mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
210 if (status.isOk()) {
211 mPixelFormat = readBackBufferAttributes.format;
212 mDataspace = readBackBufferAttributes.dataspace;
ramindani44c952f2022-02-28 23:29:29 +0000213 return ReadbackHelper::readbackSupported(mPixelFormat, mDataspace);
ramindanidcecfd42022-02-03 23:52:19 +0000214 }
ramindanid5751092022-04-22 22:30:20 +0000215 EXPECT_NO_FATAL_FAILURE(
216 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani44c952f2022-02-28 23:29:29 +0000217 return false;
ramindanib27f33b2021-12-03 19:36:10 +0000218 }
219
ramindanidcecfd42022-02-03 23:52:19 +0000220 std::shared_ptr<VtsComposerClient> mComposerClient;
221 std::vector<VtsDisplay> mDisplays;
222 // use the slot count usually set by SF
ramindanibab8ba92021-11-18 01:24:11 +0000223 std::vector<ColorMode> mTestColorModes;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400224 std::unique_ptr<ComposerClientWriter> mWriter;
Ady Abraham91c9d1a2021-12-15 18:14:45 -0800225 ComposerClientReader mReader;
ramindanibab8ba92021-11-18 01:24:11 +0000226 std::unique_ptr<TestRenderEngine> mTestRenderEngine;
ramindanibab8ba92021-11-18 01:24:11 +0000227 common::PixelFormat mPixelFormat;
228 common::Dataspace mDataspace;
229
230 static constexpr uint32_t kClientTargetSlotCount = 64;
231
232 private:
ramindanibab8ba92021-11-18 01:24:11 +0000233 void setTestColorModes() {
234 mTestColorModes.clear();
ramindanidcecfd42022-02-03 23:52:19 +0000235 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
236 ASSERT_TRUE(status.isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000237
238 for (ColorMode mode : modes) {
239 if (std::find(ReadbackHelper::colorModes.begin(), ReadbackHelper::colorModes.end(),
240 mode) != ReadbackHelper::colorModes.end()) {
241 mTestColorModes.push_back(mode);
242 }
243 }
244 }
Alec Mouribe1b4d62023-07-20 19:11:37 +0000245
246 uint8_t getPort(int64_t display) {
247 const auto& [status, identification] =
248 mComposerClient->getDisplayIdentificationData(display);
249 EXPECT_TRUE(status.isOk());
250 return static_cast<uint8_t>(identification.port);
251 }
252
253 uint64_t getStableDisplayId(int64_t display) {
254 const auto& [status, identification] =
255 mComposerClient->getDisplayIdentificationData(display);
256 EXPECT_TRUE(status.isOk());
257
258 if (const auto info = ::android::parseDisplayIdentificationData(
259 static_cast<uint8_t>(identification.port), identification.data)) {
260 return info->id.value;
261 }
262
263 return ::android::PhysicalDisplayId::fromPort(static_cast<uint8_t>(identification.port))
264 .value;
265 }
266
267 std::unique_ptr<tinyxml2::XMLDocument> loadXml(const std::string& path) {
268 auto document = std::make_unique<tinyxml2::XMLDocument>();
269 const tinyxml2::XMLError error = document->LoadFile(path.c_str());
270 if (error != tinyxml2::XML_SUCCESS) {
271 ALOGD("%s: Failed to load config file: %s", __func__, path.c_str());
272 return nullptr;
273 }
274
275 ALOGD("%s: Successfully loaded config file: %s", __func__, path.c_str());
276 return document;
277 }
278
279 std::unique_ptr<tinyxml2::XMLDocument> getDisplayConfigXmlByPort(uint8_t port) {
280 std::stringstream pathBuilder;
281 pathBuilder << "/vendor/etc/displayconfig/display_port_" << static_cast<uint32_t>(port)
282 << ".xml";
283 return loadXml(pathBuilder.str());
284 }
285
286 std::unique_ptr<tinyxml2::XMLDocument> getDisplayConfigXmlByStableId(uint64_t stableId) {
287 std::stringstream pathBuilder;
288 pathBuilder << "/vendor/etc/displayconfig/display_id_" << stableId
289 << ".xml";
290 return loadXml(pathBuilder.str());
291 }
ramindanibab8ba92021-11-18 01:24:11 +0000292};
293
294class GraphicsCompositionTest : public GraphicsCompositionTestBase,
295 public testing::WithParamInterface<std::string> {
296 public:
297 void SetUp() override { SetUpBase(GetParam()); }
298};
299
300TEST_P(GraphicsCompositionTest, SingleSolidColorLayer) {
301 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000302 EXPECT_TRUE(mComposerClient
303 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
304 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000305
ramindani44c952f2022-02-28 23:29:29 +0000306 bool isSupported;
307 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000308 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000309 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
310 return;
311 }
312
ramindanidcecfd42022-02-03 23:52:19 +0000313 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
314 common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000315 layer->setColor(BLUE);
316 layer->setDisplayFrame(coloredSquare);
317 layer->setZOrder(10);
318
319 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
320
321 // expected color for each pixel
ramindanidcecfd42022-02-03 23:52:19 +0000322 std::vector<Color> expectedColors(
323 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
324 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), coloredSquare, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000325
ramindanidcecfd42022-02-03 23:52:19 +0000326 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700327 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000328 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
329
330 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800331 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400332 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000333 execute();
334 // if hwc cannot handle and asks for composition change,
335 // just succeed the test
ramindanidcecfd42022-02-03 23:52:19 +0000336 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000337 GTEST_SUCCEED();
338 return;
339 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800340 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400341 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000342 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800343 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000344
345 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
346 mTestRenderEngine->setRenderLayers(layers);
347 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
348 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
349 }
350}
351
352TEST_P(GraphicsCompositionTest, SetLayerBuffer) {
353 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000354 EXPECT_TRUE(mComposerClient
355 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
356 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000357
ramindani44c952f2022-02-28 23:29:29 +0000358 bool isSupported;
359 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000360 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000361 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
362 return;
363 }
364
ramindanidcecfd42022-02-03 23:52:19 +0000365 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700366 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000367 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000368 std::vector<Color> expectedColors(
369 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
370 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
371 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
372 ReadbackHelper::fillColorsArea(
373 expectedColors, getDisplayWidth(),
374 {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
375 ReadbackHelper::fillColorsArea(
376 expectedColors, getDisplayWidth(),
377 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000378
379 auto layer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000380 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
381 getDisplayHeight(), common::PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000382 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000383 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400384 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000385 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
386
387 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
388
389 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800390 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400391 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000392 execute();
393
ramindanidcecfd42022-02-03 23:52:19 +0000394 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000395 GTEST_SUCCEED();
396 return;
397 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800398 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000399
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400400 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000401 execute();
402
Ady Abraham3192f3d2021-12-03 16:08:56 -0800403 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000404
405 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
406 mTestRenderEngine->setRenderLayers(layers);
407 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
408 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
409 }
410}
411
412TEST_P(GraphicsCompositionTest, SetLayerBufferNoEffect) {
413 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000414 EXPECT_TRUE(mComposerClient
415 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
416 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000417
ramindani44c952f2022-02-28 23:29:29 +0000418 bool isSupported;
419 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000420 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000421 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
422 return;
423 }
424
ramindanidcecfd42022-02-03 23:52:19 +0000425 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
426 common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000427 layer->setColor(BLUE);
428 layer->setDisplayFrame(coloredSquare);
429 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400430 layer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000431
432 // This following buffer call should have no effect
Brian Lindahle887a252023-01-17 14:54:19 -0700433 const auto usage = static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
434 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN);
435 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(usage);
436 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000437 const auto& buffer = graphicBuffer->handle;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400438 mWriter->setLayerBuffer(getPrimaryDisplayId(), layer->getLayer(), /*slot*/ 0, buffer,
439 /*acquireFence*/ -1);
ramindanibab8ba92021-11-18 01:24:11 +0000440
441 // expected color for each pixel
ramindanidcecfd42022-02-03 23:52:19 +0000442 std::vector<Color> expectedColors(
443 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
444 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), coloredSquare, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000445
ramindanidcecfd42022-02-03 23:52:19 +0000446 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700447 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000448 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
449
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400450 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000451 execute();
452
ramindanidcecfd42022-02-03 23:52:19 +0000453 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000454 GTEST_SUCCEED();
455 return;
456 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800457 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400458 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000459 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800460 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000461
462 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
463 }
464}
465
ramindanib27f33b2021-12-03 19:36:10 +0000466TEST_P(GraphicsCompositionTest, SetReadbackBuffer) {
ramindani44c952f2022-02-28 23:29:29 +0000467 bool isSupported;
468 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000469 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000470 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
471 return;
472 }
473
ramindanidcecfd42022-02-03 23:52:19 +0000474 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700475 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanib27f33b2021-12-03 19:36:10 +0000476
477 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
478}
479
ramindanidcecfd42022-02-03 23:52:19 +0000480TEST_P(GraphicsCompositionTest, SetReadbackBuffer_BadDisplay) {
ramindani44c952f2022-02-28 23:29:29 +0000481 bool isSupported;
482 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000483 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000484 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
485 return;
486 }
487
Brian Lindahle887a252023-01-17 14:54:19 -0700488 const auto usage = static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
489 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN);
490 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(usage);
491 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000492 const auto& bufferHandle = graphicBuffer->handle;
ramindanib27f33b2021-12-03 19:36:10 +0000493 ::ndk::ScopedFileDescriptor fence = ::ndk::ScopedFileDescriptor(-1);
494
ramindanidcecfd42022-02-03 23:52:19 +0000495 const auto status =
496 mComposerClient->setReadbackBuffer(getInvalidDisplayId(), bufferHandle, fence);
ramindanib27f33b2021-12-03 19:36:10 +0000497
ramindanidcecfd42022-02-03 23:52:19 +0000498 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000499 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanib27f33b2021-12-03 19:36:10 +0000500}
501
ramindanidcecfd42022-02-03 23:52:19 +0000502TEST_P(GraphicsCompositionTest, SetReadbackBuffer_BadParameter) {
ramindani44c952f2022-02-28 23:29:29 +0000503 bool isSupported;
504 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000505 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000506 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
507 return;
508 }
509
ramindanidcecfd42022-02-03 23:52:19 +0000510 const native_handle_t bufferHandle{};
ramindanib27f33b2021-12-03 19:36:10 +0000511 ndk::ScopedFileDescriptor releaseFence = ndk::ScopedFileDescriptor(-1);
ramindanidcecfd42022-02-03 23:52:19 +0000512 const auto status =
513 mComposerClient->setReadbackBuffer(getPrimaryDisplayId(), &bufferHandle, releaseFence);
ramindanib27f33b2021-12-03 19:36:10 +0000514
ramindanidcecfd42022-02-03 23:52:19 +0000515 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000516 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanib27f33b2021-12-03 19:36:10 +0000517}
518
519TEST_P(GraphicsCompositionTest, GetReadbackBufferFenceInactive) {
ramindani44c952f2022-02-28 23:29:29 +0000520 bool isSupported;
521 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000522 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000523 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
524 return;
525 }
526
ramindanidcecfd42022-02-03 23:52:19 +0000527 const auto& [status, releaseFence] =
528 mComposerClient->getReadbackBufferFence(getPrimaryDisplayId());
ramindanib27f33b2021-12-03 19:36:10 +0000529
ramindanidcecfd42022-02-03 23:52:19 +0000530 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000531 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Alec Mouri62ae37b2022-01-20 17:16:38 -0800532 EXPECT_EQ(-1, releaseFence.get());
ramindanib27f33b2021-12-03 19:36:10 +0000533}
534
ramindanibab8ba92021-11-18 01:24:11 +0000535TEST_P(GraphicsCompositionTest, ClientComposition) {
ramindanidcecfd42022-02-03 23:52:19 +0000536 EXPECT_TRUE(
537 mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)
538 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000539
540 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000541 EXPECT_TRUE(mComposerClient
542 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
ramindanibab8ba92021-11-18 01:24:11 +0000543 .isOk());
544
ramindani44c952f2022-02-28 23:29:29 +0000545 bool isSupported;
546 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000547 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000548 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
549 return;
550 }
551
ramindanidcecfd42022-02-03 23:52:19 +0000552 std::vector<Color> expectedColors(
553 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
554 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
555 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
556 ReadbackHelper::fillColorsArea(
557 expectedColors, getDisplayWidth(),
558 {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
559 ReadbackHelper::fillColorsArea(
560 expectedColors, getDisplayWidth(),
561 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000562
ramindani0a2bee42022-02-10 01:27:42 +0000563 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
564 getPrimaryDisplayId(), getDisplayWidth(),
565 getDisplayHeight(), PixelFormat::RGBA_FP16);
ramindanidcecfd42022-02-03 23:52:19 +0000566 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000567 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400568 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000569
570 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
571
ramindanidcecfd42022-02-03 23:52:19 +0000572 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700573 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000574 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
575 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800576 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400577 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000578 execute();
579
ramindanidcecfd42022-02-03 23:52:19 +0000580 auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800581 if (!changedCompositionTypes.empty()) {
Ady Abraham3192f3d2021-12-03 16:08:56 -0800582 ASSERT_EQ(1, changedCompositionTypes.size());
Ady Abraham46219f52021-12-20 09:44:31 -0800583 ASSERT_EQ(Composition::CLIENT, changedCompositionTypes[0].composition);
ramindanibab8ba92021-11-18 01:24:11 +0000584
585 PixelFormat clientFormat = PixelFormat::RGBA_8888;
Brian Lindahle887a252023-01-17 14:54:19 -0700586 auto clientUsage = static_cast<uint32_t>(
587 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN) |
588 static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
589 static_cast<uint32_t>(common::BufferUsage::COMPOSER_CLIENT_TARGET));
ramindanibab8ba92021-11-18 01:24:11 +0000590 Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
ramindanidcecfd42022-02-03 23:52:19 +0000591 common::Rect damage{0, 0, getDisplayWidth(), getDisplayHeight()};
ramindanibab8ba92021-11-18 01:24:11 +0000592
593 // create client target buffer
Brian Lindahle887a252023-01-17 14:54:19 -0700594 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(clientUsage);
595 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000596 const auto& buffer = graphicBuffer->handle;
ramindanibab8ba92021-11-18 01:24:11 +0000597 void* clientBufData;
ramindani0a2bee42022-02-10 01:27:42 +0000598 const auto stride = static_cast<uint32_t>(graphicBuffer->stride);
599 graphicBuffer->lock(clientUsage, layer->getAccessRegion(), &clientBufData);
ramindanibab8ba92021-11-18 01:24:11 +0000600
601 ASSERT_NO_FATAL_FAILURE(
ramindani0a2bee42022-02-10 01:27:42 +0000602 ReadbackHelper::fillBuffer(layer->getWidth(), layer->getHeight(), stride,
ramindanibab8ba92021-11-18 01:24:11 +0000603 clientBufData, clientFormat, expectedColors));
ramindanib1144212022-02-10 01:51:24 +0000604 int32_t clientFence;
605 const auto unlockStatus = graphicBuffer->unlockAsync(&clientFence);
606 ASSERT_EQ(::android::OK, unlockStatus);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400607 mWriter->setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, buffer, clientFence,
608 clientDataspace, std::vector<common::Rect>(1, damage));
609 layer->setToClientComposition(*mWriter);
610 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000611 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000612 changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800613 ASSERT_TRUE(changedCompositionTypes.empty());
ramindanibab8ba92021-11-18 01:24:11 +0000614 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800615 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000616
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400617 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000618 execute();
619
Ady Abraham3192f3d2021-12-03 16:08:56 -0800620 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000621
622 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
623 }
624}
625
626TEST_P(GraphicsCompositionTest, DeviceAndClientComposition) {
ramindanidcecfd42022-02-03 23:52:19 +0000627 ASSERT_TRUE(
628 mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)
629 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000630
631 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000632 EXPECT_TRUE(mComposerClient
633 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
634 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000635
ramindani44c952f2022-02-28 23:29:29 +0000636 bool isSupported;
637 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000638 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000639 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
640 return;
641 }
642
ramindanidcecfd42022-02-03 23:52:19 +0000643 std::vector<Color> expectedColors(
644 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
645 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
646 {0, 0, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
647 ReadbackHelper::fillColorsArea(
648 expectedColors, getDisplayWidth(),
649 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000650
ramindanidcecfd42022-02-03 23:52:19 +0000651 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700652 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000653 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
654
655 auto deviceLayer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000656 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
657 getDisplayHeight() / 2, PixelFormat::RGBA_8888);
ramindanibab8ba92021-11-18 01:24:11 +0000658 std::vector<Color> deviceColors(deviceLayer->getWidth() * deviceLayer->getHeight());
659 ReadbackHelper::fillColorsArea(deviceColors, static_cast<int32_t>(deviceLayer->getWidth()),
660 {0, 0, static_cast<int32_t>(deviceLayer->getWidth()),
661 static_cast<int32_t>(deviceLayer->getHeight())},
662 GREEN);
663 deviceLayer->setDisplayFrame({0, 0, static_cast<int32_t>(deviceLayer->getWidth()),
664 static_cast<int32_t>(deviceLayer->getHeight())});
665 deviceLayer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400666 deviceLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000667 ASSERT_NO_FATAL_FAILURE(deviceLayer->setBuffer(deviceColors));
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400668 deviceLayer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000669
670 PixelFormat clientFormat = PixelFormat::RGBA_8888;
Brian Lindahle887a252023-01-17 14:54:19 -0700671 auto clientUsage = static_cast<uint32_t>(
672 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
673 static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
674 static_cast<uint32_t>(common::BufferUsage::COMPOSER_CLIENT_TARGET));
ramindanibab8ba92021-11-18 01:24:11 +0000675 Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
ramindanidcecfd42022-02-03 23:52:19 +0000676 int32_t clientWidth = getDisplayWidth();
677 int32_t clientHeight = getDisplayHeight() / 2;
ramindanibab8ba92021-11-18 01:24:11 +0000678
679 auto clientLayer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000680 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), clientWidth,
681 clientHeight, PixelFormat::RGBA_FP16, Composition::DEVICE);
ramindanidcecfd42022-02-03 23:52:19 +0000682 common::Rect clientFrame = {0, getDisplayHeight() / 2, getDisplayWidth(),
683 getDisplayHeight()};
ramindanibab8ba92021-11-18 01:24:11 +0000684 clientLayer->setDisplayFrame(clientFrame);
685 clientLayer->setZOrder(0);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400686 clientLayer->write(*mWriter);
687 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000688 execute();
689
ramindanidcecfd42022-02-03 23:52:19 +0000690 auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800691 if (changedCompositionTypes.size() != 1) {
ramindanibab8ba92021-11-18 01:24:11 +0000692 continue;
693 }
694 // create client target buffer
Ady Abraham46219f52021-12-20 09:44:31 -0800695 ASSERT_EQ(Composition::CLIENT, changedCompositionTypes[0].composition);
Brian Lindahle887a252023-01-17 14:54:19 -0700696 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(clientUsage);
697 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000698 const auto& buffer = graphicBuffer->handle;
ramindanibab8ba92021-11-18 01:24:11 +0000699
700 void* clientBufData;
ramindani0a2bee42022-02-10 01:27:42 +0000701 graphicBuffer->lock(clientUsage, {0, 0, getDisplayWidth(), getDisplayHeight()},
702 &clientBufData);
ramindanibab8ba92021-11-18 01:24:11 +0000703
ramindanidcecfd42022-02-03 23:52:19 +0000704 std::vector<Color> clientColors(
705 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
706 ReadbackHelper::fillColorsArea(clientColors, getDisplayWidth(), clientFrame, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000707 ASSERT_NO_FATAL_FAILURE(ReadbackHelper::fillBuffer(
ramindanidcecfd42022-02-03 23:52:19 +0000708 static_cast<uint32_t>(getDisplayWidth()), static_cast<uint32_t>(getDisplayHeight()),
ramindani0a2bee42022-02-10 01:27:42 +0000709 graphicBuffer->getStride(), clientBufData, clientFormat, clientColors));
ramindanib1144212022-02-10 01:51:24 +0000710 int32_t clientFence;
711 const auto unlockStatus = graphicBuffer->unlockAsync(&clientFence);
712 ASSERT_EQ(::android::OK, unlockStatus);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400713 mWriter->setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, buffer, clientFence,
714 clientDataspace, std::vector<common::Rect>(1, clientFrame));
715 clientLayer->setToClientComposition(*mWriter);
716 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000717 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000718 changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800719 ASSERT_TRUE(changedCompositionTypes.empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800720 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000721
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400722 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000723 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800724 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000725 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
726 }
727}
728
729TEST_P(GraphicsCompositionTest, SetLayerDamage) {
730 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000731 EXPECT_TRUE(mComposerClient
732 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
733 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000734
ramindani44c952f2022-02-28 23:29:29 +0000735 bool isSupported;
736 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000737 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000738 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
739 return;
740 }
741
ramindanidcecfd42022-02-03 23:52:19 +0000742 common::Rect redRect = {0, 0, getDisplayWidth() / 4, getDisplayHeight() / 4};
ramindanibab8ba92021-11-18 01:24:11 +0000743
ramindanidcecfd42022-02-03 23:52:19 +0000744 std::vector<Color> expectedColors(
745 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
746 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000747
ramindani0a2bee42022-02-10 01:27:42 +0000748 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
749 getPrimaryDisplayId(), getDisplayWidth(),
750 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000751 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000752 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400753 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000754 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
755
756 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
757
ramindanidcecfd42022-02-03 23:52:19 +0000758 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700759 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000760 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
761
762 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800763 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400764 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000765 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000766 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000767 GTEST_SUCCEED();
768 return;
769 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800770 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400771 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000772 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800773 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000774
775 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
776
777 // update surface damage and recheck
ramindanidcecfd42022-02-03 23:52:19 +0000778 redRect = {getDisplayWidth() / 4, getDisplayHeight() / 4, getDisplayWidth() / 2,
779 getDisplayHeight() / 2};
780 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
781 getDisplayWidth());
782 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000783
784 ASSERT_NO_FATAL_FAILURE(layer->fillBuffer(expectedColors));
785 layer->setSurfaceDamage(
ramindanidcecfd42022-02-03 23:52:19 +0000786 std::vector<common::Rect>(1, {0, 0, getDisplayWidth() / 2, getDisplayWidth() / 2}));
ramindanibab8ba92021-11-18 01:24:11 +0000787
788 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
789
790 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800791 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400792 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000793 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800794 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcecfd42022-02-03 23:52:19 +0000795 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400796 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000797 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800798 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000799
800 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
801 }
802}
803
804TEST_P(GraphicsCompositionTest, SetLayerPlaneAlpha) {
805 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000806 EXPECT_TRUE(mComposerClient
807 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
808 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000809
ramindani44c952f2022-02-28 23:29:29 +0000810 bool isSupported;
811 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000812 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000813 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
814 return;
815 }
816
ramindanidcecfd42022-02-03 23:52:19 +0000817 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000818 layer->setColor(RED);
ramindanidcecfd42022-02-03 23:52:19 +0000819 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000820 layer->setZOrder(10);
821 layer->setAlpha(0);
822 layer->setBlendMode(BlendMode::PREMULTIPLIED);
823
824 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
825
ramindanidcecfd42022-02-03 23:52:19 +0000826 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700827 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000828
829 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
830
831 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800832 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400833 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000834 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000835 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000836 GTEST_SUCCEED();
837 return;
838 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800839 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000840
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400841 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000842 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800843 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000844
ramindanidcecfd42022-02-03 23:52:19 +0000845 std::vector<Color> expectedColors(
846 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +0000847
848 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
849 mTestRenderEngine->setRenderLayers(layers);
850 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
851 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
852 }
853}
854
855TEST_P(GraphicsCompositionTest, SetLayerSourceCrop) {
856 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000857 EXPECT_TRUE(mComposerClient
858 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
859 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000860
ramindani44c952f2022-02-28 23:29:29 +0000861 bool isSupported;
862 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000863 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000864 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
865 return;
866 }
867
ramindanidcecfd42022-02-03 23:52:19 +0000868 std::vector<Color> expectedColors(
869 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
870 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
871 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
872 ReadbackHelper::fillColorsArea(
873 expectedColors, getDisplayWidth(),
874 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000875
ramindani0a2bee42022-02-10 01:27:42 +0000876 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
877 getPrimaryDisplayId(), getDisplayWidth(),
878 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000879 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000880 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400881 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanidcecfd42022-02-03 23:52:19 +0000882 layer->setSourceCrop({0, static_cast<float>(getDisplayHeight() / 2),
883 static_cast<float>(getDisplayWidth()),
884 static_cast<float>(getDisplayHeight())});
ramindanibab8ba92021-11-18 01:24:11 +0000885 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
886
887 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
888
889 // update expected colors to match crop
ramindanidcecfd42022-02-03 23:52:19 +0000890 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
891 {0, 0, getDisplayWidth(), getDisplayHeight()}, BLUE);
892 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700893 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000894 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
895 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800896 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400897 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000898 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000899 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000900 GTEST_SUCCEED();
901 return;
902 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800903 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400904 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000905 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800906 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000907 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
908 mTestRenderEngine->setRenderLayers(layers);
909 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
910 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
911 }
912}
913
914TEST_P(GraphicsCompositionTest, SetLayerZOrder) {
915 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000916 EXPECT_TRUE(mComposerClient
917 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
918 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000919
ramindani44c952f2022-02-28 23:29:29 +0000920 bool isSupported;
921 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000922 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000923 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
924 return;
925 }
926
ramindanidcecfd42022-02-03 23:52:19 +0000927 common::Rect redRect = {0, 0, getDisplayWidth(), getDisplayHeight() / 2};
928 common::Rect blueRect = {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight()};
929 auto redLayer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000930 redLayer->setColor(RED);
931 redLayer->setDisplayFrame(redRect);
932
ramindanidcecfd42022-02-03 23:52:19 +0000933 auto blueLayer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000934 blueLayer->setColor(BLUE);
935 blueLayer->setDisplayFrame(blueRect);
936 blueLayer->setZOrder(5);
937
938 std::vector<std::shared_ptr<TestLayer>> layers = {redLayer, blueLayer};
ramindanidcecfd42022-02-03 23:52:19 +0000939 std::vector<Color> expectedColors(
940 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +0000941
942 // red in front of blue
943 redLayer->setZOrder(10);
944
945 // fill blue first so that red will overwrite on overlap
ramindanidcecfd42022-02-03 23:52:19 +0000946 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), blueRect, BLUE);
947 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000948
ramindanidcecfd42022-02-03 23:52:19 +0000949 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700950 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000951 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
952
953 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800954 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400955 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000956 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000957 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000958 GTEST_SUCCEED();
959 return;
960 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400961 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000962 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800963 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000964
965 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
966
967 redLayer->setZOrder(1);
ramindanidcecfd42022-02-03 23:52:19 +0000968 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
969 getDisplayWidth());
970 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
971 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), blueRect, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000972
973 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
974
975 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800976 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400977 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000978 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000979 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800980 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400981 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000982 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800983 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000984
985 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
986 mTestRenderEngine->setRenderLayers(layers);
987 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
988 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
989 }
990}
991
Alec Mourib1f16722022-02-07 13:03:44 -0800992TEST_P(GraphicsCompositionTest, SetLayerBrightnessDims) {
ramindanidcecfd42022-02-03 23:52:19 +0000993 const auto& [status, capabilities] =
994 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
995 ASSERT_TRUE(status.isOk());
Alec Mouri51067012022-01-06 17:28:39 -0800996
997 const bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
998 DisplayCapability::BRIGHTNESS) != capabilities.end();
999
1000 if (!brightnessSupport) {
1001 GTEST_SUCCEED() << "Cannot verify dimming behavior without brightness support";
1002 return;
1003 }
1004
1005 const std::optional<float> maxBrightnessNitsOptional =
ramindanidcecfd42022-02-03 23:52:19 +00001006 getMaxDisplayBrightnessNits(getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001007
1008 ASSERT_TRUE(maxBrightnessNitsOptional.has_value());
1009
1010 const float maxBrightnessNits = *maxBrightnessNitsOptional;
1011
1012 // Preconditions to successfully run are knowing the max brightness and successfully applying
1013 // the max brightness
1014 ASSERT_GT(maxBrightnessNits, 0.f);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001015 mWriter->setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.f, maxBrightnessNits);
Alec Mouri51067012022-01-06 17:28:39 -08001016 execute();
1017 ASSERT_TRUE(mReader.takeErrors().empty());
1018
1019 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001020 EXPECT_TRUE(mComposerClient
1021 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1022 .isOk());
Alec Mouri51067012022-01-06 17:28:39 -08001023
ramindani44c952f2022-02-28 23:29:29 +00001024 bool isSupported;
1025 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001026 if (!isSupported) {
Alec Mouri51067012022-01-06 17:28:39 -08001027 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace for "
1028 "color mode: "
1029 << toString(mode);
1030 continue;
1031 }
ramindanidcecfd42022-02-03 23:52:19 +00001032 const common::Rect redRect = {0, 0, getDisplayWidth(), getDisplayHeight() / 2};
1033 const common::Rect dimmerRedRect = {0, getDisplayHeight() / 2, getDisplayWidth(),
1034 getDisplayHeight()};
1035 const auto redLayer =
1036 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001037 redLayer->setColor(RED);
1038 redLayer->setDisplayFrame(redRect);
1039 redLayer->setWhitePointNits(maxBrightnessNits);
Alec Mourib1f16722022-02-07 13:03:44 -08001040 redLayer->setBrightness(1.f);
Alec Mouri51067012022-01-06 17:28:39 -08001041
1042 const auto dimmerRedLayer =
ramindanidcecfd42022-02-03 23:52:19 +00001043 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001044 dimmerRedLayer->setColor(RED);
1045 dimmerRedLayer->setDisplayFrame(dimmerRedRect);
1046 // Intentionally use a small dimming ratio as some implementations may be more likely to
1047 // kick into GPU composition to apply dithering when the dimming ratio is high.
1048 static constexpr float kDimmingRatio = 0.9f;
1049 dimmerRedLayer->setWhitePointNits(maxBrightnessNits * kDimmingRatio);
Alec Mourib1f16722022-02-07 13:03:44 -08001050 dimmerRedLayer->setBrightness(kDimmingRatio);
Alec Mouri51067012022-01-06 17:28:39 -08001051
1052 const std::vector<std::shared_ptr<TestLayer>> layers = {redLayer, dimmerRedLayer};
ramindanidcecfd42022-02-03 23:52:19 +00001053 std::vector<Color> expectedColors(
1054 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
Alec Mouri51067012022-01-06 17:28:39 -08001055
ramindanidcecfd42022-02-03 23:52:19 +00001056 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
1057 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), dimmerRedRect, DIM_RED);
Alec Mouri51067012022-01-06 17:28:39 -08001058
ramindanidcecfd42022-02-03 23:52:19 +00001059 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001060 getDisplayHeight(), mPixelFormat, mDataspace);
Alec Mouri51067012022-01-06 17:28:39 -08001061 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1062
1063 writeLayers(layers);
1064 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001065 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
Alec Mouri51067012022-01-06 17:28:39 -08001066 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001067 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
Alec Mouri51067012022-01-06 17:28:39 -08001068 GTEST_SUCCEED()
1069 << "Readback verification not supported for GPU composition for color mode: "
1070 << toString(mode);
1071 continue;
1072 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001073 mWriter->presentDisplay(getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001074 execute();
1075 ASSERT_TRUE(mReader.takeErrors().empty());
1076
1077 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1078 mTestRenderEngine->setRenderLayers(layers);
1079 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1080 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1081 }
1082}
1083
ramindanibab8ba92021-11-18 01:24:11 +00001084class GraphicsBlendModeCompositionTest
1085 : public GraphicsCompositionTestBase,
1086 public testing::WithParamInterface<std::tuple<std::string, std::string>> {
1087 public:
1088 void SetUp() override {
1089 SetUpBase(std::get<0>(GetParam()));
ramindanib636af22022-02-10 02:55:56 +00001090 // TODO(b/219590743) we should remove the below SRGB color mode
1091 // once we have the BlendMode test fix for all the versions of the ColorMode
ramindania4e76362022-03-02 01:48:06 +00001092 mTestColorModes.erase(
1093 std::remove_if(mTestColorModes.begin(), mTestColorModes.end(),
1094 [](ColorMode mode) { return mode != ColorMode::SRGB; }),
1095 mTestColorModes.end());
ramindanibab8ba92021-11-18 01:24:11 +00001096 mBackgroundColor = BLACK;
1097 mTopLayerColor = RED;
1098 }
1099
1100 void setBackgroundColor(Color color) { mBackgroundColor = color; }
1101
1102 void setTopLayerColor(Color color) { mTopLayerColor = color; }
1103
1104 void setUpLayers(BlendMode blendMode) {
1105 mLayers.clear();
ramindanidcecfd42022-02-03 23:52:19 +00001106 std::vector<Color> topLayerPixelColors(
1107 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1108 ReadbackHelper::fillColorsArea(topLayerPixelColors, getDisplayWidth(),
1109 {0, 0, getDisplayWidth(), getDisplayHeight()},
1110 mTopLayerColor);
ramindanibab8ba92021-11-18 01:24:11 +00001111
ramindanidcecfd42022-02-03 23:52:19 +00001112 auto backgroundLayer =
1113 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
1114 backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001115 backgroundLayer->setZOrder(0);
1116 backgroundLayer->setColor(mBackgroundColor);
1117
ramindani0a2bee42022-02-10 01:27:42 +00001118 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
1119 getPrimaryDisplayId(), getDisplayWidth(),
1120 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +00001121 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001122 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001123 layer->setDataspace(Dataspace::UNKNOWN, *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001124 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(topLayerPixelColors));
1125
1126 layer->setBlendMode(blendMode);
1127 layer->setAlpha(std::stof(std::get<1>(GetParam())));
1128
1129 mLayers.push_back(backgroundLayer);
1130 mLayers.push_back(layer);
1131 }
1132
1133 void setExpectedColors(std::vector<Color>& expectedColors) {
1134 ASSERT_EQ(2, mLayers.size());
ramindanidcecfd42022-02-03 23:52:19 +00001135 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
1136 getDisplayWidth());
ramindanibab8ba92021-11-18 01:24:11 +00001137
1138 auto layer = mLayers[1];
1139 BlendMode blendMode = layer->getBlendMode();
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001140 float alpha = mTopLayerColor.a * layer->getAlpha();
ramindanibab8ba92021-11-18 01:24:11 +00001141 if (blendMode == BlendMode::NONE) {
1142 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001143 expectedColor.r = mTopLayerColor.r * layer->getAlpha();
1144 expectedColor.g = mTopLayerColor.g * layer->getAlpha();
1145 expectedColor.b = mTopLayerColor.b * layer->getAlpha();
1146 expectedColor.a = alpha;
ramindanibab8ba92021-11-18 01:24:11 +00001147 }
1148 } else if (blendMode == BlendMode::PREMULTIPLIED) {
1149 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001150 expectedColor.r =
1151 mTopLayerColor.r * layer->getAlpha() + mBackgroundColor.r * (1.0f - alpha);
1152 expectedColor.g =
1153 mTopLayerColor.g * layer->getAlpha() + mBackgroundColor.g * (1.0f - alpha);
1154 expectedColor.b =
1155 mTopLayerColor.b * layer->getAlpha() + mBackgroundColor.b * (1.0f - alpha);
1156 expectedColor.a = alpha + mBackgroundColor.a * (1.0f - alpha);
ramindanibab8ba92021-11-18 01:24:11 +00001157 }
1158 } else if (blendMode == BlendMode::COVERAGE) {
1159 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001160 expectedColor.r = mTopLayerColor.r * alpha + mBackgroundColor.r * (1.0f - alpha);
1161 expectedColor.g = mTopLayerColor.g * alpha + mBackgroundColor.g * (1.0f - alpha);
1162 expectedColor.b = mTopLayerColor.b * alpha + mBackgroundColor.b * (1.0f - alpha);
1163 expectedColor.a = mTopLayerColor.a * alpha + mBackgroundColor.a * (1.0f - alpha);
ramindanibab8ba92021-11-18 01:24:11 +00001164 }
1165 }
1166 }
1167
1168 protected:
1169 std::vector<std::shared_ptr<TestLayer>> mLayers;
1170 Color mBackgroundColor;
1171 Color mTopLayerColor;
1172};
ramindanic7585d92022-04-15 18:30:41 +00001173
1174TEST_P(GraphicsBlendModeCompositionTest, None) {
ramindanibab8ba92021-11-18 01:24:11 +00001175 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001176 EXPECT_TRUE(mComposerClient
1177 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1178 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001179
ramindani44c952f2022-02-28 23:29:29 +00001180 bool isSupported;
1181 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001182 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001183 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1184 return;
1185 }
1186
ramindanidcecfd42022-02-03 23:52:19 +00001187 std::vector<Color> expectedColors(
1188 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001189
1190 setBackgroundColor(BLACK);
1191 setTopLayerColor(TRANSLUCENT_RED);
1192 setUpLayers(BlendMode::NONE);
1193 setExpectedColors(expectedColors);
1194
ramindanidcecfd42022-02-03 23:52:19 +00001195 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001196 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001197 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1198 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001199 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001200 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001201 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001202 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001203 GTEST_SUCCEED();
1204 return;
1205 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001206 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001207 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001208 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001209 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001210
1211 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1212 mTestRenderEngine->setRenderLayers(mLayers);
1213 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1214 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1215 }
1216}
1217
ramindani07e6f842022-02-15 15:28:33 +00001218TEST_P(GraphicsBlendModeCompositionTest, Coverage) {
ramindanibab8ba92021-11-18 01:24:11 +00001219 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001220 EXPECT_TRUE(mComposerClient
1221 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1222 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001223
ramindani44c952f2022-02-28 23:29:29 +00001224 bool isSupported;
1225 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001226 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001227 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1228 return;
1229 }
1230
ramindanidcecfd42022-02-03 23:52:19 +00001231 std::vector<Color> expectedColors(
1232 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001233
1234 setBackgroundColor(BLACK);
1235 setTopLayerColor(TRANSLUCENT_RED);
1236
1237 setUpLayers(BlendMode::COVERAGE);
1238 setExpectedColors(expectedColors);
1239
ramindanidcecfd42022-02-03 23:52:19 +00001240 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001241 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001242 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1243 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001244 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001245 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001246 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001247 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001248 GTEST_SUCCEED();
1249 return;
1250 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001251 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001252 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001253 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001254 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001255 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1256 }
1257}
1258
1259TEST_P(GraphicsBlendModeCompositionTest, Premultiplied) {
1260 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001261 EXPECT_TRUE(mComposerClient
1262 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1263 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001264
ramindani44c952f2022-02-28 23:29:29 +00001265 bool isSupported;
1266 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001267 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001268 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1269 return;
1270 }
ramindanibab8ba92021-11-18 01:24:11 +00001271
ramindanidcecfd42022-02-03 23:52:19 +00001272 std::vector<Color> expectedColors(
1273 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001274
1275 setBackgroundColor(BLACK);
1276 setTopLayerColor(TRANSLUCENT_RED);
1277 setUpLayers(BlendMode::PREMULTIPLIED);
1278 setExpectedColors(expectedColors);
1279
ramindanidcecfd42022-02-03 23:52:19 +00001280 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001281 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001282 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1283 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001284 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001285 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001286 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001287 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001288 GTEST_SUCCEED();
1289 return;
1290 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001291 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001292 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001293 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001294 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001295 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1296 mTestRenderEngine->setRenderLayers(mLayers);
1297 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1298 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1299 }
1300}
1301
1302class GraphicsTransformCompositionTest : public GraphicsCompositionTest {
1303 protected:
1304 void SetUp() override {
1305 GraphicsCompositionTest::SetUp();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001306
ramindanidcecfd42022-02-03 23:52:19 +00001307 auto backgroundLayer =
1308 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001309 backgroundLayer->setColor({0.0f, 0.0f, 0.0f, 0.0f});
ramindanidcecfd42022-02-03 23:52:19 +00001310 backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001311 backgroundLayer->setZOrder(0);
1312
ramindanidcecfd42022-02-03 23:52:19 +00001313 mSideLength =
1314 getDisplayWidth() < getDisplayHeight() ? getDisplayWidth() : getDisplayHeight();
ramindanibab8ba92021-11-18 01:24:11 +00001315 common::Rect redRect = {0, 0, mSideLength / 2, mSideLength / 2};
1316 common::Rect blueRect = {mSideLength / 2, mSideLength / 2, mSideLength, mSideLength};
1317
ramindani0a2bee42022-02-10 01:27:42 +00001318 mLayer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
1319 getPrimaryDisplayId(), mSideLength, mSideLength,
1320 PixelFormat::RGBA_8888);
ramindanibab8ba92021-11-18 01:24:11 +00001321 mLayer->setDisplayFrame({0, 0, mSideLength, mSideLength});
1322 mLayer->setZOrder(10);
1323
1324 std::vector<Color> baseColors(static_cast<size_t>(mSideLength * mSideLength));
1325 ReadbackHelper::fillColorsArea(baseColors, mSideLength, redRect, RED);
1326 ReadbackHelper::fillColorsArea(baseColors, mSideLength, blueRect, BLUE);
1327 ASSERT_NO_FATAL_FAILURE(mLayer->setBuffer(baseColors));
1328 mLayers = {backgroundLayer, mLayer};
1329 }
1330
1331 protected:
1332 std::shared_ptr<TestBufferLayer> mLayer;
1333 std::vector<std::shared_ptr<TestLayer>> mLayers;
1334 int mSideLength;
1335};
1336
1337TEST_P(GraphicsTransformCompositionTest, FLIP_H) {
1338 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001339 auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), mode,
1340 RenderIntent::COLORIMETRIC);
ramindanid5751092022-04-22 22:30:20 +00001341 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
ramindanidcecfd42022-02-03 23:52:19 +00001342 (status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED ||
1343 status.getServiceSpecificError() == IComposerClient::EX_BAD_PARAMETER)) {
ramindanibab8ba92021-11-18 01:24:11 +00001344 SUCCEED() << "ColorMode not supported, skip test";
1345 return;
1346 }
1347
ramindani44c952f2022-02-28 23:29:29 +00001348 bool isSupported;
1349 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001350 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001351 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1352 return;
1353 }
ramindanidcecfd42022-02-03 23:52:19 +00001354 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001355 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001356 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1357 mLayer->setTransform(Transform::FLIP_H);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001358 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001359
ramindanidcecfd42022-02-03 23:52:19 +00001360 std::vector<Color> expectedColors(
1361 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1362 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001363 {mSideLength / 2, 0, mSideLength, mSideLength / 2}, RED);
ramindanidcecfd42022-02-03 23:52:19 +00001364 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001365 {0, mSideLength / 2, mSideLength / 2, mSideLength}, BLUE);
1366
1367 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001368 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001369 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001370 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001371 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001372 GTEST_SUCCEED();
1373 return;
1374 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001375 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001376 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001377 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001378 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001379
1380 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1381 mTestRenderEngine->setRenderLayers(mLayers);
1382 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1383 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1384 }
1385}
1386
1387TEST_P(GraphicsTransformCompositionTest, FLIP_V) {
1388 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001389 EXPECT_TRUE(mComposerClient
1390 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1391 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001392
ramindani44c952f2022-02-28 23:29:29 +00001393 bool isSupported;
1394 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001395 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001396 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1397 return;
1398 }
ramindanidcecfd42022-02-03 23:52:19 +00001399 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001400 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001401 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1402
1403 mLayer->setTransform(Transform::FLIP_V);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001404 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001405
ramindanidcecfd42022-02-03 23:52:19 +00001406 std::vector<Color> expectedColors(
1407 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1408 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001409 {0, mSideLength / 2, mSideLength / 2, mSideLength}, RED);
ramindanidcecfd42022-02-03 23:52:19 +00001410 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001411 {mSideLength / 2, 0, mSideLength, mSideLength / 2}, BLUE);
1412
1413 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001414 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001415 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001416 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001417 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001418 GTEST_SUCCEED();
1419 return;
1420 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001421 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001422 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001423 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001424 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001425 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1426 mTestRenderEngine->setRenderLayers(mLayers);
1427 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1428 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1429 }
1430}
1431
1432TEST_P(GraphicsTransformCompositionTest, ROT_180) {
1433 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001434 EXPECT_TRUE(mComposerClient
1435 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1436 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001437
ramindani44c952f2022-02-28 23:29:29 +00001438 bool isSupported;
1439 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001440 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001441 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1442 return;
1443 }
ramindanidcecfd42022-02-03 23:52:19 +00001444 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001445 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001446 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1447
1448 mLayer->setTransform(Transform::ROT_180);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001449 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001450
ramindanidcecfd42022-02-03 23:52:19 +00001451 std::vector<Color> expectedColors(
1452 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1453 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001454 {mSideLength / 2, mSideLength / 2, mSideLength, mSideLength},
1455 RED);
ramindanidcecfd42022-02-03 23:52:19 +00001456 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001457 {0, 0, mSideLength / 2, mSideLength / 2}, BLUE);
1458
1459 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001460 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001461 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001462 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001463 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001464 GTEST_SUCCEED();
1465 return;
1466 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001467 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001468 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001469 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001470 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001471 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1472 mTestRenderEngine->setRenderLayers(mLayers);
1473 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1474 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1475 }
1476}
1477
1478GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsCompositionTest);
1479INSTANTIATE_TEST_SUITE_P(
1480 PerInstance, GraphicsCompositionTest,
1481 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
1482 ::android::PrintInstanceNameToString);
1483
1484GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsBlendModeCompositionTest);
1485INSTANTIATE_TEST_SUITE_P(BlendMode, GraphicsBlendModeCompositionTest,
1486 testing::Combine(testing::ValuesIn(::android::getAidlHalInstanceNames(
1487 IComposer::descriptor)),
1488 testing::Values("0.2", "1.0")));
1489
1490GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsTransformCompositionTest);
1491INSTANTIATE_TEST_SUITE_P(
1492 PerInstance, GraphicsTransformCompositionTest,
1493 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
1494 ::android::PrintInstanceNameToString);
1495
1496} // namespace
Ady Abraham3192f3d2021-12-03 16:08:56 -08001497} // namespace aidl::android::hardware::graphics::composer3::vts