blob: b0472209dc2ab80413abe61f74d3b258cafc0a82 [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 uint64_t getStableDisplayId(int64_t display) {
ramindanidcecfd42022-02-03 23:52:19 +0000133 const auto& [status, identification] =
134 mComposerClient->getDisplayIdentificationData(display);
135 EXPECT_TRUE(status.isOk());
Alec Mouri51067012022-01-06 17:28:39 -0800136
137 if (const auto info = ::android::parseDisplayIdentificationData(
138 static_cast<uint8_t>(identification.port), identification.data)) {
139 return info->id.value;
140 }
141
142 return ::android::PhysicalDisplayId::fromPort(static_cast<uint8_t>(identification.port))
143 .value;
144 }
145
146 // Gets the per-display XML config
147 std::unique_ptr<tinyxml2::XMLDocument> getDisplayConfigXml(int64_t display) {
148 std::stringstream pathBuilder;
149 pathBuilder << "/vendor/etc/displayconfig/display_id_" << getStableDisplayId(display)
150 << ".xml";
151 const std::string path = pathBuilder.str();
152 auto document = std::make_unique<tinyxml2::XMLDocument>();
153 const tinyxml2::XMLError error = document->LoadFile(path.c_str());
154 if (error == tinyxml2::XML_SUCCESS) {
155 return document;
156 } else {
157 return nullptr;
158 }
159 }
160
161 // Gets the max display brightness for this display.
162 // If the display config xml does not exist, then assume that the display is not well-configured
163 // enough to provide a display brightness, so return nullopt.
164 std::optional<float> getMaxDisplayBrightnessNits(int64_t display) {
165 const auto document = getDisplayConfigXml(display);
166 if (!document) {
167 // Assume the device doesn't support display brightness
168 return std::nullopt;
169 }
170
171 const auto root = document->RootElement();
172 if (!root) {
173 // If there's somehow no root element, then this isn't a valid config
174 return std::nullopt;
175 }
176
177 const auto screenBrightnessMap = root->FirstChildElement("screenBrightnessMap");
178 if (!screenBrightnessMap) {
179 // A valid display config must have a screen brightness map
180 return std::nullopt;
181 }
182
183 auto point = screenBrightnessMap->FirstChildElement("point");
184 float maxNits = -1.f;
185 while (point != nullptr) {
186 const auto nits = point->FirstChildElement("nits");
187 if (nits) {
188 maxNits = std::max(maxNits, nits->FloatText(-1.f));
189 }
190 point = point->NextSiblingElement("point");
191 }
192
193 if (maxNits < 0.f) {
194 // If we got here, then there were no point elements containing a nit value, so this
195 // config isn't valid
196 return std::nullopt;
197 }
198
199 return maxNits;
200 }
201
ramindanibab8ba92021-11-18 01:24:11 +0000202 void writeLayers(const std::vector<std::shared_ptr<TestLayer>>& layers) {
ramindanidcecfd42022-02-03 23:52:19 +0000203 for (const auto& layer : layers) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400204 layer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000205 }
206 execute();
207 }
208
209 void execute() {
Huihong Luo651806f2023-04-21 18:48:48 +0000210 auto commands = mWriter->takePendingCommands();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800211 if (commands.empty()) {
Ady Abraham3192f3d2021-12-03 16:08:56 -0800212 return;
ramindanibab8ba92021-11-18 01:24:11 +0000213 }
214
ramindanidcecfd42022-02-03 23:52:19 +0000215 auto [status, results] = mComposerClient->executeCommands(commands);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800216 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
ramindanibab8ba92021-11-18 01:24:11 +0000217
Ady Abraham46219f52021-12-20 09:44:31 -0800218 mReader.parse(std::move(results));
ramindanibab8ba92021-11-18 01:24:11 +0000219 }
220
ramindani44c952f2022-02-28 23:29:29 +0000221 bool getHasReadbackBuffer() {
ramindanidcecfd42022-02-03 23:52:19 +0000222 auto [status, readBackBufferAttributes] =
223 mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
224 if (status.isOk()) {
225 mPixelFormat = readBackBufferAttributes.format;
226 mDataspace = readBackBufferAttributes.dataspace;
ramindani44c952f2022-02-28 23:29:29 +0000227 return ReadbackHelper::readbackSupported(mPixelFormat, mDataspace);
ramindanidcecfd42022-02-03 23:52:19 +0000228 }
ramindanid5751092022-04-22 22:30:20 +0000229 EXPECT_NO_FATAL_FAILURE(
230 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani44c952f2022-02-28 23:29:29 +0000231 return false;
ramindanib27f33b2021-12-03 19:36:10 +0000232 }
233
ramindanidcecfd42022-02-03 23:52:19 +0000234 std::shared_ptr<VtsComposerClient> mComposerClient;
235 std::vector<VtsDisplay> mDisplays;
236 // use the slot count usually set by SF
ramindanibab8ba92021-11-18 01:24:11 +0000237 std::vector<ColorMode> mTestColorModes;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400238 std::unique_ptr<ComposerClientWriter> mWriter;
Ady Abraham91c9d1a2021-12-15 18:14:45 -0800239 ComposerClientReader mReader;
ramindanibab8ba92021-11-18 01:24:11 +0000240 std::unique_ptr<TestRenderEngine> mTestRenderEngine;
ramindanibab8ba92021-11-18 01:24:11 +0000241 common::PixelFormat mPixelFormat;
242 common::Dataspace mDataspace;
243
244 static constexpr uint32_t kClientTargetSlotCount = 64;
245
246 private:
ramindanibab8ba92021-11-18 01:24:11 +0000247 void setTestColorModes() {
248 mTestColorModes.clear();
ramindanidcecfd42022-02-03 23:52:19 +0000249 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
250 ASSERT_TRUE(status.isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000251
252 for (ColorMode mode : modes) {
253 if (std::find(ReadbackHelper::colorModes.begin(), ReadbackHelper::colorModes.end(),
254 mode) != ReadbackHelper::colorModes.end()) {
255 mTestColorModes.push_back(mode);
256 }
257 }
258 }
259};
260
261class GraphicsCompositionTest : public GraphicsCompositionTestBase,
262 public testing::WithParamInterface<std::string> {
263 public:
264 void SetUp() override { SetUpBase(GetParam()); }
265};
266
267TEST_P(GraphicsCompositionTest, SingleSolidColorLayer) {
268 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000269 EXPECT_TRUE(mComposerClient
270 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
271 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000272
ramindani44c952f2022-02-28 23:29:29 +0000273 bool isSupported;
274 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000275 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000276 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
277 return;
278 }
279
ramindanidcecfd42022-02-03 23:52:19 +0000280 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
281 common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000282 layer->setColor(BLUE);
283 layer->setDisplayFrame(coloredSquare);
284 layer->setZOrder(10);
285
286 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
287
288 // expected color for each pixel
ramindanidcecfd42022-02-03 23:52:19 +0000289 std::vector<Color> expectedColors(
290 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
291 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), coloredSquare, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000292
ramindanidcecfd42022-02-03 23:52:19 +0000293 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700294 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000295 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
296
297 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800298 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400299 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000300 execute();
301 // if hwc cannot handle and asks for composition change,
302 // just succeed the test
ramindanidcecfd42022-02-03 23:52:19 +0000303 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000304 GTEST_SUCCEED();
305 return;
306 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800307 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400308 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000309 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800310 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000311
312 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
313 mTestRenderEngine->setRenderLayers(layers);
314 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
315 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
316 }
317}
318
319TEST_P(GraphicsCompositionTest, SetLayerBuffer) {
320 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000321 EXPECT_TRUE(mComposerClient
322 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
323 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000324
ramindani44c952f2022-02-28 23:29:29 +0000325 bool isSupported;
326 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000327 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000328 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
329 return;
330 }
331
ramindanidcecfd42022-02-03 23:52:19 +0000332 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700333 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000334 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000335 std::vector<Color> expectedColors(
336 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
337 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
338 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
339 ReadbackHelper::fillColorsArea(
340 expectedColors, getDisplayWidth(),
341 {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
342 ReadbackHelper::fillColorsArea(
343 expectedColors, getDisplayWidth(),
344 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000345
346 auto layer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000347 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
348 getDisplayHeight(), common::PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000349 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000350 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400351 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000352 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
353
354 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
355
356 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800357 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400358 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000359 execute();
360
ramindanidcecfd42022-02-03 23:52:19 +0000361 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000362 GTEST_SUCCEED();
363 return;
364 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800365 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000366
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400367 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000368 execute();
369
Ady Abraham3192f3d2021-12-03 16:08:56 -0800370 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000371
372 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
373 mTestRenderEngine->setRenderLayers(layers);
374 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
375 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
376 }
377}
378
379TEST_P(GraphicsCompositionTest, SetLayerBufferNoEffect) {
380 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000381 EXPECT_TRUE(mComposerClient
382 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
383 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000384
ramindani44c952f2022-02-28 23:29:29 +0000385 bool isSupported;
386 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000387 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000388 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
389 return;
390 }
391
ramindanidcecfd42022-02-03 23:52:19 +0000392 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
393 common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000394 layer->setColor(BLUE);
395 layer->setDisplayFrame(coloredSquare);
396 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400397 layer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000398
399 // This following buffer call should have no effect
Brian Lindahle887a252023-01-17 14:54:19 -0700400 const auto usage = static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
401 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN);
402 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(usage);
403 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000404 const auto& buffer = graphicBuffer->handle;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400405 mWriter->setLayerBuffer(getPrimaryDisplayId(), layer->getLayer(), /*slot*/ 0, buffer,
406 /*acquireFence*/ -1);
ramindanibab8ba92021-11-18 01:24:11 +0000407
408 // expected color for each pixel
ramindanidcecfd42022-02-03 23:52:19 +0000409 std::vector<Color> expectedColors(
410 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
411 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), coloredSquare, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000412
ramindanidcecfd42022-02-03 23:52:19 +0000413 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700414 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000415 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
416
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400417 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000418 execute();
419
ramindanidcecfd42022-02-03 23:52:19 +0000420 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000421 GTEST_SUCCEED();
422 return;
423 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800424 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400425 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000426 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800427 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000428
429 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
430 }
431}
432
ramindanib27f33b2021-12-03 19:36:10 +0000433TEST_P(GraphicsCompositionTest, SetReadbackBuffer) {
ramindani44c952f2022-02-28 23:29:29 +0000434 bool isSupported;
435 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000436 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000437 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
438 return;
439 }
440
ramindanidcecfd42022-02-03 23:52:19 +0000441 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700442 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanib27f33b2021-12-03 19:36:10 +0000443
444 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
445}
446
ramindanidcecfd42022-02-03 23:52:19 +0000447TEST_P(GraphicsCompositionTest, SetReadbackBuffer_BadDisplay) {
ramindani44c952f2022-02-28 23:29:29 +0000448 bool isSupported;
449 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000450 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000451 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
452 return;
453 }
454
Brian Lindahle887a252023-01-17 14:54:19 -0700455 const auto usage = static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
456 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN);
457 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(usage);
458 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000459 const auto& bufferHandle = graphicBuffer->handle;
ramindanib27f33b2021-12-03 19:36:10 +0000460 ::ndk::ScopedFileDescriptor fence = ::ndk::ScopedFileDescriptor(-1);
461
ramindanidcecfd42022-02-03 23:52:19 +0000462 const auto status =
463 mComposerClient->setReadbackBuffer(getInvalidDisplayId(), bufferHandle, fence);
ramindanib27f33b2021-12-03 19:36:10 +0000464
ramindanidcecfd42022-02-03 23:52:19 +0000465 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000466 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanib27f33b2021-12-03 19:36:10 +0000467}
468
ramindanidcecfd42022-02-03 23:52:19 +0000469TEST_P(GraphicsCompositionTest, SetReadbackBuffer_BadParameter) {
ramindani44c952f2022-02-28 23:29:29 +0000470 bool isSupported;
471 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000472 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000473 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
474 return;
475 }
476
ramindanidcecfd42022-02-03 23:52:19 +0000477 const native_handle_t bufferHandle{};
ramindanib27f33b2021-12-03 19:36:10 +0000478 ndk::ScopedFileDescriptor releaseFence = ndk::ScopedFileDescriptor(-1);
ramindanidcecfd42022-02-03 23:52:19 +0000479 const auto status =
480 mComposerClient->setReadbackBuffer(getPrimaryDisplayId(), &bufferHandle, releaseFence);
ramindanib27f33b2021-12-03 19:36:10 +0000481
ramindanidcecfd42022-02-03 23:52:19 +0000482 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000483 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanib27f33b2021-12-03 19:36:10 +0000484}
485
486TEST_P(GraphicsCompositionTest, GetReadbackBufferFenceInactive) {
ramindani44c952f2022-02-28 23:29:29 +0000487 bool isSupported;
488 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000489 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000490 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
491 return;
492 }
493
ramindanidcecfd42022-02-03 23:52:19 +0000494 const auto& [status, releaseFence] =
495 mComposerClient->getReadbackBufferFence(getPrimaryDisplayId());
ramindanib27f33b2021-12-03 19:36:10 +0000496
ramindanidcecfd42022-02-03 23:52:19 +0000497 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000498 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Alec Mouri62ae37b2022-01-20 17:16:38 -0800499 EXPECT_EQ(-1, releaseFence.get());
ramindanib27f33b2021-12-03 19:36:10 +0000500}
501
ramindanibab8ba92021-11-18 01:24:11 +0000502TEST_P(GraphicsCompositionTest, ClientComposition) {
ramindanidcecfd42022-02-03 23:52:19 +0000503 EXPECT_TRUE(
504 mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)
505 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000506
507 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000508 EXPECT_TRUE(mComposerClient
509 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
ramindanibab8ba92021-11-18 01:24:11 +0000510 .isOk());
511
ramindani44c952f2022-02-28 23:29:29 +0000512 bool isSupported;
513 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000514 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000515 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
516 return;
517 }
518
ramindanidcecfd42022-02-03 23:52:19 +0000519 std::vector<Color> expectedColors(
520 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
521 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
522 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
523 ReadbackHelper::fillColorsArea(
524 expectedColors, getDisplayWidth(),
525 {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
526 ReadbackHelper::fillColorsArea(
527 expectedColors, getDisplayWidth(),
528 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000529
ramindani0a2bee42022-02-10 01:27:42 +0000530 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
531 getPrimaryDisplayId(), getDisplayWidth(),
532 getDisplayHeight(), PixelFormat::RGBA_FP16);
ramindanidcecfd42022-02-03 23:52:19 +0000533 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000534 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400535 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000536
537 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
538
ramindanidcecfd42022-02-03 23:52:19 +0000539 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700540 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000541 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
542 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800543 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400544 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000545 execute();
546
ramindanidcecfd42022-02-03 23:52:19 +0000547 auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800548 if (!changedCompositionTypes.empty()) {
Ady Abraham3192f3d2021-12-03 16:08:56 -0800549 ASSERT_EQ(1, changedCompositionTypes.size());
Ady Abraham46219f52021-12-20 09:44:31 -0800550 ASSERT_EQ(Composition::CLIENT, changedCompositionTypes[0].composition);
ramindanibab8ba92021-11-18 01:24:11 +0000551
552 PixelFormat clientFormat = PixelFormat::RGBA_8888;
Brian Lindahle887a252023-01-17 14:54:19 -0700553 auto clientUsage = static_cast<uint32_t>(
554 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN) |
555 static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
556 static_cast<uint32_t>(common::BufferUsage::COMPOSER_CLIENT_TARGET));
ramindanibab8ba92021-11-18 01:24:11 +0000557 Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
ramindanidcecfd42022-02-03 23:52:19 +0000558 common::Rect damage{0, 0, getDisplayWidth(), getDisplayHeight()};
ramindanibab8ba92021-11-18 01:24:11 +0000559
560 // create client target buffer
Brian Lindahle887a252023-01-17 14:54:19 -0700561 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(clientUsage);
562 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000563 const auto& buffer = graphicBuffer->handle;
ramindanibab8ba92021-11-18 01:24:11 +0000564 void* clientBufData;
ramindani0a2bee42022-02-10 01:27:42 +0000565 const auto stride = static_cast<uint32_t>(graphicBuffer->stride);
566 graphicBuffer->lock(clientUsage, layer->getAccessRegion(), &clientBufData);
ramindanibab8ba92021-11-18 01:24:11 +0000567
568 ASSERT_NO_FATAL_FAILURE(
ramindani0a2bee42022-02-10 01:27:42 +0000569 ReadbackHelper::fillBuffer(layer->getWidth(), layer->getHeight(), stride,
ramindanibab8ba92021-11-18 01:24:11 +0000570 clientBufData, clientFormat, expectedColors));
ramindanib1144212022-02-10 01:51:24 +0000571 int32_t clientFence;
572 const auto unlockStatus = graphicBuffer->unlockAsync(&clientFence);
573 ASSERT_EQ(::android::OK, unlockStatus);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400574 mWriter->setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, buffer, clientFence,
575 clientDataspace, std::vector<common::Rect>(1, damage));
576 layer->setToClientComposition(*mWriter);
577 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000578 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000579 changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800580 ASSERT_TRUE(changedCompositionTypes.empty());
ramindanibab8ba92021-11-18 01:24:11 +0000581 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800582 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000583
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400584 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000585 execute();
586
Ady Abraham3192f3d2021-12-03 16:08:56 -0800587 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000588
589 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
590 }
591}
592
593TEST_P(GraphicsCompositionTest, DeviceAndClientComposition) {
ramindanidcecfd42022-02-03 23:52:19 +0000594 ASSERT_TRUE(
595 mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)
596 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000597
598 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000599 EXPECT_TRUE(mComposerClient
600 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
601 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000602
ramindani44c952f2022-02-28 23:29:29 +0000603 bool isSupported;
604 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000605 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000606 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
607 return;
608 }
609
ramindanidcecfd42022-02-03 23:52:19 +0000610 std::vector<Color> expectedColors(
611 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
612 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
613 {0, 0, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
614 ReadbackHelper::fillColorsArea(
615 expectedColors, getDisplayWidth(),
616 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000617
ramindanidcecfd42022-02-03 23:52:19 +0000618 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700619 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000620 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
621
622 auto deviceLayer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000623 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
624 getDisplayHeight() / 2, PixelFormat::RGBA_8888);
ramindanibab8ba92021-11-18 01:24:11 +0000625 std::vector<Color> deviceColors(deviceLayer->getWidth() * deviceLayer->getHeight());
626 ReadbackHelper::fillColorsArea(deviceColors, static_cast<int32_t>(deviceLayer->getWidth()),
627 {0, 0, static_cast<int32_t>(deviceLayer->getWidth()),
628 static_cast<int32_t>(deviceLayer->getHeight())},
629 GREEN);
630 deviceLayer->setDisplayFrame({0, 0, static_cast<int32_t>(deviceLayer->getWidth()),
631 static_cast<int32_t>(deviceLayer->getHeight())});
632 deviceLayer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400633 deviceLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000634 ASSERT_NO_FATAL_FAILURE(deviceLayer->setBuffer(deviceColors));
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400635 deviceLayer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000636
637 PixelFormat clientFormat = PixelFormat::RGBA_8888;
Brian Lindahle887a252023-01-17 14:54:19 -0700638 auto clientUsage = static_cast<uint32_t>(
639 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
640 static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
641 static_cast<uint32_t>(common::BufferUsage::COMPOSER_CLIENT_TARGET));
ramindanibab8ba92021-11-18 01:24:11 +0000642 Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
ramindanidcecfd42022-02-03 23:52:19 +0000643 int32_t clientWidth = getDisplayWidth();
644 int32_t clientHeight = getDisplayHeight() / 2;
ramindanibab8ba92021-11-18 01:24:11 +0000645
646 auto clientLayer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000647 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), clientWidth,
648 clientHeight, PixelFormat::RGBA_FP16, Composition::DEVICE);
ramindanidcecfd42022-02-03 23:52:19 +0000649 common::Rect clientFrame = {0, getDisplayHeight() / 2, getDisplayWidth(),
650 getDisplayHeight()};
ramindanibab8ba92021-11-18 01:24:11 +0000651 clientLayer->setDisplayFrame(clientFrame);
652 clientLayer->setZOrder(0);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400653 clientLayer->write(*mWriter);
654 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000655 execute();
656
ramindanidcecfd42022-02-03 23:52:19 +0000657 auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800658 if (changedCompositionTypes.size() != 1) {
ramindanibab8ba92021-11-18 01:24:11 +0000659 continue;
660 }
661 // create client target buffer
Ady Abraham46219f52021-12-20 09:44:31 -0800662 ASSERT_EQ(Composition::CLIENT, changedCompositionTypes[0].composition);
Brian Lindahle887a252023-01-17 14:54:19 -0700663 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(clientUsage);
664 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000665 const auto& buffer = graphicBuffer->handle;
ramindanibab8ba92021-11-18 01:24:11 +0000666
667 void* clientBufData;
ramindani0a2bee42022-02-10 01:27:42 +0000668 graphicBuffer->lock(clientUsage, {0, 0, getDisplayWidth(), getDisplayHeight()},
669 &clientBufData);
ramindanibab8ba92021-11-18 01:24:11 +0000670
ramindanidcecfd42022-02-03 23:52:19 +0000671 std::vector<Color> clientColors(
672 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
673 ReadbackHelper::fillColorsArea(clientColors, getDisplayWidth(), clientFrame, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000674 ASSERT_NO_FATAL_FAILURE(ReadbackHelper::fillBuffer(
ramindanidcecfd42022-02-03 23:52:19 +0000675 static_cast<uint32_t>(getDisplayWidth()), static_cast<uint32_t>(getDisplayHeight()),
ramindani0a2bee42022-02-10 01:27:42 +0000676 graphicBuffer->getStride(), clientBufData, clientFormat, clientColors));
ramindanib1144212022-02-10 01:51:24 +0000677 int32_t clientFence;
678 const auto unlockStatus = graphicBuffer->unlockAsync(&clientFence);
679 ASSERT_EQ(::android::OK, unlockStatus);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400680 mWriter->setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, buffer, clientFence,
681 clientDataspace, std::vector<common::Rect>(1, clientFrame));
682 clientLayer->setToClientComposition(*mWriter);
683 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000684 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000685 changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800686 ASSERT_TRUE(changedCompositionTypes.empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800687 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000688
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400689 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000690 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800691 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000692 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
693 }
694}
695
696TEST_P(GraphicsCompositionTest, SetLayerDamage) {
697 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000698 EXPECT_TRUE(mComposerClient
699 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
700 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000701
ramindani44c952f2022-02-28 23:29:29 +0000702 bool isSupported;
703 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000704 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000705 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
706 return;
707 }
708
ramindanidcecfd42022-02-03 23:52:19 +0000709 common::Rect redRect = {0, 0, getDisplayWidth() / 4, getDisplayHeight() / 4};
ramindanibab8ba92021-11-18 01:24:11 +0000710
ramindanidcecfd42022-02-03 23:52:19 +0000711 std::vector<Color> expectedColors(
712 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
713 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000714
ramindani0a2bee42022-02-10 01:27:42 +0000715 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
716 getPrimaryDisplayId(), getDisplayWidth(),
717 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000718 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000719 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400720 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000721 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
722
723 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
724
ramindanidcecfd42022-02-03 23:52:19 +0000725 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700726 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000727 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
728
729 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800730 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400731 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000732 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000733 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000734 GTEST_SUCCEED();
735 return;
736 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800737 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400738 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000739 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800740 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000741
742 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
743
744 // update surface damage and recheck
ramindanidcecfd42022-02-03 23:52:19 +0000745 redRect = {getDisplayWidth() / 4, getDisplayHeight() / 4, getDisplayWidth() / 2,
746 getDisplayHeight() / 2};
747 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
748 getDisplayWidth());
749 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000750
751 ASSERT_NO_FATAL_FAILURE(layer->fillBuffer(expectedColors));
752 layer->setSurfaceDamage(
ramindanidcecfd42022-02-03 23:52:19 +0000753 std::vector<common::Rect>(1, {0, 0, getDisplayWidth() / 2, getDisplayWidth() / 2}));
ramindanibab8ba92021-11-18 01:24:11 +0000754
755 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
756
757 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800758 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400759 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000760 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800761 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcecfd42022-02-03 23:52:19 +0000762 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400763 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000764 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800765 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000766
767 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
768 }
769}
770
771TEST_P(GraphicsCompositionTest, SetLayerPlaneAlpha) {
772 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000773 EXPECT_TRUE(mComposerClient
774 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
775 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000776
ramindani44c952f2022-02-28 23:29:29 +0000777 bool isSupported;
778 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000779 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000780 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
781 return;
782 }
783
ramindanidcecfd42022-02-03 23:52:19 +0000784 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000785 layer->setColor(RED);
ramindanidcecfd42022-02-03 23:52:19 +0000786 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000787 layer->setZOrder(10);
788 layer->setAlpha(0);
789 layer->setBlendMode(BlendMode::PREMULTIPLIED);
790
791 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
792
ramindanidcecfd42022-02-03 23:52:19 +0000793 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700794 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000795
796 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
797
798 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800799 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400800 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000801 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000802 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000803 GTEST_SUCCEED();
804 return;
805 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800806 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000807
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400808 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000809 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800810 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000811
ramindanidcecfd42022-02-03 23:52:19 +0000812 std::vector<Color> expectedColors(
813 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +0000814
815 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
816 mTestRenderEngine->setRenderLayers(layers);
817 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
818 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
819 }
820}
821
822TEST_P(GraphicsCompositionTest, SetLayerSourceCrop) {
823 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000824 EXPECT_TRUE(mComposerClient
825 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
826 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000827
ramindani44c952f2022-02-28 23:29:29 +0000828 bool isSupported;
829 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000830 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000831 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
832 return;
833 }
834
ramindanidcecfd42022-02-03 23:52:19 +0000835 std::vector<Color> expectedColors(
836 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
837 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
838 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
839 ReadbackHelper::fillColorsArea(
840 expectedColors, getDisplayWidth(),
841 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000842
ramindani0a2bee42022-02-10 01:27:42 +0000843 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
844 getPrimaryDisplayId(), getDisplayWidth(),
845 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000846 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000847 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400848 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanidcecfd42022-02-03 23:52:19 +0000849 layer->setSourceCrop({0, static_cast<float>(getDisplayHeight() / 2),
850 static_cast<float>(getDisplayWidth()),
851 static_cast<float>(getDisplayHeight())});
ramindanibab8ba92021-11-18 01:24:11 +0000852 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
853
854 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
855
856 // update expected colors to match crop
ramindanidcecfd42022-02-03 23:52:19 +0000857 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
858 {0, 0, getDisplayWidth(), getDisplayHeight()}, BLUE);
859 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700860 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000861 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
862 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800863 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400864 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000865 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000866 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000867 GTEST_SUCCEED();
868 return;
869 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800870 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400871 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000872 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800873 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000874 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
875 mTestRenderEngine->setRenderLayers(layers);
876 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
877 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
878 }
879}
880
881TEST_P(GraphicsCompositionTest, SetLayerZOrder) {
882 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000883 EXPECT_TRUE(mComposerClient
884 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
885 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000886
ramindani44c952f2022-02-28 23:29:29 +0000887 bool isSupported;
888 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000889 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000890 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
891 return;
892 }
893
ramindanidcecfd42022-02-03 23:52:19 +0000894 common::Rect redRect = {0, 0, getDisplayWidth(), getDisplayHeight() / 2};
895 common::Rect blueRect = {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight()};
896 auto redLayer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000897 redLayer->setColor(RED);
898 redLayer->setDisplayFrame(redRect);
899
ramindanidcecfd42022-02-03 23:52:19 +0000900 auto blueLayer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000901 blueLayer->setColor(BLUE);
902 blueLayer->setDisplayFrame(blueRect);
903 blueLayer->setZOrder(5);
904
905 std::vector<std::shared_ptr<TestLayer>> layers = {redLayer, blueLayer};
ramindanidcecfd42022-02-03 23:52:19 +0000906 std::vector<Color> expectedColors(
907 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +0000908
909 // red in front of blue
910 redLayer->setZOrder(10);
911
912 // fill blue first so that red will overwrite on overlap
ramindanidcecfd42022-02-03 23:52:19 +0000913 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), blueRect, BLUE);
914 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000915
ramindanidcecfd42022-02-03 23:52:19 +0000916 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700917 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000918 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
919
920 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800921 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400922 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000923 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000924 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000925 GTEST_SUCCEED();
926 return;
927 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400928 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000929 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800930 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000931
932 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
933
934 redLayer->setZOrder(1);
ramindanidcecfd42022-02-03 23:52:19 +0000935 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
936 getDisplayWidth());
937 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
938 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), blueRect, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000939
940 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
941
942 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800943 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400944 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000945 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000946 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800947 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400948 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000949 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800950 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000951
952 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
953 mTestRenderEngine->setRenderLayers(layers);
954 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
955 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
956 }
957}
958
Alec Mourib1f16722022-02-07 13:03:44 -0800959TEST_P(GraphicsCompositionTest, SetLayerBrightnessDims) {
ramindanidcecfd42022-02-03 23:52:19 +0000960 const auto& [status, capabilities] =
961 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
962 ASSERT_TRUE(status.isOk());
Alec Mouri51067012022-01-06 17:28:39 -0800963
964 const bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
965 DisplayCapability::BRIGHTNESS) != capabilities.end();
966
967 if (!brightnessSupport) {
968 GTEST_SUCCEED() << "Cannot verify dimming behavior without brightness support";
969 return;
970 }
971
972 const std::optional<float> maxBrightnessNitsOptional =
ramindanidcecfd42022-02-03 23:52:19 +0000973 getMaxDisplayBrightnessNits(getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -0800974
975 ASSERT_TRUE(maxBrightnessNitsOptional.has_value());
976
977 const float maxBrightnessNits = *maxBrightnessNitsOptional;
978
979 // Preconditions to successfully run are knowing the max brightness and successfully applying
980 // the max brightness
981 ASSERT_GT(maxBrightnessNits, 0.f);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400982 mWriter->setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.f, maxBrightnessNits);
Alec Mouri51067012022-01-06 17:28:39 -0800983 execute();
984 ASSERT_TRUE(mReader.takeErrors().empty());
985
986 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000987 EXPECT_TRUE(mComposerClient
988 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
989 .isOk());
Alec Mouri51067012022-01-06 17:28:39 -0800990
ramindani44c952f2022-02-28 23:29:29 +0000991 bool isSupported;
992 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000993 if (!isSupported) {
Alec Mouri51067012022-01-06 17:28:39 -0800994 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace for "
995 "color mode: "
996 << toString(mode);
997 continue;
998 }
ramindanidcecfd42022-02-03 23:52:19 +0000999 const common::Rect redRect = {0, 0, getDisplayWidth(), getDisplayHeight() / 2};
1000 const common::Rect dimmerRedRect = {0, getDisplayHeight() / 2, getDisplayWidth(),
1001 getDisplayHeight()};
1002 const auto redLayer =
1003 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001004 redLayer->setColor(RED);
1005 redLayer->setDisplayFrame(redRect);
1006 redLayer->setWhitePointNits(maxBrightnessNits);
Alec Mourib1f16722022-02-07 13:03:44 -08001007 redLayer->setBrightness(1.f);
Alec Mouri51067012022-01-06 17:28:39 -08001008
1009 const auto dimmerRedLayer =
ramindanidcecfd42022-02-03 23:52:19 +00001010 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001011 dimmerRedLayer->setColor(RED);
1012 dimmerRedLayer->setDisplayFrame(dimmerRedRect);
1013 // Intentionally use a small dimming ratio as some implementations may be more likely to
1014 // kick into GPU composition to apply dithering when the dimming ratio is high.
1015 static constexpr float kDimmingRatio = 0.9f;
1016 dimmerRedLayer->setWhitePointNits(maxBrightnessNits * kDimmingRatio);
Alec Mourib1f16722022-02-07 13:03:44 -08001017 dimmerRedLayer->setBrightness(kDimmingRatio);
Alec Mouri51067012022-01-06 17:28:39 -08001018
1019 const std::vector<std::shared_ptr<TestLayer>> layers = {redLayer, dimmerRedLayer};
ramindanidcecfd42022-02-03 23:52:19 +00001020 std::vector<Color> expectedColors(
1021 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
Alec Mouri51067012022-01-06 17:28:39 -08001022
ramindanidcecfd42022-02-03 23:52:19 +00001023 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
1024 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), dimmerRedRect, DIM_RED);
Alec Mouri51067012022-01-06 17:28:39 -08001025
ramindanidcecfd42022-02-03 23:52:19 +00001026 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001027 getDisplayHeight(), mPixelFormat, mDataspace);
Alec Mouri51067012022-01-06 17:28:39 -08001028 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1029
1030 writeLayers(layers);
1031 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001032 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
Alec Mouri51067012022-01-06 17:28:39 -08001033 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001034 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
Alec Mouri51067012022-01-06 17:28:39 -08001035 GTEST_SUCCEED()
1036 << "Readback verification not supported for GPU composition for color mode: "
1037 << toString(mode);
1038 continue;
1039 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001040 mWriter->presentDisplay(getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001041 execute();
1042 ASSERT_TRUE(mReader.takeErrors().empty());
1043
1044 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1045 mTestRenderEngine->setRenderLayers(layers);
1046 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1047 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1048 }
1049}
1050
ramindanibab8ba92021-11-18 01:24:11 +00001051class GraphicsBlendModeCompositionTest
1052 : public GraphicsCompositionTestBase,
1053 public testing::WithParamInterface<std::tuple<std::string, std::string>> {
1054 public:
1055 void SetUp() override {
1056 SetUpBase(std::get<0>(GetParam()));
ramindanib636af22022-02-10 02:55:56 +00001057 // TODO(b/219590743) we should remove the below SRGB color mode
1058 // once we have the BlendMode test fix for all the versions of the ColorMode
ramindania4e76362022-03-02 01:48:06 +00001059 mTestColorModes.erase(
1060 std::remove_if(mTestColorModes.begin(), mTestColorModes.end(),
1061 [](ColorMode mode) { return mode != ColorMode::SRGB; }),
1062 mTestColorModes.end());
ramindanibab8ba92021-11-18 01:24:11 +00001063 mBackgroundColor = BLACK;
1064 mTopLayerColor = RED;
1065 }
1066
1067 void setBackgroundColor(Color color) { mBackgroundColor = color; }
1068
1069 void setTopLayerColor(Color color) { mTopLayerColor = color; }
1070
1071 void setUpLayers(BlendMode blendMode) {
1072 mLayers.clear();
ramindanidcecfd42022-02-03 23:52:19 +00001073 std::vector<Color> topLayerPixelColors(
1074 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1075 ReadbackHelper::fillColorsArea(topLayerPixelColors, getDisplayWidth(),
1076 {0, 0, getDisplayWidth(), getDisplayHeight()},
1077 mTopLayerColor);
ramindanibab8ba92021-11-18 01:24:11 +00001078
ramindanidcecfd42022-02-03 23:52:19 +00001079 auto backgroundLayer =
1080 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
1081 backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001082 backgroundLayer->setZOrder(0);
1083 backgroundLayer->setColor(mBackgroundColor);
1084
ramindani0a2bee42022-02-10 01:27:42 +00001085 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
1086 getPrimaryDisplayId(), getDisplayWidth(),
1087 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +00001088 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001089 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001090 layer->setDataspace(Dataspace::UNKNOWN, *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001091 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(topLayerPixelColors));
1092
1093 layer->setBlendMode(blendMode);
1094 layer->setAlpha(std::stof(std::get<1>(GetParam())));
1095
1096 mLayers.push_back(backgroundLayer);
1097 mLayers.push_back(layer);
1098 }
1099
1100 void setExpectedColors(std::vector<Color>& expectedColors) {
1101 ASSERT_EQ(2, mLayers.size());
ramindanidcecfd42022-02-03 23:52:19 +00001102 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
1103 getDisplayWidth());
ramindanibab8ba92021-11-18 01:24:11 +00001104
1105 auto layer = mLayers[1];
1106 BlendMode blendMode = layer->getBlendMode();
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001107 float alpha = mTopLayerColor.a * layer->getAlpha();
ramindanibab8ba92021-11-18 01:24:11 +00001108 if (blendMode == BlendMode::NONE) {
1109 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001110 expectedColor.r = mTopLayerColor.r * layer->getAlpha();
1111 expectedColor.g = mTopLayerColor.g * layer->getAlpha();
1112 expectedColor.b = mTopLayerColor.b * layer->getAlpha();
1113 expectedColor.a = alpha;
ramindanibab8ba92021-11-18 01:24:11 +00001114 }
1115 } else if (blendMode == BlendMode::PREMULTIPLIED) {
1116 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001117 expectedColor.r =
1118 mTopLayerColor.r * layer->getAlpha() + mBackgroundColor.r * (1.0f - alpha);
1119 expectedColor.g =
1120 mTopLayerColor.g * layer->getAlpha() + mBackgroundColor.g * (1.0f - alpha);
1121 expectedColor.b =
1122 mTopLayerColor.b * layer->getAlpha() + mBackgroundColor.b * (1.0f - alpha);
1123 expectedColor.a = alpha + mBackgroundColor.a * (1.0f - alpha);
ramindanibab8ba92021-11-18 01:24:11 +00001124 }
1125 } else if (blendMode == BlendMode::COVERAGE) {
1126 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001127 expectedColor.r = mTopLayerColor.r * alpha + mBackgroundColor.r * (1.0f - alpha);
1128 expectedColor.g = mTopLayerColor.g * alpha + mBackgroundColor.g * (1.0f - alpha);
1129 expectedColor.b = mTopLayerColor.b * alpha + mBackgroundColor.b * (1.0f - alpha);
1130 expectedColor.a = mTopLayerColor.a * alpha + mBackgroundColor.a * (1.0f - alpha);
ramindanibab8ba92021-11-18 01:24:11 +00001131 }
1132 }
1133 }
1134
1135 protected:
1136 std::vector<std::shared_ptr<TestLayer>> mLayers;
1137 Color mBackgroundColor;
1138 Color mTopLayerColor;
1139};
ramindanic7585d92022-04-15 18:30:41 +00001140
1141TEST_P(GraphicsBlendModeCompositionTest, None) {
ramindanibab8ba92021-11-18 01:24:11 +00001142 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001143 EXPECT_TRUE(mComposerClient
1144 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1145 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001146
ramindani44c952f2022-02-28 23:29:29 +00001147 bool isSupported;
1148 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001149 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001150 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1151 return;
1152 }
1153
ramindanidcecfd42022-02-03 23:52:19 +00001154 std::vector<Color> expectedColors(
1155 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001156
1157 setBackgroundColor(BLACK);
1158 setTopLayerColor(TRANSLUCENT_RED);
1159 setUpLayers(BlendMode::NONE);
1160 setExpectedColors(expectedColors);
1161
ramindanidcecfd42022-02-03 23:52:19 +00001162 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001163 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001164 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1165 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001166 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001167 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001168 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001169 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001170 GTEST_SUCCEED();
1171 return;
1172 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001173 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001174 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001175 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001176 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001177
1178 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1179 mTestRenderEngine->setRenderLayers(mLayers);
1180 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1181 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1182 }
1183}
1184
ramindani07e6f842022-02-15 15:28:33 +00001185TEST_P(GraphicsBlendModeCompositionTest, Coverage) {
ramindanibab8ba92021-11-18 01:24:11 +00001186 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001187 EXPECT_TRUE(mComposerClient
1188 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1189 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001190
ramindani44c952f2022-02-28 23:29:29 +00001191 bool isSupported;
1192 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001193 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001194 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1195 return;
1196 }
1197
ramindanidcecfd42022-02-03 23:52:19 +00001198 std::vector<Color> expectedColors(
1199 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001200
1201 setBackgroundColor(BLACK);
1202 setTopLayerColor(TRANSLUCENT_RED);
1203
1204 setUpLayers(BlendMode::COVERAGE);
1205 setExpectedColors(expectedColors);
1206
ramindanidcecfd42022-02-03 23:52:19 +00001207 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001208 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001209 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1210 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001211 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001212 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001213 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001214 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001215 GTEST_SUCCEED();
1216 return;
1217 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001218 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001219 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001220 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001221 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001222 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1223 }
1224}
1225
1226TEST_P(GraphicsBlendModeCompositionTest, Premultiplied) {
1227 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001228 EXPECT_TRUE(mComposerClient
1229 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1230 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001231
ramindani44c952f2022-02-28 23:29:29 +00001232 bool isSupported;
1233 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001234 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001235 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1236 return;
1237 }
ramindanibab8ba92021-11-18 01:24:11 +00001238
ramindanidcecfd42022-02-03 23:52:19 +00001239 std::vector<Color> expectedColors(
1240 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001241
1242 setBackgroundColor(BLACK);
1243 setTopLayerColor(TRANSLUCENT_RED);
1244 setUpLayers(BlendMode::PREMULTIPLIED);
1245 setExpectedColors(expectedColors);
1246
ramindanidcecfd42022-02-03 23:52:19 +00001247 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001248 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001249 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1250 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001251 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001252 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001253 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001254 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001255 GTEST_SUCCEED();
1256 return;
1257 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001258 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001259 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001260 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001261 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001262 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1263 mTestRenderEngine->setRenderLayers(mLayers);
1264 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1265 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1266 }
1267}
1268
1269class GraphicsTransformCompositionTest : public GraphicsCompositionTest {
1270 protected:
1271 void SetUp() override {
1272 GraphicsCompositionTest::SetUp();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001273
ramindanidcecfd42022-02-03 23:52:19 +00001274 auto backgroundLayer =
1275 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001276 backgroundLayer->setColor({0.0f, 0.0f, 0.0f, 0.0f});
ramindanidcecfd42022-02-03 23:52:19 +00001277 backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001278 backgroundLayer->setZOrder(0);
1279
ramindanidcecfd42022-02-03 23:52:19 +00001280 mSideLength =
1281 getDisplayWidth() < getDisplayHeight() ? getDisplayWidth() : getDisplayHeight();
ramindanibab8ba92021-11-18 01:24:11 +00001282 common::Rect redRect = {0, 0, mSideLength / 2, mSideLength / 2};
1283 common::Rect blueRect = {mSideLength / 2, mSideLength / 2, mSideLength, mSideLength};
1284
ramindani0a2bee42022-02-10 01:27:42 +00001285 mLayer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
1286 getPrimaryDisplayId(), mSideLength, mSideLength,
1287 PixelFormat::RGBA_8888);
ramindanibab8ba92021-11-18 01:24:11 +00001288 mLayer->setDisplayFrame({0, 0, mSideLength, mSideLength});
1289 mLayer->setZOrder(10);
1290
1291 std::vector<Color> baseColors(static_cast<size_t>(mSideLength * mSideLength));
1292 ReadbackHelper::fillColorsArea(baseColors, mSideLength, redRect, RED);
1293 ReadbackHelper::fillColorsArea(baseColors, mSideLength, blueRect, BLUE);
1294 ASSERT_NO_FATAL_FAILURE(mLayer->setBuffer(baseColors));
1295 mLayers = {backgroundLayer, mLayer};
1296 }
1297
1298 protected:
1299 std::shared_ptr<TestBufferLayer> mLayer;
1300 std::vector<std::shared_ptr<TestLayer>> mLayers;
1301 int mSideLength;
1302};
1303
1304TEST_P(GraphicsTransformCompositionTest, FLIP_H) {
1305 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001306 auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), mode,
1307 RenderIntent::COLORIMETRIC);
ramindanid5751092022-04-22 22:30:20 +00001308 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
ramindanidcecfd42022-02-03 23:52:19 +00001309 (status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED ||
1310 status.getServiceSpecificError() == IComposerClient::EX_BAD_PARAMETER)) {
ramindanibab8ba92021-11-18 01:24:11 +00001311 SUCCEED() << "ColorMode not supported, skip test";
1312 return;
1313 }
1314
ramindani44c952f2022-02-28 23:29:29 +00001315 bool isSupported;
1316 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001317 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001318 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1319 return;
1320 }
ramindanidcecfd42022-02-03 23:52:19 +00001321 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001322 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001323 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1324 mLayer->setTransform(Transform::FLIP_H);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001325 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001326
ramindanidcecfd42022-02-03 23:52:19 +00001327 std::vector<Color> expectedColors(
1328 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1329 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001330 {mSideLength / 2, 0, mSideLength, mSideLength / 2}, RED);
ramindanidcecfd42022-02-03 23:52:19 +00001331 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001332 {0, mSideLength / 2, mSideLength / 2, mSideLength}, BLUE);
1333
1334 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001335 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001336 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001337 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001338 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001339 GTEST_SUCCEED();
1340 return;
1341 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001342 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001343 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001344 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001345 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001346
1347 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1348 mTestRenderEngine->setRenderLayers(mLayers);
1349 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1350 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1351 }
1352}
1353
1354TEST_P(GraphicsTransformCompositionTest, FLIP_V) {
1355 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001356 EXPECT_TRUE(mComposerClient
1357 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1358 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001359
ramindani44c952f2022-02-28 23:29:29 +00001360 bool isSupported;
1361 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001362 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001363 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1364 return;
1365 }
ramindanidcecfd42022-02-03 23:52:19 +00001366 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001367 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001368 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1369
1370 mLayer->setTransform(Transform::FLIP_V);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001371 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001372
ramindanidcecfd42022-02-03 23:52:19 +00001373 std::vector<Color> expectedColors(
1374 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1375 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001376 {0, mSideLength / 2, mSideLength / 2, mSideLength}, RED);
ramindanidcecfd42022-02-03 23:52:19 +00001377 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001378 {mSideLength / 2, 0, mSideLength, mSideLength / 2}, BLUE);
1379
1380 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001381 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001382 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001383 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001384 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001385 GTEST_SUCCEED();
1386 return;
1387 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001388 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001389 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001390 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001391 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001392 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1393 mTestRenderEngine->setRenderLayers(mLayers);
1394 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1395 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1396 }
1397}
1398
1399TEST_P(GraphicsTransformCompositionTest, ROT_180) {
1400 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001401 EXPECT_TRUE(mComposerClient
1402 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1403 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001404
ramindani44c952f2022-02-28 23:29:29 +00001405 bool isSupported;
1406 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001407 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001408 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1409 return;
1410 }
ramindanidcecfd42022-02-03 23:52:19 +00001411 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001412 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001413 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1414
1415 mLayer->setTransform(Transform::ROT_180);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001416 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001417
ramindanidcecfd42022-02-03 23:52:19 +00001418 std::vector<Color> expectedColors(
1419 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1420 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001421 {mSideLength / 2, mSideLength / 2, mSideLength, mSideLength},
1422 RED);
ramindanidcecfd42022-02-03 23:52:19 +00001423 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001424 {0, 0, mSideLength / 2, mSideLength / 2}, BLUE);
1425
1426 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001427 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001428 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001429 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001430 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001431 GTEST_SUCCEED();
1432 return;
1433 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001434 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001435 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001436 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001437 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001438 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1439 mTestRenderEngine->setRenderLayers(mLayers);
1440 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1441 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1442 }
1443}
1444
1445GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsCompositionTest);
1446INSTANTIATE_TEST_SUITE_P(
1447 PerInstance, GraphicsCompositionTest,
1448 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
1449 ::android::PrintInstanceNameToString);
1450
1451GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsBlendModeCompositionTest);
1452INSTANTIATE_TEST_SUITE_P(BlendMode, GraphicsBlendModeCompositionTest,
1453 testing::Combine(testing::ValuesIn(::android::getAidlHalInstanceNames(
1454 IComposer::descriptor)),
1455 testing::Values("0.2", "1.0")));
1456
1457GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsTransformCompositionTest);
1458INSTANTIATE_TEST_SUITE_P(
1459 PerInstance, GraphicsTransformCompositionTest,
1460 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
1461 ::android::PrintInstanceNameToString);
1462
1463} // namespace
Ady Abraham3192f3d2021-12-03 16:08:56 -08001464} // namespace aidl::android::hardware::graphics::composer3::vts