blob: 33408574724e38073760d1b42b56d037a281ba1c [file] [log] [blame]
Alec Mouri6e57f682018-09-29 20:45:08 -07001/*
2 * Copyright 2018 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
Ana Krulec82ba2ec2020-11-21 13:33:20 -080017#undef LOG_TAG
18#define LOG_TAG "RenderEngineTest"
19
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080020// TODO(b/129481165): remove the #pragma below and fix conversion issues
21#pragma clang diagnostic push
22#pragma clang diagnostic ignored "-Wconversion"
Marin Shalamanovbed7fd32020-12-21 20:02:20 +010023#pragma clang diagnostic ignored "-Wextra"
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080024
Lucas Dupin19c8f0e2019-11-25 17:55:44 -080025#include <cutils/properties.h>
Ana Krulec9bc9dc62020-02-26 12:16:40 -080026#include <gtest/gtest.h>
Alec Mouria90a5702021-04-16 16:36:21 +000027#include <renderengine/ExternalTexture.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070028#include <renderengine/RenderEngine.h>
Vishnu Nairdbbe3852022-01-12 20:22:11 -080029#include <renderengine/impl/ExternalTexture.h>
Alec Mouri1089aed2018-10-25 21:33:57 -070030#include <sync/sync.h>
Alec Mouri4049b532021-10-15 20:59:33 -070031#include <system/graphics-base-v1.0.h>
32#include <tonemap/tonemap.h>
33#include <ui/ColorSpace.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070034#include <ui/PixelFormat.h>
Alec Mouric0aae732021-01-12 13:32:18 -080035
36#include <chrono>
37#include <condition_variable>
38#include <fstream>
39
Alec Mourid43ccab2019-03-13 12:23:45 -070040#include "../gl/GLESRenderEngine.h"
Alec Mouric0aae732021-01-12 13:32:18 -080041#include "../skia/SkiaGLRenderEngine.h"
Ana Krulec9bc9dc62020-02-26 12:16:40 -080042#include "../threaded/RenderEngineThreaded.h"
Alec Mouri6e57f682018-09-29 20:45:08 -070043
Alec Mouri1089aed2018-10-25 21:33:57 -070044constexpr int DEFAULT_DISPLAY_WIDTH = 128;
45constexpr int DEFAULT_DISPLAY_HEIGHT = 256;
46constexpr int DEFAULT_DISPLAY_OFFSET = 64;
Vishnu Nair16efdbf2019-12-10 11:55:42 -080047constexpr bool WRITE_BUFFER_TO_FILE_ON_FAILURE = false;
Alec Mouri1089aed2018-10-25 21:33:57 -070048
Alec Mouri6e57f682018-09-29 20:45:08 -070049namespace android {
Derek Sollenbergerd3f60652021-06-11 15:34:36 -040050namespace renderengine {
Alec Mouri6e57f682018-09-29 20:45:08 -070051
Alec Mouri5a493722022-01-26 16:43:02 -080052namespace {
53
54double EOTF_PQ(double channel) {
55 float m1 = (2610.0 / 4096.0) / 4.0;
56 float m2 = (2523.0 / 4096.0) * 128.0;
57 float c1 = (3424.0 / 4096.0);
58 float c2 = (2413.0 / 4096.0) * 32.0;
59 float c3 = (2392.0 / 4096.0) * 32.0;
60
61 float tmp = std::pow(std::clamp(channel, 0.0, 1.0), 1.0 / m2);
62 tmp = std::fmax(tmp - c1, 0.0) / (c2 - c3 * tmp);
63 return std::pow(tmp, 1.0 / m1);
64}
65
66vec3 EOTF_PQ(vec3 color) {
67 return vec3(EOTF_PQ(color.r), EOTF_PQ(color.g), EOTF_PQ(color.b));
68}
69
70double EOTF_HLG(double channel) {
71 const float a = 0.17883277;
72 const float b = 0.28466892;
73 const float c = 0.55991073;
74 return channel <= 0.5 ? channel * channel / 3.0 : (exp((channel - c) / a) + b) / 12.0;
75}
76
77vec3 EOTF_HLG(vec3 color) {
78 return vec3(EOTF_HLG(color.r), EOTF_HLG(color.g), EOTF_HLG(color.b));
79}
80
81double OETF_sRGB(double channel) {
82 return channel <= 0.0031308 ? channel * 12.92 : (pow(channel, 1.0 / 2.4) * 1.055) - 0.055;
83}
84
85int sign(float in) {
86 return in >= 0.0 ? 1 : -1;
87}
88
89vec3 OETF_sRGB(vec3 linear) {
90 return vec3(sign(linear.r) * OETF_sRGB(linear.r), sign(linear.g) * OETF_sRGB(linear.g),
91 sign(linear.b) * OETF_sRGB(linear.b));
92}
93
Alec Mouri9bcd1d12022-04-21 22:16:56 +000094// clang-format off
95// Converts red channels to green channels, and zeroes out an existing green channel.
96static const auto kRemoveGreenAndMoveRedToGreenMat4 = mat4(0, 1, 0, 0,
97 0, 0, 0, 0,
98 0, 0, 1, 0,
99 0, 0, 0, 1);
100// clang-format on
101
Alec Mouri5a493722022-01-26 16:43:02 -0800102} // namespace
103
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800104class RenderEngineFactory {
105public:
106 virtual ~RenderEngineFactory() = default;
107
108 virtual std::string name() = 0;
Alec Mouric0aae732021-01-12 13:32:18 -0800109 virtual renderengine::RenderEngine::RenderEngineType type() = 0;
110 virtual std::unique_ptr<renderengine::RenderEngine> createRenderEngine() = 0;
111 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
112 return nullptr;
113 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400114 virtual bool useColorManagement() const = 0;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800115};
116
117class GLESRenderEngineFactory : public RenderEngineFactory {
118public:
119 std::string name() override { return "GLESRenderEngineFactory"; }
120
Alec Mouric0aae732021-01-12 13:32:18 -0800121 renderengine::RenderEngine::RenderEngineType type() {
122 return renderengine::RenderEngine::RenderEngineType::GLES;
123 }
124
125 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
126 return createGLESRenderEngine();
127 }
128
129 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800130 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -0700131 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800132 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
133 .setImageCacheSize(1)
134 .setUseColorManagerment(false)
135 .setEnableProtectedContext(false)
136 .setPrecacheToneMapperShaderOnly(false)
137 .setSupportsBackgroundBlur(true)
138 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800139 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700140 .setUseColorManagerment(useColorManagement())
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800141 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800142 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -0700143 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400144
145 bool useColorManagement() const override { return false; }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800146};
Alec Mourid43ccab2019-03-13 12:23:45 -0700147
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800148class GLESCMRenderEngineFactory : public RenderEngineFactory {
149public:
150 std::string name() override { return "GLESCMRenderEngineFactory"; }
151
Alec Mouric0aae732021-01-12 13:32:18 -0800152 renderengine::RenderEngine::RenderEngineType type() {
153 return renderengine::RenderEngine::RenderEngineType::GLES;
154 }
155
156 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
157 return createGLESRenderEngine();
158 }
159
160 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() override {
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800161 renderengine::RenderEngineCreationArgs reCreationArgs =
162 renderengine::RenderEngineCreationArgs::Builder()
163 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
164 .setImageCacheSize(1)
165 .setEnableProtectedContext(false)
166 .setPrecacheToneMapperShaderOnly(false)
167 .setSupportsBackgroundBlur(true)
168 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800169 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700170 .setUseColorManagerment(useColorManagement())
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800171 .build();
172 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
173 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400174
175 bool useColorManagement() const override { return true; }
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800176};
177
Alec Mouri0eab3e82020-12-08 18:10:27 -0800178class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
179public:
Alec Mouric0aae732021-01-12 13:32:18 -0800180 std::string name() override { return "SkiaGLRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800181
Alec Mouric0aae732021-01-12 13:32:18 -0800182 renderengine::RenderEngine::RenderEngineType type() {
183 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
184 }
185
186 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800187 renderengine::RenderEngineCreationArgs reCreationArgs =
188 renderengine::RenderEngineCreationArgs::Builder()
189 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
190 .setImageCacheSize(1)
191 .setEnableProtectedContext(false)
192 .setPrecacheToneMapperShaderOnly(false)
193 .setSupportsBackgroundBlur(true)
194 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800195 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700196 .setUseColorManagerment(useColorManagement())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800197 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800198 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800199 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400200
Alec Mourid2bcbae2021-06-28 17:02:17 -0700201 bool useColorManagement() const override { return false; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800202};
203
204class SkiaGLESCMRenderEngineFactory : public RenderEngineFactory {
205public:
Alec Mouric0aae732021-01-12 13:32:18 -0800206 std::string name() override { return "SkiaGLCMRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800207
Alec Mouric0aae732021-01-12 13:32:18 -0800208 renderengine::RenderEngine::RenderEngineType type() {
209 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
210 }
211
212 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800213 renderengine::RenderEngineCreationArgs reCreationArgs =
214 renderengine::RenderEngineCreationArgs::Builder()
215 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
216 .setImageCacheSize(1)
217 .setEnableProtectedContext(false)
218 .setPrecacheToneMapperShaderOnly(false)
219 .setSupportsBackgroundBlur(true)
220 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800221 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700222 .setUseColorManagerment(useColorManagement())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800223 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800224 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800225 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400226
227 bool useColorManagement() const override { return true; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800228};
229
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800230class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
231public:
Alec Mouria90a5702021-04-16 16:36:21 +0000232 std::shared_ptr<renderengine::ExternalTexture> allocateDefaultBuffer() {
233 return std::make_shared<
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800234 renderengine::impl::
Alec Mouria90a5702021-04-16 16:36:21 +0000235 ExternalTexture>(new GraphicBuffer(DEFAULT_DISPLAY_WIDTH,
236 DEFAULT_DISPLAY_HEIGHT,
237 HAL_PIXEL_FORMAT_RGBA_8888, 1,
238 GRALLOC_USAGE_SW_READ_OFTEN |
239 GRALLOC_USAGE_SW_WRITE_OFTEN |
240 GRALLOC_USAGE_HW_RENDER |
241 GRALLOC_USAGE_HW_TEXTURE,
242 "output"),
243 *mRE,
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800244 renderengine::impl::ExternalTexture::Usage::READABLE |
245 renderengine::impl::ExternalTexture::Usage::
246 WRITEABLE);
Alec Mouri6e57f682018-09-29 20:45:08 -0700247 }
248
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800249 // Allocates a 1x1 buffer to fill with a solid color
Alec Mouria90a5702021-04-16 16:36:21 +0000250 std::shared_ptr<renderengine::ExternalTexture> allocateSourceBuffer(uint32_t width,
251 uint32_t height) {
252 return std::make_shared<
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800253 renderengine::impl::
Alec Mouria90a5702021-04-16 16:36:21 +0000254 ExternalTexture>(new GraphicBuffer(width, height,
255 HAL_PIXEL_FORMAT_RGBA_8888, 1,
256 GRALLOC_USAGE_SW_READ_OFTEN |
257 GRALLOC_USAGE_SW_WRITE_OFTEN |
258 GRALLOC_USAGE_HW_TEXTURE,
259 "input"),
260 *mRE,
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800261 renderengine::impl::ExternalTexture::Usage::READABLE |
262 renderengine::impl::ExternalTexture::Usage::
263 WRITEABLE);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800264 }
265
Alec Mouricdf6cbc2021-11-01 17:21:15 -0700266 std::shared_ptr<renderengine::ExternalTexture> allocateAndFillSourceBuffer(uint32_t width,
267 uint32_t height,
268 ubyte4 color) {
269 const auto buffer = allocateSourceBuffer(width, height);
270 uint8_t* pixels;
271 buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
272 reinterpret_cast<void**>(&pixels));
Leon Scroggins III2c1d9ef2022-01-21 13:46:56 -0500273 for (uint32_t j = 0; j < height; j++) {
274 uint8_t* dst = pixels + (buffer->getBuffer()->getStride() * j * 4);
275 for (uint32_t i = 0; i < width; i++) {
276 dst[0] = color.r;
277 dst[1] = color.g;
278 dst[2] = color.b;
279 dst[3] = color.a;
280 dst += 4;
281 }
282 }
Alec Mouricdf6cbc2021-11-01 17:21:15 -0700283 buffer->getBuffer()->unlock();
284 return buffer;
285 }
286
Leon Scroggins III2c1d9ef2022-01-21 13:46:56 -0500287 std::shared_ptr<renderengine::ExternalTexture> allocateR8Buffer(int width, int height) {
288 auto buffer = new GraphicBuffer(width, height, android::PIXEL_FORMAT_R_8, 1,
289 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
290 GRALLOC_USAGE_HW_TEXTURE,
291 "r8");
292 if (buffer->initCheck() != 0) {
293 // Devices are not required to support R8.
294 return nullptr;
295 }
296 return std::make_shared<
297 renderengine::impl::ExternalTexture>(std::move(buffer), *mRE,
298 renderengine::impl::ExternalTexture::Usage::
299 READABLE);
300 }
301
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800302 RenderEngineTest() {
303 const ::testing::TestInfo* const test_info =
304 ::testing::UnitTest::GetInstance()->current_test_info();
305 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800306 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700307
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800308 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800309 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
310 writeBufferToFile("/data/texture_out_");
311 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800312 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800313 mRE->deleteTextures(1, &texName);
Alec Mouric0aae732021-01-12 13:32:18 -0800314 if (mGLESRE != nullptr) {
315 EXPECT_FALSE(mGLESRE->isTextureNameKnownForTesting(texName));
316 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800317 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800318 const ::testing::TestInfo* const test_info =
319 ::testing::UnitTest::GetInstance()->current_test_info();
320 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800321 }
322
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800323 void writeBufferToFile(const char* basename) {
324 std::string filename(basename);
325 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
326 filename.append(".ppm");
327 std::ofstream file(filename.c_str(), std::ios::binary);
328 if (!file.is_open()) {
329 ALOGE("Unable to open file: %s", filename.c_str());
330 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
331 "surfaceflinger to write debug images");
332 return;
333 }
334
Alec Mouri1089aed2018-10-25 21:33:57 -0700335 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000336 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
337 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700338
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800339 file << "P6\n";
Alec Mouria90a5702021-04-16 16:36:21 +0000340 file << mBuffer->getBuffer()->getWidth() << "\n";
341 file << mBuffer->getBuffer()->getHeight() << "\n";
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800342 file << 255 << "\n";
343
Alec Mouria90a5702021-04-16 16:36:21 +0000344 std::vector<uint8_t> outBuffer(mBuffer->getBuffer()->getWidth() *
345 mBuffer->getBuffer()->getHeight() * 3);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800346 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
347
Alec Mouria90a5702021-04-16 16:36:21 +0000348 for (int32_t j = 0; j < mBuffer->getBuffer()->getHeight(); j++) {
349 const uint8_t* src = pixels + (mBuffer->getBuffer()->getStride() * j) * 4;
350 for (int32_t i = 0; i < mBuffer->getBuffer()->getWidth(); i++) {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800351 // Only copy R, G and B components
352 outPtr[0] = src[0];
353 outPtr[1] = src[1];
354 outPtr[2] = src[2];
355 outPtr += 3;
356
357 src += 4;
358 }
359 }
360 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
Alec Mouria90a5702021-04-16 16:36:21 +0000361 mBuffer->getBuffer()->unlock();
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800362 }
363
364 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
365 size_t c;
366 Rect const* rect = region.getArray(&c);
367 for (size_t i = 0; i < c; i++, rect++) {
368 expectBufferColor(*rect, r, g, b, a);
369 }
370 }
371
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -0400372 void expectBufferColor(const Point& point, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
373 uint8_t tolerance = 0) {
374 expectBufferColor(Rect(point.x, point.y, point.x + 1, point.y + 1), r, g, b, a, tolerance);
375 }
376
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800377 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
378 uint8_t tolerance = 0) {
Alec Mouri4049b532021-10-15 20:59:33 -0700379 auto generator = [=](Point) { return ubyte4(r, g, b, a); };
380 expectBufferColor(rect, generator, tolerance);
381 }
382
383 using ColorGenerator = std::function<ubyte4(Point location)>;
384
385 void expectBufferColor(const Rect& rect, ColorGenerator generator, uint8_t tolerance = 0) {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800386 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
387 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
388 uint8_t tmp = a >= b ? a - b : b - a;
389 return tmp <= tolerance;
390 };
391 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700392 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800393
Alec Mouri4049b532021-10-15 20:59:33 -0700394 expectBufferColor(rect, generator, colorCompare);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800395 }
396
Alec Mouri4049b532021-10-15 20:59:33 -0700397 void expectBufferColor(const Rect& region, ColorGenerator generator,
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800398 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
399 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000400 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
401 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700402 int32_t maxFails = 10;
403 int32_t fails = 0;
404 for (int32_t j = 0; j < region.getHeight(); j++) {
Alec Mouria90a5702021-04-16 16:36:21 +0000405 const uint8_t* src = pixels +
406 (mBuffer->getBuffer()->getStride() * (region.top + j) + region.left) * 4;
Alec Mouri1089aed2018-10-25 21:33:57 -0700407 for (int32_t i = 0; i < region.getWidth(); i++) {
Alec Mouri4049b532021-10-15 20:59:33 -0700408 const auto location = Point(region.left + i, region.top + j);
409 const ubyte4 colors = generator(location);
410 const uint8_t expected[4] = {colors.r, colors.g, colors.b, colors.a};
411 bool colorMatches = colorCompare(src, expected);
412 EXPECT_TRUE(colorMatches)
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400413 << GetParam()->name().c_str() << ": "
Alec Mouri4049b532021-10-15 20:59:33 -0700414 << "pixel @ (" << location.x << ", " << location.y << "): "
415 << "expected (" << static_cast<uint32_t>(colors.r) << ", "
416 << static_cast<uint32_t>(colors.g) << ", "
417 << static_cast<uint32_t>(colors.b) << ", "
418 << static_cast<uint32_t>(colors.a) << "), "
Alec Mouri1089aed2018-10-25 21:33:57 -0700419 << "got (" << static_cast<uint32_t>(src[0]) << ", "
420 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
421 << ", " << static_cast<uint32_t>(src[3]) << ")";
422 src += 4;
Alec Mouri4049b532021-10-15 20:59:33 -0700423 if (!colorMatches && ++fails >= maxFails) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700424 break;
425 }
426 }
427 if (fails >= maxFails) {
428 break;
429 }
430 }
Alec Mouria90a5702021-04-16 16:36:21 +0000431 mBuffer->getBuffer()->unlock();
Alec Mouri1089aed2018-10-25 21:33:57 -0700432 }
433
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800434 void expectAlpha(const Rect& rect, uint8_t a) {
Alec Mouri4049b532021-10-15 20:59:33 -0700435 auto generator = [=](Point) { return ubyte4(0, 0, 0, a); };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800436 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
437 return colorA[3] == colorB[3];
438 };
Alec Mouri4049b532021-10-15 20:59:33 -0700439 expectBufferColor(rect, generator, colorCompare);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800440 }
441
442 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
443 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
444 const ubyte4& backgroundColor) {
445 const Rect casterRect(castingLayer.geometry.boundaries);
446 Region casterRegion = Region(casterRect);
447 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
448 if (casterCornerRadius > 0.0f) {
449 // ignore the corners if a corner radius is set
450 Rect cornerRect(casterCornerRadius, casterCornerRadius);
451 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
452 casterRegion.subtractSelf(
453 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
454 casterRegion.subtractSelf(
455 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
456 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
457 casterRect.bottom - casterCornerRadius));
458 }
459
460 const float shadowInset = shadow.length * -1.0f;
461 const Rect casterWithShadow =
462 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
463 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
464 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
465
466 // verify casting layer
467 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
468
469 // verify shadows by testing just the alpha since its difficult to validate the shadow color
470 size_t c;
471 Rect const* r = shadowRegion.getArray(&c);
472 for (size_t i = 0; i < c; i++, r++) {
473 expectAlpha(*r, 255);
474 }
475
476 // verify background
477 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
478 backgroundColor.a);
479 }
480
Alec Mouribd17b3b2020-12-17 11:08:30 -0800481 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
482 const renderengine::ShadowSettings& shadow,
483 const ubyte4& backgroundColor) {
484 const float shadowInset = shadow.length * -1.0f;
485 const Rect casterRect(casterBounds);
486 const Rect shadowRect =
487 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
488
489 const Region backgroundRegion =
490 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
491
492 expectAlpha(shadowRect, 255);
493 // (0, 0, 0) fill on the bounds of the layer should be ignored.
494 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
495
496 // verify background
497 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
498 backgroundColor.a);
499 }
500
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800501 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
502 bool casterIsTranslucent) {
503 renderengine::ShadowSettings shadow;
504 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
505 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
506 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
507 shadow.lightRadius = 0.0f;
508 shadow.length = shadowLength;
509 shadow.casterIsTranslucent = casterIsTranslucent;
510 return shadow;
511 }
512
Alec Mouri1089aed2018-10-25 21:33:57 -0700513 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
514
515 static Rect offsetRect() {
516 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
517 DEFAULT_DISPLAY_HEIGHT);
518 }
519
520 static Rect offsetRectAtZero() {
521 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
522 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
523 }
524
Sally Qi59a9f502021-10-12 18:53:23 +0000525 void invokeDraw(const renderengine::DisplaySettings& settings,
526 const std::vector<renderengine::LayerSettings>& layers) {
Sally Qi4cabdd02021-08-05 16:45:57 -0700527 std::future<renderengine::RenderEngineResult> result =
528 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd());
Sally Qi59a9f502021-10-12 18:53:23 +0000529
Sally Qi4cabdd02021-08-05 16:45:57 -0700530 ASSERT_TRUE(result.valid());
531 auto [status, fence] = result.get();
Alec Mouri1089aed2018-10-25 21:33:57 -0700532
Derek Sollenbergerec411212021-08-25 10:54:47 -0400533 ASSERT_EQ(NO_ERROR, status);
534 if (fence.ok()) {
535 sync_wait(fence.get(), -1);
Alec Mouri1089aed2018-10-25 21:33:57 -0700536 }
537
Alec Mouric0aae732021-01-12 13:32:18 -0800538 if (layers.size() > 0 && mGLESRE != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000539 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700540 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700541 }
542
Alec Mourid43ccab2019-03-13 12:23:45 -0700543 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700544 renderengine::DisplaySettings settings;
Sally Qi59a9f502021-10-12 18:53:23 +0000545 std::vector<renderengine::LayerSettings> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800546 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700547 }
548
Alec Mouri1089aed2018-10-25 21:33:57 -0700549 template <typename SourceVariant>
550 void fillBuffer(half r, half g, half b, half a);
551
552 template <typename SourceVariant>
553 void fillRedBuffer();
554
555 template <typename SourceVariant>
556 void fillGreenBuffer();
557
558 template <typename SourceVariant>
559 void fillBlueBuffer();
560
561 template <typename SourceVariant>
562 void fillRedTransparentBuffer();
563
564 template <typename SourceVariant>
565 void fillRedOffsetBuffer();
566
567 template <typename SourceVariant>
568 void fillBufferPhysicalOffset();
569
570 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700571 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700572
573 template <typename SourceVariant>
574 void fillBufferCheckersRotate0();
575
576 template <typename SourceVariant>
577 void fillBufferCheckersRotate90();
578
579 template <typename SourceVariant>
580 void fillBufferCheckersRotate180();
581
582 template <typename SourceVariant>
583 void fillBufferCheckersRotate270();
584
585 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800586 void fillBufferWithLayerTransform();
587
588 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700589 void fillBufferLayerTransform();
590
591 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800592 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800593
594 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700595 void fillBufferColorTransform();
596
Alec Mouri7c94edb2018-12-03 21:23:26 -0800597 template <typename SourceVariant>
Sally Qi2019fd22021-11-22 10:19:04 -0800598 void fillBufferWithColorTransformAndSourceDataspace(const ui::Dataspace sourceDataspace);
599
600 template <typename SourceVariant>
601 void fillBufferColorTransformAndSourceDataspace();
602
603 template <typename SourceVariant>
604 void fillBufferWithColorTransformAndOutputDataspace(const ui::Dataspace outputDataspace);
605
606 template <typename SourceVariant>
607 void fillBufferColorTransformAndOutputDataspace();
608
609 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800610 void fillBufferWithColorTransformZeroLayerAlpha();
611
612 template <typename SourceVariant>
613 void fillBufferColorTransformZeroLayerAlpha();
614
615 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800616 void fillRedBufferWithRoundedCorners();
617
618 template <typename SourceVariant>
619 void fillBufferWithRoundedCorners();
620
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000621 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800622 void fillBufferAndBlurBackground();
623
624 template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700625 void fillSmallLayerAndBlurBackground();
626
627 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000628 void overlayCorners();
629
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800630 void fillRedBufferTextureTransform();
631
632 void fillBufferTextureTransform();
633
634 void fillRedBufferWithPremultiplyAlpha();
635
636 void fillBufferWithPremultiplyAlpha();
637
638 void fillRedBufferWithoutPremultiplyAlpha();
639
640 void fillBufferWithoutPremultiplyAlpha();
641
Alec Mouriac335532018-11-12 15:01:33 -0800642 void fillGreenColorBufferThenClearRegion();
643
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800644 template <typename SourceVariant>
645 void drawShadow(const renderengine::LayerSettings& castingLayer,
646 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
647 const ubyte4& backgroundColor);
648
Alec Mouribd17b3b2020-12-17 11:08:30 -0800649 void drawShadowWithoutCaster(const FloatRect& castingBounds,
650 const renderengine::ShadowSettings& shadow,
651 const ubyte4& backgroundColor);
652
Alec Mouri5a493722022-01-26 16:43:02 -0800653 // Tonemaps grey values from sourceDataspace -> Display P3 and checks that GPU and CPU
654 // implementations are identical Also implicitly checks that the injected tonemap shader
655 // compiles
656 void tonemap(ui::Dataspace sourceDataspace, std::function<vec3(vec3)> eotf,
657 std::function<vec3(vec3, float)> scaleOotf);
658
Alec Mouric0aae732021-01-12 13:32:18 -0800659 void initializeRenderEngine();
660
661 std::unique_ptr<renderengine::RenderEngine> mRE;
Alec Mouria90a5702021-04-16 16:36:21 +0000662 std::shared_ptr<renderengine::ExternalTexture> mBuffer;
Alec Mouric0aae732021-01-12 13:32:18 -0800663 // GLESRenderEngine for testing GLES-specific behavior.
664 // Owened by mRE, but this is downcasted.
665 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800666
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800667 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700668};
669
Alec Mouric0aae732021-01-12 13:32:18 -0800670void RenderEngineTest::initializeRenderEngine() {
671 const auto& renderEngineFactory = GetParam();
672 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
673 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
674 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
675 // every time.
676 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
677 renderEngineFactory->createGLESRenderEngine();
678 mGLESRE = renderEngine.get();
679 mRE = std::move(renderEngine);
680 } else {
681 mRE = renderEngineFactory->createRenderEngine();
682 }
Alec Mouria90a5702021-04-16 16:36:21 +0000683 mBuffer = allocateDefaultBuffer();
Alec Mouric0aae732021-01-12 13:32:18 -0800684}
685
Alec Mouri1089aed2018-10-25 21:33:57 -0700686struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800687 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800688 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700689 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800690 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700691 }
692};
693
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800694struct RelaxOpaqueBufferVariant {
695 static void setOpaqueBit(renderengine::LayerSettings& layer) {
696 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800697 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800698 }
699
700 static uint8_t getAlphaChannel() { return 255; }
701};
702
703struct ForceOpaqueBufferVariant {
704 static void setOpaqueBit(renderengine::LayerSettings& layer) {
705 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800706 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800707 }
708
709 static uint8_t getAlphaChannel() {
710 // The isOpaque bit will override the alpha channel, so this should be
711 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800712 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800713 }
714};
715
716template <typename OpaquenessVariant>
717struct BufferSourceVariant {
718 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800719 RenderEngineTest* fixture) {
Alec Mouria90a5702021-04-16 16:36:21 +0000720 const auto buf = fixture->allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800721 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800722 fixture->mRE->genTextures(1, &texName);
723 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800724
725 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000726 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
727 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800728
Alec Mouria90a5702021-04-16 16:36:21 +0000729 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
730 uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
731 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800732 iter[0] = uint8_t(r * 255);
733 iter[1] = uint8_t(g * 255);
734 iter[2] = uint8_t(b * 255);
735 iter[3] = OpaquenessVariant::getAlphaChannel();
736 iter += 4;
737 }
738 }
739
Alec Mouria90a5702021-04-16 16:36:21 +0000740 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800741
742 layer.source.buffer.buffer = buf;
743 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800744 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800745 OpaquenessVariant::setOpaqueBit(layer);
746 }
747};
748
Alec Mouri1089aed2018-10-25 21:33:57 -0700749template <typename SourceVariant>
750void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
751 renderengine::DisplaySettings settings;
752 settings.physicalDisplay = fullscreenRect();
753 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800754 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700755
Sally Qi59a9f502021-10-12 18:53:23 +0000756 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700757
758 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800759 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700760 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800761 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700762 layer.alpha = a;
763
Sally Qi59a9f502021-10-12 18:53:23 +0000764 layers.push_back(layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700765
Alec Mouric0aae732021-01-12 13:32:18 -0800766 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700767}
768
769template <typename SourceVariant>
770void RenderEngineTest::fillRedBuffer() {
771 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
772 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
773}
774
775template <typename SourceVariant>
776void RenderEngineTest::fillGreenBuffer() {
777 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
778 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
779}
780
781template <typename SourceVariant>
782void RenderEngineTest::fillBlueBuffer() {
783 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
784 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
785}
786
787template <typename SourceVariant>
788void RenderEngineTest::fillRedTransparentBuffer() {
789 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
790 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
791}
792
793template <typename SourceVariant>
794void RenderEngineTest::fillRedOffsetBuffer() {
795 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800796 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700797 settings.physicalDisplay = offsetRect();
798 settings.clip = offsetRectAtZero();
799
Sally Qi59a9f502021-10-12 18:53:23 +0000800 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700801
802 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800803 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700804 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800805 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700806 layer.alpha = 1.0f;
807
Sally Qi59a9f502021-10-12 18:53:23 +0000808 layers.push_back(layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800809 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700810}
811
812template <typename SourceVariant>
813void RenderEngineTest::fillBufferPhysicalOffset() {
814 fillRedOffsetBuffer<SourceVariant>();
815
816 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
817 DEFAULT_DISPLAY_HEIGHT),
818 255, 0, 0, 255);
819 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
820 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
821
822 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
823 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
824}
825
826template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700827void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700828 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800829 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700830 settings.physicalDisplay = fullscreenRect();
831 // Here logical space is 2x2
832 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700833 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700834
Sally Qi59a9f502021-10-12 18:53:23 +0000835 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700836
837 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800838 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700839 Rect rectOne(0, 0, 1, 1);
840 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800841 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700842 layerOne.alpha = 1.0f;
843
844 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800845 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700846 Rect rectTwo(0, 1, 1, 2);
847 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800848 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700849 layerTwo.alpha = 1.0f;
850
851 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800852 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700853 Rect rectThree(1, 0, 2, 1);
854 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800855 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700856 layerThree.alpha = 1.0f;
857
Sally Qi59a9f502021-10-12 18:53:23 +0000858 layers.push_back(layerOne);
859 layers.push_back(layerTwo);
860 layers.push_back(layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700861
Alec Mouric0aae732021-01-12 13:32:18 -0800862 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700863}
864
865template <typename SourceVariant>
866void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700867 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700868 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
869 255);
870 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
871 DEFAULT_DISPLAY_HEIGHT / 2),
872 0, 0, 255, 255);
873 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
874 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
875 0, 0, 0, 0);
876 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
877 DEFAULT_DISPLAY_HEIGHT),
878 0, 255, 0, 255);
879}
880
881template <typename SourceVariant>
882void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700883 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700884 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
885 255);
886 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
887 DEFAULT_DISPLAY_HEIGHT / 2),
888 255, 0, 0, 255);
889 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
890 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
891 0, 0, 255, 255);
892 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
893 DEFAULT_DISPLAY_HEIGHT),
894 0, 0, 0, 0);
895}
896
897template <typename SourceVariant>
898void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700899 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700900 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
901 0);
902 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
903 DEFAULT_DISPLAY_HEIGHT / 2),
904 0, 255, 0, 255);
905 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
906 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
907 255, 0, 0, 255);
908 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
909 DEFAULT_DISPLAY_HEIGHT),
910 0, 0, 255, 255);
911}
912
913template <typename SourceVariant>
914void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700915 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700916 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
917 255);
918 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
919 DEFAULT_DISPLAY_HEIGHT / 2),
920 0, 0, 0, 0);
921 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
922 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
923 0, 255, 0, 255);
924 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
925 DEFAULT_DISPLAY_HEIGHT),
926 255, 0, 0, 255);
927}
928
929template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800930void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700931 renderengine::DisplaySettings settings;
932 settings.physicalDisplay = fullscreenRect();
933 // Here logical space is 2x2
934 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800935 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700936
Sally Qi59a9f502021-10-12 18:53:23 +0000937 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700938
939 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800940 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700941 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
942 // Translate one pixel diagonally
943 layer.geometry.positionTransform = mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800944 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700945 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
946 layer.alpha = 1.0f;
947
Sally Qi59a9f502021-10-12 18:53:23 +0000948 layers.push_back(layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700949
Alec Mouric0aae732021-01-12 13:32:18 -0800950 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800951}
Alec Mouri1089aed2018-10-25 21:33:57 -0700952
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800953template <typename SourceVariant>
954void RenderEngineTest::fillBufferLayerTransform() {
955 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700956 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
957 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
958 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
959 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
960 255, 0, 0, 255);
961}
962
963template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800964void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700965 renderengine::DisplaySettings settings;
966 settings.physicalDisplay = fullscreenRect();
967 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800968 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700969
Sally Qi59a9f502021-10-12 18:53:23 +0000970 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700971
972 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800973 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700974 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800975 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700976 layer.alpha = 1.0f;
977
978 // construct a fake color matrix
979 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800980 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700981 // set red channel to red + green
982 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
983
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800984 layer.alpha = 1.0f;
985 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
986
Sally Qi59a9f502021-10-12 18:53:23 +0000987 layers.push_back(layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700988
Alec Mouric0aae732021-01-12 13:32:18 -0800989 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800990}
Alec Mouri1089aed2018-10-25 21:33:57 -0700991
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800992template <typename SourceVariant>
Sally Qi2019fd22021-11-22 10:19:04 -0800993void RenderEngineTest::fillBufferWithColorTransformAndSourceDataspace(
994 const ui::Dataspace sourceDataspace) {
995 renderengine::DisplaySettings settings;
996 settings.physicalDisplay = fullscreenRect();
997 settings.clip = Rect(1, 1);
998 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
999
1000 std::vector<renderengine::LayerSettings> layers;
1001
1002 renderengine::LayerSettings layer;
1003 layer.sourceDataspace = sourceDataspace;
1004 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1005 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
1006 layer.alpha = 1.0f;
1007
1008 // construct a fake color matrix
1009 // annihilate green and blue channels
1010 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
1011 // set red channel to red + green
1012 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1013
1014 layer.alpha = 1.0f;
1015 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1016
1017 layers.push_back(layer);
1018
1019 invokeDraw(settings, layers);
1020}
1021
1022template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001023void RenderEngineTest::fillBufferColorTransform() {
1024 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001025 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
1026}
1027
1028template <typename SourceVariant>
Sally Qi2019fd22021-11-22 10:19:04 -08001029void RenderEngineTest::fillBufferColorTransformAndSourceDataspace() {
1030 unordered_map<ui::Dataspace, ubyte4> dataspaceToColorMap;
1031 dataspaceToColorMap[ui::Dataspace::V0_BT709] = {172, 0, 0, 255};
1032 dataspaceToColorMap[ui::Dataspace::BT2020] = {172, 0, 0, 255};
1033 dataspaceToColorMap[ui::Dataspace::ADOBE_RGB] = {172, 0, 0, 255};
1034 ui::Dataspace customizedDataspace = static_cast<ui::Dataspace>(
1035 ui::Dataspace::STANDARD_BT709 | ui::Dataspace::TRANSFER_GAMMA2_2 |
1036 ui::Dataspace::RANGE_FULL);
1037 dataspaceToColorMap[customizedDataspace] = {172, 0, 0, 255};
1038 for (const auto& [sourceDataspace, color] : dataspaceToColorMap) {
1039 fillBufferWithColorTransformAndSourceDataspace<SourceVariant>(sourceDataspace);
1040 expectBufferColor(fullscreenRect(), color.r, color.g, color.b, color.a, 1);
1041 }
1042}
1043
1044template <typename SourceVariant>
1045void RenderEngineTest::fillBufferWithColorTransformAndOutputDataspace(
1046 const ui::Dataspace outputDataspace) {
1047 renderengine::DisplaySettings settings;
1048 settings.physicalDisplay = fullscreenRect();
1049 settings.clip = Rect(1, 1);
1050 settings.outputDataspace = outputDataspace;
1051
1052 std::vector<renderengine::LayerSettings> layers;
1053
1054 renderengine::LayerSettings layer;
1055 layer.sourceDataspace = ui::Dataspace::V0_SCRGB_LINEAR;
1056 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1057 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
1058 layer.alpha = 1.0f;
1059
1060 // construct a fake color matrix
1061 // annihilate green and blue channels
1062 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
1063 // set red channel to red + green
1064 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1065
1066 layer.alpha = 1.0f;
1067 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1068
1069 layers.push_back(layer);
1070
1071 invokeDraw(settings, layers);
1072}
1073
1074template <typename SourceVariant>
1075void RenderEngineTest::fillBufferColorTransformAndOutputDataspace() {
1076 unordered_map<ui::Dataspace, ubyte4> dataspaceToColorMap;
1077 dataspaceToColorMap[ui::Dataspace::V0_BT709] = {202, 0, 0, 255};
1078 dataspaceToColorMap[ui::Dataspace::BT2020] = {192, 0, 0, 255};
1079 dataspaceToColorMap[ui::Dataspace::ADOBE_RGB] = {202, 0, 0, 255};
1080 ui::Dataspace customizedDataspace = static_cast<ui::Dataspace>(
1081 ui::Dataspace::STANDARD_BT709 | ui::Dataspace::TRANSFER_GAMMA2_6 |
1082 ui::Dataspace::RANGE_FULL);
1083 dataspaceToColorMap[customizedDataspace] = {202, 0, 0, 255};
1084 for (const auto& [outputDataspace, color] : dataspaceToColorMap) {
1085 fillBufferWithColorTransformAndOutputDataspace<SourceVariant>(outputDataspace);
1086 expectBufferColor(fullscreenRect(), color.r, color.g, color.b, color.a, 1);
1087 }
1088}
1089
1090template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001091void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
1092 renderengine::DisplaySettings settings;
1093 settings.physicalDisplay = fullscreenRect();
1094 settings.clip = Rect(1, 1);
1095
Sally Qi59a9f502021-10-12 18:53:23 +00001096 std::vector<renderengine::LayerSettings> layers;
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001097
1098 renderengine::LayerSettings layer;
1099 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1100 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
1101 layer.alpha = 0;
1102
1103 // construct a fake color matrix
1104 // simple inverse color
1105 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
1106
1107 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1108
Sally Qi59a9f502021-10-12 18:53:23 +00001109 layers.push_back(layer);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001110
Alec Mouric0aae732021-01-12 13:32:18 -08001111 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001112}
1113
1114template <typename SourceVariant>
1115void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
1116 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
1117 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
1118}
1119
1120template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -08001121void RenderEngineTest::fillRedBufferWithRoundedCorners() {
1122 renderengine::DisplaySettings settings;
1123 settings.physicalDisplay = fullscreenRect();
1124 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001125 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -08001126
Sally Qi59a9f502021-10-12 18:53:23 +00001127 std::vector<renderengine::LayerSettings> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -08001128
1129 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001130 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -08001131 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1132 layer.geometry.roundedCornersRadius = 5.0f;
1133 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1134 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1135 layer.alpha = 1.0f;
1136
Sally Qi59a9f502021-10-12 18:53:23 +00001137 layers.push_back(layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -08001138
Alec Mouric0aae732021-01-12 13:32:18 -08001139 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -08001140}
1141
1142template <typename SourceVariant>
1143void RenderEngineTest::fillBufferWithRoundedCorners() {
1144 fillRedBufferWithRoundedCorners<SourceVariant>();
1145 // Corners should be ignored...
1146 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1147 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1148 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1149 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1150 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1151 0, 0, 0, 0);
1152 // ...And the non-rounded portion should be red.
1153 // Other pixels may be anti-aliased, so let's not check those.
1154 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
1155 255);
1156}
1157
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001158template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001159void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001160 auto blurRadius = 50;
1161 auto center = DEFAULT_DISPLAY_WIDTH / 2;
1162
1163 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001164 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001165 settings.physicalDisplay = fullscreenRect();
1166 settings.clip = fullscreenRect();
1167
Sally Qi59a9f502021-10-12 18:53:23 +00001168 std::vector<renderengine::LayerSettings> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001169
1170 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001171 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001172 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1173 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
1174 backgroundLayer.alpha = 1.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001175 layers.emplace_back(backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001176
1177 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001178 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001179 leftLayer.geometry.boundaries =
1180 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
1181 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
1182 leftLayer.alpha = 1.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001183 layers.emplace_back(leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001184
1185 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001186 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001187 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1188 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -05001189 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001190 blurLayer.alpha = 0;
Sally Qi59a9f502021-10-12 18:53:23 +00001191 layers.emplace_back(blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001192
Alec Mouric0aae732021-01-12 13:32:18 -08001193 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001194
Derek Sollenbergerecb21462021-01-29 16:53:49 -05001195 // solid color
1196 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
1197
Derek Sollenbergerb3998372021-02-16 15:16:56 -05001198 if (mRE->supportsBackgroundBlur()) {
1199 // blurred color (downsampling should result in the center color being close to 128)
1200 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001201 50 /* tolerance */);
Derek Sollenbergerb3998372021-02-16 15:16:56 -05001202 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001203}
1204
1205template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -07001206void RenderEngineTest::fillSmallLayerAndBlurBackground() {
1207 auto blurRadius = 50;
1208 renderengine::DisplaySettings settings;
1209 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1210 settings.physicalDisplay = fullscreenRect();
1211 settings.clip = fullscreenRect();
1212
Sally Qi59a9f502021-10-12 18:53:23 +00001213 std::vector<renderengine::LayerSettings> layers;
Alec Mourie8489fd2021-04-29 16:08:56 -07001214
1215 renderengine::LayerSettings backgroundLayer;
1216 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1217 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1218 SourceVariant::fillColor(backgroundLayer, 1.0f, 0.0f, 0.0f, this);
1219 backgroundLayer.alpha = 1.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001220 layers.push_back(backgroundLayer);
Alec Mourie8489fd2021-04-29 16:08:56 -07001221
1222 renderengine::LayerSettings blurLayer;
1223 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1224 blurLayer.geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f);
1225 blurLayer.backgroundBlurRadius = blurRadius;
1226 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
1227 blurLayer.alpha = 0;
Sally Qi59a9f502021-10-12 18:53:23 +00001228 layers.push_back(blurLayer);
Alec Mourie8489fd2021-04-29 16:08:56 -07001229
1230 invokeDraw(settings, layers);
1231
1232 // Give a generous tolerance - the blur rectangle is very small and this test is
1233 // mainly concerned with ensuring that there's no device failure.
1234 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 255, 0, 0, 255,
1235 40 /* tolerance */);
1236}
1237
1238template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001239void RenderEngineTest::overlayCorners() {
1240 renderengine::DisplaySettings settings;
1241 settings.physicalDisplay = fullscreenRect();
1242 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001243 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001244
Sally Qi59a9f502021-10-12 18:53:23 +00001245 std::vector<renderengine::LayerSettings> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001246
1247 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001248 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001249 layerOne.geometry.boundaries =
1250 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
1251 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
1252 layerOne.alpha = 0.2;
1253
Sally Qi59a9f502021-10-12 18:53:23 +00001254 layersFirst.push_back(layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -08001255 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001256 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
1257 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1258 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1259 0, 0, 0, 0);
1260
Sally Qi59a9f502021-10-12 18:53:23 +00001261 std::vector<renderengine::LayerSettings> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001262 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001263 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001264 layerTwo.geometry.boundaries =
1265 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1266 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1267 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1268 layerTwo.alpha = 1.0f;
1269
Sally Qi59a9f502021-10-12 18:53:23 +00001270 layersSecond.push_back(layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001271 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001272
1273 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1274 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1275 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1276 0, 255, 0, 255);
1277}
1278
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001279void RenderEngineTest::fillRedBufferTextureTransform() {
1280 renderengine::DisplaySettings settings;
1281 settings.physicalDisplay = fullscreenRect();
1282 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001283 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001284
Sally Qi59a9f502021-10-12 18:53:23 +00001285 std::vector<renderengine::LayerSettings> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001286
1287 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001288 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001289 // Here will allocate a checker board texture, but transform texture
1290 // coordinates so that only the upper left is applied.
Alec Mouria90a5702021-04-16 16:36:21 +00001291 const auto buf = allocateSourceBuffer(2, 2);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001292 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001293 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001294 this->mTexNames.push_back(texName);
1295
1296 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001297 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1298 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001299 // Red top left, Green top right, Blue bottom left, Black bottom right
1300 pixels[0] = 255;
1301 pixels[1] = 0;
1302 pixels[2] = 0;
1303 pixels[3] = 255;
1304 pixels[4] = 0;
1305 pixels[5] = 255;
1306 pixels[6] = 0;
1307 pixels[7] = 255;
1308 pixels[8] = 0;
1309 pixels[9] = 0;
1310 pixels[10] = 255;
1311 pixels[11] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001312 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001313
1314 layer.source.buffer.buffer = buf;
1315 layer.source.buffer.textureName = texName;
1316 // Transform coordinates to only be inside the red quadrant.
Alec Mouri4049b532021-10-15 20:59:33 -07001317 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2f, 0.2f, 1.f, 1.f));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001318 layer.alpha = 1.0f;
1319 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1320
Sally Qi59a9f502021-10-12 18:53:23 +00001321 layers.push_back(layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001322
Alec Mouric0aae732021-01-12 13:32:18 -08001323 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001324}
1325
1326void RenderEngineTest::fillBufferTextureTransform() {
1327 fillRedBufferTextureTransform();
1328 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1329}
1330
1331void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1332 renderengine::DisplaySettings settings;
1333 settings.physicalDisplay = fullscreenRect();
1334 // Here logical space is 1x1
1335 settings.clip = Rect(1, 1);
1336
Sally Qi59a9f502021-10-12 18:53:23 +00001337 std::vector<renderengine::LayerSettings> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001338
1339 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001340 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001341 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001342 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001343 this->mTexNames.push_back(texName);
1344
1345 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001346 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1347 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001348 pixels[0] = 255;
1349 pixels[1] = 0;
1350 pixels[2] = 0;
1351 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001352 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001353
1354 layer.source.buffer.buffer = buf;
1355 layer.source.buffer.textureName = texName;
1356 layer.source.buffer.usePremultipliedAlpha = true;
1357 layer.alpha = 0.5f;
1358 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1359
Sally Qi59a9f502021-10-12 18:53:23 +00001360 layers.push_back(layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001361
Alec Mouric0aae732021-01-12 13:32:18 -08001362 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001363}
1364
1365void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1366 fillRedBufferWithPremultiplyAlpha();
1367 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1368}
1369
1370void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1371 renderengine::DisplaySettings settings;
1372 settings.physicalDisplay = fullscreenRect();
1373 // Here logical space is 1x1
1374 settings.clip = Rect(1, 1);
1375
Sally Qi59a9f502021-10-12 18:53:23 +00001376 std::vector<renderengine::LayerSettings> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001377
1378 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001379 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001380 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001381 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001382 this->mTexNames.push_back(texName);
1383
1384 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001385 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1386 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001387 pixels[0] = 255;
1388 pixels[1] = 0;
1389 pixels[2] = 0;
1390 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001391 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001392
1393 layer.source.buffer.buffer = buf;
1394 layer.source.buffer.textureName = texName;
1395 layer.source.buffer.usePremultipliedAlpha = false;
1396 layer.alpha = 0.5f;
1397 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1398
Sally Qi59a9f502021-10-12 18:53:23 +00001399 layers.push_back(layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001400
Alec Mouric0aae732021-01-12 13:32:18 -08001401 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001402}
1403
1404void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1405 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001406 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001407}
1408
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001409template <typename SourceVariant>
1410void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1411 const renderengine::ShadowSettings& shadow,
1412 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1413 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001414 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001415 settings.physicalDisplay = fullscreenRect();
1416 settings.clip = fullscreenRect();
1417
Sally Qi59a9f502021-10-12 18:53:23 +00001418 std::vector<renderengine::LayerSettings> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001419
1420 // add background layer
1421 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001422 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001423 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1424 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1425 backgroundColor.b / 255.0f, this);
1426 bgLayer.alpha = backgroundColor.a / 255.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001427 layers.push_back(bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001428
1429 // add shadow layer
1430 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001431 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001432 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1433 shadowLayer.alpha = castingLayer.alpha;
1434 shadowLayer.shadow = shadow;
Sally Qi59a9f502021-10-12 18:53:23 +00001435 layers.push_back(shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001436
1437 // add layer casting the shadow
1438 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001439 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001440 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1441 casterColor.b / 255.0f, this);
Sally Qi59a9f502021-10-12 18:53:23 +00001442 layers.push_back(layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001443
Alec Mouric0aae732021-01-12 13:32:18 -08001444 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001445}
1446
Alec Mouribd17b3b2020-12-17 11:08:30 -08001447void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1448 const renderengine::ShadowSettings& shadow,
1449 const ubyte4& backgroundColor) {
1450 renderengine::DisplaySettings settings;
1451 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1452 settings.physicalDisplay = fullscreenRect();
1453 settings.clip = fullscreenRect();
1454
Sally Qi59a9f502021-10-12 18:53:23 +00001455 std::vector<renderengine::LayerSettings> layers;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001456
1457 // add background layer
1458 renderengine::LayerSettings bgLayer;
1459 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1460 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1461 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1462 backgroundColor.b / 255.0f, this);
1463 bgLayer.alpha = backgroundColor.a / 255.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001464 layers.push_back(bgLayer);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001465
1466 // add shadow layer
1467 renderengine::LayerSettings shadowLayer;
1468 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1469 shadowLayer.geometry.boundaries = castingBounds;
Derek Sollenbergerc31985e2021-05-18 16:38:17 -04001470 shadowLayer.skipContentDraw = true;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001471 shadowLayer.alpha = 1.0f;
1472 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1473 shadowLayer.shadow = shadow;
Sally Qi59a9f502021-10-12 18:53:23 +00001474 layers.push_back(shadowLayer);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001475
Alec Mouric0aae732021-01-12 13:32:18 -08001476 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001477}
1478
Alec Mouri5a493722022-01-26 16:43:02 -08001479void RenderEngineTest::tonemap(ui::Dataspace sourceDataspace, std::function<vec3(vec3)> eotf,
1480 std::function<vec3(vec3, float)> scaleOotf) {
1481 constexpr int32_t kGreyLevels = 256;
1482
1483 const auto rect = Rect(0, 0, kGreyLevels, 1);
1484
1485 constexpr float kMaxLuminance = 750.f;
1486 constexpr float kCurrentLuminanceNits = 500.f;
1487 const renderengine::DisplaySettings display{
1488 .physicalDisplay = rect,
1489 .clip = rect,
1490 .maxLuminance = kMaxLuminance,
1491 .currentLuminanceNits = kCurrentLuminanceNits,
1492 .outputDataspace = ui::Dataspace::DISPLAY_P3,
1493 };
1494
1495 auto buf = std::make_shared<
1496 renderengine::impl::
1497 ExternalTexture>(new GraphicBuffer(kGreyLevels, 1, HAL_PIXEL_FORMAT_RGBA_8888,
1498 1,
1499 GRALLOC_USAGE_SW_READ_OFTEN |
1500 GRALLOC_USAGE_SW_WRITE_OFTEN |
1501 GRALLOC_USAGE_HW_RENDER |
1502 GRALLOC_USAGE_HW_TEXTURE,
1503 "input"),
1504 *mRE,
1505 renderengine::impl::ExternalTexture::Usage::READABLE |
1506 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
1507 ASSERT_EQ(0, buf->getBuffer()->initCheck());
1508 {
1509 uint8_t* pixels;
1510 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1511 reinterpret_cast<void**>(&pixels));
1512
1513 uint8_t color = 0;
1514 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
1515 uint8_t* dest = pixels + (buf->getBuffer()->getStride() * j * 4);
1516 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
1517 dest[0] = color;
1518 dest[1] = color;
1519 dest[2] = color;
1520 dest[3] = 255;
1521 color++;
1522 dest += 4;
1523 }
1524 }
1525 buf->getBuffer()->unlock();
1526 }
1527
1528 mBuffer = std::make_shared<
1529 renderengine::impl::
1530 ExternalTexture>(new GraphicBuffer(kGreyLevels, 1, HAL_PIXEL_FORMAT_RGBA_8888,
1531 1,
1532 GRALLOC_USAGE_SW_READ_OFTEN |
1533 GRALLOC_USAGE_SW_WRITE_OFTEN |
1534 GRALLOC_USAGE_HW_RENDER |
1535 GRALLOC_USAGE_HW_TEXTURE,
1536 "output"),
1537 *mRE,
1538 renderengine::impl::ExternalTexture::Usage::READABLE |
1539 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
1540 ASSERT_EQ(0, mBuffer->getBuffer()->initCheck());
1541
1542 const renderengine::LayerSettings layer{.geometry.boundaries = rect.toFloatRect(),
1543 .source =
1544 renderengine::PixelSource{
1545 .buffer =
1546 renderengine::Buffer{
1547 .buffer =
1548 std::move(buf),
1549 .usePremultipliedAlpha =
1550 true,
1551 },
1552 },
1553 .alpha = 1.0f,
1554 .sourceDataspace = sourceDataspace};
1555
1556 std::vector<renderengine::LayerSettings> layers{layer};
1557 invokeDraw(display, layers);
1558
1559 ColorSpace displayP3 = ColorSpace::DisplayP3();
1560 ColorSpace bt2020 = ColorSpace::BT2020();
1561
1562 tonemap::Metadata metadata{.displayMaxLuminance = 750.0f};
1563
1564 auto generator = [=](Point location) {
1565 const double normColor = static_cast<double>(location.x) / (kGreyLevels - 1);
1566 const vec3 rgb = vec3(normColor, normColor, normColor);
1567
1568 const vec3 linearRGB = eotf(rgb);
1569
1570 const vec3 xyz = bt2020.getRGBtoXYZ() * linearRGB;
1571
1572 const vec3 scaledXYZ = scaleOotf(xyz, kCurrentLuminanceNits);
Alec Mouri196b0f22022-03-04 22:13:48 +00001573 const auto gains =
Alec Mouri5a493722022-01-26 16:43:02 -08001574 tonemap::getToneMapper()
1575 ->lookupTonemapGain(static_cast<aidl::android::hardware::graphics::common::
1576 Dataspace>(sourceDataspace),
1577 static_cast<aidl::android::hardware::graphics::common::
1578 Dataspace>(
1579 ui::Dataspace::DISPLAY_P3),
Alec Mouri196b0f22022-03-04 22:13:48 +00001580 {tonemap::
1581 Color{.linearRGB =
1582 scaleOotf(linearRGB,
1583 kCurrentLuminanceNits),
1584 .xyz = scaledXYZ}},
Alec Mouri5a493722022-01-26 16:43:02 -08001585 metadata);
Alec Mouri196b0f22022-03-04 22:13:48 +00001586 EXPECT_EQ(1, gains.size());
1587 const double gain = gains.front();
Alec Mouri5a493722022-01-26 16:43:02 -08001588 const vec3 normalizedXYZ = scaledXYZ * gain / metadata.displayMaxLuminance;
1589
1590 const vec3 targetRGB = OETF_sRGB(displayP3.getXYZtoRGB() * normalizedXYZ) * 255;
1591 return ubyte4(static_cast<uint8_t>(targetRGB.r), static_cast<uint8_t>(targetRGB.g),
1592 static_cast<uint8_t>(targetRGB.b), 255);
1593 };
1594
1595 expectBufferColor(Rect(kGreyLevels, 1), generator, 2);
1596}
1597
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001598INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001599 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001600 std::make_shared<GLESCMRenderEngineFactory>(),
1601 std::make_shared<SkiaGLESRenderEngineFactory>(),
1602 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001603
1604TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001605 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001606 drawEmptyLayers();
1607}
1608
Sally Qi1fed86e2022-06-23 15:33:52 -07001609TEST_P(RenderEngineTest, drawLayers_fillRedBufferAndEmptyBuffer) {
1610 const auto& renderEngineFactory = GetParam();
1611 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
1612 // GLES-specific test
1613 return;
1614 }
1615
1616 initializeRenderEngine();
1617 renderengine::DisplaySettings settings;
1618 settings.physicalDisplay = fullscreenRect();
1619 settings.clip = fullscreenRect();
1620 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1621
1622 // add a red layer
1623 renderengine::LayerSettings layerOne{
1624 .geometry.boundaries = fullscreenRect().toFloatRect(),
1625 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1626 .alpha = 1.f,
1627 };
1628
1629 std::vector<renderengine::LayerSettings> layersFirst{layerOne};
1630 invokeDraw(settings, layersFirst);
1631 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1632
1633 // re-draw with an empty layer above it, and we get a transparent black one
1634 std::vector<renderengine::LayerSettings> layersSecond;
1635 invokeDraw(settings, layersSecond);
1636 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
1637}
1638
Ana Krulec07b98df2021-01-07 14:38:40 -08001639TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
Alec Mouria90a5702021-04-16 16:36:21 +00001640 initializeRenderEngine();
Ana Krulec07b98df2021-01-07 14:38:40 -08001641
1642 renderengine::DisplaySettings settings;
1643 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1644 settings.physicalDisplay = fullscreenRect();
1645 settings.clip = fullscreenRect();
1646
1647 // 255, 255, 255, 255 is full opaque white.
Alec Mouri4049b532021-10-15 20:59:33 -07001648 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
1649 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Ana Krulec07b98df2021-01-07 14:38:40 -08001650 // Create layer with given color.
1651 renderengine::LayerSettings bgLayer;
1652 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1653 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1654 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1655 backgroundColor.b / 255.0f);
1656 bgLayer.alpha = backgroundColor.a / 255.0f;
1657 // Transform the red color.
1658 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1659
Sally Qi59a9f502021-10-12 18:53:23 +00001660 std::vector<renderengine::LayerSettings> layers;
1661 layers.push_back(bgLayer);
Ana Krulec07b98df2021-01-07 14:38:40 -08001662
Alec Mouric0aae732021-01-12 13:32:18 -08001663 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001664
1665 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001666 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001667 backgroundColor.a);
1668}
1669
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001670TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001671 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001672
Alec Mourid43ccab2019-03-13 12:23:45 -07001673 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001674 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Sally Qi59a9f502021-10-12 18:53:23 +00001675 std::vector<renderengine::LayerSettings> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001676 renderengine::LayerSettings layer;
1677 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1678 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Sally Qi59a9f502021-10-12 18:53:23 +00001679 layers.push_back(layer);
Sally Qi4cabdd02021-08-05 16:45:57 -07001680 std::future<renderengine::RenderEngineResult> result =
1681 mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd());
Alec Mourid43ccab2019-03-13 12:23:45 -07001682
Sally Qi4cabdd02021-08-05 16:45:57 -07001683 ASSERT_TRUE(result.valid());
Derek Sollenbergerec411212021-08-25 10:54:47 -04001684 auto [status, fence] = result.get();
Alec Mourid43ccab2019-03-13 12:23:45 -07001685 ASSERT_EQ(BAD_VALUE, status);
Derek Sollenbergerec411212021-08-25 10:54:47 -04001686 ASSERT_FALSE(fence.ok());
Alec Mourid43ccab2019-03-13 12:23:45 -07001687}
1688
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001689TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1690 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001691
1692 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1693 // GLES-specific test
1694 return;
1695 }
1696
1697 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001698
Alec Mourife0d72b2019-03-21 14:05:56 -07001699 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001700 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001701 settings.physicalDisplay = fullscreenRect();
1702 settings.clip = fullscreenRect();
1703
Sally Qi59a9f502021-10-12 18:53:23 +00001704 std::vector<renderengine::LayerSettings> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001705 renderengine::LayerSettings layer;
1706 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1707 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1708 layer.alpha = 1.0;
Sally Qi59a9f502021-10-12 18:53:23 +00001709 layers.push_back(layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001710
Sally Qi4cabdd02021-08-05 16:45:57 -07001711 std::future<renderengine::RenderEngineResult> result =
1712 mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd());
1713 ASSERT_TRUE(result.valid());
Derek Sollenbergerec411212021-08-25 10:54:47 -04001714 auto [status, fence] = result.get();
1715
Alec Mourife0d72b2019-03-21 14:05:56 -07001716 ASSERT_EQ(NO_ERROR, status);
Derek Sollenbergerec411212021-08-25 10:54:47 -04001717 if (fence.ok()) {
1718 sync_wait(fence.get(), -1);
1719 }
1720
Alec Mouria90a5702021-04-16 16:36:21 +00001721 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001722 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1723}
1724
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001725TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001726 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001727 fillRedBuffer<ColorSourceVariant>();
1728}
1729
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001730TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001731 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001732 fillGreenBuffer<ColorSourceVariant>();
1733}
1734
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001735TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001736 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001737 fillBlueBuffer<ColorSourceVariant>();
1738}
1739
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001740TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001741 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001742 fillRedTransparentBuffer<ColorSourceVariant>();
1743}
1744
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001745TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001746 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001747 fillBufferPhysicalOffset<ColorSourceVariant>();
1748}
1749
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001750TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001751 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001752 fillBufferCheckersRotate0<ColorSourceVariant>();
1753}
1754
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001755TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001756 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001757 fillBufferCheckersRotate90<ColorSourceVariant>();
1758}
1759
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001760TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001761 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001762 fillBufferCheckersRotate180<ColorSourceVariant>();
1763}
1764
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001765TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001766 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001767 fillBufferCheckersRotate270<ColorSourceVariant>();
1768}
1769
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001770TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001771 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001772 fillBufferLayerTransform<ColorSourceVariant>();
1773}
1774
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001775TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001776 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001777 fillBufferColorTransform<ColorSourceVariant>();
1778}
1779
Sally Qi2019fd22021-11-22 10:19:04 -08001780TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_sourceDataspace) {
1781 const auto& renderEngineFactory = GetParam();
1782 // skip for non color management
1783 if (!renderEngineFactory->useColorManagement()) {
1784 return;
1785 }
1786 // skip for GLESRenderEngine
1787 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1788 return;
1789 }
1790
1791 initializeRenderEngine();
1792 fillBufferColorTransformAndSourceDataspace<ColorSourceVariant>();
1793}
1794
1795TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_outputDataspace) {
1796 const auto& renderEngineFactory = GetParam();
1797 // skip for non color management
1798 if (!renderEngineFactory->useColorManagement()) {
1799 return;
1800 }
1801 // skip for GLESRenderEngine
1802 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1803 return;
1804 }
1805
1806 initializeRenderEngine();
1807 fillBufferColorTransformAndOutputDataspace<ColorSourceVariant>();
1808}
1809
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001810TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001811 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001812 fillBufferWithRoundedCorners<ColorSourceVariant>();
1813}
1814
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001815TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001816 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001817 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1818}
1819
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001820TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001821 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001822 fillBufferAndBlurBackground<ColorSourceVariant>();
1823}
1824
Alec Mourie8489fd2021-04-29 16:08:56 -07001825TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1826 initializeRenderEngine();
1827 fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1828}
1829
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001830TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001831 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001832 overlayCorners<ColorSourceVariant>();
1833}
1834
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001835TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001836 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001837 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1838}
1839
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001840TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001841 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001842 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1843}
1844
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001845TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001846 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001847 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1848}
1849
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001850TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001851 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001852 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1853}
1854
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001855TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001856 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001857 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1858}
1859
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001860TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001861 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001862 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1863}
1864
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001865TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001866 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001867 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1868}
1869
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001870TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001871 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001872 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1873}
1874
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001875TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001876 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001877 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1878}
1879
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001880TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001881 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001882 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1883}
1884
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001885TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001886 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001887 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1888}
1889
Sally Qi2019fd22021-11-22 10:19:04 -08001890TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndSourceDataspace_opaqueBufferSource) {
1891 const auto& renderEngineFactory = GetParam();
1892 // skip for non color management
1893 if (!renderEngineFactory->useColorManagement()) {
1894 return;
1895 }
1896 // skip for GLESRenderEngine
1897 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1898 return;
1899 }
1900
1901 initializeRenderEngine();
1902 fillBufferColorTransformAndSourceDataspace<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1903}
1904
1905TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndOutputDataspace_opaqueBufferSource) {
1906 const auto& renderEngineFactory = GetParam();
1907 // skip for non color management
1908 if (!renderEngineFactory->useColorManagement()) {
1909 return;
1910 }
1911 // skip for GLESRenderEngine
1912 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1913 return;
1914 }
1915
1916 initializeRenderEngine();
1917 fillBufferColorTransformAndOutputDataspace<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1918}
1919
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001920TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001921 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001922 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1923}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001924
Alec Mouric0aae732021-01-12 13:32:18 -08001925TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1926 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001927 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1928}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001929
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001930TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001931 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001932 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1933}
1934
Alec Mourie8489fd2021-04-29 16:08:56 -07001935TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1936 initializeRenderEngine();
1937 fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1938}
1939
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001940TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001941 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001942 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1943}
1944
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001945TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001946 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001947 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1948}
1949
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001950TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001951 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001952 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1953}
1954
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001955TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001956 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001957 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1958}
1959
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001960TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001961 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001962 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1963}
1964
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001965TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001966 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001967 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1968}
1969
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001970TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001971 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001972 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1973}
1974
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001975TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001976 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001977 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1978}
1979
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001980TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001981 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001982 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1983}
1984
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001985TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001986 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001987 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1988}
1989
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001990TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001991 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001992 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1993}
1994
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001995TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001996 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001997 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1998}
1999
Sally Qi2019fd22021-11-22 10:19:04 -08002000TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndSourceDataspace_bufferSource) {
2001 const auto& renderEngineFactory = GetParam();
2002 // skip for non color management
2003 if (!renderEngineFactory->useColorManagement()) {
2004 return;
2005 }
2006 // skip for GLESRenderEngine
2007 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
2008 return;
2009 }
2010
2011 initializeRenderEngine();
2012 fillBufferColorTransformAndSourceDataspace<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2013}
2014
2015TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndOutputDataspace_bufferSource) {
2016 const auto& renderEngineFactory = GetParam();
2017 // skip for non color management
2018 if (!renderEngineFactory->useColorManagement()) {
2019 return;
2020 }
2021 // skip for GLESRenderEngine
2022 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
2023 return;
2024 }
2025
2026 initializeRenderEngine();
2027 fillBufferColorTransformAndOutputDataspace<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2028}
2029
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002030TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08002031 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08002032 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2033}
2034
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08002035TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08002036 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08002037 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2038}
2039
Nathaniel Nifong53494f32021-04-30 14:05:39 -04002040TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08002041 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08002042 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2043}
2044
Alec Mourie8489fd2021-04-29 16:08:56 -07002045TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
2046 initializeRenderEngine();
2047 fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2048}
2049
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002050TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08002051 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00002052 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2053}
2054
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002055TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08002056 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08002057 fillBufferTextureTransform();
2058}
2059
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002060TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08002061 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08002062 fillBufferWithPremultiplyAlpha();
2063}
2064
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002065TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08002066 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08002067 fillBufferWithoutPremultiplyAlpha();
2068}
2069
Alec Mouribd17b3b2020-12-17 11:08:30 -08002070TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08002071 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08002072
Alec Mouri4049b532021-10-15 20:59:33 -07002073 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2074 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Alec Mouribd17b3b2020-12-17 11:08:30 -08002075 const float shadowLength = 5.0f;
2076 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2077 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2078 renderengine::ShadowSettings settings =
2079 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2080 false /* casterIsTranslucent */);
2081
2082 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
2083 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
2084}
2085
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002086TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08002087 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002088
Alec Mouri4049b532021-10-15 20:59:33 -07002089 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2090 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2091 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2092 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002093 const float shadowLength = 5.0f;
2094 Rect casterBounds(1, 1);
2095 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2096 renderengine::LayerSettings castingLayer;
2097 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2098 castingLayer.alpha = 1.0f;
2099 renderengine::ShadowSettings settings =
2100 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2101 false /* casterIsTranslucent */);
2102
2103 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
2104 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2105}
2106
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002107TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08002108 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002109
Alec Mouri4049b532021-10-15 20:59:33 -07002110 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2111 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2112 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2113 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002114 const float shadowLength = 5.0f;
2115 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2116 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2117 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08002118 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002119 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2120 castingLayer.alpha = 1.0f;
2121 renderengine::ShadowSettings settings =
2122 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2123 false /* casterIsTranslucent */);
2124
2125 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
2126 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2127}
2128
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002129TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08002130 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002131
Alec Mouri4049b532021-10-15 20:59:33 -07002132 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2133 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2134 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2135 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002136 const float shadowLength = 5.0f;
2137 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2138 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2139 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08002140 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002141 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2142 castingLayer.alpha = 1.0f;
2143 renderengine::ShadowSettings settings =
2144 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2145 false /* casterIsTranslucent */);
2146
2147 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
2148 backgroundColor);
2149 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2150}
2151
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002152TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08002153 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002154
Alec Mouri4049b532021-10-15 20:59:33 -07002155 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2156 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2157 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2158 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002159 const float shadowLength = 5.0f;
2160 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2161 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2162 renderengine::LayerSettings castingLayer;
2163 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2164 castingLayer.geometry.roundedCornersRadius = 3.0f;
2165 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
2166 castingLayer.alpha = 1.0f;
2167 renderengine::ShadowSettings settings =
2168 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2169 false /* casterIsTranslucent */);
2170
2171 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
2172 backgroundColor);
2173 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2174}
2175
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002176TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08002177 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002178
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002179 const ubyte4 casterColor(255, 0, 0, 255);
2180 const ubyte4 backgroundColor(255, 255, 255, 255);
2181 const float shadowLength = 5.0f;
2182 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2183 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2184 renderengine::LayerSettings castingLayer;
2185 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2186 castingLayer.alpha = 0.5f;
2187 renderengine::ShadowSettings settings =
2188 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2189 true /* casterIsTranslucent */);
2190
2191 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
2192 backgroundColor);
2193
2194 // verify only the background since the shadow will draw behind the caster
2195 const float shadowInset = settings.length * -1.0f;
2196 const Rect casterWithShadow =
2197 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
2198 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
2199 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
2200 backgroundColor.a);
2201}
2202
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002203TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
Alec Mouric0aae732021-01-12 13:32:18 -08002204 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002205
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002206 renderengine::DisplaySettings settings;
2207 settings.physicalDisplay = fullscreenRect();
2208 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08002209 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002210
Sally Qi59a9f502021-10-12 18:53:23 +00002211 std::vector<renderengine::LayerSettings> layers;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002212 renderengine::LayerSettings layer;
2213 layer.geometry.boundaries = fullscreenRect().toFloatRect();
2214 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
2215 layer.alpha = 1.0;
Sally Qi59a9f502021-10-12 18:53:23 +00002216 layers.push_back(layer);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002217
Sally Qi4cabdd02021-08-05 16:45:57 -07002218 std::future<renderengine::RenderEngineResult> resultOne =
2219 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd());
2220 ASSERT_TRUE(resultOne.valid());
2221 auto [statusOne, fenceOne] = resultOne.get();
2222 ASSERT_EQ(NO_ERROR, statusOne);
2223
2224 std::future<renderengine::RenderEngineResult> resultTwo =
2225 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne));
2226 ASSERT_TRUE(resultTwo.valid());
2227 auto [statusTwo, fenceTwo] = resultTwo.get();
2228 ASSERT_EQ(NO_ERROR, statusTwo);
Derek Sollenbergerec411212021-08-25 10:54:47 -04002229 if (fenceTwo.ok()) {
2230 sync_wait(fenceTwo.get(), -1);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002231 }
Derek Sollenbergerec411212021-08-25 10:54:47 -04002232
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002233 // Only cleanup the first time.
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04002234 EXPECT_FALSE(mRE->canSkipPostRenderCleanup());
2235 mRE->cleanupPostRender();
2236 EXPECT_TRUE(mRE->canSkipPostRenderCleanup());
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002237}
2238
Ana Krulecf9a15d92020-12-11 08:35:00 -08002239TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08002240 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08002241
2242 renderengine::DisplaySettings settings;
2243 settings.physicalDisplay = fullscreenRect();
2244 settings.clip = fullscreenRect();
2245 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2246
Sally Qi59a9f502021-10-12 18:53:23 +00002247 std::vector<renderengine::LayerSettings> layers;
Ana Krulecf9a15d92020-12-11 08:35:00 -08002248
2249 renderengine::LayerSettings redLayer;
2250 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2251 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2252 redLayer.geometry.roundedCornersRadius = 5.0f;
2253 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
2254 // Red background.
2255 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2256 redLayer.alpha = 1.0f;
2257
Sally Qi59a9f502021-10-12 18:53:23 +00002258 layers.push_back(redLayer);
Ana Krulecf9a15d92020-12-11 08:35:00 -08002259
2260 // Green layer with 1/3 size.
2261 renderengine::LayerSettings greenLayer;
2262 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2263 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2264 greenLayer.geometry.roundedCornersRadius = 5.0f;
2265 // Bottom right corner is not going to be rounded.
2266 greenLayer.geometry.roundedCornersCrop =
2267 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
2268 DEFAULT_DISPLAY_HEIGHT)
2269 .toFloatRect();
2270 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
2271 greenLayer.alpha = 1.0f;
2272
Sally Qi59a9f502021-10-12 18:53:23 +00002273 layers.push_back(greenLayer);
Ana Krulecf9a15d92020-12-11 08:35:00 -08002274
Alec Mouric0aae732021-01-12 13:32:18 -08002275 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08002276
2277 // Corners should be ignored...
2278 // Screen size: width is 128, height is 256.
2279 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
2280 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
2281 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
2282 // Bottom right corner is kept out of the clipping, and it's green.
2283 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
2284 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
2285 0, 255, 0, 255);
2286}
2287
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002288TEST_P(RenderEngineTest, testRoundedCornersParentCrop) {
2289 initializeRenderEngine();
2290
2291 renderengine::DisplaySettings settings;
2292 settings.physicalDisplay = fullscreenRect();
2293 settings.clip = fullscreenRect();
2294 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2295
Sally Qi59a9f502021-10-12 18:53:23 +00002296 std::vector<renderengine::LayerSettings> layers;
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002297
2298 renderengine::LayerSettings redLayer;
2299 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2300 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2301 redLayer.geometry.roundedCornersRadius = 5.0f;
2302 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
2303 // Red background.
2304 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2305 redLayer.alpha = 1.0f;
2306
Sally Qi59a9f502021-10-12 18:53:23 +00002307 layers.push_back(redLayer);
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002308
2309 // Green layer with 1/2 size with parent crop rect.
2310 renderengine::LayerSettings greenLayer = redLayer;
2311 greenLayer.geometry.boundaries =
2312 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2);
2313 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
2314
Sally Qi59a9f502021-10-12 18:53:23 +00002315 layers.push_back(greenLayer);
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002316
2317 invokeDraw(settings, layers);
2318
2319 // Due to roundedCornersRadius, the corners are untouched.
2320 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
2321 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
2322 expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
2323 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
2324
2325 // top middle should be green and the bottom middle red
2326 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 0), 0, 255, 0, 255);
2327 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 255);
2328
2329 // the bottom edge of the green layer should not be rounded
2330 expectBufferColor(Point(0, (DEFAULT_DISPLAY_HEIGHT / 2) - 1), 0, 255, 0, 255);
2331}
2332
Derek Sollenberger547d0a62021-07-27 14:09:17 -04002333TEST_P(RenderEngineTest, testRoundedCornersParentCropSmallBounds) {
2334 initializeRenderEngine();
2335
2336 renderengine::DisplaySettings settings;
2337 settings.physicalDisplay = fullscreenRect();
2338 settings.clip = fullscreenRect();
2339 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2340
Sally Qi59a9f502021-10-12 18:53:23 +00002341 std::vector<renderengine::LayerSettings> layers;
Derek Sollenberger547d0a62021-07-27 14:09:17 -04002342
2343 renderengine::LayerSettings redLayer;
2344 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2345 redLayer.geometry.boundaries = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 32);
2346 redLayer.geometry.roundedCornersRadius = 64;
2347 redLayer.geometry.roundedCornersCrop = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 128);
2348 // Red background.
2349 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2350 redLayer.alpha = 1.0f;
2351
Sally Qi59a9f502021-10-12 18:53:23 +00002352 layers.push_back(redLayer);
Derek Sollenberger547d0a62021-07-27 14:09:17 -04002353 invokeDraw(settings, layers);
2354
2355 // Due to roundedCornersRadius, the top corners are untouched.
2356 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
2357 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
2358
2359 // ensure that the entire height of the red layer was clipped by the rounded corners crop.
2360 expectBufferColor(Point(0, 31), 0, 0, 0, 0);
2361 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 31), 0, 0, 0, 0);
2362
2363 // the bottom middle should be red
2364 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 31), 255, 0, 0, 255);
2365}
2366
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002367TEST_P(RenderEngineTest, testClear) {
2368 initializeRenderEngine();
2369
2370 const auto rect = fullscreenRect();
2371 const renderengine::DisplaySettings display{
2372 .physicalDisplay = rect,
2373 .clip = rect,
2374 };
2375
2376 const renderengine::LayerSettings redLayer{
2377 .geometry.boundaries = rect.toFloatRect(),
2378 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
2379 .alpha = 1.0f,
2380 };
2381
2382 // This mimics prepareClearClientComposition. This layer should overwrite
2383 // the redLayer, so that the buffer is transparent, rather than red.
2384 const renderengine::LayerSettings clearLayer{
2385 .geometry.boundaries = rect.toFloatRect(),
2386 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
2387 .alpha = 0.0f,
2388 .disableBlending = true,
2389 };
2390
Sally Qi59a9f502021-10-12 18:53:23 +00002391 std::vector<renderengine::LayerSettings> layers{redLayer, clearLayer};
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002392 invokeDraw(display, layers);
2393 expectBufferColor(rect, 0, 0, 0, 0);
2394}
2395
2396TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
2397 initializeRenderEngine();
2398
2399 const auto rect = Rect(0, 0, 1, 1);
2400 const renderengine::DisplaySettings display{
2401 .physicalDisplay = rect,
2402 .clip = rect,
2403 };
2404
2405 const renderengine::LayerSettings redLayer{
2406 .geometry.boundaries = rect.toFloatRect(),
2407 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
2408 .alpha = 1.0f,
2409 };
2410
2411 // The next layer will overwrite redLayer with a GraphicBuffer that is green
2412 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00002413 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002414 {
2415 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00002416 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2417 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002418 pixels[0] = 0;
2419 pixels[1] = 255;
2420 pixels[2] = 0;
2421 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00002422 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002423 }
2424
2425 const renderengine::LayerSettings greenLayer{
2426 .geometry.boundaries = rect.toFloatRect(),
2427 .source =
2428 renderengine::PixelSource{
2429 .buffer =
2430 renderengine::Buffer{
2431 .buffer = buf,
2432 .usePremultipliedAlpha = true,
2433 },
2434 },
2435 .alpha = 0.5f,
2436 .disableBlending = true,
2437 };
2438
Sally Qi59a9f502021-10-12 18:53:23 +00002439 std::vector<renderengine::LayerSettings> layers{redLayer, greenLayer};
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002440 invokeDraw(display, layers);
2441 expectBufferColor(rect, 0, 128, 0, 128);
2442}
2443
Tianhao Yao67dd7122022-02-22 17:48:33 +00002444TEST_P(RenderEngineTest, testBorder) {
2445 if (GetParam()->type() != renderengine::RenderEngine::RenderEngineType::SKIA_GL) {
2446 GTEST_SKIP();
2447 }
2448
2449 if (!GetParam()->useColorManagement()) {
2450 GTEST_SKIP();
2451 }
2452
2453 initializeRenderEngine();
2454
2455 const ui::Dataspace dataspace = ui::Dataspace::V0_SRGB;
2456
2457 const auto displayRect = Rect(1080, 2280);
2458 renderengine::DisplaySettings display{
2459 .physicalDisplay = displayRect,
2460 .clip = displayRect,
2461 .outputDataspace = dataspace,
2462 };
2463 display.borderInfoList.clear();
2464 renderengine::BorderRenderInfo info;
2465 info.combinedRegion = Region(Rect(99, 99, 199, 199));
Tianhao Yao10cea3c2022-03-30 01:37:22 +00002466 info.width = 20.0f;
2467 info.color = half4{1.0f, 128.0f / 255.0f, 0.0f, 1.0f};
Tianhao Yao67dd7122022-02-22 17:48:33 +00002468 display.borderInfoList.emplace_back(info);
2469
2470 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2471 const renderengine::LayerSettings greenLayer{
2472 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2473 .source =
2474 renderengine::PixelSource{
2475 .buffer =
2476 renderengine::Buffer{
2477 .buffer = greenBuffer,
2478 .usePremultipliedAlpha = true,
2479 },
2480 },
2481 .alpha = 1.0f,
2482 .sourceDataspace = dataspace,
2483 .whitePointNits = 200.f,
2484 };
2485
2486 std::vector<renderengine::LayerSettings> layers;
2487 layers.emplace_back(greenLayer);
2488 invokeDraw(display, layers);
2489
2490 expectBufferColor(Rect(99, 99, 101, 101), 255, 128, 0, 255, 1);
2491}
2492
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002493TEST_P(RenderEngineTest, testDimming) {
2494 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
Alec Mouri85065692022-03-18 00:58:26 +00002495 GTEST_SKIP();
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002496 }
Alec Mouri85065692022-03-18 00:58:26 +00002497
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002498 initializeRenderEngine();
2499
Alec Mouri85065692022-03-18 00:58:26 +00002500 const ui::Dataspace dataspace = ui::Dataspace::V0_SRGB_LINEAR;
2501
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002502 const auto displayRect = Rect(3, 1);
2503 const renderengine::DisplaySettings display{
2504 .physicalDisplay = displayRect,
2505 .clip = displayRect,
Alec Mouri85065692022-03-18 00:58:26 +00002506 .outputDataspace = dataspace,
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002507 .targetLuminanceNits = 1000.f,
2508 };
2509
2510 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2511 const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2512 const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255));
2513
2514 const renderengine::LayerSettings greenLayer{
2515 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2516 .source =
2517 renderengine::PixelSource{
2518 .buffer =
2519 renderengine::Buffer{
2520 .buffer = greenBuffer,
2521 .usePremultipliedAlpha = true,
2522 },
2523 },
2524 .alpha = 1.0f,
Alec Mouri85065692022-03-18 00:58:26 +00002525 .sourceDataspace = dataspace,
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002526 .whitePointNits = 200.f,
2527 };
2528
2529 const renderengine::LayerSettings blueLayer{
2530 .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2531 .source =
2532 renderengine::PixelSource{
2533 .buffer =
2534 renderengine::Buffer{
2535 .buffer = blueBuffer,
2536 .usePremultipliedAlpha = true,
2537 },
2538 },
2539 .alpha = 1.0f,
Alec Mouri85065692022-03-18 00:58:26 +00002540 .sourceDataspace = dataspace,
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002541 .whitePointNits = 1000.f / 51.f,
2542 };
2543
2544 const renderengine::LayerSettings redLayer{
2545 .geometry.boundaries = FloatRect(2.f, 0.f, 3.f, 1.f),
2546 .source =
2547 renderengine::PixelSource{
2548 .buffer =
2549 renderengine::Buffer{
2550 .buffer = redBuffer,
2551 .usePremultipliedAlpha = true,
2552 },
2553 },
2554 .alpha = 1.0f,
Alec Mouri85065692022-03-18 00:58:26 +00002555 .sourceDataspace = dataspace,
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002556 // When the white point is not set for a layer, just ignore it and treat it as the same
2557 // as the max layer
2558 .whitePointNits = -1.f,
2559 };
2560
2561 std::vector<renderengine::LayerSettings> layers{greenLayer, blueLayer, redLayer};
2562 invokeDraw(display, layers);
2563
2564 expectBufferColor(Rect(1, 1), 0, 51, 0, 255, 1);
2565 expectBufferColor(Rect(1, 0, 2, 1), 0, 0, 5, 255, 1);
2566 expectBufferColor(Rect(2, 0, 3, 1), 51, 0, 0, 255, 1);
2567}
2568
Alec Mouri85065692022-03-18 00:58:26 +00002569TEST_P(RenderEngineTest, testDimming_inGammaSpace) {
2570 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2571 GTEST_SKIP();
2572 }
2573 initializeRenderEngine();
2574
2575 const ui::Dataspace dataspace = static_cast<ui::Dataspace>(ui::Dataspace::STANDARD_BT709 |
2576 ui::Dataspace::TRANSFER_GAMMA2_2 |
2577 ui::Dataspace::RANGE_FULL);
2578
2579 const auto displayRect = Rect(3, 1);
2580 const renderengine::DisplaySettings display{
2581 .physicalDisplay = displayRect,
2582 .clip = displayRect,
2583 .outputDataspace = dataspace,
2584 .targetLuminanceNits = 1000.f,
2585 .dimmingStage = aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF,
2586 };
2587
2588 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2589 const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2590 const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255));
2591
2592 const renderengine::LayerSettings greenLayer{
2593 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2594 .source =
2595 renderengine::PixelSource{
2596 .buffer =
2597 renderengine::Buffer{
2598 .buffer = greenBuffer,
2599 .usePremultipliedAlpha = true,
2600 },
2601 },
2602 .alpha = 1.0f,
2603 .sourceDataspace = dataspace,
2604 .whitePointNits = 200.f,
2605 };
2606
2607 const renderengine::LayerSettings blueLayer{
2608 .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2609 .source =
2610 renderengine::PixelSource{
2611 .buffer =
2612 renderengine::Buffer{
2613 .buffer = blueBuffer,
2614 .usePremultipliedAlpha = true,
2615 },
2616 },
2617 .alpha = 1.0f,
2618 .sourceDataspace = dataspace,
2619 .whitePointNits = 1000.f / 51.f,
2620 };
2621
2622 const renderengine::LayerSettings redLayer{
2623 .geometry.boundaries = FloatRect(2.f, 0.f, 3.f, 1.f),
2624 .source =
2625 renderengine::PixelSource{
2626 .buffer =
2627 renderengine::Buffer{
2628 .buffer = redBuffer,
2629 .usePremultipliedAlpha = true,
2630 },
2631 },
2632 .alpha = 1.0f,
2633 .sourceDataspace = dataspace,
2634 // When the white point is not set for a layer, just ignore it and treat it as the same
2635 // as the max layer
2636 .whitePointNits = -1.f,
2637 };
2638
2639 std::vector<renderengine::LayerSettings> layers{greenLayer, blueLayer, redLayer};
2640 invokeDraw(display, layers);
2641
2642 expectBufferColor(Rect(1, 1), 0, 122, 0, 255, 1);
2643 expectBufferColor(Rect(1, 0, 2, 1), 0, 0, 42, 255, 1);
2644 expectBufferColor(Rect(2, 0, 3, 1), 122, 0, 0, 255, 1);
2645}
2646
Alec Mouri9bcd1d12022-04-21 22:16:56 +00002647TEST_P(RenderEngineTest, testDimming_inGammaSpace_withDisplayColorTransform) {
2648 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2649 GTEST_SKIP();
2650 }
2651 initializeRenderEngine();
2652
2653 const ui::Dataspace dataspace = static_cast<ui::Dataspace>(ui::Dataspace::STANDARD_BT709 |
2654 ui::Dataspace::TRANSFER_GAMMA2_2 |
2655 ui::Dataspace::RANGE_FULL);
2656
2657 const auto displayRect = Rect(3, 1);
2658 const renderengine::DisplaySettings display{
2659 .physicalDisplay = displayRect,
2660 .clip = displayRect,
2661 .outputDataspace = dataspace,
2662 .colorTransform = kRemoveGreenAndMoveRedToGreenMat4,
2663 .targetLuminanceNits = 1000.f,
2664 .dimmingStage = aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF,
2665 };
2666
2667 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2668 const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2669 const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255));
2670
2671 const renderengine::LayerSettings greenLayer{
2672 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2673 .source =
2674 renderengine::PixelSource{
2675 .buffer =
2676 renderengine::Buffer{
2677 .buffer = greenBuffer,
2678 .usePremultipliedAlpha = true,
2679 },
2680 },
2681 .alpha = 1.0f,
2682 .sourceDataspace = dataspace,
2683 .whitePointNits = 200.f,
2684 };
2685
2686 const renderengine::LayerSettings redLayer{
2687 .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2688 .source =
2689 renderengine::PixelSource{
2690 .buffer =
2691 renderengine::Buffer{
2692 .buffer = redBuffer,
2693 .usePremultipliedAlpha = true,
2694 },
2695 },
2696 .alpha = 1.0f,
2697 .sourceDataspace = dataspace,
2698 // When the white point is not set for a layer, just ignore it and treat it as the same
2699 // as the max layer
2700 .whitePointNits = -1.f,
2701 };
2702
2703 std::vector<renderengine::LayerSettings> layers{greenLayer, redLayer};
2704 invokeDraw(display, layers);
2705
2706 expectBufferColor(Rect(1, 1), 0, 0, 0, 255, 1);
2707 expectBufferColor(Rect(1, 0, 2, 1), 0, 122, 0, 255, 1);
2708}
2709
2710TEST_P(RenderEngineTest, testDimming_inGammaSpace_withDisplayColorTransform_deviceHandles) {
2711 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2712 GTEST_SKIP();
2713 }
2714 initializeRenderEngine();
2715
2716 const ui::Dataspace dataspace = static_cast<ui::Dataspace>(ui::Dataspace::STANDARD_BT709 |
2717 ui::Dataspace::TRANSFER_GAMMA2_2 |
2718 ui::Dataspace::RANGE_FULL);
2719
2720 const auto displayRect = Rect(3, 1);
2721 const renderengine::DisplaySettings display{
2722 .physicalDisplay = displayRect,
2723 .clip = displayRect,
2724 .outputDataspace = dataspace,
2725 .colorTransform = kRemoveGreenAndMoveRedToGreenMat4,
2726 .deviceHandlesColorTransform = true,
2727 .targetLuminanceNits = 1000.f,
2728 .dimmingStage = aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF,
2729 };
2730
2731 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2732 const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2733 const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255));
2734
2735 const renderengine::LayerSettings greenLayer{
2736 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2737 .source =
2738 renderengine::PixelSource{
2739 .buffer =
2740 renderengine::Buffer{
2741 .buffer = greenBuffer,
2742 .usePremultipliedAlpha = true,
2743 },
2744 },
2745 .alpha = 1.0f,
2746 .sourceDataspace = dataspace,
2747 .whitePointNits = 200.f,
2748 };
2749
2750 const renderengine::LayerSettings redLayer{
2751 .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2752 .source =
2753 renderengine::PixelSource{
2754 .buffer =
2755 renderengine::Buffer{
2756 .buffer = redBuffer,
2757 .usePremultipliedAlpha = true,
2758 },
2759 },
2760 .alpha = 1.0f,
2761 .sourceDataspace = dataspace,
2762 // When the white point is not set for a layer, just ignore it and treat it as the same
2763 // as the max layer
2764 .whitePointNits = -1.f,
2765 };
2766
2767 std::vector<renderengine::LayerSettings> layers{greenLayer, redLayer};
2768 invokeDraw(display, layers);
2769
2770 expectBufferColor(Rect(1, 1), 0, 122, 0, 255, 1);
2771 expectBufferColor(Rect(1, 0, 2, 1), 122, 0, 0, 255, 1);
2772}
2773
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002774TEST_P(RenderEngineTest, testDimming_withoutTargetLuminance) {
2775 initializeRenderEngine();
2776 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2777 return;
2778 }
2779
2780 const auto displayRect = Rect(2, 1);
2781 const renderengine::DisplaySettings display{
2782 .physicalDisplay = displayRect,
2783 .clip = displayRect,
2784 .outputDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2785 .targetLuminanceNits = -1.f,
2786 };
2787
2788 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2789 const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2790
2791 const renderengine::LayerSettings greenLayer{
2792 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2793 .source =
2794 renderengine::PixelSource{
2795 .buffer =
2796 renderengine::Buffer{
2797 .buffer = greenBuffer,
2798 .usePremultipliedAlpha = true,
2799 },
2800 },
2801 .alpha = 1.0f,
2802 .sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2803 .whitePointNits = 200.f,
2804 };
2805
2806 const renderengine::LayerSettings blueLayer{
2807 .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2808 .source =
2809 renderengine::PixelSource{
2810 .buffer =
2811 renderengine::Buffer{
2812 .buffer = blueBuffer,
2813 .usePremultipliedAlpha = true,
2814 },
2815 },
2816 .alpha = 1.0f,
2817 .sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2818 .whitePointNits = 1000.f,
2819 };
2820
2821 std::vector<renderengine::LayerSettings> layers{greenLayer, blueLayer};
2822 invokeDraw(display, layers);
2823
2824 expectBufferColor(Rect(1, 1), 0, 51, 0, 255, 1);
2825 expectBufferColor(Rect(1, 0, 2, 1), 0, 0, 255, 255);
2826}
2827
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04002828TEST_P(RenderEngineTest, test_isOpaque) {
2829 initializeRenderEngine();
2830
2831 const auto rect = Rect(0, 0, 1, 1);
2832 const renderengine::DisplaySettings display{
2833 .physicalDisplay = rect,
2834 .clip = rect,
2835 .outputDataspace = ui::Dataspace::DISPLAY_P3,
2836 };
2837
2838 // Create an unpremul buffer that is green with no alpha. Using isOpaque
2839 // should make the green show.
2840 const auto buf = allocateSourceBuffer(1, 1);
2841 {
2842 uint8_t* pixels;
2843 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2844 reinterpret_cast<void**>(&pixels));
2845 pixels[0] = 0;
2846 pixels[1] = 255;
2847 pixels[2] = 0;
2848 pixels[3] = 0;
2849 buf->getBuffer()->unlock();
2850 }
2851
2852 const renderengine::LayerSettings greenLayer{
2853 .geometry.boundaries = rect.toFloatRect(),
2854 .source =
2855 renderengine::PixelSource{
2856 .buffer =
2857 renderengine::Buffer{
2858 .buffer = buf,
2859 // Although the pixels are not
2860 // premultiplied in practice, this
2861 // matches the input we see.
2862 .usePremultipliedAlpha = true,
2863 .isOpaque = true,
2864 },
2865 },
2866 .alpha = 1.0f,
2867 };
2868
Sally Qi59a9f502021-10-12 18:53:23 +00002869 std::vector<renderengine::LayerSettings> layers{greenLayer};
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04002870 invokeDraw(display, layers);
2871
2872 if (GetParam()->useColorManagement()) {
2873 expectBufferColor(rect, 117, 251, 76, 255);
2874 } else {
2875 expectBufferColor(rect, 0, 255, 0, 255);
2876 }
2877}
Alec Mouri4049b532021-10-15 20:59:33 -07002878
Alec Mouri4049b532021-10-15 20:59:33 -07002879TEST_P(RenderEngineTest, test_tonemapPQMatches) {
2880 if (!GetParam()->useColorManagement()) {
Alec Mouri5a493722022-01-26 16:43:02 -08002881 GTEST_SKIP();
Alec Mouri4049b532021-10-15 20:59:33 -07002882 }
2883
2884 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
Alec Mouri5a493722022-01-26 16:43:02 -08002885 GTEST_SKIP();
Alec Mouri4049b532021-10-15 20:59:33 -07002886 }
2887
2888 initializeRenderEngine();
2889
Alec Mouri5a493722022-01-26 16:43:02 -08002890 tonemap(
2891 static_cast<ui::Dataspace>(HAL_DATASPACE_STANDARD_BT2020 |
2892 HAL_DATASPACE_TRANSFER_ST2084 | HAL_DATASPACE_RANGE_FULL),
2893 [](vec3 color) { return EOTF_PQ(color); },
2894 [](vec3 color, float) {
2895 static constexpr float kMaxPQLuminance = 10000.f;
2896 return color * kMaxPQLuminance;
2897 });
2898}
Alec Mouri4049b532021-10-15 20:59:33 -07002899
Alec Mouri5a493722022-01-26 16:43:02 -08002900TEST_P(RenderEngineTest, test_tonemapHLGMatches) {
2901 if (!GetParam()->useColorManagement()) {
2902 GTEST_SKIP();
Alec Mouri4049b532021-10-15 20:59:33 -07002903 }
2904
Alec Mouri5a493722022-01-26 16:43:02 -08002905 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2906 GTEST_SKIP();
2907 }
Alec Mouri4049b532021-10-15 20:59:33 -07002908
Alec Mouri5a493722022-01-26 16:43:02 -08002909 initializeRenderEngine();
Alec Mouri4049b532021-10-15 20:59:33 -07002910
Alec Mouri5a493722022-01-26 16:43:02 -08002911 tonemap(
2912 static_cast<ui::Dataspace>(HAL_DATASPACE_STANDARD_BT2020 | HAL_DATASPACE_TRANSFER_HLG |
2913 HAL_DATASPACE_RANGE_FULL),
2914 [](vec3 color) { return EOTF_HLG(color); },
2915 [](vec3 color, float currentLuminaceNits) {
2916 static constexpr float kMaxHLGLuminance = 1000.f;
Alec Mouri7a577452022-03-04 23:41:38 +00002917 return color * kMaxHLGLuminance;
Alec Mouri5a493722022-01-26 16:43:02 -08002918 });
Alec Mouri4049b532021-10-15 20:59:33 -07002919}
Leon Scroggins III2c1d9ef2022-01-21 13:46:56 -05002920
2921TEST_P(RenderEngineTest, r8_behaves_as_mask) {
2922 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2923 return;
2924 }
2925
2926 initializeRenderEngine();
2927
2928 const auto r8Buffer = allocateR8Buffer(2, 1);
2929 if (!r8Buffer) {
Leon Scroggins III745dcaa2022-01-26 11:55:58 -05002930 GTEST_SKIP() << "Test is only necessary on devices that support r8";
Leon Scroggins III2c1d9ef2022-01-21 13:46:56 -05002931 return;
2932 }
2933 {
2934 uint8_t* pixels;
2935 r8Buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2936 reinterpret_cast<void**>(&pixels));
2937 // This will be drawn on top of a green buffer. We'll verify that 255
2938 // results in keeping the original green and 0 results in black.
2939 pixels[0] = 0;
2940 pixels[1] = 255;
2941 r8Buffer->getBuffer()->unlock();
2942 }
2943
2944 const auto rect = Rect(0, 0, 2, 1);
2945 const renderengine::DisplaySettings display{
2946 .physicalDisplay = rect,
2947 .clip = rect,
2948 .outputDataspace = ui::Dataspace::SRGB,
2949 };
2950
2951 const auto greenBuffer = allocateAndFillSourceBuffer(2, 1, ubyte4(0, 255, 0, 255));
2952 const renderengine::LayerSettings greenLayer{
2953 .geometry.boundaries = rect.toFloatRect(),
2954 .source =
2955 renderengine::PixelSource{
2956 .buffer =
2957 renderengine::Buffer{
2958 .buffer = greenBuffer,
2959 },
2960 },
2961 .alpha = 1.0f,
2962 };
2963 const renderengine::LayerSettings r8Layer{
2964 .geometry.boundaries = rect.toFloatRect(),
2965 .source =
2966 renderengine::PixelSource{
2967 .buffer =
2968 renderengine::Buffer{
2969 .buffer = r8Buffer,
2970 },
2971 },
2972 .alpha = 1.0f,
2973 };
2974
2975 std::vector<renderengine::LayerSettings> layers{greenLayer, r8Layer};
2976 invokeDraw(display, layers);
2977
2978 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 255);
2979 expectBufferColor(Rect(1, 0, 2, 1), 0, 255, 0, 255);
2980}
Leon Scroggins III745dcaa2022-01-26 11:55:58 -05002981
2982TEST_P(RenderEngineTest, r8_respects_color_transform) {
2983 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2984 return;
2985 }
2986
2987 initializeRenderEngine();
2988
2989 const auto r8Buffer = allocateR8Buffer(2, 1);
2990 if (!r8Buffer) {
2991 GTEST_SKIP() << "Test is only necessary on devices that support r8";
2992 return;
2993 }
2994 {
2995 uint8_t* pixels;
2996 r8Buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2997 reinterpret_cast<void**>(&pixels));
2998 pixels[0] = 0;
2999 pixels[1] = 255;
3000 r8Buffer->getBuffer()->unlock();
3001 }
3002
3003 const auto rect = Rect(0, 0, 2, 1);
3004 const renderengine::DisplaySettings display{
3005 .physicalDisplay = rect,
3006 .clip = rect,
3007 .outputDataspace = ui::Dataspace::SRGB,
3008 // Verify that the R8 layer respects the color transform when
3009 // deviceHandlesColorTransform is false. This transform converts
3010 // pure red to pure green. That will occur when the R8 buffer is
3011 // 255. When the R8 buffer is 0, it will still change to black, as
3012 // with r8_behaves_as_mask.
Alec Mouri9bcd1d12022-04-21 22:16:56 +00003013 .colorTransform = kRemoveGreenAndMoveRedToGreenMat4,
Leon Scroggins III745dcaa2022-01-26 11:55:58 -05003014 .deviceHandlesColorTransform = false,
3015 };
3016
3017 const auto redBuffer = allocateAndFillSourceBuffer(2, 1, ubyte4(255, 0, 0, 255));
3018 const renderengine::LayerSettings redLayer{
3019 .geometry.boundaries = rect.toFloatRect(),
3020 .source =
3021 renderengine::PixelSource{
3022 .buffer =
3023 renderengine::Buffer{
3024 .buffer = redBuffer,
3025 },
3026 },
3027 .alpha = 1.0f,
3028 };
3029 const renderengine::LayerSettings r8Layer{
3030 .geometry.boundaries = rect.toFloatRect(),
3031 .source =
3032 renderengine::PixelSource{
3033 .buffer =
3034 renderengine::Buffer{
3035 .buffer = r8Buffer,
3036 },
3037 },
3038 .alpha = 1.0f,
3039 };
3040
3041 std::vector<renderengine::LayerSettings> layers{redLayer, r8Layer};
3042 invokeDraw(display, layers);
3043
3044 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 255);
3045 expectBufferColor(Rect(1, 0, 2, 1), 0, 255, 0, 255);
3046}
3047
3048TEST_P(RenderEngineTest, r8_respects_color_transform_when_device_handles) {
3049 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
3050 return;
3051 }
3052
3053 initializeRenderEngine();
3054
3055 const auto r8Buffer = allocateR8Buffer(2, 1);
3056 if (!r8Buffer) {
3057 GTEST_SKIP() << "Test is only necessary on devices that support r8";
3058 return;
3059 }
3060 {
3061 uint8_t* pixels;
3062 r8Buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
3063 reinterpret_cast<void**>(&pixels));
3064 pixels[0] = 0;
3065 pixels[1] = 255;
3066 r8Buffer->getBuffer()->unlock();
3067 }
3068
3069 const auto rect = Rect(0, 0, 2, 1);
3070 const renderengine::DisplaySettings display{
3071 .physicalDisplay = rect,
3072 .clip = rect,
3073 .outputDataspace = ui::Dataspace::SRGB,
3074 // If deviceHandlesColorTransform is true, pixels where the A8
3075 // buffer is opaque are unaffected. If the colorTransform is
3076 // invertible, pixels where the A8 buffer are transparent have the
3077 // inverse applied to them so that the DPU will convert them back to
3078 // black. Test with an arbitrary, invertible matrix.
3079 .colorTransform = mat4(1, 0, 0, 2,
3080 3, 1, 2, 5,
3081 0, 5, 3, 0,
3082 0, 1, 0, 2),
3083 .deviceHandlesColorTransform = true,
3084 };
3085
3086 const auto redBuffer = allocateAndFillSourceBuffer(2, 1, ubyte4(255, 0, 0, 255));
3087 const renderengine::LayerSettings redLayer{
3088 .geometry.boundaries = rect.toFloatRect(),
3089 .source =
3090 renderengine::PixelSource{
3091 .buffer =
3092 renderengine::Buffer{
3093 .buffer = redBuffer,
3094 },
3095 },
3096 .alpha = 1.0f,
3097 };
3098 const renderengine::LayerSettings r8Layer{
3099 .geometry.boundaries = rect.toFloatRect(),
3100 .source =
3101 renderengine::PixelSource{
3102 .buffer =
3103 renderengine::Buffer{
3104 .buffer = r8Buffer,
3105 },
3106 },
3107 .alpha = 1.0f,
3108 };
3109
3110 std::vector<renderengine::LayerSettings> layers{redLayer, r8Layer};
3111 invokeDraw(display, layers);
3112
3113 expectBufferColor(Rect(1, 0, 2, 1), 255, 0, 0, 255); // Still red.
3114 expectBufferColor(Rect(0, 0, 1, 1), 0, 70, 0, 255);
3115}
Leon Scroggins III45be9182022-04-27 10:37:11 -04003116
3117TEST_P(RenderEngineTest, primeShaderCache) {
3118 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
3119 GTEST_SKIP();
3120 }
3121
3122 initializeRenderEngine();
3123
3124 auto fut = mRE->primeCache();
3125 if (fut.valid()) {
3126 fut.wait();
3127 }
3128
3129 const int minimumExpectedShadersCompiled = GetParam()->useColorManagement() ? 60 : 30;
3130 ASSERT_GT(static_cast<skia::SkiaGLRenderEngine*>(mRE.get())->reportShadersCompiled(),
3131 minimumExpectedShadersCompiled);
3132}
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04003133} // namespace renderengine
Alec Mouri6e57f682018-09-29 20:45:08 -07003134} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08003135
3136// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01003137#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"