blob: 6fa33927f08b0c1eb9991194f9fea306b50629a6 [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() {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400210 const auto& commands = mWriter->getPendingCommands();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800211 if (commands.empty()) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400212 mWriter->reset();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800213 return;
ramindanibab8ba92021-11-18 01:24:11 +0000214 }
215
ramindanidcecfd42022-02-03 23:52:19 +0000216 auto [status, results] = mComposerClient->executeCommands(commands);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800217 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
ramindanibab8ba92021-11-18 01:24:11 +0000218
Ady Abraham46219f52021-12-20 09:44:31 -0800219 mReader.parse(std::move(results));
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400220 mWriter->reset();
ramindanibab8ba92021-11-18 01:24:11 +0000221 }
222
ramindani44c952f2022-02-28 23:29:29 +0000223 bool getHasReadbackBuffer() {
ramindanidcecfd42022-02-03 23:52:19 +0000224 auto [status, readBackBufferAttributes] =
225 mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
226 if (status.isOk()) {
227 mPixelFormat = readBackBufferAttributes.format;
228 mDataspace = readBackBufferAttributes.dataspace;
ramindani44c952f2022-02-28 23:29:29 +0000229 return ReadbackHelper::readbackSupported(mPixelFormat, mDataspace);
ramindanidcecfd42022-02-03 23:52:19 +0000230 }
ramindanid5751092022-04-22 22:30:20 +0000231 EXPECT_NO_FATAL_FAILURE(
232 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani44c952f2022-02-28 23:29:29 +0000233 return false;
ramindanib27f33b2021-12-03 19:36:10 +0000234 }
235
ramindanidcecfd42022-02-03 23:52:19 +0000236 std::shared_ptr<VtsComposerClient> mComposerClient;
237 std::vector<VtsDisplay> mDisplays;
238 // use the slot count usually set by SF
ramindanibab8ba92021-11-18 01:24:11 +0000239 std::vector<ColorMode> mTestColorModes;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400240 std::unique_ptr<ComposerClientWriter> mWriter;
Ady Abraham91c9d1a2021-12-15 18:14:45 -0800241 ComposerClientReader mReader;
ramindanibab8ba92021-11-18 01:24:11 +0000242 std::unique_ptr<TestRenderEngine> mTestRenderEngine;
ramindanibab8ba92021-11-18 01:24:11 +0000243 common::PixelFormat mPixelFormat;
244 common::Dataspace mDataspace;
245
246 static constexpr uint32_t kClientTargetSlotCount = 64;
247
248 private:
ramindanibab8ba92021-11-18 01:24:11 +0000249 void setTestColorModes() {
250 mTestColorModes.clear();
ramindanidcecfd42022-02-03 23:52:19 +0000251 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
252 ASSERT_TRUE(status.isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000253
254 for (ColorMode mode : modes) {
255 if (std::find(ReadbackHelper::colorModes.begin(), ReadbackHelper::colorModes.end(),
256 mode) != ReadbackHelper::colorModes.end()) {
257 mTestColorModes.push_back(mode);
258 }
259 }
260 }
261};
262
263class GraphicsCompositionTest : public GraphicsCompositionTestBase,
264 public testing::WithParamInterface<std::string> {
265 public:
266 void SetUp() override { SetUpBase(GetParam()); }
267};
268
269TEST_P(GraphicsCompositionTest, SingleSolidColorLayer) {
270 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000271 EXPECT_TRUE(mComposerClient
272 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
273 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000274
ramindani44c952f2022-02-28 23:29:29 +0000275 bool isSupported;
276 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000277 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000278 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
279 return;
280 }
281
ramindanidcecfd42022-02-03 23:52:19 +0000282 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
283 common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000284 layer->setColor(BLUE);
285 layer->setDisplayFrame(coloredSquare);
286 layer->setZOrder(10);
287
288 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
289
290 // expected color for each pixel
ramindanidcecfd42022-02-03 23:52:19 +0000291 std::vector<Color> expectedColors(
292 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
293 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), coloredSquare, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000294
ramindanidcecfd42022-02-03 23:52:19 +0000295 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700296 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000297 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
298
299 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800300 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400301 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000302 execute();
303 // if hwc cannot handle and asks for composition change,
304 // just succeed the test
ramindanidcecfd42022-02-03 23:52:19 +0000305 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000306 GTEST_SUCCEED();
307 return;
308 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800309 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400310 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000311 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800312 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000313
314 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
315 mTestRenderEngine->setRenderLayers(layers);
316 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
317 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
318 }
319}
320
321TEST_P(GraphicsCompositionTest, SetLayerBuffer) {
322 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000323 EXPECT_TRUE(mComposerClient
324 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
325 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000326
ramindani44c952f2022-02-28 23:29:29 +0000327 bool isSupported;
328 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000329 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000330 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
331 return;
332 }
333
ramindanidcecfd42022-02-03 23:52:19 +0000334 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700335 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000336 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000337 std::vector<Color> expectedColors(
338 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
339 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
340 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
341 ReadbackHelper::fillColorsArea(
342 expectedColors, getDisplayWidth(),
343 {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
344 ReadbackHelper::fillColorsArea(
345 expectedColors, getDisplayWidth(),
346 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000347
348 auto layer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000349 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
350 getDisplayHeight(), common::PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000351 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000352 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400353 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000354 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
355
356 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
357
358 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800359 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400360 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000361 execute();
362
ramindanidcecfd42022-02-03 23:52:19 +0000363 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000364 GTEST_SUCCEED();
365 return;
366 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800367 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000368
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400369 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000370 execute();
371
Ady Abraham3192f3d2021-12-03 16:08:56 -0800372 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000373
374 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
375 mTestRenderEngine->setRenderLayers(layers);
376 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
377 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
378 }
379}
380
381TEST_P(GraphicsCompositionTest, SetLayerBufferNoEffect) {
382 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000383 EXPECT_TRUE(mComposerClient
384 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
385 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000386
ramindani44c952f2022-02-28 23:29:29 +0000387 bool isSupported;
388 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000389 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000390 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
391 return;
392 }
393
ramindanidcecfd42022-02-03 23:52:19 +0000394 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
395 common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000396 layer->setColor(BLUE);
397 layer->setDisplayFrame(coloredSquare);
398 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400399 layer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000400
401 // This following buffer call should have no effect
Brian Lindahle887a252023-01-17 14:54:19 -0700402 const auto usage = static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
403 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN);
404 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(usage);
405 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000406 const auto& buffer = graphicBuffer->handle;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400407 mWriter->setLayerBuffer(getPrimaryDisplayId(), layer->getLayer(), /*slot*/ 0, buffer,
408 /*acquireFence*/ -1);
ramindanibab8ba92021-11-18 01:24:11 +0000409
410 // expected color for each pixel
ramindanidcecfd42022-02-03 23:52:19 +0000411 std::vector<Color> expectedColors(
412 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
413 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), coloredSquare, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000414
ramindanidcecfd42022-02-03 23:52:19 +0000415 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700416 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000417 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
418
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400419 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000420 execute();
421
ramindanidcecfd42022-02-03 23:52:19 +0000422 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000423 GTEST_SUCCEED();
424 return;
425 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800426 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400427 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000428 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800429 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000430
431 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
432 }
433}
434
ramindanib27f33b2021-12-03 19:36:10 +0000435TEST_P(GraphicsCompositionTest, SetReadbackBuffer) {
ramindani44c952f2022-02-28 23:29:29 +0000436 bool isSupported;
437 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000438 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000439 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
440 return;
441 }
442
ramindanidcecfd42022-02-03 23:52:19 +0000443 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700444 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanib27f33b2021-12-03 19:36:10 +0000445
446 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
447}
448
ramindanidcecfd42022-02-03 23:52:19 +0000449TEST_P(GraphicsCompositionTest, SetReadbackBuffer_BadDisplay) {
ramindani44c952f2022-02-28 23:29:29 +0000450 bool isSupported;
451 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000452 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000453 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
454 return;
455 }
456
Brian Lindahle887a252023-01-17 14:54:19 -0700457 const auto usage = static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
458 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN);
459 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(usage);
460 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000461 const auto& bufferHandle = graphicBuffer->handle;
ramindanib27f33b2021-12-03 19:36:10 +0000462 ::ndk::ScopedFileDescriptor fence = ::ndk::ScopedFileDescriptor(-1);
463
ramindanidcecfd42022-02-03 23:52:19 +0000464 const auto status =
465 mComposerClient->setReadbackBuffer(getInvalidDisplayId(), bufferHandle, fence);
ramindanib27f33b2021-12-03 19:36:10 +0000466
ramindanidcecfd42022-02-03 23:52:19 +0000467 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000468 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanib27f33b2021-12-03 19:36:10 +0000469}
470
ramindanidcecfd42022-02-03 23:52:19 +0000471TEST_P(GraphicsCompositionTest, SetReadbackBuffer_BadParameter) {
ramindani44c952f2022-02-28 23:29:29 +0000472 bool isSupported;
473 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000474 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000475 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
476 return;
477 }
478
ramindanidcecfd42022-02-03 23:52:19 +0000479 const native_handle_t bufferHandle{};
ramindanib27f33b2021-12-03 19:36:10 +0000480 ndk::ScopedFileDescriptor releaseFence = ndk::ScopedFileDescriptor(-1);
ramindanidcecfd42022-02-03 23:52:19 +0000481 const auto status =
482 mComposerClient->setReadbackBuffer(getPrimaryDisplayId(), &bufferHandle, releaseFence);
ramindanib27f33b2021-12-03 19:36:10 +0000483
ramindanidcecfd42022-02-03 23:52:19 +0000484 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000485 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanib27f33b2021-12-03 19:36:10 +0000486}
487
488TEST_P(GraphicsCompositionTest, GetReadbackBufferFenceInactive) {
ramindani44c952f2022-02-28 23:29:29 +0000489 bool isSupported;
490 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000491 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000492 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
493 return;
494 }
495
ramindanidcecfd42022-02-03 23:52:19 +0000496 const auto& [status, releaseFence] =
497 mComposerClient->getReadbackBufferFence(getPrimaryDisplayId());
ramindanib27f33b2021-12-03 19:36:10 +0000498
ramindanidcecfd42022-02-03 23:52:19 +0000499 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000500 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Alec Mouri62ae37b2022-01-20 17:16:38 -0800501 EXPECT_EQ(-1, releaseFence.get());
ramindanib27f33b2021-12-03 19:36:10 +0000502}
503
ramindanibab8ba92021-11-18 01:24:11 +0000504TEST_P(GraphicsCompositionTest, ClientComposition) {
ramindanidcecfd42022-02-03 23:52:19 +0000505 EXPECT_TRUE(
506 mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)
507 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000508
509 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000510 EXPECT_TRUE(mComposerClient
511 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
ramindanibab8ba92021-11-18 01:24:11 +0000512 .isOk());
513
ramindani44c952f2022-02-28 23:29:29 +0000514 bool isSupported;
515 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000516 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000517 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
518 return;
519 }
520
ramindanidcecfd42022-02-03 23:52:19 +0000521 std::vector<Color> expectedColors(
522 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
523 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
524 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
525 ReadbackHelper::fillColorsArea(
526 expectedColors, getDisplayWidth(),
527 {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
528 ReadbackHelper::fillColorsArea(
529 expectedColors, getDisplayWidth(),
530 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000531
ramindani0a2bee42022-02-10 01:27:42 +0000532 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
533 getPrimaryDisplayId(), getDisplayWidth(),
534 getDisplayHeight(), PixelFormat::RGBA_FP16);
ramindanidcecfd42022-02-03 23:52:19 +0000535 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000536 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400537 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000538
539 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
540
ramindanidcecfd42022-02-03 23:52:19 +0000541 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700542 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000543 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
544 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800545 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400546 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000547 execute();
548
ramindanidcecfd42022-02-03 23:52:19 +0000549 auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800550 if (!changedCompositionTypes.empty()) {
Ady Abraham3192f3d2021-12-03 16:08:56 -0800551 ASSERT_EQ(1, changedCompositionTypes.size());
Ady Abraham46219f52021-12-20 09:44:31 -0800552 ASSERT_EQ(Composition::CLIENT, changedCompositionTypes[0].composition);
ramindanibab8ba92021-11-18 01:24:11 +0000553
554 PixelFormat clientFormat = PixelFormat::RGBA_8888;
Brian Lindahle887a252023-01-17 14:54:19 -0700555 auto clientUsage = static_cast<uint32_t>(
556 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN) |
557 static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
558 static_cast<uint32_t>(common::BufferUsage::COMPOSER_CLIENT_TARGET));
ramindanibab8ba92021-11-18 01:24:11 +0000559 Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
ramindanidcecfd42022-02-03 23:52:19 +0000560 common::Rect damage{0, 0, getDisplayWidth(), getDisplayHeight()};
ramindanibab8ba92021-11-18 01:24:11 +0000561
562 // create client target buffer
Brian Lindahle887a252023-01-17 14:54:19 -0700563 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(clientUsage);
564 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000565 const auto& buffer = graphicBuffer->handle;
ramindanibab8ba92021-11-18 01:24:11 +0000566 void* clientBufData;
ramindani0a2bee42022-02-10 01:27:42 +0000567 const auto stride = static_cast<uint32_t>(graphicBuffer->stride);
568 graphicBuffer->lock(clientUsage, layer->getAccessRegion(), &clientBufData);
ramindanibab8ba92021-11-18 01:24:11 +0000569
570 ASSERT_NO_FATAL_FAILURE(
ramindani0a2bee42022-02-10 01:27:42 +0000571 ReadbackHelper::fillBuffer(layer->getWidth(), layer->getHeight(), stride,
ramindanibab8ba92021-11-18 01:24:11 +0000572 clientBufData, clientFormat, expectedColors));
ramindanib1144212022-02-10 01:51:24 +0000573 int32_t clientFence;
574 const auto unlockStatus = graphicBuffer->unlockAsync(&clientFence);
575 ASSERT_EQ(::android::OK, unlockStatus);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400576 mWriter->setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, buffer, clientFence,
577 clientDataspace, std::vector<common::Rect>(1, damage));
578 layer->setToClientComposition(*mWriter);
579 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000580 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000581 changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800582 ASSERT_TRUE(changedCompositionTypes.empty());
ramindanibab8ba92021-11-18 01:24:11 +0000583 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800584 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000585
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400586 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000587 execute();
588
Ady Abraham3192f3d2021-12-03 16:08:56 -0800589 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000590
591 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
592 }
593}
594
595TEST_P(GraphicsCompositionTest, DeviceAndClientComposition) {
ramindanidcecfd42022-02-03 23:52:19 +0000596 ASSERT_TRUE(
597 mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)
598 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000599
600 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000601 EXPECT_TRUE(mComposerClient
602 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
603 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000604
ramindani44c952f2022-02-28 23:29:29 +0000605 bool isSupported;
606 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000607 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000608 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
609 return;
610 }
611
ramindanidcecfd42022-02-03 23:52:19 +0000612 std::vector<Color> expectedColors(
613 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
614 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
615 {0, 0, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
616 ReadbackHelper::fillColorsArea(
617 expectedColors, getDisplayWidth(),
618 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000619
ramindanidcecfd42022-02-03 23:52:19 +0000620 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700621 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000622 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
623
624 auto deviceLayer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000625 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
626 getDisplayHeight() / 2, PixelFormat::RGBA_8888);
ramindanibab8ba92021-11-18 01:24:11 +0000627 std::vector<Color> deviceColors(deviceLayer->getWidth() * deviceLayer->getHeight());
628 ReadbackHelper::fillColorsArea(deviceColors, static_cast<int32_t>(deviceLayer->getWidth()),
629 {0, 0, static_cast<int32_t>(deviceLayer->getWidth()),
630 static_cast<int32_t>(deviceLayer->getHeight())},
631 GREEN);
632 deviceLayer->setDisplayFrame({0, 0, static_cast<int32_t>(deviceLayer->getWidth()),
633 static_cast<int32_t>(deviceLayer->getHeight())});
634 deviceLayer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400635 deviceLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000636 ASSERT_NO_FATAL_FAILURE(deviceLayer->setBuffer(deviceColors));
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400637 deviceLayer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000638
639 PixelFormat clientFormat = PixelFormat::RGBA_8888;
Brian Lindahle887a252023-01-17 14:54:19 -0700640 auto clientUsage = static_cast<uint32_t>(
641 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
642 static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
643 static_cast<uint32_t>(common::BufferUsage::COMPOSER_CLIENT_TARGET));
ramindanibab8ba92021-11-18 01:24:11 +0000644 Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
ramindanidcecfd42022-02-03 23:52:19 +0000645 int32_t clientWidth = getDisplayWidth();
646 int32_t clientHeight = getDisplayHeight() / 2;
ramindanibab8ba92021-11-18 01:24:11 +0000647
648 auto clientLayer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000649 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), clientWidth,
650 clientHeight, PixelFormat::RGBA_FP16, Composition::DEVICE);
ramindanidcecfd42022-02-03 23:52:19 +0000651 common::Rect clientFrame = {0, getDisplayHeight() / 2, getDisplayWidth(),
652 getDisplayHeight()};
ramindanibab8ba92021-11-18 01:24:11 +0000653 clientLayer->setDisplayFrame(clientFrame);
654 clientLayer->setZOrder(0);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400655 clientLayer->write(*mWriter);
656 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000657 execute();
658
ramindanidcecfd42022-02-03 23:52:19 +0000659 auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800660 if (changedCompositionTypes.size() != 1) {
ramindanibab8ba92021-11-18 01:24:11 +0000661 continue;
662 }
663 // create client target buffer
Ady Abraham46219f52021-12-20 09:44:31 -0800664 ASSERT_EQ(Composition::CLIENT, changedCompositionTypes[0].composition);
Brian Lindahle887a252023-01-17 14:54:19 -0700665 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(clientUsage);
666 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000667 const auto& buffer = graphicBuffer->handle;
ramindanibab8ba92021-11-18 01:24:11 +0000668
669 void* clientBufData;
ramindani0a2bee42022-02-10 01:27:42 +0000670 graphicBuffer->lock(clientUsage, {0, 0, getDisplayWidth(), getDisplayHeight()},
671 &clientBufData);
ramindanibab8ba92021-11-18 01:24:11 +0000672
ramindanidcecfd42022-02-03 23:52:19 +0000673 std::vector<Color> clientColors(
674 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
675 ReadbackHelper::fillColorsArea(clientColors, getDisplayWidth(), clientFrame, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000676 ASSERT_NO_FATAL_FAILURE(ReadbackHelper::fillBuffer(
ramindanidcecfd42022-02-03 23:52:19 +0000677 static_cast<uint32_t>(getDisplayWidth()), static_cast<uint32_t>(getDisplayHeight()),
ramindani0a2bee42022-02-10 01:27:42 +0000678 graphicBuffer->getStride(), clientBufData, clientFormat, clientColors));
ramindanib1144212022-02-10 01:51:24 +0000679 int32_t clientFence;
680 const auto unlockStatus = graphicBuffer->unlockAsync(&clientFence);
681 ASSERT_EQ(::android::OK, unlockStatus);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400682 mWriter->setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, buffer, clientFence,
683 clientDataspace, std::vector<common::Rect>(1, clientFrame));
684 clientLayer->setToClientComposition(*mWriter);
685 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000686 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000687 changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800688 ASSERT_TRUE(changedCompositionTypes.empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800689 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000690
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400691 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000692 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800693 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000694 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
695 }
696}
697
698TEST_P(GraphicsCompositionTest, SetLayerDamage) {
699 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000700 EXPECT_TRUE(mComposerClient
701 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
702 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000703
ramindani44c952f2022-02-28 23:29:29 +0000704 bool isSupported;
705 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000706 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000707 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
708 return;
709 }
710
ramindanidcecfd42022-02-03 23:52:19 +0000711 common::Rect redRect = {0, 0, getDisplayWidth() / 4, getDisplayHeight() / 4};
ramindanibab8ba92021-11-18 01:24:11 +0000712
ramindanidcecfd42022-02-03 23:52:19 +0000713 std::vector<Color> expectedColors(
714 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
715 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000716
ramindani0a2bee42022-02-10 01:27:42 +0000717 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
718 getPrimaryDisplayId(), getDisplayWidth(),
719 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000720 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000721 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400722 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000723 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
724
725 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
726
ramindanidcecfd42022-02-03 23:52:19 +0000727 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700728 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000729 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
730
731 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800732 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400733 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000734 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000735 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000736 GTEST_SUCCEED();
737 return;
738 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800739 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400740 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000741 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800742 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000743
744 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
745
746 // update surface damage and recheck
ramindanidcecfd42022-02-03 23:52:19 +0000747 redRect = {getDisplayWidth() / 4, getDisplayHeight() / 4, getDisplayWidth() / 2,
748 getDisplayHeight() / 2};
749 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
750 getDisplayWidth());
751 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000752
753 ASSERT_NO_FATAL_FAILURE(layer->fillBuffer(expectedColors));
754 layer->setSurfaceDamage(
ramindanidcecfd42022-02-03 23:52:19 +0000755 std::vector<common::Rect>(1, {0, 0, getDisplayWidth() / 2, getDisplayWidth() / 2}));
ramindanibab8ba92021-11-18 01:24:11 +0000756
757 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
758
759 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800760 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400761 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000762 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800763 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcecfd42022-02-03 23:52:19 +0000764 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400765 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000766 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800767 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000768
769 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
770 }
771}
772
773TEST_P(GraphicsCompositionTest, SetLayerPlaneAlpha) {
774 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000775 EXPECT_TRUE(mComposerClient
776 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
777 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000778
ramindani44c952f2022-02-28 23:29:29 +0000779 bool isSupported;
780 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000781 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000782 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
783 return;
784 }
785
ramindanidcecfd42022-02-03 23:52:19 +0000786 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000787 layer->setColor(RED);
ramindanidcecfd42022-02-03 23:52:19 +0000788 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000789 layer->setZOrder(10);
790 layer->setAlpha(0);
791 layer->setBlendMode(BlendMode::PREMULTIPLIED);
792
793 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
794
ramindanidcecfd42022-02-03 23:52:19 +0000795 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700796 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000797
798 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
799
800 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800801 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400802 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000803 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000804 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000805 GTEST_SUCCEED();
806 return;
807 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800808 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000809
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400810 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000811 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800812 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000813
ramindanidcecfd42022-02-03 23:52:19 +0000814 std::vector<Color> expectedColors(
815 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +0000816
817 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
818 mTestRenderEngine->setRenderLayers(layers);
819 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
820 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
821 }
822}
823
824TEST_P(GraphicsCompositionTest, SetLayerSourceCrop) {
825 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000826 EXPECT_TRUE(mComposerClient
827 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
828 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000829
ramindani44c952f2022-02-28 23:29:29 +0000830 bool isSupported;
831 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000832 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000833 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
834 return;
835 }
836
ramindanidcecfd42022-02-03 23:52:19 +0000837 std::vector<Color> expectedColors(
838 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
839 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
840 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
841 ReadbackHelper::fillColorsArea(
842 expectedColors, getDisplayWidth(),
843 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000844
ramindani0a2bee42022-02-10 01:27:42 +0000845 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
846 getPrimaryDisplayId(), getDisplayWidth(),
847 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000848 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000849 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400850 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanidcecfd42022-02-03 23:52:19 +0000851 layer->setSourceCrop({0, static_cast<float>(getDisplayHeight() / 2),
852 static_cast<float>(getDisplayWidth()),
853 static_cast<float>(getDisplayHeight())});
ramindanibab8ba92021-11-18 01:24:11 +0000854 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
855
856 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
857
858 // update expected colors to match crop
ramindanidcecfd42022-02-03 23:52:19 +0000859 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
860 {0, 0, getDisplayWidth(), getDisplayHeight()}, BLUE);
861 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700862 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000863 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
864 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800865 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400866 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000867 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000868 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000869 GTEST_SUCCEED();
870 return;
871 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800872 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400873 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000874 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800875 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000876 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
877 mTestRenderEngine->setRenderLayers(layers);
878 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
879 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
880 }
881}
882
883TEST_P(GraphicsCompositionTest, SetLayerZOrder) {
884 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000885 EXPECT_TRUE(mComposerClient
886 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
887 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000888
ramindani44c952f2022-02-28 23:29:29 +0000889 bool isSupported;
890 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000891 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000892 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
893 return;
894 }
895
ramindanidcecfd42022-02-03 23:52:19 +0000896 common::Rect redRect = {0, 0, getDisplayWidth(), getDisplayHeight() / 2};
897 common::Rect blueRect = {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight()};
898 auto redLayer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000899 redLayer->setColor(RED);
900 redLayer->setDisplayFrame(redRect);
901
ramindanidcecfd42022-02-03 23:52:19 +0000902 auto blueLayer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000903 blueLayer->setColor(BLUE);
904 blueLayer->setDisplayFrame(blueRect);
905 blueLayer->setZOrder(5);
906
907 std::vector<std::shared_ptr<TestLayer>> layers = {redLayer, blueLayer};
ramindanidcecfd42022-02-03 23:52:19 +0000908 std::vector<Color> expectedColors(
909 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +0000910
911 // red in front of blue
912 redLayer->setZOrder(10);
913
914 // fill blue first so that red will overwrite on overlap
ramindanidcecfd42022-02-03 23:52:19 +0000915 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), blueRect, BLUE);
916 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000917
ramindanidcecfd42022-02-03 23:52:19 +0000918 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700919 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000920 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
921
922 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800923 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400924 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000925 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000926 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000927 GTEST_SUCCEED();
928 return;
929 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400930 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000931 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800932 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000933
934 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
935
936 redLayer->setZOrder(1);
ramindanidcecfd42022-02-03 23:52:19 +0000937 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
938 getDisplayWidth());
939 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
940 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), blueRect, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000941
942 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
943
944 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800945 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400946 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000947 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000948 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800949 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400950 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000951 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800952 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000953
954 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
955 mTestRenderEngine->setRenderLayers(layers);
956 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
957 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
958 }
959}
960
Alec Mourib1f16722022-02-07 13:03:44 -0800961TEST_P(GraphicsCompositionTest, SetLayerBrightnessDims) {
ramindanidcecfd42022-02-03 23:52:19 +0000962 const auto& [status, capabilities] =
963 mComposerClient->getDisplayCapabilities(getPrimaryDisplayId());
964 ASSERT_TRUE(status.isOk());
Alec Mouri51067012022-01-06 17:28:39 -0800965
966 const bool brightnessSupport = std::find(capabilities.begin(), capabilities.end(),
967 DisplayCapability::BRIGHTNESS) != capabilities.end();
968
969 if (!brightnessSupport) {
970 GTEST_SUCCEED() << "Cannot verify dimming behavior without brightness support";
971 return;
972 }
973
974 const std::optional<float> maxBrightnessNitsOptional =
ramindanidcecfd42022-02-03 23:52:19 +0000975 getMaxDisplayBrightnessNits(getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -0800976
977 ASSERT_TRUE(maxBrightnessNitsOptional.has_value());
978
979 const float maxBrightnessNits = *maxBrightnessNitsOptional;
980
981 // Preconditions to successfully run are knowing the max brightness and successfully applying
982 // the max brightness
983 ASSERT_GT(maxBrightnessNits, 0.f);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400984 mWriter->setDisplayBrightness(getPrimaryDisplayId(), /*brightness*/ 1.f, maxBrightnessNits);
Alec Mouri51067012022-01-06 17:28:39 -0800985 execute();
986 ASSERT_TRUE(mReader.takeErrors().empty());
987
988 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000989 EXPECT_TRUE(mComposerClient
990 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
991 .isOk());
Alec Mouri51067012022-01-06 17:28:39 -0800992
ramindani44c952f2022-02-28 23:29:29 +0000993 bool isSupported;
994 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000995 if (!isSupported) {
Alec Mouri51067012022-01-06 17:28:39 -0800996 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace for "
997 "color mode: "
998 << toString(mode);
999 continue;
1000 }
ramindanidcecfd42022-02-03 23:52:19 +00001001 const common::Rect redRect = {0, 0, getDisplayWidth(), getDisplayHeight() / 2};
1002 const common::Rect dimmerRedRect = {0, getDisplayHeight() / 2, getDisplayWidth(),
1003 getDisplayHeight()};
1004 const auto redLayer =
1005 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001006 redLayer->setColor(RED);
1007 redLayer->setDisplayFrame(redRect);
1008 redLayer->setWhitePointNits(maxBrightnessNits);
Alec Mourib1f16722022-02-07 13:03:44 -08001009 redLayer->setBrightness(1.f);
Alec Mouri51067012022-01-06 17:28:39 -08001010
1011 const auto dimmerRedLayer =
ramindanidcecfd42022-02-03 23:52:19 +00001012 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001013 dimmerRedLayer->setColor(RED);
1014 dimmerRedLayer->setDisplayFrame(dimmerRedRect);
1015 // Intentionally use a small dimming ratio as some implementations may be more likely to
1016 // kick into GPU composition to apply dithering when the dimming ratio is high.
1017 static constexpr float kDimmingRatio = 0.9f;
1018 dimmerRedLayer->setWhitePointNits(maxBrightnessNits * kDimmingRatio);
Alec Mourib1f16722022-02-07 13:03:44 -08001019 dimmerRedLayer->setBrightness(kDimmingRatio);
Alec Mouri51067012022-01-06 17:28:39 -08001020
1021 const std::vector<std::shared_ptr<TestLayer>> layers = {redLayer, dimmerRedLayer};
ramindanidcecfd42022-02-03 23:52:19 +00001022 std::vector<Color> expectedColors(
1023 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
Alec Mouri51067012022-01-06 17:28:39 -08001024
ramindanidcecfd42022-02-03 23:52:19 +00001025 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
1026 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), dimmerRedRect, DIM_RED);
Alec Mouri51067012022-01-06 17:28:39 -08001027
ramindanidcecfd42022-02-03 23:52:19 +00001028 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001029 getDisplayHeight(), mPixelFormat, mDataspace);
Alec Mouri51067012022-01-06 17:28:39 -08001030 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1031
1032 writeLayers(layers);
1033 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001034 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
Alec Mouri51067012022-01-06 17:28:39 -08001035 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001036 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
Alec Mouri51067012022-01-06 17:28:39 -08001037 GTEST_SUCCEED()
1038 << "Readback verification not supported for GPU composition for color mode: "
1039 << toString(mode);
1040 continue;
1041 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001042 mWriter->presentDisplay(getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -08001043 execute();
1044 ASSERT_TRUE(mReader.takeErrors().empty());
1045
1046 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1047 mTestRenderEngine->setRenderLayers(layers);
1048 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1049 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1050 }
1051}
1052
ramindanibab8ba92021-11-18 01:24:11 +00001053class GraphicsBlendModeCompositionTest
1054 : public GraphicsCompositionTestBase,
1055 public testing::WithParamInterface<std::tuple<std::string, std::string>> {
1056 public:
1057 void SetUp() override {
1058 SetUpBase(std::get<0>(GetParam()));
ramindanib636af22022-02-10 02:55:56 +00001059 // TODO(b/219590743) we should remove the below SRGB color mode
1060 // once we have the BlendMode test fix for all the versions of the ColorMode
ramindania4e76362022-03-02 01:48:06 +00001061 mTestColorModes.erase(
1062 std::remove_if(mTestColorModes.begin(), mTestColorModes.end(),
1063 [](ColorMode mode) { return mode != ColorMode::SRGB; }),
1064 mTestColorModes.end());
ramindanibab8ba92021-11-18 01:24:11 +00001065 mBackgroundColor = BLACK;
1066 mTopLayerColor = RED;
1067 }
1068
1069 void setBackgroundColor(Color color) { mBackgroundColor = color; }
1070
1071 void setTopLayerColor(Color color) { mTopLayerColor = color; }
1072
1073 void setUpLayers(BlendMode blendMode) {
1074 mLayers.clear();
ramindanidcecfd42022-02-03 23:52:19 +00001075 std::vector<Color> topLayerPixelColors(
1076 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1077 ReadbackHelper::fillColorsArea(topLayerPixelColors, getDisplayWidth(),
1078 {0, 0, getDisplayWidth(), getDisplayHeight()},
1079 mTopLayerColor);
ramindanibab8ba92021-11-18 01:24:11 +00001080
ramindanidcecfd42022-02-03 23:52:19 +00001081 auto backgroundLayer =
1082 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
1083 backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001084 backgroundLayer->setZOrder(0);
1085 backgroundLayer->setColor(mBackgroundColor);
1086
ramindani0a2bee42022-02-10 01:27:42 +00001087 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
1088 getPrimaryDisplayId(), getDisplayWidth(),
1089 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +00001090 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001091 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001092 layer->setDataspace(Dataspace::UNKNOWN, *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001093 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(topLayerPixelColors));
1094
1095 layer->setBlendMode(blendMode);
1096 layer->setAlpha(std::stof(std::get<1>(GetParam())));
1097
1098 mLayers.push_back(backgroundLayer);
1099 mLayers.push_back(layer);
1100 }
1101
1102 void setExpectedColors(std::vector<Color>& expectedColors) {
1103 ASSERT_EQ(2, mLayers.size());
ramindanidcecfd42022-02-03 23:52:19 +00001104 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
1105 getDisplayWidth());
ramindanibab8ba92021-11-18 01:24:11 +00001106
1107 auto layer = mLayers[1];
1108 BlendMode blendMode = layer->getBlendMode();
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001109 float alpha = mTopLayerColor.a * layer->getAlpha();
ramindanibab8ba92021-11-18 01:24:11 +00001110 if (blendMode == BlendMode::NONE) {
1111 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001112 expectedColor.r = mTopLayerColor.r * layer->getAlpha();
1113 expectedColor.g = mTopLayerColor.g * layer->getAlpha();
1114 expectedColor.b = mTopLayerColor.b * layer->getAlpha();
1115 expectedColor.a = alpha;
ramindanibab8ba92021-11-18 01:24:11 +00001116 }
1117 } else if (blendMode == BlendMode::PREMULTIPLIED) {
1118 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001119 expectedColor.r =
1120 mTopLayerColor.r * layer->getAlpha() + mBackgroundColor.r * (1.0f - alpha);
1121 expectedColor.g =
1122 mTopLayerColor.g * layer->getAlpha() + mBackgroundColor.g * (1.0f - alpha);
1123 expectedColor.b =
1124 mTopLayerColor.b * layer->getAlpha() + mBackgroundColor.b * (1.0f - alpha);
1125 expectedColor.a = alpha + mBackgroundColor.a * (1.0f - alpha);
ramindanibab8ba92021-11-18 01:24:11 +00001126 }
1127 } else if (blendMode == BlendMode::COVERAGE) {
1128 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001129 expectedColor.r = mTopLayerColor.r * alpha + mBackgroundColor.r * (1.0f - alpha);
1130 expectedColor.g = mTopLayerColor.g * alpha + mBackgroundColor.g * (1.0f - alpha);
1131 expectedColor.b = mTopLayerColor.b * alpha + mBackgroundColor.b * (1.0f - alpha);
1132 expectedColor.a = mTopLayerColor.a * alpha + mBackgroundColor.a * (1.0f - alpha);
ramindanibab8ba92021-11-18 01:24:11 +00001133 }
1134 }
1135 }
1136
1137 protected:
1138 std::vector<std::shared_ptr<TestLayer>> mLayers;
1139 Color mBackgroundColor;
1140 Color mTopLayerColor;
1141};
ramindanic7585d92022-04-15 18:30:41 +00001142
1143TEST_P(GraphicsBlendModeCompositionTest, None) {
ramindanibab8ba92021-11-18 01:24:11 +00001144 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001145 EXPECT_TRUE(mComposerClient
1146 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1147 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001148
ramindani44c952f2022-02-28 23:29:29 +00001149 bool isSupported;
1150 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001151 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001152 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1153 return;
1154 }
1155
ramindanidcecfd42022-02-03 23:52:19 +00001156 std::vector<Color> expectedColors(
1157 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001158
1159 setBackgroundColor(BLACK);
1160 setTopLayerColor(TRANSLUCENT_RED);
1161 setUpLayers(BlendMode::NONE);
1162 setExpectedColors(expectedColors);
1163
ramindanidcecfd42022-02-03 23:52:19 +00001164 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001165 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001166 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1167 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001168 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001169 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001170 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001171 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001172 GTEST_SUCCEED();
1173 return;
1174 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001175 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001176 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001177 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001178 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001179
1180 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1181 mTestRenderEngine->setRenderLayers(mLayers);
1182 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1183 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1184 }
1185}
1186
ramindani07e6f842022-02-15 15:28:33 +00001187TEST_P(GraphicsBlendModeCompositionTest, Coverage) {
ramindanibab8ba92021-11-18 01:24:11 +00001188 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001189 EXPECT_TRUE(mComposerClient
1190 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1191 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001192
ramindani44c952f2022-02-28 23:29:29 +00001193 bool isSupported;
1194 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001195 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001196 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1197 return;
1198 }
1199
ramindanidcecfd42022-02-03 23:52:19 +00001200 std::vector<Color> expectedColors(
1201 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001202
1203 setBackgroundColor(BLACK);
1204 setTopLayerColor(TRANSLUCENT_RED);
1205
1206 setUpLayers(BlendMode::COVERAGE);
1207 setExpectedColors(expectedColors);
1208
ramindanidcecfd42022-02-03 23:52:19 +00001209 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001210 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001211 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1212 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001213 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001214 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001215 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001216 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001217 GTEST_SUCCEED();
1218 return;
1219 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001220 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001221 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001222 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001223 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001224 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1225 }
1226}
1227
1228TEST_P(GraphicsBlendModeCompositionTest, Premultiplied) {
1229 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001230 EXPECT_TRUE(mComposerClient
1231 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1232 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001233
ramindani44c952f2022-02-28 23:29:29 +00001234 bool isSupported;
1235 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001236 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001237 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1238 return;
1239 }
ramindanibab8ba92021-11-18 01:24:11 +00001240
ramindanidcecfd42022-02-03 23:52:19 +00001241 std::vector<Color> expectedColors(
1242 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001243
1244 setBackgroundColor(BLACK);
1245 setTopLayerColor(TRANSLUCENT_RED);
1246 setUpLayers(BlendMode::PREMULTIPLIED);
1247 setExpectedColors(expectedColors);
1248
ramindanidcecfd42022-02-03 23:52:19 +00001249 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001250 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001251 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1252 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001253 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001254 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001255 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001256 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001257 GTEST_SUCCEED();
1258 return;
1259 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001260 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001261 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001262 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001263 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001264 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1265 mTestRenderEngine->setRenderLayers(mLayers);
1266 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1267 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1268 }
1269}
1270
1271class GraphicsTransformCompositionTest : public GraphicsCompositionTest {
1272 protected:
1273 void SetUp() override {
1274 GraphicsCompositionTest::SetUp();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001275
ramindanidcecfd42022-02-03 23:52:19 +00001276 auto backgroundLayer =
1277 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001278 backgroundLayer->setColor({0.0f, 0.0f, 0.0f, 0.0f});
ramindanidcecfd42022-02-03 23:52:19 +00001279 backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001280 backgroundLayer->setZOrder(0);
1281
ramindanidcecfd42022-02-03 23:52:19 +00001282 mSideLength =
1283 getDisplayWidth() < getDisplayHeight() ? getDisplayWidth() : getDisplayHeight();
ramindanibab8ba92021-11-18 01:24:11 +00001284 common::Rect redRect = {0, 0, mSideLength / 2, mSideLength / 2};
1285 common::Rect blueRect = {mSideLength / 2, mSideLength / 2, mSideLength, mSideLength};
1286
ramindani0a2bee42022-02-10 01:27:42 +00001287 mLayer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
1288 getPrimaryDisplayId(), mSideLength, mSideLength,
1289 PixelFormat::RGBA_8888);
ramindanibab8ba92021-11-18 01:24:11 +00001290 mLayer->setDisplayFrame({0, 0, mSideLength, mSideLength});
1291 mLayer->setZOrder(10);
1292
1293 std::vector<Color> baseColors(static_cast<size_t>(mSideLength * mSideLength));
1294 ReadbackHelper::fillColorsArea(baseColors, mSideLength, redRect, RED);
1295 ReadbackHelper::fillColorsArea(baseColors, mSideLength, blueRect, BLUE);
1296 ASSERT_NO_FATAL_FAILURE(mLayer->setBuffer(baseColors));
1297 mLayers = {backgroundLayer, mLayer};
1298 }
1299
1300 protected:
1301 std::shared_ptr<TestBufferLayer> mLayer;
1302 std::vector<std::shared_ptr<TestLayer>> mLayers;
1303 int mSideLength;
1304};
1305
1306TEST_P(GraphicsTransformCompositionTest, FLIP_H) {
1307 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001308 auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), mode,
1309 RenderIntent::COLORIMETRIC);
ramindanid5751092022-04-22 22:30:20 +00001310 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
ramindanidcecfd42022-02-03 23:52:19 +00001311 (status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED ||
1312 status.getServiceSpecificError() == IComposerClient::EX_BAD_PARAMETER)) {
ramindanibab8ba92021-11-18 01:24:11 +00001313 SUCCEED() << "ColorMode not supported, skip test";
1314 return;
1315 }
1316
ramindani44c952f2022-02-28 23:29:29 +00001317 bool isSupported;
1318 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001319 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001320 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1321 return;
1322 }
ramindanidcecfd42022-02-03 23:52:19 +00001323 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001324 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001325 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1326 mLayer->setTransform(Transform::FLIP_H);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001327 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001328
ramindanidcecfd42022-02-03 23:52:19 +00001329 std::vector<Color> expectedColors(
1330 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1331 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001332 {mSideLength / 2, 0, mSideLength, mSideLength / 2}, RED);
ramindanidcecfd42022-02-03 23:52:19 +00001333 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001334 {0, mSideLength / 2, mSideLength / 2, mSideLength}, BLUE);
1335
1336 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001337 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001338 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001339 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001340 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001341 GTEST_SUCCEED();
1342 return;
1343 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001344 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001345 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001346 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001347 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001348
1349 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1350 mTestRenderEngine->setRenderLayers(mLayers);
1351 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1352 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1353 }
1354}
1355
1356TEST_P(GraphicsTransformCompositionTest, FLIP_V) {
1357 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001358 EXPECT_TRUE(mComposerClient
1359 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1360 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001361
ramindani44c952f2022-02-28 23:29:29 +00001362 bool isSupported;
1363 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001364 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001365 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1366 return;
1367 }
ramindanidcecfd42022-02-03 23:52:19 +00001368 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001369 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001370 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1371
1372 mLayer->setTransform(Transform::FLIP_V);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001373 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001374
ramindanidcecfd42022-02-03 23:52:19 +00001375 std::vector<Color> expectedColors(
1376 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1377 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001378 {0, mSideLength / 2, mSideLength / 2, mSideLength}, RED);
ramindanidcecfd42022-02-03 23:52:19 +00001379 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001380 {mSideLength / 2, 0, mSideLength, mSideLength / 2}, BLUE);
1381
1382 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001383 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001384 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001385 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001386 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001387 GTEST_SUCCEED();
1388 return;
1389 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001390 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001391 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001392 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001393 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001394 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1395 mTestRenderEngine->setRenderLayers(mLayers);
1396 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1397 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1398 }
1399}
1400
1401TEST_P(GraphicsTransformCompositionTest, ROT_180) {
1402 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001403 EXPECT_TRUE(mComposerClient
1404 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1405 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001406
ramindani44c952f2022-02-28 23:29:29 +00001407 bool isSupported;
1408 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001409 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001410 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1411 return;
1412 }
ramindanidcecfd42022-02-03 23:52:19 +00001413 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001414 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001415 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1416
1417 mLayer->setTransform(Transform::ROT_180);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001418 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode), *mWriter);
ramindanibab8ba92021-11-18 01:24:11 +00001419
ramindanidcecfd42022-02-03 23:52:19 +00001420 std::vector<Color> expectedColors(
1421 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1422 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001423 {mSideLength / 2, mSideLength / 2, mSideLength, mSideLength},
1424 RED);
ramindanidcecfd42022-02-03 23:52:19 +00001425 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001426 {0, 0, mSideLength / 2, mSideLength / 2}, BLUE);
1427
1428 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001429 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001430 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001431 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001432 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001433 GTEST_SUCCEED();
1434 return;
1435 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001436 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001437 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001438 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001439 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001440 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1441 mTestRenderEngine->setRenderLayers(mLayers);
1442 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1443 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1444 }
1445}
1446
1447GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsCompositionTest);
1448INSTANTIATE_TEST_SUITE_P(
1449 PerInstance, GraphicsCompositionTest,
1450 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
1451 ::android::PrintInstanceNameToString);
1452
1453GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsBlendModeCompositionTest);
1454INSTANTIATE_TEST_SUITE_P(BlendMode, GraphicsBlendModeCompositionTest,
1455 testing::Combine(testing::ValuesIn(::android::getAidlHalInstanceNames(
1456 IComposer::descriptor)),
1457 testing::Values("0.2", "1.0")));
1458
1459GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsTransformCompositionTest);
1460INSTANTIATE_TEST_SUITE_P(
1461 PerInstance, GraphicsTransformCompositionTest,
1462 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
1463 ::android::PrintInstanceNameToString);
1464
1465} // namespace
Ady Abraham3192f3d2021-12-03 16:08:56 -08001466} // namespace aidl::android::hardware::graphics::composer3::vts