blob: ec1bd470b55be7824bba5795c5a57e975a303499 [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
94} // namespace
95
Ana Krulec82ba2ec2020-11-21 13:33:20 -080096class RenderEngineFactory {
97public:
98 virtual ~RenderEngineFactory() = default;
99
100 virtual std::string name() = 0;
Alec Mouric0aae732021-01-12 13:32:18 -0800101 virtual renderengine::RenderEngine::RenderEngineType type() = 0;
102 virtual std::unique_ptr<renderengine::RenderEngine> createRenderEngine() = 0;
103 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
104 return nullptr;
105 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400106 virtual bool useColorManagement() const = 0;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800107};
108
109class GLESRenderEngineFactory : public RenderEngineFactory {
110public:
111 std::string name() override { return "GLESRenderEngineFactory"; }
112
Alec Mouric0aae732021-01-12 13:32:18 -0800113 renderengine::RenderEngine::RenderEngineType type() {
114 return renderengine::RenderEngine::RenderEngineType::GLES;
115 }
116
117 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
118 return createGLESRenderEngine();
119 }
120
121 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800122 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -0700123 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800124 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
125 .setImageCacheSize(1)
126 .setUseColorManagerment(false)
127 .setEnableProtectedContext(false)
128 .setPrecacheToneMapperShaderOnly(false)
129 .setSupportsBackgroundBlur(true)
130 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800131 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700132 .setUseColorManagerment(useColorManagement())
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800133 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800134 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -0700135 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400136
137 bool useColorManagement() const override { return false; }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800138};
Alec Mourid43ccab2019-03-13 12:23:45 -0700139
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800140class GLESCMRenderEngineFactory : public RenderEngineFactory {
141public:
142 std::string name() override { return "GLESCMRenderEngineFactory"; }
143
Alec Mouric0aae732021-01-12 13:32:18 -0800144 renderengine::RenderEngine::RenderEngineType type() {
145 return renderengine::RenderEngine::RenderEngineType::GLES;
146 }
147
148 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
149 return createGLESRenderEngine();
150 }
151
152 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() override {
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800153 renderengine::RenderEngineCreationArgs reCreationArgs =
154 renderengine::RenderEngineCreationArgs::Builder()
155 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
156 .setImageCacheSize(1)
157 .setEnableProtectedContext(false)
158 .setPrecacheToneMapperShaderOnly(false)
159 .setSupportsBackgroundBlur(true)
160 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800161 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700162 .setUseColorManagerment(useColorManagement())
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800163 .build();
164 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
165 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400166
167 bool useColorManagement() const override { return true; }
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800168};
169
Alec Mouri0eab3e82020-12-08 18:10:27 -0800170class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
171public:
Alec Mouric0aae732021-01-12 13:32:18 -0800172 std::string name() override { return "SkiaGLRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800173
Alec Mouric0aae732021-01-12 13:32:18 -0800174 renderengine::RenderEngine::RenderEngineType type() {
175 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
176 }
177
178 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800179 renderengine::RenderEngineCreationArgs reCreationArgs =
180 renderengine::RenderEngineCreationArgs::Builder()
181 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
182 .setImageCacheSize(1)
183 .setEnableProtectedContext(false)
184 .setPrecacheToneMapperShaderOnly(false)
185 .setSupportsBackgroundBlur(true)
186 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800187 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700188 .setUseColorManagerment(useColorManagement())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800189 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800190 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800191 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400192
Alec Mourid2bcbae2021-06-28 17:02:17 -0700193 bool useColorManagement() const override { return false; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800194};
195
196class SkiaGLESCMRenderEngineFactory : public RenderEngineFactory {
197public:
Alec Mouric0aae732021-01-12 13:32:18 -0800198 std::string name() override { return "SkiaGLCMRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800199
Alec Mouric0aae732021-01-12 13:32:18 -0800200 renderengine::RenderEngine::RenderEngineType type() {
201 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
202 }
203
204 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800205 renderengine::RenderEngineCreationArgs reCreationArgs =
206 renderengine::RenderEngineCreationArgs::Builder()
207 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
208 .setImageCacheSize(1)
209 .setEnableProtectedContext(false)
210 .setPrecacheToneMapperShaderOnly(false)
211 .setSupportsBackgroundBlur(true)
212 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800213 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700214 .setUseColorManagerment(useColorManagement())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800215 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800216 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800217 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400218
219 bool useColorManagement() const override { return true; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800220};
221
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800222class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
223public:
Alec Mouria90a5702021-04-16 16:36:21 +0000224 std::shared_ptr<renderengine::ExternalTexture> allocateDefaultBuffer() {
225 return std::make_shared<
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800226 renderengine::impl::
Alec Mouria90a5702021-04-16 16:36:21 +0000227 ExternalTexture>(new GraphicBuffer(DEFAULT_DISPLAY_WIDTH,
228 DEFAULT_DISPLAY_HEIGHT,
229 HAL_PIXEL_FORMAT_RGBA_8888, 1,
230 GRALLOC_USAGE_SW_READ_OFTEN |
231 GRALLOC_USAGE_SW_WRITE_OFTEN |
232 GRALLOC_USAGE_HW_RENDER |
233 GRALLOC_USAGE_HW_TEXTURE,
234 "output"),
235 *mRE,
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800236 renderengine::impl::ExternalTexture::Usage::READABLE |
237 renderengine::impl::ExternalTexture::Usage::
238 WRITEABLE);
Alec Mouri6e57f682018-09-29 20:45:08 -0700239 }
240
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800241 // Allocates a 1x1 buffer to fill with a solid color
Alec Mouria90a5702021-04-16 16:36:21 +0000242 std::shared_ptr<renderengine::ExternalTexture> allocateSourceBuffer(uint32_t width,
243 uint32_t height) {
244 return std::make_shared<
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800245 renderengine::impl::
Alec Mouria90a5702021-04-16 16:36:21 +0000246 ExternalTexture>(new GraphicBuffer(width, height,
247 HAL_PIXEL_FORMAT_RGBA_8888, 1,
248 GRALLOC_USAGE_SW_READ_OFTEN |
249 GRALLOC_USAGE_SW_WRITE_OFTEN |
250 GRALLOC_USAGE_HW_TEXTURE,
251 "input"),
252 *mRE,
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800253 renderengine::impl::ExternalTexture::Usage::READABLE |
254 renderengine::impl::ExternalTexture::Usage::
255 WRITEABLE);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800256 }
257
Alec Mouricdf6cbc2021-11-01 17:21:15 -0700258 std::shared_ptr<renderengine::ExternalTexture> allocateAndFillSourceBuffer(uint32_t width,
259 uint32_t height,
260 ubyte4 color) {
261 const auto buffer = allocateSourceBuffer(width, height);
262 uint8_t* pixels;
263 buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
264 reinterpret_cast<void**>(&pixels));
Leon Scroggins III2c1d9ef2022-01-21 13:46:56 -0500265 for (uint32_t j = 0; j < height; j++) {
266 uint8_t* dst = pixels + (buffer->getBuffer()->getStride() * j * 4);
267 for (uint32_t i = 0; i < width; i++) {
268 dst[0] = color.r;
269 dst[1] = color.g;
270 dst[2] = color.b;
271 dst[3] = color.a;
272 dst += 4;
273 }
274 }
Alec Mouricdf6cbc2021-11-01 17:21:15 -0700275 buffer->getBuffer()->unlock();
276 return buffer;
277 }
278
Leon Scroggins III2c1d9ef2022-01-21 13:46:56 -0500279 std::shared_ptr<renderengine::ExternalTexture> allocateR8Buffer(int width, int height) {
280 auto buffer = new GraphicBuffer(width, height, android::PIXEL_FORMAT_R_8, 1,
281 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
282 GRALLOC_USAGE_HW_TEXTURE,
283 "r8");
284 if (buffer->initCheck() != 0) {
285 // Devices are not required to support R8.
286 return nullptr;
287 }
288 return std::make_shared<
289 renderengine::impl::ExternalTexture>(std::move(buffer), *mRE,
290 renderengine::impl::ExternalTexture::Usage::
291 READABLE);
292 }
293
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800294 RenderEngineTest() {
295 const ::testing::TestInfo* const test_info =
296 ::testing::UnitTest::GetInstance()->current_test_info();
297 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800298 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700299
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800300 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800301 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
302 writeBufferToFile("/data/texture_out_");
303 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800304 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800305 mRE->deleteTextures(1, &texName);
Alec Mouric0aae732021-01-12 13:32:18 -0800306 if (mGLESRE != nullptr) {
307 EXPECT_FALSE(mGLESRE->isTextureNameKnownForTesting(texName));
308 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800309 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800310 const ::testing::TestInfo* const test_info =
311 ::testing::UnitTest::GetInstance()->current_test_info();
312 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800313 }
314
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800315 void writeBufferToFile(const char* basename) {
316 std::string filename(basename);
317 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
318 filename.append(".ppm");
319 std::ofstream file(filename.c_str(), std::ios::binary);
320 if (!file.is_open()) {
321 ALOGE("Unable to open file: %s", filename.c_str());
322 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
323 "surfaceflinger to write debug images");
324 return;
325 }
326
Alec Mouri1089aed2018-10-25 21:33:57 -0700327 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000328 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
329 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700330
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800331 file << "P6\n";
Alec Mouria90a5702021-04-16 16:36:21 +0000332 file << mBuffer->getBuffer()->getWidth() << "\n";
333 file << mBuffer->getBuffer()->getHeight() << "\n";
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800334 file << 255 << "\n";
335
Alec Mouria90a5702021-04-16 16:36:21 +0000336 std::vector<uint8_t> outBuffer(mBuffer->getBuffer()->getWidth() *
337 mBuffer->getBuffer()->getHeight() * 3);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800338 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
339
Alec Mouria90a5702021-04-16 16:36:21 +0000340 for (int32_t j = 0; j < mBuffer->getBuffer()->getHeight(); j++) {
341 const uint8_t* src = pixels + (mBuffer->getBuffer()->getStride() * j) * 4;
342 for (int32_t i = 0; i < mBuffer->getBuffer()->getWidth(); i++) {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800343 // Only copy R, G and B components
344 outPtr[0] = src[0];
345 outPtr[1] = src[1];
346 outPtr[2] = src[2];
347 outPtr += 3;
348
349 src += 4;
350 }
351 }
352 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
Alec Mouria90a5702021-04-16 16:36:21 +0000353 mBuffer->getBuffer()->unlock();
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800354 }
355
356 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
357 size_t c;
358 Rect const* rect = region.getArray(&c);
359 for (size_t i = 0; i < c; i++, rect++) {
360 expectBufferColor(*rect, r, g, b, a);
361 }
362 }
363
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -0400364 void expectBufferColor(const Point& point, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
365 uint8_t tolerance = 0) {
366 expectBufferColor(Rect(point.x, point.y, point.x + 1, point.y + 1), r, g, b, a, tolerance);
367 }
368
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800369 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
370 uint8_t tolerance = 0) {
Alec Mouri4049b532021-10-15 20:59:33 -0700371 auto generator = [=](Point) { return ubyte4(r, g, b, a); };
372 expectBufferColor(rect, generator, tolerance);
373 }
374
375 using ColorGenerator = std::function<ubyte4(Point location)>;
376
377 void expectBufferColor(const Rect& rect, ColorGenerator generator, uint8_t tolerance = 0) {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800378 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
379 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
380 uint8_t tmp = a >= b ? a - b : b - a;
381 return tmp <= tolerance;
382 };
383 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700384 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800385
Alec Mouri4049b532021-10-15 20:59:33 -0700386 expectBufferColor(rect, generator, colorCompare);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800387 }
388
Alec Mouri4049b532021-10-15 20:59:33 -0700389 void expectBufferColor(const Rect& region, ColorGenerator generator,
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800390 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
391 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000392 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
393 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700394 int32_t maxFails = 10;
395 int32_t fails = 0;
396 for (int32_t j = 0; j < region.getHeight(); j++) {
Alec Mouria90a5702021-04-16 16:36:21 +0000397 const uint8_t* src = pixels +
398 (mBuffer->getBuffer()->getStride() * (region.top + j) + region.left) * 4;
Alec Mouri1089aed2018-10-25 21:33:57 -0700399 for (int32_t i = 0; i < region.getWidth(); i++) {
Alec Mouri4049b532021-10-15 20:59:33 -0700400 const auto location = Point(region.left + i, region.top + j);
401 const ubyte4 colors = generator(location);
402 const uint8_t expected[4] = {colors.r, colors.g, colors.b, colors.a};
403 bool colorMatches = colorCompare(src, expected);
404 EXPECT_TRUE(colorMatches)
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400405 << GetParam()->name().c_str() << ": "
Alec Mouri4049b532021-10-15 20:59:33 -0700406 << "pixel @ (" << location.x << ", " << location.y << "): "
407 << "expected (" << static_cast<uint32_t>(colors.r) << ", "
408 << static_cast<uint32_t>(colors.g) << ", "
409 << static_cast<uint32_t>(colors.b) << ", "
410 << static_cast<uint32_t>(colors.a) << "), "
Alec Mouri1089aed2018-10-25 21:33:57 -0700411 << "got (" << static_cast<uint32_t>(src[0]) << ", "
412 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
413 << ", " << static_cast<uint32_t>(src[3]) << ")";
414 src += 4;
Alec Mouri4049b532021-10-15 20:59:33 -0700415 if (!colorMatches && ++fails >= maxFails) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700416 break;
417 }
418 }
419 if (fails >= maxFails) {
420 break;
421 }
422 }
Alec Mouria90a5702021-04-16 16:36:21 +0000423 mBuffer->getBuffer()->unlock();
Alec Mouri1089aed2018-10-25 21:33:57 -0700424 }
425
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800426 void expectAlpha(const Rect& rect, uint8_t a) {
Alec Mouri4049b532021-10-15 20:59:33 -0700427 auto generator = [=](Point) { return ubyte4(0, 0, 0, a); };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800428 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
429 return colorA[3] == colorB[3];
430 };
Alec Mouri4049b532021-10-15 20:59:33 -0700431 expectBufferColor(rect, generator, colorCompare);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800432 }
433
434 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
435 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
436 const ubyte4& backgroundColor) {
437 const Rect casterRect(castingLayer.geometry.boundaries);
438 Region casterRegion = Region(casterRect);
439 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
440 if (casterCornerRadius > 0.0f) {
441 // ignore the corners if a corner radius is set
442 Rect cornerRect(casterCornerRadius, casterCornerRadius);
443 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
444 casterRegion.subtractSelf(
445 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
446 casterRegion.subtractSelf(
447 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
448 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
449 casterRect.bottom - casterCornerRadius));
450 }
451
452 const float shadowInset = shadow.length * -1.0f;
453 const Rect casterWithShadow =
454 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
455 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
456 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
457
458 // verify casting layer
459 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
460
461 // verify shadows by testing just the alpha since its difficult to validate the shadow color
462 size_t c;
463 Rect const* r = shadowRegion.getArray(&c);
464 for (size_t i = 0; i < c; i++, r++) {
465 expectAlpha(*r, 255);
466 }
467
468 // verify background
469 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
470 backgroundColor.a);
471 }
472
Alec Mouribd17b3b2020-12-17 11:08:30 -0800473 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
474 const renderengine::ShadowSettings& shadow,
475 const ubyte4& backgroundColor) {
476 const float shadowInset = shadow.length * -1.0f;
477 const Rect casterRect(casterBounds);
478 const Rect shadowRect =
479 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
480
481 const Region backgroundRegion =
482 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
483
484 expectAlpha(shadowRect, 255);
485 // (0, 0, 0) fill on the bounds of the layer should be ignored.
486 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
487
488 // verify background
489 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
490 backgroundColor.a);
491 }
492
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800493 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
494 bool casterIsTranslucent) {
495 renderengine::ShadowSettings shadow;
496 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
497 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
498 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
499 shadow.lightRadius = 0.0f;
500 shadow.length = shadowLength;
501 shadow.casterIsTranslucent = casterIsTranslucent;
502 return shadow;
503 }
504
Alec Mouri1089aed2018-10-25 21:33:57 -0700505 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
506
507 static Rect offsetRect() {
508 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
509 DEFAULT_DISPLAY_HEIGHT);
510 }
511
512 static Rect offsetRectAtZero() {
513 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
514 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
515 }
516
Sally Qi59a9f502021-10-12 18:53:23 +0000517 void invokeDraw(const renderengine::DisplaySettings& settings,
518 const std::vector<renderengine::LayerSettings>& layers) {
Sally Qi4cabdd02021-08-05 16:45:57 -0700519 std::future<renderengine::RenderEngineResult> result =
520 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd());
Sally Qi59a9f502021-10-12 18:53:23 +0000521
Sally Qi4cabdd02021-08-05 16:45:57 -0700522 ASSERT_TRUE(result.valid());
523 auto [status, fence] = result.get();
Alec Mouri1089aed2018-10-25 21:33:57 -0700524
Derek Sollenbergerec411212021-08-25 10:54:47 -0400525 ASSERT_EQ(NO_ERROR, status);
526 if (fence.ok()) {
527 sync_wait(fence.get(), -1);
Alec Mouri1089aed2018-10-25 21:33:57 -0700528 }
529
Alec Mouric0aae732021-01-12 13:32:18 -0800530 if (layers.size() > 0 && mGLESRE != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000531 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700532 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700533 }
534
Alec Mourid43ccab2019-03-13 12:23:45 -0700535 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700536 renderengine::DisplaySettings settings;
Sally Qi59a9f502021-10-12 18:53:23 +0000537 std::vector<renderengine::LayerSettings> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800538 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700539 }
540
Alec Mouri1089aed2018-10-25 21:33:57 -0700541 template <typename SourceVariant>
542 void fillBuffer(half r, half g, half b, half a);
543
544 template <typename SourceVariant>
545 void fillRedBuffer();
546
547 template <typename SourceVariant>
548 void fillGreenBuffer();
549
550 template <typename SourceVariant>
551 void fillBlueBuffer();
552
553 template <typename SourceVariant>
554 void fillRedTransparentBuffer();
555
556 template <typename SourceVariant>
557 void fillRedOffsetBuffer();
558
559 template <typename SourceVariant>
560 void fillBufferPhysicalOffset();
561
562 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700563 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700564
565 template <typename SourceVariant>
566 void fillBufferCheckersRotate0();
567
568 template <typename SourceVariant>
569 void fillBufferCheckersRotate90();
570
571 template <typename SourceVariant>
572 void fillBufferCheckersRotate180();
573
574 template <typename SourceVariant>
575 void fillBufferCheckersRotate270();
576
577 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800578 void fillBufferWithLayerTransform();
579
580 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700581 void fillBufferLayerTransform();
582
583 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800584 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800585
586 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700587 void fillBufferColorTransform();
588
Alec Mouri7c94edb2018-12-03 21:23:26 -0800589 template <typename SourceVariant>
Sally Qi2019fd22021-11-22 10:19:04 -0800590 void fillBufferWithColorTransformAndSourceDataspace(const ui::Dataspace sourceDataspace);
591
592 template <typename SourceVariant>
593 void fillBufferColorTransformAndSourceDataspace();
594
595 template <typename SourceVariant>
596 void fillBufferWithColorTransformAndOutputDataspace(const ui::Dataspace outputDataspace);
597
598 template <typename SourceVariant>
599 void fillBufferColorTransformAndOutputDataspace();
600
601 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800602 void fillBufferWithColorTransformZeroLayerAlpha();
603
604 template <typename SourceVariant>
605 void fillBufferColorTransformZeroLayerAlpha();
606
607 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800608 void fillRedBufferWithRoundedCorners();
609
610 template <typename SourceVariant>
611 void fillBufferWithRoundedCorners();
612
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000613 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800614 void fillBufferAndBlurBackground();
615
616 template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700617 void fillSmallLayerAndBlurBackground();
618
619 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000620 void overlayCorners();
621
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800622 void fillRedBufferTextureTransform();
623
624 void fillBufferTextureTransform();
625
626 void fillRedBufferWithPremultiplyAlpha();
627
628 void fillBufferWithPremultiplyAlpha();
629
630 void fillRedBufferWithoutPremultiplyAlpha();
631
632 void fillBufferWithoutPremultiplyAlpha();
633
Alec Mouriac335532018-11-12 15:01:33 -0800634 void fillGreenColorBufferThenClearRegion();
635
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800636 template <typename SourceVariant>
637 void drawShadow(const renderengine::LayerSettings& castingLayer,
638 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
639 const ubyte4& backgroundColor);
640
Alec Mouribd17b3b2020-12-17 11:08:30 -0800641 void drawShadowWithoutCaster(const FloatRect& castingBounds,
642 const renderengine::ShadowSettings& shadow,
643 const ubyte4& backgroundColor);
644
Alec Mouri5a493722022-01-26 16:43:02 -0800645 // Tonemaps grey values from sourceDataspace -> Display P3 and checks that GPU and CPU
646 // implementations are identical Also implicitly checks that the injected tonemap shader
647 // compiles
648 void tonemap(ui::Dataspace sourceDataspace, std::function<vec3(vec3)> eotf,
649 std::function<vec3(vec3, float)> scaleOotf);
650
Alec Mouric0aae732021-01-12 13:32:18 -0800651 void initializeRenderEngine();
652
653 std::unique_ptr<renderengine::RenderEngine> mRE;
Alec Mouria90a5702021-04-16 16:36:21 +0000654 std::shared_ptr<renderengine::ExternalTexture> mBuffer;
Alec Mouric0aae732021-01-12 13:32:18 -0800655 // GLESRenderEngine for testing GLES-specific behavior.
656 // Owened by mRE, but this is downcasted.
657 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800658
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800659 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700660};
661
Alec Mouric0aae732021-01-12 13:32:18 -0800662void RenderEngineTest::initializeRenderEngine() {
663 const auto& renderEngineFactory = GetParam();
664 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
665 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
666 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
667 // every time.
668 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
669 renderEngineFactory->createGLESRenderEngine();
670 mGLESRE = renderEngine.get();
671 mRE = std::move(renderEngine);
672 } else {
673 mRE = renderEngineFactory->createRenderEngine();
674 }
Alec Mouria90a5702021-04-16 16:36:21 +0000675 mBuffer = allocateDefaultBuffer();
Alec Mouric0aae732021-01-12 13:32:18 -0800676}
677
Alec Mouri1089aed2018-10-25 21:33:57 -0700678struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800679 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800680 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700681 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800682 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700683 }
684};
685
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800686struct RelaxOpaqueBufferVariant {
687 static void setOpaqueBit(renderengine::LayerSettings& layer) {
688 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800689 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800690 }
691
692 static uint8_t getAlphaChannel() { return 255; }
693};
694
695struct ForceOpaqueBufferVariant {
696 static void setOpaqueBit(renderengine::LayerSettings& layer) {
697 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800698 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800699 }
700
701 static uint8_t getAlphaChannel() {
702 // The isOpaque bit will override the alpha channel, so this should be
703 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800704 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800705 }
706};
707
708template <typename OpaquenessVariant>
709struct BufferSourceVariant {
710 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800711 RenderEngineTest* fixture) {
Alec Mouria90a5702021-04-16 16:36:21 +0000712 const auto buf = fixture->allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800713 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800714 fixture->mRE->genTextures(1, &texName);
715 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800716
717 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000718 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
719 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800720
Alec Mouria90a5702021-04-16 16:36:21 +0000721 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
722 uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
723 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800724 iter[0] = uint8_t(r * 255);
725 iter[1] = uint8_t(g * 255);
726 iter[2] = uint8_t(b * 255);
727 iter[3] = OpaquenessVariant::getAlphaChannel();
728 iter += 4;
729 }
730 }
731
Alec Mouria90a5702021-04-16 16:36:21 +0000732 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800733
734 layer.source.buffer.buffer = buf;
735 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800736 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800737 OpaquenessVariant::setOpaqueBit(layer);
738 }
739};
740
Alec Mouri1089aed2018-10-25 21:33:57 -0700741template <typename SourceVariant>
742void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
743 renderengine::DisplaySettings settings;
744 settings.physicalDisplay = fullscreenRect();
745 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800746 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700747
Sally Qi59a9f502021-10-12 18:53:23 +0000748 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700749
750 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800751 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700752 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800753 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700754 layer.alpha = a;
755
Sally Qi59a9f502021-10-12 18:53:23 +0000756 layers.push_back(layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700757
Alec Mouric0aae732021-01-12 13:32:18 -0800758 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700759}
760
761template <typename SourceVariant>
762void RenderEngineTest::fillRedBuffer() {
763 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
764 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
765}
766
767template <typename SourceVariant>
768void RenderEngineTest::fillGreenBuffer() {
769 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
770 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
771}
772
773template <typename SourceVariant>
774void RenderEngineTest::fillBlueBuffer() {
775 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
776 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
777}
778
779template <typename SourceVariant>
780void RenderEngineTest::fillRedTransparentBuffer() {
781 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
782 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
783}
784
785template <typename SourceVariant>
786void RenderEngineTest::fillRedOffsetBuffer() {
787 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800788 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700789 settings.physicalDisplay = offsetRect();
790 settings.clip = offsetRectAtZero();
791
Sally Qi59a9f502021-10-12 18:53:23 +0000792 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700793
794 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800795 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700796 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800797 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700798 layer.alpha = 1.0f;
799
Sally Qi59a9f502021-10-12 18:53:23 +0000800 layers.push_back(layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800801 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700802}
803
804template <typename SourceVariant>
805void RenderEngineTest::fillBufferPhysicalOffset() {
806 fillRedOffsetBuffer<SourceVariant>();
807
808 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
809 DEFAULT_DISPLAY_HEIGHT),
810 255, 0, 0, 255);
811 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
812 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
813
814 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
815 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
816}
817
818template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700819void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700820 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800821 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700822 settings.physicalDisplay = fullscreenRect();
823 // Here logical space is 2x2
824 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700825 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700826
Sally Qi59a9f502021-10-12 18:53:23 +0000827 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700828
829 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800830 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700831 Rect rectOne(0, 0, 1, 1);
832 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800833 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700834 layerOne.alpha = 1.0f;
835
836 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800837 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700838 Rect rectTwo(0, 1, 1, 2);
839 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800840 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700841 layerTwo.alpha = 1.0f;
842
843 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800844 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700845 Rect rectThree(1, 0, 2, 1);
846 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800847 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700848 layerThree.alpha = 1.0f;
849
Sally Qi59a9f502021-10-12 18:53:23 +0000850 layers.push_back(layerOne);
851 layers.push_back(layerTwo);
852 layers.push_back(layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700853
Alec Mouric0aae732021-01-12 13:32:18 -0800854 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700855}
856
857template <typename SourceVariant>
858void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700859 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700860 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
861 255);
862 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
863 DEFAULT_DISPLAY_HEIGHT / 2),
864 0, 0, 255, 255);
865 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
866 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
867 0, 0, 0, 0);
868 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
869 DEFAULT_DISPLAY_HEIGHT),
870 0, 255, 0, 255);
871}
872
873template <typename SourceVariant>
874void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700875 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700876 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
877 255);
878 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
879 DEFAULT_DISPLAY_HEIGHT / 2),
880 255, 0, 0, 255);
881 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
882 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
883 0, 0, 255, 255);
884 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
885 DEFAULT_DISPLAY_HEIGHT),
886 0, 0, 0, 0);
887}
888
889template <typename SourceVariant>
890void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700891 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700892 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
893 0);
894 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
895 DEFAULT_DISPLAY_HEIGHT / 2),
896 0, 255, 0, 255);
897 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
898 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
899 255, 0, 0, 255);
900 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
901 DEFAULT_DISPLAY_HEIGHT),
902 0, 0, 255, 255);
903}
904
905template <typename SourceVariant>
906void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700907 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700908 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
909 255);
910 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
911 DEFAULT_DISPLAY_HEIGHT / 2),
912 0, 0, 0, 0);
913 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
914 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
915 0, 255, 0, 255);
916 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
917 DEFAULT_DISPLAY_HEIGHT),
918 255, 0, 0, 255);
919}
920
921template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800922void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700923 renderengine::DisplaySettings settings;
924 settings.physicalDisplay = fullscreenRect();
925 // Here logical space is 2x2
926 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800927 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700928
Sally Qi59a9f502021-10-12 18:53:23 +0000929 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700930
931 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800932 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700933 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
934 // Translate one pixel diagonally
935 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 -0800936 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700937 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
938 layer.alpha = 1.0f;
939
Sally Qi59a9f502021-10-12 18:53:23 +0000940 layers.push_back(layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700941
Alec Mouric0aae732021-01-12 13:32:18 -0800942 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800943}
Alec Mouri1089aed2018-10-25 21:33:57 -0700944
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800945template <typename SourceVariant>
946void RenderEngineTest::fillBufferLayerTransform() {
947 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700948 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
949 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
950 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
951 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
952 255, 0, 0, 255);
953}
954
955template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800956void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700957 renderengine::DisplaySettings settings;
958 settings.physicalDisplay = fullscreenRect();
959 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800960 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700961
Sally Qi59a9f502021-10-12 18:53:23 +0000962 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700963
964 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800965 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700966 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800967 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700968 layer.alpha = 1.0f;
969
970 // construct a fake color matrix
971 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800972 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700973 // set red channel to red + green
974 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
975
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800976 layer.alpha = 1.0f;
977 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
978
Sally Qi59a9f502021-10-12 18:53:23 +0000979 layers.push_back(layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700980
Alec Mouric0aae732021-01-12 13:32:18 -0800981 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800982}
Alec Mouri1089aed2018-10-25 21:33:57 -0700983
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800984template <typename SourceVariant>
Sally Qi2019fd22021-11-22 10:19:04 -0800985void RenderEngineTest::fillBufferWithColorTransformAndSourceDataspace(
986 const ui::Dataspace sourceDataspace) {
987 renderengine::DisplaySettings settings;
988 settings.physicalDisplay = fullscreenRect();
989 settings.clip = Rect(1, 1);
990 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
991
992 std::vector<renderengine::LayerSettings> layers;
993
994 renderengine::LayerSettings layer;
995 layer.sourceDataspace = sourceDataspace;
996 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
997 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
998 layer.alpha = 1.0f;
999
1000 // construct a fake color matrix
1001 // annihilate green and blue channels
1002 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
1003 // set red channel to red + green
1004 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1005
1006 layer.alpha = 1.0f;
1007 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1008
1009 layers.push_back(layer);
1010
1011 invokeDraw(settings, layers);
1012}
1013
1014template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001015void RenderEngineTest::fillBufferColorTransform() {
1016 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001017 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
1018}
1019
1020template <typename SourceVariant>
Sally Qi2019fd22021-11-22 10:19:04 -08001021void RenderEngineTest::fillBufferColorTransformAndSourceDataspace() {
1022 unordered_map<ui::Dataspace, ubyte4> dataspaceToColorMap;
1023 dataspaceToColorMap[ui::Dataspace::V0_BT709] = {172, 0, 0, 255};
1024 dataspaceToColorMap[ui::Dataspace::BT2020] = {172, 0, 0, 255};
1025 dataspaceToColorMap[ui::Dataspace::ADOBE_RGB] = {172, 0, 0, 255};
1026 ui::Dataspace customizedDataspace = static_cast<ui::Dataspace>(
1027 ui::Dataspace::STANDARD_BT709 | ui::Dataspace::TRANSFER_GAMMA2_2 |
1028 ui::Dataspace::RANGE_FULL);
1029 dataspaceToColorMap[customizedDataspace] = {172, 0, 0, 255};
1030 for (const auto& [sourceDataspace, color] : dataspaceToColorMap) {
1031 fillBufferWithColorTransformAndSourceDataspace<SourceVariant>(sourceDataspace);
1032 expectBufferColor(fullscreenRect(), color.r, color.g, color.b, color.a, 1);
1033 }
1034}
1035
1036template <typename SourceVariant>
1037void RenderEngineTest::fillBufferWithColorTransformAndOutputDataspace(
1038 const ui::Dataspace outputDataspace) {
1039 renderengine::DisplaySettings settings;
1040 settings.physicalDisplay = fullscreenRect();
1041 settings.clip = Rect(1, 1);
1042 settings.outputDataspace = outputDataspace;
1043
1044 std::vector<renderengine::LayerSettings> layers;
1045
1046 renderengine::LayerSettings layer;
1047 layer.sourceDataspace = ui::Dataspace::V0_SCRGB_LINEAR;
1048 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1049 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
1050 layer.alpha = 1.0f;
1051
1052 // construct a fake color matrix
1053 // annihilate green and blue channels
1054 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
1055 // set red channel to red + green
1056 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1057
1058 layer.alpha = 1.0f;
1059 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1060
1061 layers.push_back(layer);
1062
1063 invokeDraw(settings, layers);
1064}
1065
1066template <typename SourceVariant>
1067void RenderEngineTest::fillBufferColorTransformAndOutputDataspace() {
1068 unordered_map<ui::Dataspace, ubyte4> dataspaceToColorMap;
1069 dataspaceToColorMap[ui::Dataspace::V0_BT709] = {202, 0, 0, 255};
1070 dataspaceToColorMap[ui::Dataspace::BT2020] = {192, 0, 0, 255};
1071 dataspaceToColorMap[ui::Dataspace::ADOBE_RGB] = {202, 0, 0, 255};
1072 ui::Dataspace customizedDataspace = static_cast<ui::Dataspace>(
1073 ui::Dataspace::STANDARD_BT709 | ui::Dataspace::TRANSFER_GAMMA2_6 |
1074 ui::Dataspace::RANGE_FULL);
1075 dataspaceToColorMap[customizedDataspace] = {202, 0, 0, 255};
1076 for (const auto& [outputDataspace, color] : dataspaceToColorMap) {
1077 fillBufferWithColorTransformAndOutputDataspace<SourceVariant>(outputDataspace);
1078 expectBufferColor(fullscreenRect(), color.r, color.g, color.b, color.a, 1);
1079 }
1080}
1081
1082template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001083void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
1084 renderengine::DisplaySettings settings;
1085 settings.physicalDisplay = fullscreenRect();
1086 settings.clip = Rect(1, 1);
1087
Sally Qi59a9f502021-10-12 18:53:23 +00001088 std::vector<renderengine::LayerSettings> layers;
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001089
1090 renderengine::LayerSettings layer;
1091 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1092 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
1093 layer.alpha = 0;
1094
1095 // construct a fake color matrix
1096 // simple inverse color
1097 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
1098
1099 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1100
Sally Qi59a9f502021-10-12 18:53:23 +00001101 layers.push_back(layer);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001102
Alec Mouric0aae732021-01-12 13:32:18 -08001103 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001104}
1105
1106template <typename SourceVariant>
1107void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
1108 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
1109 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
1110}
1111
1112template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -08001113void RenderEngineTest::fillRedBufferWithRoundedCorners() {
1114 renderengine::DisplaySettings settings;
1115 settings.physicalDisplay = fullscreenRect();
1116 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001117 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -08001118
Sally Qi59a9f502021-10-12 18:53:23 +00001119 std::vector<renderengine::LayerSettings> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -08001120
1121 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001122 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -08001123 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1124 layer.geometry.roundedCornersRadius = 5.0f;
1125 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1126 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1127 layer.alpha = 1.0f;
1128
Sally Qi59a9f502021-10-12 18:53:23 +00001129 layers.push_back(layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -08001130
Alec Mouric0aae732021-01-12 13:32:18 -08001131 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -08001132}
1133
1134template <typename SourceVariant>
1135void RenderEngineTest::fillBufferWithRoundedCorners() {
1136 fillRedBufferWithRoundedCorners<SourceVariant>();
1137 // Corners should be ignored...
1138 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1139 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1140 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1141 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1142 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1143 0, 0, 0, 0);
1144 // ...And the non-rounded portion should be red.
1145 // Other pixels may be anti-aliased, so let's not check those.
1146 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
1147 255);
1148}
1149
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001150template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001151void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001152 auto blurRadius = 50;
1153 auto center = DEFAULT_DISPLAY_WIDTH / 2;
1154
1155 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001156 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001157 settings.physicalDisplay = fullscreenRect();
1158 settings.clip = fullscreenRect();
1159
Sally Qi59a9f502021-10-12 18:53:23 +00001160 std::vector<renderengine::LayerSettings> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001161
1162 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001163 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001164 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1165 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
1166 backgroundLayer.alpha = 1.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001167 layers.emplace_back(backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001168
1169 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001170 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001171 leftLayer.geometry.boundaries =
1172 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
1173 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
1174 leftLayer.alpha = 1.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001175 layers.emplace_back(leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001176
1177 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001178 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001179 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1180 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -05001181 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001182 blurLayer.alpha = 0;
Sally Qi59a9f502021-10-12 18:53:23 +00001183 layers.emplace_back(blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001184
Alec Mouric0aae732021-01-12 13:32:18 -08001185 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001186
Derek Sollenbergerecb21462021-01-29 16:53:49 -05001187 // solid color
1188 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
1189
Derek Sollenbergerb3998372021-02-16 15:16:56 -05001190 if (mRE->supportsBackgroundBlur()) {
1191 // blurred color (downsampling should result in the center color being close to 128)
1192 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001193 50 /* tolerance */);
Derek Sollenbergerb3998372021-02-16 15:16:56 -05001194 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001195}
1196
1197template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -07001198void RenderEngineTest::fillSmallLayerAndBlurBackground() {
1199 auto blurRadius = 50;
1200 renderengine::DisplaySettings settings;
1201 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1202 settings.physicalDisplay = fullscreenRect();
1203 settings.clip = fullscreenRect();
1204
Sally Qi59a9f502021-10-12 18:53:23 +00001205 std::vector<renderengine::LayerSettings> layers;
Alec Mourie8489fd2021-04-29 16:08:56 -07001206
1207 renderengine::LayerSettings backgroundLayer;
1208 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1209 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1210 SourceVariant::fillColor(backgroundLayer, 1.0f, 0.0f, 0.0f, this);
1211 backgroundLayer.alpha = 1.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001212 layers.push_back(backgroundLayer);
Alec Mourie8489fd2021-04-29 16:08:56 -07001213
1214 renderengine::LayerSettings blurLayer;
1215 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1216 blurLayer.geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f);
1217 blurLayer.backgroundBlurRadius = blurRadius;
1218 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
1219 blurLayer.alpha = 0;
Sally Qi59a9f502021-10-12 18:53:23 +00001220 layers.push_back(blurLayer);
Alec Mourie8489fd2021-04-29 16:08:56 -07001221
1222 invokeDraw(settings, layers);
1223
1224 // Give a generous tolerance - the blur rectangle is very small and this test is
1225 // mainly concerned with ensuring that there's no device failure.
1226 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 255, 0, 0, 255,
1227 40 /* tolerance */);
1228}
1229
1230template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001231void RenderEngineTest::overlayCorners() {
1232 renderengine::DisplaySettings settings;
1233 settings.physicalDisplay = fullscreenRect();
1234 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001235 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001236
Sally Qi59a9f502021-10-12 18:53:23 +00001237 std::vector<renderengine::LayerSettings> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001238
1239 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001240 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001241 layerOne.geometry.boundaries =
1242 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
1243 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
1244 layerOne.alpha = 0.2;
1245
Sally Qi59a9f502021-10-12 18:53:23 +00001246 layersFirst.push_back(layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -08001247 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001248 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
1249 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1250 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1251 0, 0, 0, 0);
1252
Sally Qi59a9f502021-10-12 18:53:23 +00001253 std::vector<renderengine::LayerSettings> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001254 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001255 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001256 layerTwo.geometry.boundaries =
1257 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1258 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1259 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1260 layerTwo.alpha = 1.0f;
1261
Sally Qi59a9f502021-10-12 18:53:23 +00001262 layersSecond.push_back(layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001263 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001264
1265 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1266 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1267 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1268 0, 255, 0, 255);
1269}
1270
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001271void RenderEngineTest::fillRedBufferTextureTransform() {
1272 renderengine::DisplaySettings settings;
1273 settings.physicalDisplay = fullscreenRect();
1274 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001275 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001276
Sally Qi59a9f502021-10-12 18:53:23 +00001277 std::vector<renderengine::LayerSettings> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001278
1279 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001280 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001281 // Here will allocate a checker board texture, but transform texture
1282 // coordinates so that only the upper left is applied.
Alec Mouria90a5702021-04-16 16:36:21 +00001283 const auto buf = allocateSourceBuffer(2, 2);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001284 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001285 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001286 this->mTexNames.push_back(texName);
1287
1288 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001289 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1290 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001291 // Red top left, Green top right, Blue bottom left, Black bottom right
1292 pixels[0] = 255;
1293 pixels[1] = 0;
1294 pixels[2] = 0;
1295 pixels[3] = 255;
1296 pixels[4] = 0;
1297 pixels[5] = 255;
1298 pixels[6] = 0;
1299 pixels[7] = 255;
1300 pixels[8] = 0;
1301 pixels[9] = 0;
1302 pixels[10] = 255;
1303 pixels[11] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001304 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001305
1306 layer.source.buffer.buffer = buf;
1307 layer.source.buffer.textureName = texName;
1308 // Transform coordinates to only be inside the red quadrant.
Alec Mouri4049b532021-10-15 20:59:33 -07001309 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2f, 0.2f, 1.f, 1.f));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001310 layer.alpha = 1.0f;
1311 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1312
Sally Qi59a9f502021-10-12 18:53:23 +00001313 layers.push_back(layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001314
Alec Mouric0aae732021-01-12 13:32:18 -08001315 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001316}
1317
1318void RenderEngineTest::fillBufferTextureTransform() {
1319 fillRedBufferTextureTransform();
1320 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1321}
1322
1323void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1324 renderengine::DisplaySettings settings;
1325 settings.physicalDisplay = fullscreenRect();
1326 // Here logical space is 1x1
1327 settings.clip = Rect(1, 1);
1328
Sally Qi59a9f502021-10-12 18:53:23 +00001329 std::vector<renderengine::LayerSettings> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001330
1331 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001332 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001333 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001334 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001335 this->mTexNames.push_back(texName);
1336
1337 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001338 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1339 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001340 pixels[0] = 255;
1341 pixels[1] = 0;
1342 pixels[2] = 0;
1343 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001344 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001345
1346 layer.source.buffer.buffer = buf;
1347 layer.source.buffer.textureName = texName;
1348 layer.source.buffer.usePremultipliedAlpha = true;
1349 layer.alpha = 0.5f;
1350 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1351
Sally Qi59a9f502021-10-12 18:53:23 +00001352 layers.push_back(layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001353
Alec Mouric0aae732021-01-12 13:32:18 -08001354 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001355}
1356
1357void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1358 fillRedBufferWithPremultiplyAlpha();
1359 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1360}
1361
1362void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1363 renderengine::DisplaySettings settings;
1364 settings.physicalDisplay = fullscreenRect();
1365 // Here logical space is 1x1
1366 settings.clip = Rect(1, 1);
1367
Sally Qi59a9f502021-10-12 18:53:23 +00001368 std::vector<renderengine::LayerSettings> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001369
1370 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001371 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001372 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001373 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001374 this->mTexNames.push_back(texName);
1375
1376 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001377 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1378 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001379 pixels[0] = 255;
1380 pixels[1] = 0;
1381 pixels[2] = 0;
1382 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001383 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001384
1385 layer.source.buffer.buffer = buf;
1386 layer.source.buffer.textureName = texName;
1387 layer.source.buffer.usePremultipliedAlpha = false;
1388 layer.alpha = 0.5f;
1389 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1390
Sally Qi59a9f502021-10-12 18:53:23 +00001391 layers.push_back(layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001392
Alec Mouric0aae732021-01-12 13:32:18 -08001393 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001394}
1395
1396void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1397 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001398 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001399}
1400
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001401template <typename SourceVariant>
1402void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1403 const renderengine::ShadowSettings& shadow,
1404 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1405 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001406 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001407 settings.physicalDisplay = fullscreenRect();
1408 settings.clip = fullscreenRect();
1409
Sally Qi59a9f502021-10-12 18:53:23 +00001410 std::vector<renderengine::LayerSettings> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001411
1412 // add background layer
1413 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001414 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001415 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1416 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1417 backgroundColor.b / 255.0f, this);
1418 bgLayer.alpha = backgroundColor.a / 255.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001419 layers.push_back(bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001420
1421 // add shadow layer
1422 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001423 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001424 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1425 shadowLayer.alpha = castingLayer.alpha;
1426 shadowLayer.shadow = shadow;
Sally Qi59a9f502021-10-12 18:53:23 +00001427 layers.push_back(shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001428
1429 // add layer casting the shadow
1430 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001431 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001432 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1433 casterColor.b / 255.0f, this);
Sally Qi59a9f502021-10-12 18:53:23 +00001434 layers.push_back(layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001435
Alec Mouric0aae732021-01-12 13:32:18 -08001436 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001437}
1438
Alec Mouribd17b3b2020-12-17 11:08:30 -08001439void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1440 const renderengine::ShadowSettings& shadow,
1441 const ubyte4& backgroundColor) {
1442 renderengine::DisplaySettings settings;
1443 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1444 settings.physicalDisplay = fullscreenRect();
1445 settings.clip = fullscreenRect();
1446
Sally Qi59a9f502021-10-12 18:53:23 +00001447 std::vector<renderengine::LayerSettings> layers;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001448
1449 // add background layer
1450 renderengine::LayerSettings bgLayer;
1451 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1452 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1453 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1454 backgroundColor.b / 255.0f, this);
1455 bgLayer.alpha = backgroundColor.a / 255.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001456 layers.push_back(bgLayer);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001457
1458 // add shadow layer
1459 renderengine::LayerSettings shadowLayer;
1460 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1461 shadowLayer.geometry.boundaries = castingBounds;
Derek Sollenbergerc31985e2021-05-18 16:38:17 -04001462 shadowLayer.skipContentDraw = true;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001463 shadowLayer.alpha = 1.0f;
1464 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1465 shadowLayer.shadow = shadow;
Sally Qi59a9f502021-10-12 18:53:23 +00001466 layers.push_back(shadowLayer);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001467
Alec Mouric0aae732021-01-12 13:32:18 -08001468 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001469}
1470
Alec Mouri5a493722022-01-26 16:43:02 -08001471void RenderEngineTest::tonemap(ui::Dataspace sourceDataspace, std::function<vec3(vec3)> eotf,
1472 std::function<vec3(vec3, float)> scaleOotf) {
1473 constexpr int32_t kGreyLevels = 256;
1474
1475 const auto rect = Rect(0, 0, kGreyLevels, 1);
1476
1477 constexpr float kMaxLuminance = 750.f;
1478 constexpr float kCurrentLuminanceNits = 500.f;
1479 const renderengine::DisplaySettings display{
1480 .physicalDisplay = rect,
1481 .clip = rect,
1482 .maxLuminance = kMaxLuminance,
1483 .currentLuminanceNits = kCurrentLuminanceNits,
1484 .outputDataspace = ui::Dataspace::DISPLAY_P3,
1485 };
1486
1487 auto buf = std::make_shared<
1488 renderengine::impl::
1489 ExternalTexture>(new GraphicBuffer(kGreyLevels, 1, HAL_PIXEL_FORMAT_RGBA_8888,
1490 1,
1491 GRALLOC_USAGE_SW_READ_OFTEN |
1492 GRALLOC_USAGE_SW_WRITE_OFTEN |
1493 GRALLOC_USAGE_HW_RENDER |
1494 GRALLOC_USAGE_HW_TEXTURE,
1495 "input"),
1496 *mRE,
1497 renderengine::impl::ExternalTexture::Usage::READABLE |
1498 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
1499 ASSERT_EQ(0, buf->getBuffer()->initCheck());
1500 {
1501 uint8_t* pixels;
1502 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1503 reinterpret_cast<void**>(&pixels));
1504
1505 uint8_t color = 0;
1506 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
1507 uint8_t* dest = pixels + (buf->getBuffer()->getStride() * j * 4);
1508 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
1509 dest[0] = color;
1510 dest[1] = color;
1511 dest[2] = color;
1512 dest[3] = 255;
1513 color++;
1514 dest += 4;
1515 }
1516 }
1517 buf->getBuffer()->unlock();
1518 }
1519
1520 mBuffer = std::make_shared<
1521 renderengine::impl::
1522 ExternalTexture>(new GraphicBuffer(kGreyLevels, 1, HAL_PIXEL_FORMAT_RGBA_8888,
1523 1,
1524 GRALLOC_USAGE_SW_READ_OFTEN |
1525 GRALLOC_USAGE_SW_WRITE_OFTEN |
1526 GRALLOC_USAGE_HW_RENDER |
1527 GRALLOC_USAGE_HW_TEXTURE,
1528 "output"),
1529 *mRE,
1530 renderengine::impl::ExternalTexture::Usage::READABLE |
1531 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
1532 ASSERT_EQ(0, mBuffer->getBuffer()->initCheck());
1533
1534 const renderengine::LayerSettings layer{.geometry.boundaries = rect.toFloatRect(),
1535 .source =
1536 renderengine::PixelSource{
1537 .buffer =
1538 renderengine::Buffer{
1539 .buffer =
1540 std::move(buf),
1541 .usePremultipliedAlpha =
1542 true,
1543 },
1544 },
1545 .alpha = 1.0f,
1546 .sourceDataspace = sourceDataspace};
1547
1548 std::vector<renderengine::LayerSettings> layers{layer};
1549 invokeDraw(display, layers);
1550
1551 ColorSpace displayP3 = ColorSpace::DisplayP3();
1552 ColorSpace bt2020 = ColorSpace::BT2020();
1553
1554 tonemap::Metadata metadata{.displayMaxLuminance = 750.0f};
1555
1556 auto generator = [=](Point location) {
1557 const double normColor = static_cast<double>(location.x) / (kGreyLevels - 1);
1558 const vec3 rgb = vec3(normColor, normColor, normColor);
1559
1560 const vec3 linearRGB = eotf(rgb);
1561
1562 const vec3 xyz = bt2020.getRGBtoXYZ() * linearRGB;
1563
1564 const vec3 scaledXYZ = scaleOotf(xyz, kCurrentLuminanceNits);
Alec Mouri196b0f22022-03-04 22:13:48 +00001565 const auto gains =
Alec Mouri5a493722022-01-26 16:43:02 -08001566 tonemap::getToneMapper()
1567 ->lookupTonemapGain(static_cast<aidl::android::hardware::graphics::common::
1568 Dataspace>(sourceDataspace),
1569 static_cast<aidl::android::hardware::graphics::common::
1570 Dataspace>(
1571 ui::Dataspace::DISPLAY_P3),
Alec Mouri196b0f22022-03-04 22:13:48 +00001572 {tonemap::
1573 Color{.linearRGB =
1574 scaleOotf(linearRGB,
1575 kCurrentLuminanceNits),
1576 .xyz = scaledXYZ}},
Alec Mouri5a493722022-01-26 16:43:02 -08001577 metadata);
Alec Mouri196b0f22022-03-04 22:13:48 +00001578 EXPECT_EQ(1, gains.size());
1579 const double gain = gains.front();
Alec Mouri5a493722022-01-26 16:43:02 -08001580 const vec3 normalizedXYZ = scaledXYZ * gain / metadata.displayMaxLuminance;
1581
1582 const vec3 targetRGB = OETF_sRGB(displayP3.getXYZtoRGB() * normalizedXYZ) * 255;
1583 return ubyte4(static_cast<uint8_t>(targetRGB.r), static_cast<uint8_t>(targetRGB.g),
1584 static_cast<uint8_t>(targetRGB.b), 255);
1585 };
1586
1587 expectBufferColor(Rect(kGreyLevels, 1), generator, 2);
1588}
1589
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001590INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001591 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001592 std::make_shared<GLESCMRenderEngineFactory>(),
1593 std::make_shared<SkiaGLESRenderEngineFactory>(),
1594 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001595
1596TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001597 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001598 drawEmptyLayers();
1599}
1600
Ana Krulec07b98df2021-01-07 14:38:40 -08001601TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
Alec Mouria90a5702021-04-16 16:36:21 +00001602 initializeRenderEngine();
Ana Krulec07b98df2021-01-07 14:38:40 -08001603
1604 renderengine::DisplaySettings settings;
1605 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1606 settings.physicalDisplay = fullscreenRect();
1607 settings.clip = fullscreenRect();
1608
1609 // 255, 255, 255, 255 is full opaque white.
Alec Mouri4049b532021-10-15 20:59:33 -07001610 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
1611 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Ana Krulec07b98df2021-01-07 14:38:40 -08001612 // Create layer with given color.
1613 renderengine::LayerSettings bgLayer;
1614 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1615 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1616 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1617 backgroundColor.b / 255.0f);
1618 bgLayer.alpha = backgroundColor.a / 255.0f;
1619 // Transform the red color.
1620 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1621
Sally Qi59a9f502021-10-12 18:53:23 +00001622 std::vector<renderengine::LayerSettings> layers;
1623 layers.push_back(bgLayer);
Ana Krulec07b98df2021-01-07 14:38:40 -08001624
Alec Mouric0aae732021-01-12 13:32:18 -08001625 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001626
1627 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001628 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001629 backgroundColor.a);
1630}
1631
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001632TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001633 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001634
Alec Mourid43ccab2019-03-13 12:23:45 -07001635 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001636 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Sally Qi59a9f502021-10-12 18:53:23 +00001637 std::vector<renderengine::LayerSettings> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001638 renderengine::LayerSettings layer;
1639 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1640 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Sally Qi59a9f502021-10-12 18:53:23 +00001641 layers.push_back(layer);
Sally Qi4cabdd02021-08-05 16:45:57 -07001642 std::future<renderengine::RenderEngineResult> result =
1643 mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd());
Alec Mourid43ccab2019-03-13 12:23:45 -07001644
Sally Qi4cabdd02021-08-05 16:45:57 -07001645 ASSERT_TRUE(result.valid());
Derek Sollenbergerec411212021-08-25 10:54:47 -04001646 auto [status, fence] = result.get();
Alec Mourid43ccab2019-03-13 12:23:45 -07001647 ASSERT_EQ(BAD_VALUE, status);
Derek Sollenbergerec411212021-08-25 10:54:47 -04001648 ASSERT_FALSE(fence.ok());
Alec Mourid43ccab2019-03-13 12:23:45 -07001649}
1650
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001651TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1652 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001653
1654 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1655 // GLES-specific test
1656 return;
1657 }
1658
1659 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001660
Alec Mourife0d72b2019-03-21 14:05:56 -07001661 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001662 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001663 settings.physicalDisplay = fullscreenRect();
1664 settings.clip = fullscreenRect();
1665
Sally Qi59a9f502021-10-12 18:53:23 +00001666 std::vector<renderengine::LayerSettings> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001667 renderengine::LayerSettings layer;
1668 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1669 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1670 layer.alpha = 1.0;
Sally Qi59a9f502021-10-12 18:53:23 +00001671 layers.push_back(layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001672
Sally Qi4cabdd02021-08-05 16:45:57 -07001673 std::future<renderengine::RenderEngineResult> result =
1674 mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd());
1675 ASSERT_TRUE(result.valid());
Derek Sollenbergerec411212021-08-25 10:54:47 -04001676 auto [status, fence] = result.get();
1677
Alec Mourife0d72b2019-03-21 14:05:56 -07001678 ASSERT_EQ(NO_ERROR, status);
Derek Sollenbergerec411212021-08-25 10:54:47 -04001679 if (fence.ok()) {
1680 sync_wait(fence.get(), -1);
1681 }
1682
Alec Mouria90a5702021-04-16 16:36:21 +00001683 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001684 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1685}
1686
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001687TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001688 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001689 fillRedBuffer<ColorSourceVariant>();
1690}
1691
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001692TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001693 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001694 fillGreenBuffer<ColorSourceVariant>();
1695}
1696
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001697TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001698 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001699 fillBlueBuffer<ColorSourceVariant>();
1700}
1701
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001702TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001703 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001704 fillRedTransparentBuffer<ColorSourceVariant>();
1705}
1706
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001707TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001708 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001709 fillBufferPhysicalOffset<ColorSourceVariant>();
1710}
1711
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001712TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001713 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001714 fillBufferCheckersRotate0<ColorSourceVariant>();
1715}
1716
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001717TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001718 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001719 fillBufferCheckersRotate90<ColorSourceVariant>();
1720}
1721
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001722TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001723 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001724 fillBufferCheckersRotate180<ColorSourceVariant>();
1725}
1726
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001727TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001728 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001729 fillBufferCheckersRotate270<ColorSourceVariant>();
1730}
1731
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001732TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001733 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001734 fillBufferLayerTransform<ColorSourceVariant>();
1735}
1736
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001737TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001738 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001739 fillBufferColorTransform<ColorSourceVariant>();
1740}
1741
Sally Qi2019fd22021-11-22 10:19:04 -08001742TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_sourceDataspace) {
1743 const auto& renderEngineFactory = GetParam();
1744 // skip for non color management
1745 if (!renderEngineFactory->useColorManagement()) {
1746 return;
1747 }
1748 // skip for GLESRenderEngine
1749 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1750 return;
1751 }
1752
1753 initializeRenderEngine();
1754 fillBufferColorTransformAndSourceDataspace<ColorSourceVariant>();
1755}
1756
1757TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_outputDataspace) {
1758 const auto& renderEngineFactory = GetParam();
1759 // skip for non color management
1760 if (!renderEngineFactory->useColorManagement()) {
1761 return;
1762 }
1763 // skip for GLESRenderEngine
1764 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1765 return;
1766 }
1767
1768 initializeRenderEngine();
1769 fillBufferColorTransformAndOutputDataspace<ColorSourceVariant>();
1770}
1771
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001772TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001773 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001774 fillBufferWithRoundedCorners<ColorSourceVariant>();
1775}
1776
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001777TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001778 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001779 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1780}
1781
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001782TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001783 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001784 fillBufferAndBlurBackground<ColorSourceVariant>();
1785}
1786
Alec Mourie8489fd2021-04-29 16:08:56 -07001787TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1788 initializeRenderEngine();
1789 fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1790}
1791
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001792TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001793 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001794 overlayCorners<ColorSourceVariant>();
1795}
1796
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001797TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001798 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001799 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1800}
1801
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001802TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001803 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001804 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1805}
1806
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001807TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001808 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001809 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1810}
1811
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001812TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001813 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001814 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1815}
1816
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001817TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001818 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001819 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1820}
1821
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001822TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001823 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001824 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1825}
1826
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001827TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001828 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001829 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1830}
1831
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001832TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001833 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001834 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1835}
1836
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001837TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001838 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001839 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1840}
1841
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001842TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001843 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001844 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1845}
1846
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001847TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001848 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001849 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1850}
1851
Sally Qi2019fd22021-11-22 10:19:04 -08001852TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndSourceDataspace_opaqueBufferSource) {
1853 const auto& renderEngineFactory = GetParam();
1854 // skip for non color management
1855 if (!renderEngineFactory->useColorManagement()) {
1856 return;
1857 }
1858 // skip for GLESRenderEngine
1859 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1860 return;
1861 }
1862
1863 initializeRenderEngine();
1864 fillBufferColorTransformAndSourceDataspace<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1865}
1866
1867TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndOutputDataspace_opaqueBufferSource) {
1868 const auto& renderEngineFactory = GetParam();
1869 // skip for non color management
1870 if (!renderEngineFactory->useColorManagement()) {
1871 return;
1872 }
1873 // skip for GLESRenderEngine
1874 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1875 return;
1876 }
1877
1878 initializeRenderEngine();
1879 fillBufferColorTransformAndOutputDataspace<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1880}
1881
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001882TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001883 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001884 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1885}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001886
Alec Mouric0aae732021-01-12 13:32:18 -08001887TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1888 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001889 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1890}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001891
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001892TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001893 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001894 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1895}
1896
Alec Mourie8489fd2021-04-29 16:08:56 -07001897TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1898 initializeRenderEngine();
1899 fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1900}
1901
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001902TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001903 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001904 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1905}
1906
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001907TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001908 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001909 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1910}
1911
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001912TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001913 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001914 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1915}
1916
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001917TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001918 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001919 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1920}
1921
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001922TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001923 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001924 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1925}
1926
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001927TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001928 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001929 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1930}
1931
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001932TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001933 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001934 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1935}
1936
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001937TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001938 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001939 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1940}
1941
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001942TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001943 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001944 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1945}
1946
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001947TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001948 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001949 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1950}
1951
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001952TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001953 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001954 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1955}
1956
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001957TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001958 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001959 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1960}
1961
Sally Qi2019fd22021-11-22 10:19:04 -08001962TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndSourceDataspace_bufferSource) {
1963 const auto& renderEngineFactory = GetParam();
1964 // skip for non color management
1965 if (!renderEngineFactory->useColorManagement()) {
1966 return;
1967 }
1968 // skip for GLESRenderEngine
1969 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1970 return;
1971 }
1972
1973 initializeRenderEngine();
1974 fillBufferColorTransformAndSourceDataspace<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1975}
1976
1977TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndOutputDataspace_bufferSource) {
1978 const auto& renderEngineFactory = GetParam();
1979 // skip for non color management
1980 if (!renderEngineFactory->useColorManagement()) {
1981 return;
1982 }
1983 // skip for GLESRenderEngine
1984 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1985 return;
1986 }
1987
1988 initializeRenderEngine();
1989 fillBufferColorTransformAndOutputDataspace<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1990}
1991
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001992TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001993 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001994 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1995}
1996
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001997TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001998 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001999 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2000}
2001
Nathaniel Nifong53494f32021-04-30 14:05:39 -04002002TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08002003 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08002004 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2005}
2006
Alec Mourie8489fd2021-04-29 16:08:56 -07002007TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
2008 initializeRenderEngine();
2009 fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2010}
2011
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002012TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08002013 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00002014 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2015}
2016
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002017TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08002018 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08002019 fillBufferTextureTransform();
2020}
2021
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002022TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08002023 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08002024 fillBufferWithPremultiplyAlpha();
2025}
2026
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002027TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08002028 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08002029 fillBufferWithoutPremultiplyAlpha();
2030}
2031
Alec Mouribd17b3b2020-12-17 11:08:30 -08002032TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08002033 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08002034
Alec Mouri4049b532021-10-15 20:59:33 -07002035 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2036 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Alec Mouribd17b3b2020-12-17 11:08:30 -08002037 const float shadowLength = 5.0f;
2038 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2039 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2040 renderengine::ShadowSettings settings =
2041 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2042 false /* casterIsTranslucent */);
2043
2044 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
2045 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
2046}
2047
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002048TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08002049 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002050
Alec Mouri4049b532021-10-15 20:59:33 -07002051 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2052 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2053 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2054 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002055 const float shadowLength = 5.0f;
2056 Rect casterBounds(1, 1);
2057 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2058 renderengine::LayerSettings castingLayer;
2059 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2060 castingLayer.alpha = 1.0f;
2061 renderengine::ShadowSettings settings =
2062 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2063 false /* casterIsTranslucent */);
2064
2065 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
2066 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2067}
2068
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002069TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08002070 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002071
Alec Mouri4049b532021-10-15 20:59:33 -07002072 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2073 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2074 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2075 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002076 const float shadowLength = 5.0f;
2077 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2078 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2079 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08002080 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002081 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2082 castingLayer.alpha = 1.0f;
2083 renderengine::ShadowSettings settings =
2084 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2085 false /* casterIsTranslucent */);
2086
2087 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
2088 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2089}
2090
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002091TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08002092 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002093
Alec Mouri4049b532021-10-15 20:59:33 -07002094 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2095 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2096 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2097 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002098 const float shadowLength = 5.0f;
2099 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2100 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2101 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08002102 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002103 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2104 castingLayer.alpha = 1.0f;
2105 renderengine::ShadowSettings settings =
2106 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2107 false /* casterIsTranslucent */);
2108
2109 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
2110 backgroundColor);
2111 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2112}
2113
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002114TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08002115 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002116
Alec Mouri4049b532021-10-15 20:59:33 -07002117 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2118 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2119 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2120 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002121 const float shadowLength = 5.0f;
2122 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2123 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2124 renderengine::LayerSettings castingLayer;
2125 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2126 castingLayer.geometry.roundedCornersRadius = 3.0f;
2127 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
2128 castingLayer.alpha = 1.0f;
2129 renderengine::ShadowSettings settings =
2130 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2131 false /* casterIsTranslucent */);
2132
2133 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
2134 backgroundColor);
2135 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2136}
2137
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002138TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08002139 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002140
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002141 const ubyte4 casterColor(255, 0, 0, 255);
2142 const ubyte4 backgroundColor(255, 255, 255, 255);
2143 const float shadowLength = 5.0f;
2144 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2145 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2146 renderengine::LayerSettings castingLayer;
2147 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2148 castingLayer.alpha = 0.5f;
2149 renderengine::ShadowSettings settings =
2150 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2151 true /* casterIsTranslucent */);
2152
2153 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
2154 backgroundColor);
2155
2156 // verify only the background since the shadow will draw behind the caster
2157 const float shadowInset = settings.length * -1.0f;
2158 const Rect casterWithShadow =
2159 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
2160 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
2161 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
2162 backgroundColor.a);
2163}
2164
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002165TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
Alec Mouric0aae732021-01-12 13:32:18 -08002166 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002167
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002168 renderengine::DisplaySettings settings;
2169 settings.physicalDisplay = fullscreenRect();
2170 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08002171 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002172
Sally Qi59a9f502021-10-12 18:53:23 +00002173 std::vector<renderengine::LayerSettings> layers;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002174 renderengine::LayerSettings layer;
2175 layer.geometry.boundaries = fullscreenRect().toFloatRect();
2176 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
2177 layer.alpha = 1.0;
Sally Qi59a9f502021-10-12 18:53:23 +00002178 layers.push_back(layer);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002179
Sally Qi4cabdd02021-08-05 16:45:57 -07002180 std::future<renderengine::RenderEngineResult> resultOne =
2181 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd());
2182 ASSERT_TRUE(resultOne.valid());
2183 auto [statusOne, fenceOne] = resultOne.get();
2184 ASSERT_EQ(NO_ERROR, statusOne);
2185
2186 std::future<renderengine::RenderEngineResult> resultTwo =
2187 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne));
2188 ASSERT_TRUE(resultTwo.valid());
2189 auto [statusTwo, fenceTwo] = resultTwo.get();
2190 ASSERT_EQ(NO_ERROR, statusTwo);
Derek Sollenbergerec411212021-08-25 10:54:47 -04002191 if (fenceTwo.ok()) {
2192 sync_wait(fenceTwo.get(), -1);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002193 }
Derek Sollenbergerec411212021-08-25 10:54:47 -04002194
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002195 // Only cleanup the first time.
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04002196 EXPECT_FALSE(mRE->canSkipPostRenderCleanup());
2197 mRE->cleanupPostRender();
2198 EXPECT_TRUE(mRE->canSkipPostRenderCleanup());
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002199}
2200
Ana Krulecf9a15d92020-12-11 08:35:00 -08002201TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08002202 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08002203
2204 renderengine::DisplaySettings settings;
2205 settings.physicalDisplay = fullscreenRect();
2206 settings.clip = fullscreenRect();
2207 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2208
Sally Qi59a9f502021-10-12 18:53:23 +00002209 std::vector<renderengine::LayerSettings> layers;
Ana Krulecf9a15d92020-12-11 08:35:00 -08002210
2211 renderengine::LayerSettings redLayer;
2212 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2213 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2214 redLayer.geometry.roundedCornersRadius = 5.0f;
2215 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
2216 // Red background.
2217 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2218 redLayer.alpha = 1.0f;
2219
Sally Qi59a9f502021-10-12 18:53:23 +00002220 layers.push_back(redLayer);
Ana Krulecf9a15d92020-12-11 08:35:00 -08002221
2222 // Green layer with 1/3 size.
2223 renderengine::LayerSettings greenLayer;
2224 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2225 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2226 greenLayer.geometry.roundedCornersRadius = 5.0f;
2227 // Bottom right corner is not going to be rounded.
2228 greenLayer.geometry.roundedCornersCrop =
2229 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
2230 DEFAULT_DISPLAY_HEIGHT)
2231 .toFloatRect();
2232 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
2233 greenLayer.alpha = 1.0f;
2234
Sally Qi59a9f502021-10-12 18:53:23 +00002235 layers.push_back(greenLayer);
Ana Krulecf9a15d92020-12-11 08:35:00 -08002236
Alec Mouric0aae732021-01-12 13:32:18 -08002237 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08002238
2239 // Corners should be ignored...
2240 // Screen size: width is 128, height is 256.
2241 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
2242 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
2243 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
2244 // Bottom right corner is kept out of the clipping, and it's green.
2245 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
2246 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
2247 0, 255, 0, 255);
2248}
2249
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002250TEST_P(RenderEngineTest, testRoundedCornersParentCrop) {
2251 initializeRenderEngine();
2252
2253 renderengine::DisplaySettings settings;
2254 settings.physicalDisplay = fullscreenRect();
2255 settings.clip = fullscreenRect();
2256 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2257
Sally Qi59a9f502021-10-12 18:53:23 +00002258 std::vector<renderengine::LayerSettings> layers;
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002259
2260 renderengine::LayerSettings redLayer;
2261 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2262 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2263 redLayer.geometry.roundedCornersRadius = 5.0f;
2264 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
2265 // Red background.
2266 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2267 redLayer.alpha = 1.0f;
2268
Sally Qi59a9f502021-10-12 18:53:23 +00002269 layers.push_back(redLayer);
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002270
2271 // Green layer with 1/2 size with parent crop rect.
2272 renderengine::LayerSettings greenLayer = redLayer;
2273 greenLayer.geometry.boundaries =
2274 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2);
2275 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
2276
Sally Qi59a9f502021-10-12 18:53:23 +00002277 layers.push_back(greenLayer);
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002278
2279 invokeDraw(settings, layers);
2280
2281 // Due to roundedCornersRadius, the corners are untouched.
2282 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
2283 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
2284 expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
2285 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
2286
2287 // top middle should be green and the bottom middle red
2288 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 0), 0, 255, 0, 255);
2289 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 255);
2290
2291 // the bottom edge of the green layer should not be rounded
2292 expectBufferColor(Point(0, (DEFAULT_DISPLAY_HEIGHT / 2) - 1), 0, 255, 0, 255);
2293}
2294
Derek Sollenberger547d0a62021-07-27 14:09:17 -04002295TEST_P(RenderEngineTest, testRoundedCornersParentCropSmallBounds) {
2296 initializeRenderEngine();
2297
2298 renderengine::DisplaySettings settings;
2299 settings.physicalDisplay = fullscreenRect();
2300 settings.clip = fullscreenRect();
2301 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2302
Sally Qi59a9f502021-10-12 18:53:23 +00002303 std::vector<renderengine::LayerSettings> layers;
Derek Sollenberger547d0a62021-07-27 14:09:17 -04002304
2305 renderengine::LayerSettings redLayer;
2306 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2307 redLayer.geometry.boundaries = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 32);
2308 redLayer.geometry.roundedCornersRadius = 64;
2309 redLayer.geometry.roundedCornersCrop = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 128);
2310 // Red background.
2311 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2312 redLayer.alpha = 1.0f;
2313
Sally Qi59a9f502021-10-12 18:53:23 +00002314 layers.push_back(redLayer);
Derek Sollenberger547d0a62021-07-27 14:09:17 -04002315 invokeDraw(settings, layers);
2316
2317 // Due to roundedCornersRadius, the top corners are untouched.
2318 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
2319 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
2320
2321 // ensure that the entire height of the red layer was clipped by the rounded corners crop.
2322 expectBufferColor(Point(0, 31), 0, 0, 0, 0);
2323 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 31), 0, 0, 0, 0);
2324
2325 // the bottom middle should be red
2326 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 31), 255, 0, 0, 255);
2327}
2328
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002329TEST_P(RenderEngineTest, testClear) {
2330 initializeRenderEngine();
2331
2332 const auto rect = fullscreenRect();
2333 const renderengine::DisplaySettings display{
2334 .physicalDisplay = rect,
2335 .clip = rect,
2336 };
2337
2338 const renderengine::LayerSettings redLayer{
2339 .geometry.boundaries = rect.toFloatRect(),
2340 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
2341 .alpha = 1.0f,
2342 };
2343
2344 // This mimics prepareClearClientComposition. This layer should overwrite
2345 // the redLayer, so that the buffer is transparent, rather than red.
2346 const renderengine::LayerSettings clearLayer{
2347 .geometry.boundaries = rect.toFloatRect(),
2348 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
2349 .alpha = 0.0f,
2350 .disableBlending = true,
2351 };
2352
Sally Qi59a9f502021-10-12 18:53:23 +00002353 std::vector<renderengine::LayerSettings> layers{redLayer, clearLayer};
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002354 invokeDraw(display, layers);
2355 expectBufferColor(rect, 0, 0, 0, 0);
2356}
2357
2358TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
2359 initializeRenderEngine();
2360
2361 const auto rect = Rect(0, 0, 1, 1);
2362 const renderengine::DisplaySettings display{
2363 .physicalDisplay = rect,
2364 .clip = rect,
2365 };
2366
2367 const renderengine::LayerSettings redLayer{
2368 .geometry.boundaries = rect.toFloatRect(),
2369 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
2370 .alpha = 1.0f,
2371 };
2372
2373 // The next layer will overwrite redLayer with a GraphicBuffer that is green
2374 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00002375 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002376 {
2377 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00002378 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2379 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002380 pixels[0] = 0;
2381 pixels[1] = 255;
2382 pixels[2] = 0;
2383 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00002384 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002385 }
2386
2387 const renderengine::LayerSettings greenLayer{
2388 .geometry.boundaries = rect.toFloatRect(),
2389 .source =
2390 renderengine::PixelSource{
2391 .buffer =
2392 renderengine::Buffer{
2393 .buffer = buf,
2394 .usePremultipliedAlpha = true,
2395 },
2396 },
2397 .alpha = 0.5f,
2398 .disableBlending = true,
2399 };
2400
Sally Qi59a9f502021-10-12 18:53:23 +00002401 std::vector<renderengine::LayerSettings> layers{redLayer, greenLayer};
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002402 invokeDraw(display, layers);
2403 expectBufferColor(rect, 0, 128, 0, 128);
2404}
2405
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002406TEST_P(RenderEngineTest, testDimming) {
2407 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2408 return;
2409 }
2410 initializeRenderEngine();
2411
2412 const auto displayRect = Rect(3, 1);
2413 const renderengine::DisplaySettings display{
2414 .physicalDisplay = displayRect,
2415 .clip = displayRect,
2416 .outputDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2417 .targetLuminanceNits = 1000.f,
2418 };
2419
2420 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2421 const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2422 const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255));
2423
2424 const renderengine::LayerSettings greenLayer{
2425 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2426 .source =
2427 renderengine::PixelSource{
2428 .buffer =
2429 renderengine::Buffer{
2430 .buffer = greenBuffer,
2431 .usePremultipliedAlpha = true,
2432 },
2433 },
2434 .alpha = 1.0f,
2435 .sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2436 .whitePointNits = 200.f,
2437 };
2438
2439 const renderengine::LayerSettings blueLayer{
2440 .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2441 .source =
2442 renderengine::PixelSource{
2443 .buffer =
2444 renderengine::Buffer{
2445 .buffer = blueBuffer,
2446 .usePremultipliedAlpha = true,
2447 },
2448 },
2449 .alpha = 1.0f,
2450 .sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2451 .whitePointNits = 1000.f / 51.f,
2452 };
2453
2454 const renderengine::LayerSettings redLayer{
2455 .geometry.boundaries = FloatRect(2.f, 0.f, 3.f, 1.f),
2456 .source =
2457 renderengine::PixelSource{
2458 .buffer =
2459 renderengine::Buffer{
2460 .buffer = redBuffer,
2461 .usePremultipliedAlpha = true,
2462 },
2463 },
2464 .alpha = 1.0f,
2465 .sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2466 // When the white point is not set for a layer, just ignore it and treat it as the same
2467 // as the max layer
2468 .whitePointNits = -1.f,
2469 };
2470
2471 std::vector<renderengine::LayerSettings> layers{greenLayer, blueLayer, redLayer};
2472 invokeDraw(display, layers);
2473
2474 expectBufferColor(Rect(1, 1), 0, 51, 0, 255, 1);
2475 expectBufferColor(Rect(1, 0, 2, 1), 0, 0, 5, 255, 1);
2476 expectBufferColor(Rect(2, 0, 3, 1), 51, 0, 0, 255, 1);
2477}
2478
2479TEST_P(RenderEngineTest, testDimming_withoutTargetLuminance) {
2480 initializeRenderEngine();
2481 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2482 return;
2483 }
2484
2485 const auto displayRect = Rect(2, 1);
2486 const renderengine::DisplaySettings display{
2487 .physicalDisplay = displayRect,
2488 .clip = displayRect,
2489 .outputDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2490 .targetLuminanceNits = -1.f,
2491 };
2492
2493 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2494 const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2495
2496 const renderengine::LayerSettings greenLayer{
2497 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2498 .source =
2499 renderengine::PixelSource{
2500 .buffer =
2501 renderengine::Buffer{
2502 .buffer = greenBuffer,
2503 .usePremultipliedAlpha = true,
2504 },
2505 },
2506 .alpha = 1.0f,
2507 .sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2508 .whitePointNits = 200.f,
2509 };
2510
2511 const renderengine::LayerSettings blueLayer{
2512 .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2513 .source =
2514 renderengine::PixelSource{
2515 .buffer =
2516 renderengine::Buffer{
2517 .buffer = blueBuffer,
2518 .usePremultipliedAlpha = true,
2519 },
2520 },
2521 .alpha = 1.0f,
2522 .sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2523 .whitePointNits = 1000.f,
2524 };
2525
2526 std::vector<renderengine::LayerSettings> layers{greenLayer, blueLayer};
2527 invokeDraw(display, layers);
2528
2529 expectBufferColor(Rect(1, 1), 0, 51, 0, 255, 1);
2530 expectBufferColor(Rect(1, 0, 2, 1), 0, 0, 255, 255);
2531}
2532
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04002533TEST_P(RenderEngineTest, test_isOpaque) {
2534 initializeRenderEngine();
2535
2536 const auto rect = Rect(0, 0, 1, 1);
2537 const renderengine::DisplaySettings display{
2538 .physicalDisplay = rect,
2539 .clip = rect,
2540 .outputDataspace = ui::Dataspace::DISPLAY_P3,
2541 };
2542
2543 // Create an unpremul buffer that is green with no alpha. Using isOpaque
2544 // should make the green show.
2545 const auto buf = allocateSourceBuffer(1, 1);
2546 {
2547 uint8_t* pixels;
2548 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2549 reinterpret_cast<void**>(&pixels));
2550 pixels[0] = 0;
2551 pixels[1] = 255;
2552 pixels[2] = 0;
2553 pixels[3] = 0;
2554 buf->getBuffer()->unlock();
2555 }
2556
2557 const renderengine::LayerSettings greenLayer{
2558 .geometry.boundaries = rect.toFloatRect(),
2559 .source =
2560 renderengine::PixelSource{
2561 .buffer =
2562 renderengine::Buffer{
2563 .buffer = buf,
2564 // Although the pixels are not
2565 // premultiplied in practice, this
2566 // matches the input we see.
2567 .usePremultipliedAlpha = true,
2568 .isOpaque = true,
2569 },
2570 },
2571 .alpha = 1.0f,
2572 };
2573
Sally Qi59a9f502021-10-12 18:53:23 +00002574 std::vector<renderengine::LayerSettings> layers{greenLayer};
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04002575 invokeDraw(display, layers);
2576
2577 if (GetParam()->useColorManagement()) {
2578 expectBufferColor(rect, 117, 251, 76, 255);
2579 } else {
2580 expectBufferColor(rect, 0, 255, 0, 255);
2581 }
2582}
Alec Mouri4049b532021-10-15 20:59:33 -07002583
Alec Mouri4049b532021-10-15 20:59:33 -07002584TEST_P(RenderEngineTest, test_tonemapPQMatches) {
2585 if (!GetParam()->useColorManagement()) {
Alec Mouri5a493722022-01-26 16:43:02 -08002586 GTEST_SKIP();
Alec Mouri4049b532021-10-15 20:59:33 -07002587 }
2588
2589 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
Alec Mouri5a493722022-01-26 16:43:02 -08002590 GTEST_SKIP();
Alec Mouri4049b532021-10-15 20:59:33 -07002591 }
2592
2593 initializeRenderEngine();
2594
Alec Mouri5a493722022-01-26 16:43:02 -08002595 tonemap(
2596 static_cast<ui::Dataspace>(HAL_DATASPACE_STANDARD_BT2020 |
2597 HAL_DATASPACE_TRANSFER_ST2084 | HAL_DATASPACE_RANGE_FULL),
2598 [](vec3 color) { return EOTF_PQ(color); },
2599 [](vec3 color, float) {
2600 static constexpr float kMaxPQLuminance = 10000.f;
2601 return color * kMaxPQLuminance;
2602 });
2603}
Alec Mouri4049b532021-10-15 20:59:33 -07002604
Alec Mouri5a493722022-01-26 16:43:02 -08002605TEST_P(RenderEngineTest, test_tonemapHLGMatches) {
2606 if (!GetParam()->useColorManagement()) {
2607 GTEST_SKIP();
Alec Mouri4049b532021-10-15 20:59:33 -07002608 }
2609
Alec Mouri5a493722022-01-26 16:43:02 -08002610 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2611 GTEST_SKIP();
2612 }
Alec Mouri4049b532021-10-15 20:59:33 -07002613
Alec Mouri5a493722022-01-26 16:43:02 -08002614 initializeRenderEngine();
Alec Mouri4049b532021-10-15 20:59:33 -07002615
Alec Mouri5a493722022-01-26 16:43:02 -08002616 tonemap(
2617 static_cast<ui::Dataspace>(HAL_DATASPACE_STANDARD_BT2020 | HAL_DATASPACE_TRANSFER_HLG |
2618 HAL_DATASPACE_RANGE_FULL),
2619 [](vec3 color) { return EOTF_HLG(color); },
2620 [](vec3 color, float currentLuminaceNits) {
2621 static constexpr float kMaxHLGLuminance = 1000.f;
2622 static const float kHLGGamma = 1.2 + 0.42 * std::log10(currentLuminaceNits / 1000);
2623 return color * kMaxHLGLuminance * std::pow(color.y, kHLGGamma - 1);
2624 });
Alec Mouri4049b532021-10-15 20:59:33 -07002625}
Leon Scroggins III2c1d9ef2022-01-21 13:46:56 -05002626
2627TEST_P(RenderEngineTest, r8_behaves_as_mask) {
2628 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2629 return;
2630 }
2631
2632 initializeRenderEngine();
2633
2634 const auto r8Buffer = allocateR8Buffer(2, 1);
2635 if (!r8Buffer) {
Leon Scroggins III745dcaa2022-01-26 11:55:58 -05002636 GTEST_SKIP() << "Test is only necessary on devices that support r8";
Leon Scroggins III2c1d9ef2022-01-21 13:46:56 -05002637 return;
2638 }
2639 {
2640 uint8_t* pixels;
2641 r8Buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2642 reinterpret_cast<void**>(&pixels));
2643 // This will be drawn on top of a green buffer. We'll verify that 255
2644 // results in keeping the original green and 0 results in black.
2645 pixels[0] = 0;
2646 pixels[1] = 255;
2647 r8Buffer->getBuffer()->unlock();
2648 }
2649
2650 const auto rect = Rect(0, 0, 2, 1);
2651 const renderengine::DisplaySettings display{
2652 .physicalDisplay = rect,
2653 .clip = rect,
2654 .outputDataspace = ui::Dataspace::SRGB,
2655 };
2656
2657 const auto greenBuffer = allocateAndFillSourceBuffer(2, 1, ubyte4(0, 255, 0, 255));
2658 const renderengine::LayerSettings greenLayer{
2659 .geometry.boundaries = rect.toFloatRect(),
2660 .source =
2661 renderengine::PixelSource{
2662 .buffer =
2663 renderengine::Buffer{
2664 .buffer = greenBuffer,
2665 },
2666 },
2667 .alpha = 1.0f,
2668 };
2669 const renderengine::LayerSettings r8Layer{
2670 .geometry.boundaries = rect.toFloatRect(),
2671 .source =
2672 renderengine::PixelSource{
2673 .buffer =
2674 renderengine::Buffer{
2675 .buffer = r8Buffer,
2676 },
2677 },
2678 .alpha = 1.0f,
2679 };
2680
2681 std::vector<renderengine::LayerSettings> layers{greenLayer, r8Layer};
2682 invokeDraw(display, layers);
2683
2684 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 255);
2685 expectBufferColor(Rect(1, 0, 2, 1), 0, 255, 0, 255);
2686}
Leon Scroggins III745dcaa2022-01-26 11:55:58 -05002687
2688TEST_P(RenderEngineTest, r8_respects_color_transform) {
2689 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2690 return;
2691 }
2692
2693 initializeRenderEngine();
2694
2695 const auto r8Buffer = allocateR8Buffer(2, 1);
2696 if (!r8Buffer) {
2697 GTEST_SKIP() << "Test is only necessary on devices that support r8";
2698 return;
2699 }
2700 {
2701 uint8_t* pixels;
2702 r8Buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2703 reinterpret_cast<void**>(&pixels));
2704 pixels[0] = 0;
2705 pixels[1] = 255;
2706 r8Buffer->getBuffer()->unlock();
2707 }
2708
2709 const auto rect = Rect(0, 0, 2, 1);
2710 const renderengine::DisplaySettings display{
2711 .physicalDisplay = rect,
2712 .clip = rect,
2713 .outputDataspace = ui::Dataspace::SRGB,
2714 // Verify that the R8 layer respects the color transform when
2715 // deviceHandlesColorTransform is false. This transform converts
2716 // pure red to pure green. That will occur when the R8 buffer is
2717 // 255. When the R8 buffer is 0, it will still change to black, as
2718 // with r8_behaves_as_mask.
2719 .colorTransform = mat4(0, 1, 0, 0,
2720 0, 0, 0, 0,
2721 0, 0, 1, 0,
2722 0, 0, 0, 1),
2723 .deviceHandlesColorTransform = false,
2724 };
2725
2726 const auto redBuffer = allocateAndFillSourceBuffer(2, 1, ubyte4(255, 0, 0, 255));
2727 const renderengine::LayerSettings redLayer{
2728 .geometry.boundaries = rect.toFloatRect(),
2729 .source =
2730 renderengine::PixelSource{
2731 .buffer =
2732 renderengine::Buffer{
2733 .buffer = redBuffer,
2734 },
2735 },
2736 .alpha = 1.0f,
2737 };
2738 const renderengine::LayerSettings r8Layer{
2739 .geometry.boundaries = rect.toFloatRect(),
2740 .source =
2741 renderengine::PixelSource{
2742 .buffer =
2743 renderengine::Buffer{
2744 .buffer = r8Buffer,
2745 },
2746 },
2747 .alpha = 1.0f,
2748 };
2749
2750 std::vector<renderengine::LayerSettings> layers{redLayer, r8Layer};
2751 invokeDraw(display, layers);
2752
2753 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 255);
2754 expectBufferColor(Rect(1, 0, 2, 1), 0, 255, 0, 255);
2755}
2756
2757TEST_P(RenderEngineTest, r8_respects_color_transform_when_device_handles) {
2758 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2759 return;
2760 }
2761
2762 initializeRenderEngine();
2763
2764 const auto r8Buffer = allocateR8Buffer(2, 1);
2765 if (!r8Buffer) {
2766 GTEST_SKIP() << "Test is only necessary on devices that support r8";
2767 return;
2768 }
2769 {
2770 uint8_t* pixels;
2771 r8Buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2772 reinterpret_cast<void**>(&pixels));
2773 pixels[0] = 0;
2774 pixels[1] = 255;
2775 r8Buffer->getBuffer()->unlock();
2776 }
2777
2778 const auto rect = Rect(0, 0, 2, 1);
2779 const renderengine::DisplaySettings display{
2780 .physicalDisplay = rect,
2781 .clip = rect,
2782 .outputDataspace = ui::Dataspace::SRGB,
2783 // If deviceHandlesColorTransform is true, pixels where the A8
2784 // buffer is opaque are unaffected. If the colorTransform is
2785 // invertible, pixels where the A8 buffer are transparent have the
2786 // inverse applied to them so that the DPU will convert them back to
2787 // black. Test with an arbitrary, invertible matrix.
2788 .colorTransform = mat4(1, 0, 0, 2,
2789 3, 1, 2, 5,
2790 0, 5, 3, 0,
2791 0, 1, 0, 2),
2792 .deviceHandlesColorTransform = true,
2793 };
2794
2795 const auto redBuffer = allocateAndFillSourceBuffer(2, 1, ubyte4(255, 0, 0, 255));
2796 const renderengine::LayerSettings redLayer{
2797 .geometry.boundaries = rect.toFloatRect(),
2798 .source =
2799 renderengine::PixelSource{
2800 .buffer =
2801 renderengine::Buffer{
2802 .buffer = redBuffer,
2803 },
2804 },
2805 .alpha = 1.0f,
2806 };
2807 const renderengine::LayerSettings r8Layer{
2808 .geometry.boundaries = rect.toFloatRect(),
2809 .source =
2810 renderengine::PixelSource{
2811 .buffer =
2812 renderengine::Buffer{
2813 .buffer = r8Buffer,
2814 },
2815 },
2816 .alpha = 1.0f,
2817 };
2818
2819 std::vector<renderengine::LayerSettings> layers{redLayer, r8Layer};
2820 invokeDraw(display, layers);
2821
2822 expectBufferColor(Rect(1, 0, 2, 1), 255, 0, 0, 255); // Still red.
2823 expectBufferColor(Rect(0, 0, 1, 1), 0, 70, 0, 255);
2824}
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04002825} // namespace renderengine
Alec Mouri6e57f682018-09-29 20:45:08 -07002826} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08002827
2828// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002829#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"