blob: 466954f26d6e356de775902423e26cf297756b1e [file] [log] [blame]
ramindanibab8ba92021-11-18 01:24:11 +00001/**
2 * Copyright (c) 2021, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "graphics_composer_aidl_hal_readback_tests@3"
18
19#include <aidl/Gtest.h>
20#include <aidl/Vintf.h>
Brian Lindahle887a252023-01-17 14:54:19 -070021#include <aidl/android/hardware/graphics/common/BufferUsage.h>
Ady Abraham46219f52021-12-20 09:44:31 -080022#include <aidl/android/hardware/graphics/composer3/IComposer.h>
ramindanibab8ba92021-11-18 01:24:11 +000023#include <gtest/gtest.h>
Alec Mouri51067012022-01-06 17:28:39 -080024#include <ui/DisplayId.h>
25#include <ui/DisplayIdentification.h>
ramindanibab8ba92021-11-18 01:24:11 +000026#include <ui/GraphicBuffer.h>
ramindanibab8ba92021-11-18 01:24:11 +000027#include <ui/PixelFormat.h>
28#include <ui/Rect.h>
ramindani458e53e2022-02-23 17:30:16 +000029#include "GraphicsComposerCallback.h"
30#include "ReadbackVts.h"
31#include "RenderEngineVts.h"
32#include "VtsComposerClient.h"
Alec Mouri51067012022-01-06 17:28:39 -080033
ramindanibab8ba92021-11-18 01:24:11 +000034namespace aidl::android::hardware::graphics::composer3::vts {
35namespace {
36
37using ::android::Rect;
38using common::Dataspace;
39using common::PixelFormat;
40
41class GraphicsCompositionTestBase : public ::testing::Test {
42 protected:
43 void SetUpBase(const std::string& name) {
ramindanidcecfd42022-02-03 23:52:19 +000044 mComposerClient = std::make_shared<VtsComposerClient>(name);
45 ASSERT_TRUE(mComposerClient->createClient().isOk());
ramindanibab8ba92021-11-18 01:24:11 +000046
ramindanidcecfd42022-02-03 23:52:19 +000047 const auto& [status, displays] = mComposerClient->getDisplays();
48 ASSERT_TRUE(status.isOk());
49 mDisplays = displays;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -040050 mWriter.reset(new ComposerClientWriter(getPrimaryDisplayId()));
ramindanibab8ba92021-11-18 01:24:11 +000051
52 setTestColorModes();
53
54 // explicitly disable vsync
ramindanidcecfd42022-02-03 23:52:19 +000055 for (const auto& display : mDisplays) {
56 EXPECT_TRUE(mComposerClient->setVsync(display.getDisplayId(), /*enable*/ false).isOk());
57 }
58 mComposerClient->setVsyncAllowed(/*isAllowed*/ false);
ramindanibab8ba92021-11-18 01:24:11 +000059
ramindanidcecfd42022-02-03 23:52:19 +000060 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
ramindanibab8ba92021-11-18 01:24:11 +000061
62 ASSERT_NO_FATAL_FAILURE(
63 mTestRenderEngine = std::unique_ptr<TestRenderEngine>(new TestRenderEngine(
64 ::android::renderengine::RenderEngineCreationArgs::Builder()
65 .setPixelFormat(static_cast<int>(common::PixelFormat::RGBA_8888))
66 .setImageCacheSize(TestRenderEngine::sMaxFrameBufferAcquireBuffers)
ramindanibab8ba92021-11-18 01:24:11 +000067 .setEnableProtectedContext(false)
68 .setPrecacheToneMapperShaderOnly(false)
69 .setContextPriority(::android::renderengine::RenderEngine::
70 ContextPriority::HIGH)
71 .build())));
72
Alec Mourif6c039a2023-10-06 23:02:17 +000073 mClientCompositionDisplaySettings.physicalDisplay =
74 Rect(getDisplayWidth(), getDisplayHeight());
75 mClientCompositionDisplaySettings.clip = mClientCompositionDisplaySettings.physicalDisplay;
ramindanibab8ba92021-11-18 01:24:11 +000076
Brian Lindahle887a252023-01-17 14:54:19 -070077 mTestRenderEngine->initGraphicBuffer(
78 static_cast<uint32_t>(getDisplayWidth()), static_cast<uint32_t>(getDisplayHeight()),
79 /*layerCount*/ 1U,
80 static_cast<uint64_t>(
81 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
82 static_cast<uint64_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
83 static_cast<uint64_t>(common::BufferUsage::GPU_RENDER_TARGET)));
Alec Mourif6c039a2023-10-06 23:02:17 +000084 mTestRenderEngine->setDisplaySettings(mClientCompositionDisplaySettings);
ramindanibab8ba92021-11-18 01:24:11 +000085 }
86
87 void TearDown() override {
ramindanidcecfd42022-02-03 23:52:19 +000088 ASSERT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::OFF).isOk());
89 ASSERT_TRUE(mComposerClient->tearDown());
90 mComposerClient.reset();
Ady Abraham3192f3d2021-12-03 16:08:56 -080091 const auto errors = mReader.takeErrors();
92 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcecfd42022-02-03 23:52:19 +000093 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
ramindanibab8ba92021-11-18 01:24:11 +000094 }
95
ramindanidcecfd42022-02-03 23:52:19 +000096 const VtsDisplay& getPrimaryDisplay() const { return mDisplays[0]; }
97
98 int64_t getPrimaryDisplayId() const { return getPrimaryDisplay().getDisplayId(); }
99
100 int64_t getInvalidDisplayId() const { return mComposerClient->getInvalidDisplayId(); }
101
102 int32_t getDisplayWidth() const { return getPrimaryDisplay().getDisplayWidth(); }
103
104 int32_t getDisplayHeight() const { return getPrimaryDisplay().getDisplayHeight(); }
105
ramindanid5751092022-04-22 22:30:20 +0000106 void assertServiceSpecificError(const ScopedAStatus& status, int32_t serviceSpecificError) {
107 ASSERT_EQ(status.getExceptionCode(), EX_SERVICE_SPECIFIC);
108 ASSERT_EQ(status.getServiceSpecificError(), serviceSpecificError);
109 }
110
Brian Lindahle887a252023-01-17 14:54:19 -0700111 std::pair<bool, ::android::sp<::android::GraphicBuffer>> allocateBuffer(uint32_t usage) {
112 const auto width = static_cast<uint32_t>(getDisplayWidth());
113 const auto height = static_cast<uint32_t>(getDisplayHeight());
114
115 const auto& graphicBuffer = ::android::sp<::android::GraphicBuffer>::make(
116 width, height, ::android::PIXEL_FORMAT_RGBA_8888,
117 /*layerCount*/ 1u, usage, "VtsHalGraphicsComposer3_ReadbackTest");
ramindani0a2bee42022-02-10 01:27:42 +0000118
119 if (graphicBuffer && ::android::OK == graphicBuffer->initCheck()) {
Brian Lindahle887a252023-01-17 14:54:19 -0700120 return {true, graphicBuffer};
ramindani0a2bee42022-02-10 01:27:42 +0000121 }
Brian Lindahle887a252023-01-17 14:54:19 -0700122 return {false, graphicBuffer};
ramindanibab8ba92021-11-18 01:24:11 +0000123 }
124
ramindanibab8ba92021-11-18 01:24:11 +0000125 void writeLayers(const std::vector<std::shared_ptr<TestLayer>>& layers) {
ramindanidcecfd42022-02-03 23:52:19 +0000126 for (const auto& layer : layers) {
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400127 layer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000128 }
129 execute();
130 }
131
132 void execute() {
Huihong Luo651806f2023-04-21 18:48:48 +0000133 auto commands = mWriter->takePendingCommands();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800134 if (commands.empty()) {
Ady Abraham3192f3d2021-12-03 16:08:56 -0800135 return;
ramindanibab8ba92021-11-18 01:24:11 +0000136 }
137
ramindanidcecfd42022-02-03 23:52:19 +0000138 auto [status, results] = mComposerClient->executeCommands(commands);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800139 ASSERT_TRUE(status.isOk()) << "executeCommands failed " << status.getDescription();
ramindanibab8ba92021-11-18 01:24:11 +0000140
Ady Abraham46219f52021-12-20 09:44:31 -0800141 mReader.parse(std::move(results));
ramindanibab8ba92021-11-18 01:24:11 +0000142 }
143
ramindani44c952f2022-02-28 23:29:29 +0000144 bool getHasReadbackBuffer() {
ramindanidcecfd42022-02-03 23:52:19 +0000145 auto [status, readBackBufferAttributes] =
146 mComposerClient->getReadbackBufferAttributes(getPrimaryDisplayId());
147 if (status.isOk()) {
148 mPixelFormat = readBackBufferAttributes.format;
149 mDataspace = readBackBufferAttributes.dataspace;
ramindani44c952f2022-02-28 23:29:29 +0000150 return ReadbackHelper::readbackSupported(mPixelFormat, mDataspace);
ramindanidcecfd42022-02-03 23:52:19 +0000151 }
ramindanid5751092022-04-22 22:30:20 +0000152 EXPECT_NO_FATAL_FAILURE(
153 assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
ramindani44c952f2022-02-28 23:29:29 +0000154 return false;
ramindanib27f33b2021-12-03 19:36:10 +0000155 }
156
ramindanidcecfd42022-02-03 23:52:19 +0000157 std::shared_ptr<VtsComposerClient> mComposerClient;
158 std::vector<VtsDisplay> mDisplays;
159 // use the slot count usually set by SF
ramindanibab8ba92021-11-18 01:24:11 +0000160 std::vector<ColorMode> mTestColorModes;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400161 std::unique_ptr<ComposerClientWriter> mWriter;
Ady Abraham91c9d1a2021-12-15 18:14:45 -0800162 ComposerClientReader mReader;
ramindanibab8ba92021-11-18 01:24:11 +0000163 std::unique_ptr<TestRenderEngine> mTestRenderEngine;
ramindanibab8ba92021-11-18 01:24:11 +0000164 common::PixelFormat mPixelFormat;
165 common::Dataspace mDataspace;
Alec Mourif6c039a2023-10-06 23:02:17 +0000166 ::android::renderengine::DisplaySettings mClientCompositionDisplaySettings;
ramindanibab8ba92021-11-18 01:24:11 +0000167
168 static constexpr uint32_t kClientTargetSlotCount = 64;
169
170 private:
ramindanibab8ba92021-11-18 01:24:11 +0000171 void setTestColorModes() {
172 mTestColorModes.clear();
ramindanidcecfd42022-02-03 23:52:19 +0000173 const auto& [status, modes] = mComposerClient->getColorModes(getPrimaryDisplayId());
174 ASSERT_TRUE(status.isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000175
176 for (ColorMode mode : modes) {
177 if (std::find(ReadbackHelper::colorModes.begin(), ReadbackHelper::colorModes.end(),
178 mode) != ReadbackHelper::colorModes.end()) {
179 mTestColorModes.push_back(mode);
180 }
181 }
182 }
183};
184
185class GraphicsCompositionTest : public GraphicsCompositionTestBase,
186 public testing::WithParamInterface<std::string> {
187 public:
188 void SetUp() override { SetUpBase(GetParam()); }
189};
190
191TEST_P(GraphicsCompositionTest, SingleSolidColorLayer) {
192 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000193 EXPECT_TRUE(mComposerClient
194 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
195 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000196
ramindani44c952f2022-02-28 23:29:29 +0000197 bool isSupported;
198 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000199 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000200 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
201 return;
202 }
203
ramindanidcecfd42022-02-03 23:52:19 +0000204 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
205 common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000206 layer->setColor(BLUE);
207 layer->setDisplayFrame(coloredSquare);
208 layer->setZOrder(10);
209
210 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
211
212 // expected color for each pixel
ramindanidcecfd42022-02-03 23:52:19 +0000213 std::vector<Color> expectedColors(
214 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
215 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), coloredSquare, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000216
ramindanidcecfd42022-02-03 23:52:19 +0000217 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700218 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000219 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
220
221 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800222 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400223 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000224 execute();
225 // if hwc cannot handle and asks for composition change,
226 // just succeed the test
ramindanidcecfd42022-02-03 23:52:19 +0000227 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000228 GTEST_SUCCEED();
229 return;
230 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800231 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400232 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000233 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800234 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000235
236 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
237 mTestRenderEngine->setRenderLayers(layers);
238 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
239 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
240 }
241}
242
243TEST_P(GraphicsCompositionTest, SetLayerBuffer) {
244 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000245 EXPECT_TRUE(mComposerClient
246 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
247 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000248
ramindani44c952f2022-02-28 23:29:29 +0000249 bool isSupported;
250 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000251 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000252 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
253 return;
254 }
255
ramindanidcecfd42022-02-03 23:52:19 +0000256 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700257 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000258 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000259 std::vector<Color> expectedColors(
260 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
261 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
262 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
263 ReadbackHelper::fillColorsArea(
264 expectedColors, getDisplayWidth(),
265 {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
266 ReadbackHelper::fillColorsArea(
267 expectedColors, getDisplayWidth(),
268 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000269
270 auto layer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000271 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
272 getDisplayHeight(), common::PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000273 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000274 layer->setZOrder(10);
Alec Mourif6c039a2023-10-06 23:02:17 +0000275 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +0000276 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
277
278 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
279
280 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800281 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400282 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000283 execute();
284
ramindanidcecfd42022-02-03 23:52:19 +0000285 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000286 GTEST_SUCCEED();
287 return;
288 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800289 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000290
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400291 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000292 execute();
293
Ady Abraham3192f3d2021-12-03 16:08:56 -0800294 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000295
296 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
297 mTestRenderEngine->setRenderLayers(layers);
298 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
299 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
300 }
301}
302
303TEST_P(GraphicsCompositionTest, SetLayerBufferNoEffect) {
304 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000305 EXPECT_TRUE(mComposerClient
306 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
307 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000308
ramindani44c952f2022-02-28 23:29:29 +0000309 bool isSupported;
310 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000311 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000312 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
313 return;
314 }
315
ramindanidcecfd42022-02-03 23:52:19 +0000316 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
317 common::Rect coloredSquare({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000318 layer->setColor(BLUE);
319 layer->setDisplayFrame(coloredSquare);
320 layer->setZOrder(10);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400321 layer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000322
323 // This following buffer call should have no effect
Brian Lindahle887a252023-01-17 14:54:19 -0700324 const auto usage = static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
325 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN);
326 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(usage);
327 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000328 const auto& buffer = graphicBuffer->handle;
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400329 mWriter->setLayerBuffer(getPrimaryDisplayId(), layer->getLayer(), /*slot*/ 0, buffer,
330 /*acquireFence*/ -1);
ramindanibab8ba92021-11-18 01:24:11 +0000331
332 // expected color for each pixel
ramindanidcecfd42022-02-03 23:52:19 +0000333 std::vector<Color> expectedColors(
334 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
335 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), coloredSquare, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000336
ramindanidcecfd42022-02-03 23:52:19 +0000337 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700338 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000339 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
340
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400341 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000342 execute();
343
ramindanidcecfd42022-02-03 23:52:19 +0000344 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000345 GTEST_SUCCEED();
346 return;
347 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800348 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400349 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000350 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800351 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000352
353 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
354 }
355}
356
ramindanib27f33b2021-12-03 19:36:10 +0000357TEST_P(GraphicsCompositionTest, SetReadbackBuffer) {
ramindani44c952f2022-02-28 23:29:29 +0000358 bool isSupported;
359 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000360 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000361 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
362 return;
363 }
364
ramindanidcecfd42022-02-03 23:52:19 +0000365 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700366 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanib27f33b2021-12-03 19:36:10 +0000367
368 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
369}
370
ramindanidcecfd42022-02-03 23:52:19 +0000371TEST_P(GraphicsCompositionTest, SetReadbackBuffer_BadDisplay) {
ramindani44c952f2022-02-28 23:29:29 +0000372 bool isSupported;
373 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000374 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000375 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
376 return;
377 }
378
Brian Lindahle887a252023-01-17 14:54:19 -0700379 const auto usage = static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
380 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN);
381 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(usage);
382 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000383 const auto& bufferHandle = graphicBuffer->handle;
ramindanib27f33b2021-12-03 19:36:10 +0000384 ::ndk::ScopedFileDescriptor fence = ::ndk::ScopedFileDescriptor(-1);
385
ramindanidcecfd42022-02-03 23:52:19 +0000386 const auto status =
387 mComposerClient->setReadbackBuffer(getInvalidDisplayId(), bufferHandle, fence);
ramindanib27f33b2021-12-03 19:36:10 +0000388
ramindanidcecfd42022-02-03 23:52:19 +0000389 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000390 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_DISPLAY));
ramindanib27f33b2021-12-03 19:36:10 +0000391}
392
ramindanidcecfd42022-02-03 23:52:19 +0000393TEST_P(GraphicsCompositionTest, SetReadbackBuffer_BadParameter) {
ramindani44c952f2022-02-28 23:29:29 +0000394 bool isSupported;
395 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000396 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000397 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
398 return;
399 }
400
ramindanidcecfd42022-02-03 23:52:19 +0000401 const native_handle_t bufferHandle{};
ramindanib27f33b2021-12-03 19:36:10 +0000402 ndk::ScopedFileDescriptor releaseFence = ndk::ScopedFileDescriptor(-1);
ramindanidcecfd42022-02-03 23:52:19 +0000403 const auto status =
404 mComposerClient->setReadbackBuffer(getPrimaryDisplayId(), &bufferHandle, releaseFence);
ramindanib27f33b2021-12-03 19:36:10 +0000405
ramindanidcecfd42022-02-03 23:52:19 +0000406 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000407 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_BAD_PARAMETER));
ramindanib27f33b2021-12-03 19:36:10 +0000408}
409
410TEST_P(GraphicsCompositionTest, GetReadbackBufferFenceInactive) {
ramindani44c952f2022-02-28 23:29:29 +0000411 bool isSupported;
412 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000413 if (!isSupported) {
ramindanib27f33b2021-12-03 19:36:10 +0000414 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
415 return;
416 }
417
ramindanidcecfd42022-02-03 23:52:19 +0000418 const auto& [status, releaseFence] =
419 mComposerClient->getReadbackBufferFence(getPrimaryDisplayId());
ramindanib27f33b2021-12-03 19:36:10 +0000420
ramindanidcecfd42022-02-03 23:52:19 +0000421 EXPECT_FALSE(status.isOk());
ramindanid5751092022-04-22 22:30:20 +0000422 EXPECT_NO_FATAL_FAILURE(assertServiceSpecificError(status, IComposerClient::EX_UNSUPPORTED));
Alec Mouri62ae37b2022-01-20 17:16:38 -0800423 EXPECT_EQ(-1, releaseFence.get());
ramindanib27f33b2021-12-03 19:36:10 +0000424}
425
ramindanibab8ba92021-11-18 01:24:11 +0000426TEST_P(GraphicsCompositionTest, ClientComposition) {
ramindanidcecfd42022-02-03 23:52:19 +0000427 EXPECT_TRUE(
428 mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)
429 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000430
431 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000432 EXPECT_TRUE(mComposerClient
433 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
ramindanibab8ba92021-11-18 01:24:11 +0000434 .isOk());
435
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) {
ramindanibab8ba92021-11-18 01:24:11 +0000439 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
440 return;
441 }
442
ramindanidcecfd42022-02-03 23:52:19 +0000443 std::vector<Color> expectedColors(
444 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
445 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
446 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
447 ReadbackHelper::fillColorsArea(
448 expectedColors, getDisplayWidth(),
449 {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
450 ReadbackHelper::fillColorsArea(
451 expectedColors, getDisplayWidth(),
452 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000453
ramindani0a2bee42022-02-10 01:27:42 +0000454 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
455 getPrimaryDisplayId(), getDisplayWidth(),
456 getDisplayHeight(), PixelFormat::RGBA_FP16);
ramindanidcecfd42022-02-03 23:52:19 +0000457 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000458 layer->setZOrder(10);
Alec Mourif6c039a2023-10-06 23:02:17 +0000459 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +0000460
461 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
462
ramindanidcecfd42022-02-03 23:52:19 +0000463 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700464 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000465 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
466 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800467 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400468 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000469 execute();
470
ramindanidcecfd42022-02-03 23:52:19 +0000471 auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800472 if (!changedCompositionTypes.empty()) {
Ady Abraham3192f3d2021-12-03 16:08:56 -0800473 ASSERT_EQ(1, changedCompositionTypes.size());
Ady Abraham46219f52021-12-20 09:44:31 -0800474 ASSERT_EQ(Composition::CLIENT, changedCompositionTypes[0].composition);
ramindanibab8ba92021-11-18 01:24:11 +0000475
476 PixelFormat clientFormat = PixelFormat::RGBA_8888;
Brian Lindahle887a252023-01-17 14:54:19 -0700477 auto clientUsage = static_cast<uint32_t>(
478 static_cast<uint32_t>(common::BufferUsage::CPU_READ_OFTEN) |
479 static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
480 static_cast<uint32_t>(common::BufferUsage::COMPOSER_CLIENT_TARGET));
ramindanibab8ba92021-11-18 01:24:11 +0000481 Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
ramindanidcecfd42022-02-03 23:52:19 +0000482 common::Rect damage{0, 0, getDisplayWidth(), getDisplayHeight()};
ramindanibab8ba92021-11-18 01:24:11 +0000483
484 // create client target buffer
Brian Lindahle887a252023-01-17 14:54:19 -0700485 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(clientUsage);
486 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000487 const auto& buffer = graphicBuffer->handle;
ramindanibab8ba92021-11-18 01:24:11 +0000488 void* clientBufData;
ramindani0a2bee42022-02-10 01:27:42 +0000489 const auto stride = static_cast<uint32_t>(graphicBuffer->stride);
490 graphicBuffer->lock(clientUsage, layer->getAccessRegion(), &clientBufData);
ramindanibab8ba92021-11-18 01:24:11 +0000491
492 ASSERT_NO_FATAL_FAILURE(
ramindani0a2bee42022-02-10 01:27:42 +0000493 ReadbackHelper::fillBuffer(layer->getWidth(), layer->getHeight(), stride,
ramindanibab8ba92021-11-18 01:24:11 +0000494 clientBufData, clientFormat, expectedColors));
ramindanib1144212022-02-10 01:51:24 +0000495 int32_t clientFence;
496 const auto unlockStatus = graphicBuffer->unlockAsync(&clientFence);
497 ASSERT_EQ(::android::OK, unlockStatus);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400498 mWriter->setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, buffer, clientFence,
499 clientDataspace, std::vector<common::Rect>(1, damage));
500 layer->setToClientComposition(*mWriter);
501 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000502 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000503 changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800504 ASSERT_TRUE(changedCompositionTypes.empty());
ramindanibab8ba92021-11-18 01:24:11 +0000505 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800506 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000507
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400508 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000509 execute();
510
Ady Abraham3192f3d2021-12-03 16:08:56 -0800511 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000512
513 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
514 }
515}
516
517TEST_P(GraphicsCompositionTest, DeviceAndClientComposition) {
ramindanidcecfd42022-02-03 23:52:19 +0000518 ASSERT_TRUE(
519 mComposerClient->setClientTargetSlotCount(getPrimaryDisplayId(), kClientTargetSlotCount)
520 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000521
522 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000523 EXPECT_TRUE(mComposerClient
524 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
525 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000526
ramindani44c952f2022-02-28 23:29:29 +0000527 bool isSupported;
528 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000529 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000530 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
531 return;
532 }
533
ramindanidcecfd42022-02-03 23:52:19 +0000534 std::vector<Color> expectedColors(
535 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
536 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
537 {0, 0, getDisplayWidth(), getDisplayHeight() / 2}, GREEN);
538 ReadbackHelper::fillColorsArea(
539 expectedColors, getDisplayWidth(),
540 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000541
ramindanidcecfd42022-02-03 23:52:19 +0000542 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700543 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000544 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
545
546 auto deviceLayer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000547 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
548 getDisplayHeight() / 2, PixelFormat::RGBA_8888);
ramindanibab8ba92021-11-18 01:24:11 +0000549 std::vector<Color> deviceColors(deviceLayer->getWidth() * deviceLayer->getHeight());
550 ReadbackHelper::fillColorsArea(deviceColors, static_cast<int32_t>(deviceLayer->getWidth()),
551 {0, 0, static_cast<int32_t>(deviceLayer->getWidth()),
552 static_cast<int32_t>(deviceLayer->getHeight())},
553 GREEN);
554 deviceLayer->setDisplayFrame({0, 0, static_cast<int32_t>(deviceLayer->getWidth()),
555 static_cast<int32_t>(deviceLayer->getHeight())});
556 deviceLayer->setZOrder(10);
Alec Mourif6c039a2023-10-06 23:02:17 +0000557 deviceLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +0000558 ASSERT_NO_FATAL_FAILURE(deviceLayer->setBuffer(deviceColors));
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400559 deviceLayer->write(*mWriter);
ramindanibab8ba92021-11-18 01:24:11 +0000560
561 PixelFormat clientFormat = PixelFormat::RGBA_8888;
Brian Lindahle887a252023-01-17 14:54:19 -0700562 auto clientUsage = static_cast<uint32_t>(
563 static_cast<uint64_t>(common::BufferUsage::CPU_READ_OFTEN) |
564 static_cast<uint32_t>(common::BufferUsage::CPU_WRITE_OFTEN) |
565 static_cast<uint32_t>(common::BufferUsage::COMPOSER_CLIENT_TARGET));
ramindanibab8ba92021-11-18 01:24:11 +0000566 Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
ramindanidcecfd42022-02-03 23:52:19 +0000567 int32_t clientWidth = getDisplayWidth();
568 int32_t clientHeight = getDisplayHeight() / 2;
ramindanibab8ba92021-11-18 01:24:11 +0000569
570 auto clientLayer = std::make_shared<TestBufferLayer>(
ramindani0a2bee42022-02-10 01:27:42 +0000571 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), clientWidth,
572 clientHeight, PixelFormat::RGBA_FP16, Composition::DEVICE);
ramindanidcecfd42022-02-03 23:52:19 +0000573 common::Rect clientFrame = {0, getDisplayHeight() / 2, getDisplayWidth(),
574 getDisplayHeight()};
ramindanibab8ba92021-11-18 01:24:11 +0000575 clientLayer->setDisplayFrame(clientFrame);
576 clientLayer->setZOrder(0);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400577 clientLayer->write(*mWriter);
578 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000579 execute();
580
ramindanidcecfd42022-02-03 23:52:19 +0000581 auto changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800582 if (changedCompositionTypes.size() != 1) {
ramindanibab8ba92021-11-18 01:24:11 +0000583 continue;
584 }
585 // create client target buffer
Ady Abraham46219f52021-12-20 09:44:31 -0800586 ASSERT_EQ(Composition::CLIENT, changedCompositionTypes[0].composition);
Brian Lindahle887a252023-01-17 14:54:19 -0700587 const auto& [graphicBufferStatus, graphicBuffer] = allocateBuffer(clientUsage);
588 ASSERT_TRUE(graphicBufferStatus);
ramindani0a2bee42022-02-10 01:27:42 +0000589 const auto& buffer = graphicBuffer->handle;
ramindanibab8ba92021-11-18 01:24:11 +0000590
591 void* clientBufData;
ramindani0a2bee42022-02-10 01:27:42 +0000592 graphicBuffer->lock(clientUsage, {0, 0, getDisplayWidth(), getDisplayHeight()},
593 &clientBufData);
ramindanibab8ba92021-11-18 01:24:11 +0000594
ramindanidcecfd42022-02-03 23:52:19 +0000595 std::vector<Color> clientColors(
596 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
597 ReadbackHelper::fillColorsArea(clientColors, getDisplayWidth(), clientFrame, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000598 ASSERT_NO_FATAL_FAILURE(ReadbackHelper::fillBuffer(
ramindanidcecfd42022-02-03 23:52:19 +0000599 static_cast<uint32_t>(getDisplayWidth()), static_cast<uint32_t>(getDisplayHeight()),
ramindani0a2bee42022-02-10 01:27:42 +0000600 graphicBuffer->getStride(), clientBufData, clientFormat, clientColors));
ramindanib1144212022-02-10 01:51:24 +0000601 int32_t clientFence;
602 const auto unlockStatus = graphicBuffer->unlockAsync(&clientFence);
603 ASSERT_EQ(::android::OK, unlockStatus);
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400604 mWriter->setClientTarget(getPrimaryDisplayId(), /*slot*/ 0, buffer, clientFence,
605 clientDataspace, std::vector<common::Rect>(1, clientFrame));
606 clientLayer->setToClientComposition(*mWriter);
607 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000608 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000609 changedCompositionTypes = mReader.takeChangedCompositionTypes(getPrimaryDisplayId());
Ady Abraham46219f52021-12-20 09:44:31 -0800610 ASSERT_TRUE(changedCompositionTypes.empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800611 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000612
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400613 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000614 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800615 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000616 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
617 }
618}
619
620TEST_P(GraphicsCompositionTest, SetLayerDamage) {
621 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000622 EXPECT_TRUE(mComposerClient
623 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
624 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000625
ramindani44c952f2022-02-28 23:29:29 +0000626 bool isSupported;
627 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000628 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000629 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
630 return;
631 }
632
ramindanidcecfd42022-02-03 23:52:19 +0000633 common::Rect redRect = {0, 0, getDisplayWidth() / 4, getDisplayHeight() / 4};
ramindanibab8ba92021-11-18 01:24:11 +0000634
ramindanidcecfd42022-02-03 23:52:19 +0000635 std::vector<Color> expectedColors(
636 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
637 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000638
ramindani0a2bee42022-02-10 01:27:42 +0000639 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
640 getPrimaryDisplayId(), getDisplayWidth(),
641 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000642 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000643 layer->setZOrder(10);
Alec Mourif6c039a2023-10-06 23:02:17 +0000644 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +0000645 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
646
647 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
648
ramindanidcecfd42022-02-03 23:52:19 +0000649 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700650 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000651 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
652
653 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800654 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400655 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000656 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000657 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000658 GTEST_SUCCEED();
659 return;
660 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800661 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400662 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000663 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800664 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000665
666 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
667
668 // update surface damage and recheck
ramindanidcecfd42022-02-03 23:52:19 +0000669 redRect = {getDisplayWidth() / 4, getDisplayHeight() / 4, getDisplayWidth() / 2,
670 getDisplayHeight() / 2};
671 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
672 getDisplayWidth());
673 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000674
675 ASSERT_NO_FATAL_FAILURE(layer->fillBuffer(expectedColors));
676 layer->setSurfaceDamage(
ramindanidcecfd42022-02-03 23:52:19 +0000677 std::vector<common::Rect>(1, {0, 0, getDisplayWidth() / 2, getDisplayWidth() / 2}));
ramindanibab8ba92021-11-18 01:24:11 +0000678
679 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
680
681 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800682 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400683 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000684 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800685 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanidcecfd42022-02-03 23:52:19 +0000686 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400687 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000688 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800689 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000690
691 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
692 }
693}
694
695TEST_P(GraphicsCompositionTest, SetLayerPlaneAlpha) {
696 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000697 EXPECT_TRUE(mComposerClient
698 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
699 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000700
ramindani44c952f2022-02-28 23:29:29 +0000701 bool isSupported;
702 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000703 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000704 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
705 return;
706 }
707
ramindanidcecfd42022-02-03 23:52:19 +0000708 auto layer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000709 layer->setColor(RED);
ramindanidcecfd42022-02-03 23:52:19 +0000710 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000711 layer->setZOrder(10);
712 layer->setAlpha(0);
713 layer->setBlendMode(BlendMode::PREMULTIPLIED);
714
715 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
716
ramindanidcecfd42022-02-03 23:52:19 +0000717 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700718 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000719
720 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
721
722 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800723 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400724 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000725 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000726 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000727 GTEST_SUCCEED();
728 return;
729 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800730 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000731
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400732 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000733 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800734 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000735
ramindanidcecfd42022-02-03 23:52:19 +0000736 std::vector<Color> expectedColors(
737 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +0000738
739 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
740 mTestRenderEngine->setRenderLayers(layers);
741 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
742 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
743 }
744}
745
746TEST_P(GraphicsCompositionTest, SetLayerSourceCrop) {
747 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000748 EXPECT_TRUE(mComposerClient
749 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
750 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000751
ramindani44c952f2022-02-28 23:29:29 +0000752 bool isSupported;
753 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000754 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000755 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
756 return;
757 }
758
ramindanidcecfd42022-02-03 23:52:19 +0000759 std::vector<Color> expectedColors(
760 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
761 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
762 {0, 0, getDisplayWidth(), getDisplayHeight() / 4}, RED);
763 ReadbackHelper::fillColorsArea(
764 expectedColors, getDisplayWidth(),
765 {0, getDisplayHeight() / 2, getDisplayWidth(), getDisplayHeight()}, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000766
ramindani0a2bee42022-02-10 01:27:42 +0000767 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
768 getPrimaryDisplayId(), getDisplayWidth(),
769 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000770 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000771 layer->setZOrder(10);
Alec Mourif6c039a2023-10-06 23:02:17 +0000772 layer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanidcecfd42022-02-03 23:52:19 +0000773 layer->setSourceCrop({0, static_cast<float>(getDisplayHeight() / 2),
774 static_cast<float>(getDisplayWidth()),
775 static_cast<float>(getDisplayHeight())});
ramindanibab8ba92021-11-18 01:24:11 +0000776 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(expectedColors));
777
778 std::vector<std::shared_ptr<TestLayer>> layers = {layer};
779
780 // update expected colors to match crop
ramindanidcecfd42022-02-03 23:52:19 +0000781 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
782 {0, 0, getDisplayWidth(), getDisplayHeight()}, BLUE);
783 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700784 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000785 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
786 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800787 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400788 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000789 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000790 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000791 GTEST_SUCCEED();
792 return;
793 }
Ady Abraham3192f3d2021-12-03 16:08:56 -0800794 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400795 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000796 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800797 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000798 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
799 mTestRenderEngine->setRenderLayers(layers);
800 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
801 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
802 }
803}
804
805TEST_P(GraphicsCompositionTest, SetLayerZOrder) {
806 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000807 EXPECT_TRUE(mComposerClient
808 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
809 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +0000810
ramindani44c952f2022-02-28 23:29:29 +0000811 bool isSupported;
812 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +0000813 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +0000814 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
815 return;
816 }
817
ramindanidcecfd42022-02-03 23:52:19 +0000818 common::Rect redRect = {0, 0, getDisplayWidth(), getDisplayHeight() / 2};
819 common::Rect blueRect = {0, getDisplayHeight() / 4, getDisplayWidth(), getDisplayHeight()};
820 auto redLayer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000821 redLayer->setColor(RED);
822 redLayer->setDisplayFrame(redRect);
823
ramindanidcecfd42022-02-03 23:52:19 +0000824 auto blueLayer = std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000825 blueLayer->setColor(BLUE);
826 blueLayer->setDisplayFrame(blueRect);
827 blueLayer->setZOrder(5);
828
829 std::vector<std::shared_ptr<TestLayer>> layers = {redLayer, blueLayer};
ramindanidcecfd42022-02-03 23:52:19 +0000830 std::vector<Color> expectedColors(
831 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +0000832
833 // red in front of blue
834 redLayer->setZOrder(10);
835
836 // fill blue first so that red will overwrite on overlap
ramindanidcecfd42022-02-03 23:52:19 +0000837 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), blueRect, BLUE);
838 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
ramindanibab8ba92021-11-18 01:24:11 +0000839
ramindanidcecfd42022-02-03 23:52:19 +0000840 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700841 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +0000842 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
843
844 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800845 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400846 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000847 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000848 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +0000849 GTEST_SUCCEED();
850 return;
851 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400852 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000853 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800854 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000855
856 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
857
858 redLayer->setZOrder(1);
ramindanidcecfd42022-02-03 23:52:19 +0000859 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
860 getDisplayWidth());
861 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
862 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), blueRect, BLUE);
ramindanibab8ba92021-11-18 01:24:11 +0000863
864 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
865
866 writeLayers(layers);
Ady Abraham3192f3d2021-12-03 16:08:56 -0800867 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400868 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +0000869 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000870 ASSERT_TRUE(mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty());
Ady Abraham3192f3d2021-12-03 16:08:56 -0800871 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400872 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +0000873 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -0800874 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +0000875
876 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
Alec Mourib1f16722022-02-07 13:03:44 -0800883TEST_P(GraphicsCompositionTest, SetLayerBrightnessDims) {
Alec Mouri51067012022-01-06 17:28:39 -0800884 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +0000885 EXPECT_TRUE(mComposerClient
886 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
887 .isOk());
Alec Mouri51067012022-01-06 17:28:39 -0800888
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) {
Alec Mouri51067012022-01-06 17:28:39 -0800892 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace for "
893 "color mode: "
894 << toString(mode);
895 continue;
896 }
ramindanidcecfd42022-02-03 23:52:19 +0000897 const common::Rect redRect = {0, 0, getDisplayWidth(), getDisplayHeight() / 2};
898 const common::Rect dimmerRedRect = {0, getDisplayHeight() / 2, getDisplayWidth(),
899 getDisplayHeight()};
Alec Mouri712b3d92023-09-29 00:21:37 +0000900
901 static constexpr float kMaxBrightnessNits = 300.f;
902
ramindanidcecfd42022-02-03 23:52:19 +0000903 const auto redLayer =
904 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -0800905 redLayer->setColor(RED);
906 redLayer->setDisplayFrame(redRect);
Alec Mouri712b3d92023-09-29 00:21:37 +0000907 redLayer->setWhitePointNits(kMaxBrightnessNits);
Alec Mourib1f16722022-02-07 13:03:44 -0800908 redLayer->setBrightness(1.f);
Alec Mouri51067012022-01-06 17:28:39 -0800909
910 const auto dimmerRedLayer =
ramindanidcecfd42022-02-03 23:52:19 +0000911 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -0800912 dimmerRedLayer->setColor(RED);
913 dimmerRedLayer->setDisplayFrame(dimmerRedRect);
914 // Intentionally use a small dimming ratio as some implementations may be more likely to
915 // kick into GPU composition to apply dithering when the dimming ratio is high.
916 static constexpr float kDimmingRatio = 0.9f;
Alec Mouri712b3d92023-09-29 00:21:37 +0000917 dimmerRedLayer->setWhitePointNits(kMaxBrightnessNits * kDimmingRatio);
Alec Mourib1f16722022-02-07 13:03:44 -0800918 dimmerRedLayer->setBrightness(kDimmingRatio);
Alec Mouri51067012022-01-06 17:28:39 -0800919
920 const std::vector<std::shared_ptr<TestLayer>> layers = {redLayer, dimmerRedLayer};
ramindanidcecfd42022-02-03 23:52:19 +0000921 std::vector<Color> expectedColors(
922 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
Alec Mouri51067012022-01-06 17:28:39 -0800923
ramindanidcecfd42022-02-03 23:52:19 +0000924 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), redRect, RED);
925 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(), dimmerRedRect, DIM_RED);
Alec Mouri51067012022-01-06 17:28:39 -0800926
ramindanidcecfd42022-02-03 23:52:19 +0000927 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -0700928 getDisplayHeight(), mPixelFormat, mDataspace);
Alec Mouri51067012022-01-06 17:28:39 -0800929 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
930
931 writeLayers(layers);
932 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400933 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
Alec Mouri51067012022-01-06 17:28:39 -0800934 execute();
ramindanidcecfd42022-02-03 23:52:19 +0000935 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
Alec Mouri51067012022-01-06 17:28:39 -0800936 GTEST_SUCCEED()
937 << "Readback verification not supported for GPU composition for color mode: "
938 << toString(mode);
939 continue;
940 }
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -0400941 mWriter->presentDisplay(getPrimaryDisplayId());
Alec Mouri51067012022-01-06 17:28:39 -0800942 execute();
943 ASSERT_TRUE(mReader.takeErrors().empty());
944
945 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
946 mTestRenderEngine->setRenderLayers(layers);
947 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
948 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
949 }
950}
951
ramindanibab8ba92021-11-18 01:24:11 +0000952class GraphicsBlendModeCompositionTest
953 : public GraphicsCompositionTestBase,
954 public testing::WithParamInterface<std::tuple<std::string, std::string>> {
955 public:
956 void SetUp() override {
957 SetUpBase(std::get<0>(GetParam()));
ramindanib636af22022-02-10 02:55:56 +0000958 // TODO(b/219590743) we should remove the below SRGB color mode
959 // once we have the BlendMode test fix for all the versions of the ColorMode
ramindania4e76362022-03-02 01:48:06 +0000960 mTestColorModes.erase(
961 std::remove_if(mTestColorModes.begin(), mTestColorModes.end(),
962 [](ColorMode mode) { return mode != ColorMode::SRGB; }),
963 mTestColorModes.end());
ramindanibab8ba92021-11-18 01:24:11 +0000964 mBackgroundColor = BLACK;
965 mTopLayerColor = RED;
966 }
967
968 void setBackgroundColor(Color color) { mBackgroundColor = color; }
969
970 void setTopLayerColor(Color color) { mTopLayerColor = color; }
971
972 void setUpLayers(BlendMode blendMode) {
973 mLayers.clear();
ramindanidcecfd42022-02-03 23:52:19 +0000974 std::vector<Color> topLayerPixelColors(
975 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
976 ReadbackHelper::fillColorsArea(topLayerPixelColors, getDisplayWidth(),
977 {0, 0, getDisplayWidth(), getDisplayHeight()},
978 mTopLayerColor);
ramindanibab8ba92021-11-18 01:24:11 +0000979
ramindanidcecfd42022-02-03 23:52:19 +0000980 auto backgroundLayer =
981 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
982 backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000983 backgroundLayer->setZOrder(0);
984 backgroundLayer->setColor(mBackgroundColor);
985
ramindani0a2bee42022-02-10 01:27:42 +0000986 auto layer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
987 getPrimaryDisplayId(), getDisplayWidth(),
988 getDisplayHeight(), PixelFormat::RGBA_8888);
ramindanidcecfd42022-02-03 23:52:19 +0000989 layer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +0000990 layer->setZOrder(10);
Alec Mourif6c039a2023-10-06 23:02:17 +0000991 layer->setDataspace(Dataspace::UNKNOWN);
ramindanibab8ba92021-11-18 01:24:11 +0000992 ASSERT_NO_FATAL_FAILURE(layer->setBuffer(topLayerPixelColors));
993
994 layer->setBlendMode(blendMode);
995 layer->setAlpha(std::stof(std::get<1>(GetParam())));
996
997 mLayers.push_back(backgroundLayer);
998 mLayers.push_back(layer);
999 }
1000
1001 void setExpectedColors(std::vector<Color>& expectedColors) {
1002 ASSERT_EQ(2, mLayers.size());
ramindanidcecfd42022-02-03 23:52:19 +00001003 ReadbackHelper::clearColors(expectedColors, getDisplayWidth(), getDisplayHeight(),
1004 getDisplayWidth());
ramindanibab8ba92021-11-18 01:24:11 +00001005
1006 auto layer = mLayers[1];
1007 BlendMode blendMode = layer->getBlendMode();
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001008 float alpha = mTopLayerColor.a * layer->getAlpha();
ramindanibab8ba92021-11-18 01:24:11 +00001009 if (blendMode == BlendMode::NONE) {
1010 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001011 expectedColor.r = mTopLayerColor.r * layer->getAlpha();
1012 expectedColor.g = mTopLayerColor.g * layer->getAlpha();
1013 expectedColor.b = mTopLayerColor.b * layer->getAlpha();
1014 expectedColor.a = alpha;
ramindanibab8ba92021-11-18 01:24:11 +00001015 }
1016 } else if (blendMode == BlendMode::PREMULTIPLIED) {
1017 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001018 expectedColor.r =
1019 mTopLayerColor.r * layer->getAlpha() + mBackgroundColor.r * (1.0f - alpha);
1020 expectedColor.g =
1021 mTopLayerColor.g * layer->getAlpha() + mBackgroundColor.g * (1.0f - alpha);
1022 expectedColor.b =
1023 mTopLayerColor.b * layer->getAlpha() + mBackgroundColor.b * (1.0f - alpha);
1024 expectedColor.a = alpha + mBackgroundColor.a * (1.0f - alpha);
ramindanibab8ba92021-11-18 01:24:11 +00001025 }
1026 } else if (blendMode == BlendMode::COVERAGE) {
1027 for (auto& expectedColor : expectedColors) {
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001028 expectedColor.r = mTopLayerColor.r * alpha + mBackgroundColor.r * (1.0f - alpha);
1029 expectedColor.g = mTopLayerColor.g * alpha + mBackgroundColor.g * (1.0f - alpha);
1030 expectedColor.b = mTopLayerColor.b * alpha + mBackgroundColor.b * (1.0f - alpha);
1031 expectedColor.a = mTopLayerColor.a * alpha + mBackgroundColor.a * (1.0f - alpha);
ramindanibab8ba92021-11-18 01:24:11 +00001032 }
1033 }
1034 }
1035
1036 protected:
1037 std::vector<std::shared_ptr<TestLayer>> mLayers;
1038 Color mBackgroundColor;
1039 Color mTopLayerColor;
1040};
ramindanic7585d92022-04-15 18:30:41 +00001041
1042TEST_P(GraphicsBlendModeCompositionTest, None) {
ramindanibab8ba92021-11-18 01:24:11 +00001043 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001044 EXPECT_TRUE(mComposerClient
1045 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1046 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001047
ramindani44c952f2022-02-28 23:29:29 +00001048 bool isSupported;
1049 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001050 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001051 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1052 return;
1053 }
1054
ramindanidcecfd42022-02-03 23:52:19 +00001055 std::vector<Color> expectedColors(
1056 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001057
1058 setBackgroundColor(BLACK);
1059 setTopLayerColor(TRANSLUCENT_RED);
1060 setUpLayers(BlendMode::NONE);
1061 setExpectedColors(expectedColors);
1062
ramindanidcecfd42022-02-03 23:52:19 +00001063 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001064 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001065 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1066 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001067 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001068 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001069 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001070 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001071 GTEST_SUCCEED();
1072 return;
1073 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001074 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001075 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001076 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001077 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001078
1079 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1080 mTestRenderEngine->setRenderLayers(mLayers);
1081 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1082 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1083 }
1084}
1085
ramindani07e6f842022-02-15 15:28:33 +00001086TEST_P(GraphicsBlendModeCompositionTest, Coverage) {
ramindanibab8ba92021-11-18 01:24:11 +00001087 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001088 EXPECT_TRUE(mComposerClient
1089 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1090 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001091
ramindani44c952f2022-02-28 23:29:29 +00001092 bool isSupported;
1093 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001094 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001095 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1096 return;
1097 }
1098
ramindanidcecfd42022-02-03 23:52:19 +00001099 std::vector<Color> expectedColors(
1100 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001101
1102 setBackgroundColor(BLACK);
1103 setTopLayerColor(TRANSLUCENT_RED);
1104
1105 setUpLayers(BlendMode::COVERAGE);
1106 setExpectedColors(expectedColors);
1107
ramindanidcecfd42022-02-03 23:52:19 +00001108 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001109 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001110 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1111 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001112 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001113 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001114 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001115 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001116 GTEST_SUCCEED();
1117 return;
1118 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001119 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001120 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001121 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001122 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001123 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1124 }
1125}
1126
1127TEST_P(GraphicsBlendModeCompositionTest, Premultiplied) {
1128 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001129 EXPECT_TRUE(mComposerClient
1130 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1131 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001132
ramindani44c952f2022-02-28 23:29:29 +00001133 bool isSupported;
1134 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001135 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001136 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1137 return;
1138 }
ramindanibab8ba92021-11-18 01:24:11 +00001139
ramindanidcecfd42022-02-03 23:52:19 +00001140 std::vector<Color> expectedColors(
1141 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
ramindanibab8ba92021-11-18 01:24:11 +00001142
1143 setBackgroundColor(BLACK);
1144 setTopLayerColor(TRANSLUCENT_RED);
1145 setUpLayers(BlendMode::PREMULTIPLIED);
1146 setExpectedColors(expectedColors);
1147
ramindanidcecfd42022-02-03 23:52:19 +00001148 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001149 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001150 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1151 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001152 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001153 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001154 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001155 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001156 GTEST_SUCCEED();
1157 return;
1158 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001159 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001160 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001161 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001162 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001163 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1164 mTestRenderEngine->setRenderLayers(mLayers);
1165 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1166 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1167 }
1168}
1169
1170class GraphicsTransformCompositionTest : public GraphicsCompositionTest {
1171 protected:
1172 void SetUp() override {
1173 GraphicsCompositionTest::SetUp();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001174
ramindanidcecfd42022-02-03 23:52:19 +00001175 auto backgroundLayer =
1176 std::make_shared<TestColorLayer>(mComposerClient, getPrimaryDisplayId());
Ady Abraham1bee7ab2022-01-06 17:22:08 -08001177 backgroundLayer->setColor({0.0f, 0.0f, 0.0f, 0.0f});
ramindanidcecfd42022-02-03 23:52:19 +00001178 backgroundLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
ramindanibab8ba92021-11-18 01:24:11 +00001179 backgroundLayer->setZOrder(0);
1180
ramindanidcecfd42022-02-03 23:52:19 +00001181 mSideLength =
1182 getDisplayWidth() < getDisplayHeight() ? getDisplayWidth() : getDisplayHeight();
ramindanibab8ba92021-11-18 01:24:11 +00001183 common::Rect redRect = {0, 0, mSideLength / 2, mSideLength / 2};
1184 common::Rect blueRect = {mSideLength / 2, mSideLength / 2, mSideLength, mSideLength};
1185
ramindani0a2bee42022-02-10 01:27:42 +00001186 mLayer = std::make_shared<TestBufferLayer>(mComposerClient, *mTestRenderEngine,
1187 getPrimaryDisplayId(), mSideLength, mSideLength,
1188 PixelFormat::RGBA_8888);
ramindanibab8ba92021-11-18 01:24:11 +00001189 mLayer->setDisplayFrame({0, 0, mSideLength, mSideLength});
1190 mLayer->setZOrder(10);
1191
1192 std::vector<Color> baseColors(static_cast<size_t>(mSideLength * mSideLength));
1193 ReadbackHelper::fillColorsArea(baseColors, mSideLength, redRect, RED);
1194 ReadbackHelper::fillColorsArea(baseColors, mSideLength, blueRect, BLUE);
1195 ASSERT_NO_FATAL_FAILURE(mLayer->setBuffer(baseColors));
1196 mLayers = {backgroundLayer, mLayer};
1197 }
1198
1199 protected:
1200 std::shared_ptr<TestBufferLayer> mLayer;
1201 std::vector<std::shared_ptr<TestLayer>> mLayers;
1202 int mSideLength;
1203};
1204
1205TEST_P(GraphicsTransformCompositionTest, FLIP_H) {
1206 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001207 auto status = mComposerClient->setColorMode(getPrimaryDisplayId(), mode,
1208 RenderIntent::COLORIMETRIC);
ramindanid5751092022-04-22 22:30:20 +00001209 if (!status.isOk() && status.getExceptionCode() == EX_SERVICE_SPECIFIC &&
ramindanidcecfd42022-02-03 23:52:19 +00001210 (status.getServiceSpecificError() == IComposerClient::EX_UNSUPPORTED ||
1211 status.getServiceSpecificError() == IComposerClient::EX_BAD_PARAMETER)) {
ramindanibab8ba92021-11-18 01:24:11 +00001212 SUCCEED() << "ColorMode not supported, skip test";
1213 return;
1214 }
1215
ramindani44c952f2022-02-28 23:29:29 +00001216 bool isSupported;
1217 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001218 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001219 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1220 return;
1221 }
ramindanidcecfd42022-02-03 23:52:19 +00001222 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001223 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001224 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1225 mLayer->setTransform(Transform::FLIP_H);
Alec Mourif6c039a2023-10-06 23:02:17 +00001226 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +00001227
ramindanidcecfd42022-02-03 23:52:19 +00001228 std::vector<Color> expectedColors(
1229 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1230 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001231 {mSideLength / 2, 0, mSideLength, mSideLength / 2}, RED);
ramindanidcecfd42022-02-03 23:52:19 +00001232 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001233 {0, mSideLength / 2, mSideLength / 2, mSideLength}, BLUE);
1234
1235 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001236 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001237 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001238 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001239 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001240 GTEST_SUCCEED();
1241 return;
1242 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001243 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001244 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001245 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001246 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001247
1248 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1249 mTestRenderEngine->setRenderLayers(mLayers);
1250 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1251 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1252 }
1253}
1254
1255TEST_P(GraphicsTransformCompositionTest, FLIP_V) {
1256 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001257 EXPECT_TRUE(mComposerClient
1258 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1259 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001260
ramindani44c952f2022-02-28 23:29:29 +00001261 bool isSupported;
1262 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001263 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001264 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1265 return;
1266 }
ramindanidcecfd42022-02-03 23:52:19 +00001267 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001268 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001269 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1270
1271 mLayer->setTransform(Transform::FLIP_V);
Alec Mourif6c039a2023-10-06 23:02:17 +00001272 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +00001273
ramindanidcecfd42022-02-03 23:52:19 +00001274 std::vector<Color> expectedColors(
1275 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1276 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001277 {0, mSideLength / 2, mSideLength / 2, mSideLength}, RED);
ramindanidcecfd42022-02-03 23:52:19 +00001278 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001279 {mSideLength / 2, 0, mSideLength, mSideLength / 2}, BLUE);
1280
1281 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001282 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001283 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001284 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001285 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001286 GTEST_SUCCEED();
1287 return;
1288 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001289 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001290 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001291 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001292 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001293 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1294 mTestRenderEngine->setRenderLayers(mLayers);
1295 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1296 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1297 }
1298}
1299
1300TEST_P(GraphicsTransformCompositionTest, ROT_180) {
1301 for (ColorMode mode : mTestColorModes) {
ramindanidcecfd42022-02-03 23:52:19 +00001302 EXPECT_TRUE(mComposerClient
1303 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1304 .isOk());
ramindanibab8ba92021-11-18 01:24:11 +00001305
ramindani44c952f2022-02-28 23:29:29 +00001306 bool isSupported;
1307 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
ramindanidcecfd42022-02-03 23:52:19 +00001308 if (!isSupported) {
ramindanibab8ba92021-11-18 01:24:11 +00001309 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1310 return;
1311 }
ramindanidcecfd42022-02-03 23:52:19 +00001312 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
Brian Lindahle887a252023-01-17 14:54:19 -07001313 getDisplayHeight(), mPixelFormat, mDataspace);
ramindanibab8ba92021-11-18 01:24:11 +00001314 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1315
1316 mLayer->setTransform(Transform::ROT_180);
Alec Mourif6c039a2023-10-06 23:02:17 +00001317 mLayer->setDataspace(ReadbackHelper::getDataspaceForColorMode(mode));
ramindanibab8ba92021-11-18 01:24:11 +00001318
ramindanidcecfd42022-02-03 23:52:19 +00001319 std::vector<Color> expectedColors(
1320 static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1321 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001322 {mSideLength / 2, mSideLength / 2, mSideLength, mSideLength},
1323 RED);
ramindanidcecfd42022-02-03 23:52:19 +00001324 ReadbackHelper::fillColorsArea(expectedColors, getDisplayWidth(),
ramindanibab8ba92021-11-18 01:24:11 +00001325 {0, 0, mSideLength / 2, mSideLength / 2}, BLUE);
1326
1327 writeLayers(mLayers);
Ady Abraham3192f3d2021-12-03 16:08:56 -08001328 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001329 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
ramindanibab8ba92021-11-18 01:24:11 +00001330 execute();
ramindanidcecfd42022-02-03 23:52:19 +00001331 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
ramindanibab8ba92021-11-18 01:24:11 +00001332 GTEST_SUCCEED();
1333 return;
1334 }
Ady Abraham3192f3d2021-12-03 16:08:56 -08001335 ASSERT_TRUE(mReader.takeErrors().empty());
Leon Scroggins IIIc3d695d2022-09-16 15:34:59 -04001336 mWriter->presentDisplay(getPrimaryDisplayId());
ramindanibab8ba92021-11-18 01:24:11 +00001337 execute();
Ady Abraham3192f3d2021-12-03 16:08:56 -08001338 ASSERT_TRUE(mReader.takeErrors().empty());
ramindanibab8ba92021-11-18 01:24:11 +00001339 ASSERT_NO_FATAL_FAILURE(readbackBuffer.checkReadbackBuffer(expectedColors));
1340 mTestRenderEngine->setRenderLayers(mLayers);
1341 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1342 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->checkColorBuffer(expectedColors));
1343 }
1344}
1345
Alec Mourif6c039a2023-10-06 23:02:17 +00001346class GraphicsColorManagementCompositionTest
1347 : public GraphicsCompositionTestBase,
1348 public testing::WithParamInterface<std::tuple<std::string, Dataspace, Dataspace, Dataspace>> {
1349 public:
1350 void SetUp() override {
1351 SetUpBase(std::get<0>(GetParam()));
1352 // for some reason only sRGB reliably works
1353 mTestColorModes.erase(
1354 std::remove_if(mTestColorModes.begin(), mTestColorModes.end(),
1355 [](ColorMode mode) { return mode != ColorMode::SRGB; }),
1356 mTestColorModes.end());
1357 auto standard = std::get<1>(GetParam());
1358 auto transfer = std::get<2>(GetParam());
1359 auto range = std::get<3>(GetParam());
1360
1361 mLayerDataspace = static_cast<Dataspace>(static_cast<int32_t>(standard) |
1362 static_cast<int32_t>(transfer) |
1363 static_cast<int32_t>(range));
1364 ALOGD("Invoking test for dataspace: {%s, %s, %s}", toString(standard).c_str(),
1365 toString(transfer).c_str(), toString(range).c_str());
1366 }
1367
1368 void makeLayer() {
1369 mLayer = std::make_shared<TestBufferLayer>(
1370 mComposerClient, *mTestRenderEngine, getPrimaryDisplayId(), getDisplayWidth(),
1371 getDisplayHeight(), common::PixelFormat::RGBA_8888);
1372 mLayer->setDisplayFrame({0, 0, getDisplayWidth(), getDisplayHeight()});
1373 mLayer->setZOrder(10);
1374 mLayer->setAlpha(1.f);
1375 mLayer->setDataspace(mLayerDataspace);
1376 }
1377
1378 void fillColor(Color color) {
1379 std::vector<Color> baseColors(static_cast<size_t>(getDisplayWidth() * getDisplayHeight()));
1380 ReadbackHelper::fillColorsArea(baseColors, getDisplayWidth(),
1381 common::Rect{.left = 0,
1382 .top = 0,
1383 .right = getDisplayWidth(),
1384 .bottom = getDisplayHeight()},
1385 color);
1386 ASSERT_NO_FATAL_FAILURE(mLayer->setBuffer(baseColors));
1387 }
1388
1389 Dataspace mLayerDataspace;
1390 std::shared_ptr<TestBufferLayer> mLayer;
1391};
1392
1393TEST_P(GraphicsColorManagementCompositionTest, ColorConversion) {
1394 for (ColorMode mode : mTestColorModes) {
1395 EXPECT_TRUE(mComposerClient
1396 ->setColorMode(getPrimaryDisplayId(), mode, RenderIntent::COLORIMETRIC)
1397 .isOk());
1398
1399 bool isSupported;
1400 ASSERT_NO_FATAL_FAILURE(isSupported = getHasReadbackBuffer());
1401 if (!isSupported) {
1402 GTEST_SUCCEED() << "Readback not supported or unsupported pixelFormat/dataspace";
1403 return;
1404 }
1405
1406 mClientCompositionDisplaySettings.outputDataspace =
1407 static_cast<::android::ui::Dataspace>(mDataspace);
1408 mTestRenderEngine->setDisplaySettings(mClientCompositionDisplaySettings);
1409
1410 makeLayer();
1411 for (auto color : {LIGHT_RED, LIGHT_GREEN, LIGHT_BLUE}) {
1412 ALOGD("Testing color: %f, %f, %f, %f with color mode: %d", color.r, color.g, color.b,
1413 color.a, mode);
1414 ReadbackBuffer readbackBuffer(getPrimaryDisplayId(), mComposerClient, getDisplayWidth(),
1415 getDisplayHeight(), mPixelFormat, mDataspace);
1416 ASSERT_NO_FATAL_FAILURE(readbackBuffer.setReadbackBuffer());
1417 fillColor(color);
1418 writeLayers({mLayer});
1419 EXPECT_TRUE(mComposerClient->setPowerMode(getPrimaryDisplayId(), PowerMode::ON).isOk());
1420
1421 ASSERT_TRUE(mReader.takeErrors().empty());
1422 mWriter->validateDisplay(getPrimaryDisplayId(), ComposerClientWriter::kNoTimestamp);
1423 execute();
1424 if (!mReader.takeChangedCompositionTypes(getPrimaryDisplayId()).empty()) {
1425 continue;
1426 }
1427 ASSERT_TRUE(mReader.takeErrors().empty());
1428 mWriter->presentDisplay(getPrimaryDisplayId());
1429 execute();
1430 ASSERT_TRUE(mReader.takeErrors().empty());
1431
1432 mTestRenderEngine->setRenderLayers({mLayer});
1433 ASSERT_NO_FATAL_FAILURE(mTestRenderEngine->drawLayers());
1434 ASSERT_NO_FATAL_FAILURE(
1435 mTestRenderEngine->checkColorBuffer(readbackBuffer.getBuffer()));
1436 }
1437 }
1438}
1439
ramindanibab8ba92021-11-18 01:24:11 +00001440GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsCompositionTest);
1441INSTANTIATE_TEST_SUITE_P(
1442 PerInstance, GraphicsCompositionTest,
1443 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
1444 ::android::PrintInstanceNameToString);
1445
1446GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsBlendModeCompositionTest);
1447INSTANTIATE_TEST_SUITE_P(BlendMode, GraphicsBlendModeCompositionTest,
1448 testing::Combine(testing::ValuesIn(::android::getAidlHalInstanceNames(
1449 IComposer::descriptor)),
1450 testing::Values("0.2", "1.0")));
1451
1452GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsTransformCompositionTest);
1453INSTANTIATE_TEST_SUITE_P(
1454 PerInstance, GraphicsTransformCompositionTest,
1455 testing::ValuesIn(::android::getAidlHalInstanceNames(IComposer::descriptor)),
1456 ::android::PrintInstanceNameToString);
1457
Alec Mourif6c039a2023-10-06 23:02:17 +00001458GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GraphicsColorManagementCompositionTest);
1459INSTANTIATE_TEST_SUITE_P(PerInstance, GraphicsColorManagementCompositionTest,
1460 testing::Combine(testing::ValuesIn(::android::getAidlHalInstanceNames(
1461 IComposer::descriptor)),
1462 // Only check sRGB, but verify that extended range
1463 // doesn't trigger any gamma shifts
1464 testing::Values(Dataspace::STANDARD_BT709),
1465 testing::Values(Dataspace::TRANSFER_SRGB),
1466 // Don't test limited range until we send YUV overlays
1467 testing::Values(Dataspace::RANGE_FULL,
1468 Dataspace::RANGE_EXTENDED)));
1469
ramindanibab8ba92021-11-18 01:24:11 +00001470} // namespace
Ady Abraham3192f3d2021-12-03 16:08:56 -08001471} // namespace aidl::android::hardware::graphics::composer3::vts