blob: df1b985bd6c8d0c7c3f3adc3f60366582dcc2914 [file] [log] [blame]
Alec Mouri6e57f682018-09-29 20:45:08 -07001/*
2 * Copyright 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Ana Krulec82ba2ec2020-11-21 13:33:20 -080017#undef LOG_TAG
18#define LOG_TAG "RenderEngineTest"
19
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080020// TODO(b/129481165): remove the #pragma below and fix conversion issues
21#pragma clang diagnostic push
22#pragma clang diagnostic ignored "-Wconversion"
Marin Shalamanovbed7fd32020-12-21 20:02:20 +010023#pragma clang diagnostic ignored "-Wextra"
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080024
Lucas Dupin19c8f0e2019-11-25 17:55:44 -080025#include <cutils/properties.h>
Ana Krulec9bc9dc62020-02-26 12:16:40 -080026#include <gtest/gtest.h>
Alec Mouria90a5702021-04-16 16:36:21 +000027#include <renderengine/ExternalTexture.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070028#include <renderengine/RenderEngine.h>
Vishnu Nairdbbe3852022-01-12 20:22:11 -080029#include <renderengine/impl/ExternalTexture.h>
Alec Mouri1089aed2018-10-25 21:33:57 -070030#include <sync/sync.h>
Alec Mouri4049b532021-10-15 20:59:33 -070031#include <system/graphics-base-v1.0.h>
32#include <tonemap/tonemap.h>
33#include <ui/ColorSpace.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070034#include <ui/PixelFormat.h>
Alec Mouric0aae732021-01-12 13:32:18 -080035
36#include <chrono>
37#include <condition_variable>
38#include <fstream>
39
Alec Mourid43ccab2019-03-13 12:23:45 -070040#include "../gl/GLESRenderEngine.h"
Alec Mouric0aae732021-01-12 13:32:18 -080041#include "../skia/SkiaGLRenderEngine.h"
Ana Krulec9bc9dc62020-02-26 12:16:40 -080042#include "../threaded/RenderEngineThreaded.h"
Alec Mouri6e57f682018-09-29 20:45:08 -070043
Alec Mouri1089aed2018-10-25 21:33:57 -070044constexpr int DEFAULT_DISPLAY_WIDTH = 128;
45constexpr int DEFAULT_DISPLAY_HEIGHT = 256;
46constexpr int DEFAULT_DISPLAY_OFFSET = 64;
Vishnu Nair16efdbf2019-12-10 11:55:42 -080047constexpr bool WRITE_BUFFER_TO_FILE_ON_FAILURE = false;
Alec Mouri1089aed2018-10-25 21:33:57 -070048
Alec Mouri6e57f682018-09-29 20:45:08 -070049namespace android {
Derek Sollenbergerd3f60652021-06-11 15:34:36 -040050namespace renderengine {
Alec Mouri6e57f682018-09-29 20:45:08 -070051
Alec Mouri5a493722022-01-26 16:43:02 -080052namespace {
53
54double EOTF_PQ(double channel) {
55 float m1 = (2610.0 / 4096.0) / 4.0;
56 float m2 = (2523.0 / 4096.0) * 128.0;
57 float c1 = (3424.0 / 4096.0);
58 float c2 = (2413.0 / 4096.0) * 32.0;
59 float c3 = (2392.0 / 4096.0) * 32.0;
60
61 float tmp = std::pow(std::clamp(channel, 0.0, 1.0), 1.0 / m2);
62 tmp = std::fmax(tmp - c1, 0.0) / (c2 - c3 * tmp);
63 return std::pow(tmp, 1.0 / m1);
64}
65
66vec3 EOTF_PQ(vec3 color) {
67 return vec3(EOTF_PQ(color.r), EOTF_PQ(color.g), EOTF_PQ(color.b));
68}
69
70double EOTF_HLG(double channel) {
71 const float a = 0.17883277;
72 const float b = 0.28466892;
73 const float c = 0.55991073;
74 return channel <= 0.5 ? channel * channel / 3.0 : (exp((channel - c) / a) + b) / 12.0;
75}
76
77vec3 EOTF_HLG(vec3 color) {
78 return vec3(EOTF_HLG(color.r), EOTF_HLG(color.g), EOTF_HLG(color.b));
79}
80
81double OETF_sRGB(double channel) {
82 return channel <= 0.0031308 ? channel * 12.92 : (pow(channel, 1.0 / 2.4) * 1.055) - 0.055;
83}
84
85int sign(float in) {
86 return in >= 0.0 ? 1 : -1;
87}
88
89vec3 OETF_sRGB(vec3 linear) {
90 return vec3(sign(linear.r) * OETF_sRGB(linear.r), sign(linear.g) * OETF_sRGB(linear.g),
91 sign(linear.b) * OETF_sRGB(linear.b));
92}
93
Alec Mouri9bcd1d12022-04-21 22:16:56 +000094// clang-format off
95// Converts red channels to green channels, and zeroes out an existing green channel.
96static const auto kRemoveGreenAndMoveRedToGreenMat4 = mat4(0, 1, 0, 0,
97 0, 0, 0, 0,
98 0, 0, 1, 0,
99 0, 0, 0, 1);
100// clang-format on
101
Alec Mouri5a493722022-01-26 16:43:02 -0800102} // namespace
103
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800104class RenderEngineFactory {
105public:
106 virtual ~RenderEngineFactory() = default;
107
108 virtual std::string name() = 0;
Alec Mouric0aae732021-01-12 13:32:18 -0800109 virtual renderengine::RenderEngine::RenderEngineType type() = 0;
110 virtual std::unique_ptr<renderengine::RenderEngine> createRenderEngine() = 0;
111 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
112 return nullptr;
113 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400114 virtual bool useColorManagement() const = 0;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800115};
116
117class GLESRenderEngineFactory : public RenderEngineFactory {
118public:
119 std::string name() override { return "GLESRenderEngineFactory"; }
120
Alec Mouric0aae732021-01-12 13:32:18 -0800121 renderengine::RenderEngine::RenderEngineType type() {
122 return renderengine::RenderEngine::RenderEngineType::GLES;
123 }
124
125 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
126 return createGLESRenderEngine();
127 }
128
129 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800130 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -0700131 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800132 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
133 .setImageCacheSize(1)
134 .setUseColorManagerment(false)
135 .setEnableProtectedContext(false)
136 .setPrecacheToneMapperShaderOnly(false)
137 .setSupportsBackgroundBlur(true)
138 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800139 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700140 .setUseColorManagerment(useColorManagement())
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800141 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800142 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -0700143 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400144
145 bool useColorManagement() const override { return false; }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800146};
Alec Mourid43ccab2019-03-13 12:23:45 -0700147
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800148class GLESCMRenderEngineFactory : public RenderEngineFactory {
149public:
150 std::string name() override { return "GLESCMRenderEngineFactory"; }
151
Alec Mouric0aae732021-01-12 13:32:18 -0800152 renderengine::RenderEngine::RenderEngineType type() {
153 return renderengine::RenderEngine::RenderEngineType::GLES;
154 }
155
156 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
157 return createGLESRenderEngine();
158 }
159
160 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() override {
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800161 renderengine::RenderEngineCreationArgs reCreationArgs =
162 renderengine::RenderEngineCreationArgs::Builder()
163 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
164 .setImageCacheSize(1)
165 .setEnableProtectedContext(false)
166 .setPrecacheToneMapperShaderOnly(false)
167 .setSupportsBackgroundBlur(true)
168 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800169 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700170 .setUseColorManagerment(useColorManagement())
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800171 .build();
172 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
173 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400174
175 bool useColorManagement() const override { return true; }
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800176};
177
Alec Mouri0eab3e82020-12-08 18:10:27 -0800178class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
179public:
Alec Mouric0aae732021-01-12 13:32:18 -0800180 std::string name() override { return "SkiaGLRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800181
Alec Mouric0aae732021-01-12 13:32:18 -0800182 renderengine::RenderEngine::RenderEngineType type() {
183 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
184 }
185
186 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800187 renderengine::RenderEngineCreationArgs reCreationArgs =
188 renderengine::RenderEngineCreationArgs::Builder()
189 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
190 .setImageCacheSize(1)
191 .setEnableProtectedContext(false)
192 .setPrecacheToneMapperShaderOnly(false)
193 .setSupportsBackgroundBlur(true)
194 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800195 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700196 .setUseColorManagerment(useColorManagement())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800197 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800198 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800199 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400200
Alec Mourid2bcbae2021-06-28 17:02:17 -0700201 bool useColorManagement() const override { return false; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800202};
203
204class SkiaGLESCMRenderEngineFactory : public RenderEngineFactory {
205public:
Alec Mouric0aae732021-01-12 13:32:18 -0800206 std::string name() override { return "SkiaGLCMRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800207
Alec Mouric0aae732021-01-12 13:32:18 -0800208 renderengine::RenderEngine::RenderEngineType type() {
209 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
210 }
211
212 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800213 renderengine::RenderEngineCreationArgs reCreationArgs =
214 renderengine::RenderEngineCreationArgs::Builder()
215 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
216 .setImageCacheSize(1)
217 .setEnableProtectedContext(false)
218 .setPrecacheToneMapperShaderOnly(false)
219 .setSupportsBackgroundBlur(true)
220 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800221 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700222 .setUseColorManagerment(useColorManagement())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800223 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800224 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800225 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400226
227 bool useColorManagement() const override { return true; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800228};
229
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800230class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
231public:
Alec Mouria90a5702021-04-16 16:36:21 +0000232 std::shared_ptr<renderengine::ExternalTexture> allocateDefaultBuffer() {
233 return std::make_shared<
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800234 renderengine::impl::
Alec Mouria90a5702021-04-16 16:36:21 +0000235 ExternalTexture>(new GraphicBuffer(DEFAULT_DISPLAY_WIDTH,
236 DEFAULT_DISPLAY_HEIGHT,
237 HAL_PIXEL_FORMAT_RGBA_8888, 1,
238 GRALLOC_USAGE_SW_READ_OFTEN |
239 GRALLOC_USAGE_SW_WRITE_OFTEN |
240 GRALLOC_USAGE_HW_RENDER |
241 GRALLOC_USAGE_HW_TEXTURE,
242 "output"),
243 *mRE,
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800244 renderengine::impl::ExternalTexture::Usage::READABLE |
245 renderengine::impl::ExternalTexture::Usage::
246 WRITEABLE);
Alec Mouri6e57f682018-09-29 20:45:08 -0700247 }
248
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800249 // Allocates a 1x1 buffer to fill with a solid color
Alec Mouria90a5702021-04-16 16:36:21 +0000250 std::shared_ptr<renderengine::ExternalTexture> allocateSourceBuffer(uint32_t width,
251 uint32_t height) {
252 return std::make_shared<
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800253 renderengine::impl::
Alec Mouria90a5702021-04-16 16:36:21 +0000254 ExternalTexture>(new GraphicBuffer(width, height,
255 HAL_PIXEL_FORMAT_RGBA_8888, 1,
256 GRALLOC_USAGE_SW_READ_OFTEN |
257 GRALLOC_USAGE_SW_WRITE_OFTEN |
258 GRALLOC_USAGE_HW_TEXTURE,
259 "input"),
260 *mRE,
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800261 renderengine::impl::ExternalTexture::Usage::READABLE |
262 renderengine::impl::ExternalTexture::Usage::
263 WRITEABLE);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800264 }
265
Alec Mouricdf6cbc2021-11-01 17:21:15 -0700266 std::shared_ptr<renderengine::ExternalTexture> allocateAndFillSourceBuffer(uint32_t width,
267 uint32_t height,
268 ubyte4 color) {
269 const auto buffer = allocateSourceBuffer(width, height);
270 uint8_t* pixels;
271 buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
272 reinterpret_cast<void**>(&pixels));
Leon Scroggins III2c1d9ef2022-01-21 13:46:56 -0500273 for (uint32_t j = 0; j < height; j++) {
274 uint8_t* dst = pixels + (buffer->getBuffer()->getStride() * j * 4);
275 for (uint32_t i = 0; i < width; i++) {
276 dst[0] = color.r;
277 dst[1] = color.g;
278 dst[2] = color.b;
279 dst[3] = color.a;
280 dst += 4;
281 }
282 }
Alec Mouricdf6cbc2021-11-01 17:21:15 -0700283 buffer->getBuffer()->unlock();
284 return buffer;
285 }
286
Leon Scroggins III2c1d9ef2022-01-21 13:46:56 -0500287 std::shared_ptr<renderengine::ExternalTexture> allocateR8Buffer(int width, int height) {
288 auto buffer = new GraphicBuffer(width, height, android::PIXEL_FORMAT_R_8, 1,
289 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
290 GRALLOC_USAGE_HW_TEXTURE,
291 "r8");
292 if (buffer->initCheck() != 0) {
293 // Devices are not required to support R8.
294 return nullptr;
295 }
296 return std::make_shared<
297 renderengine::impl::ExternalTexture>(std::move(buffer), *mRE,
298 renderengine::impl::ExternalTexture::Usage::
299 READABLE);
300 }
301
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800302 RenderEngineTest() {
303 const ::testing::TestInfo* const test_info =
304 ::testing::UnitTest::GetInstance()->current_test_info();
305 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800306 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700307
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800308 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800309 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
310 writeBufferToFile("/data/texture_out_");
311 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800312 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800313 mRE->deleteTextures(1, &texName);
Alec Mouric0aae732021-01-12 13:32:18 -0800314 if (mGLESRE != nullptr) {
315 EXPECT_FALSE(mGLESRE->isTextureNameKnownForTesting(texName));
316 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800317 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800318 const ::testing::TestInfo* const test_info =
319 ::testing::UnitTest::GetInstance()->current_test_info();
320 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800321 }
322
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800323 void writeBufferToFile(const char* basename) {
324 std::string filename(basename);
325 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
326 filename.append(".ppm");
327 std::ofstream file(filename.c_str(), std::ios::binary);
328 if (!file.is_open()) {
329 ALOGE("Unable to open file: %s", filename.c_str());
330 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
331 "surfaceflinger to write debug images");
332 return;
333 }
334
Alec Mouri1089aed2018-10-25 21:33:57 -0700335 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000336 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
337 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700338
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800339 file << "P6\n";
Alec Mouria90a5702021-04-16 16:36:21 +0000340 file << mBuffer->getBuffer()->getWidth() << "\n";
341 file << mBuffer->getBuffer()->getHeight() << "\n";
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800342 file << 255 << "\n";
343
Alec Mouria90a5702021-04-16 16:36:21 +0000344 std::vector<uint8_t> outBuffer(mBuffer->getBuffer()->getWidth() *
345 mBuffer->getBuffer()->getHeight() * 3);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800346 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
347
Alec Mouria90a5702021-04-16 16:36:21 +0000348 for (int32_t j = 0; j < mBuffer->getBuffer()->getHeight(); j++) {
349 const uint8_t* src = pixels + (mBuffer->getBuffer()->getStride() * j) * 4;
350 for (int32_t i = 0; i < mBuffer->getBuffer()->getWidth(); i++) {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800351 // Only copy R, G and B components
352 outPtr[0] = src[0];
353 outPtr[1] = src[1];
354 outPtr[2] = src[2];
355 outPtr += 3;
356
357 src += 4;
358 }
359 }
360 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
Alec Mouria90a5702021-04-16 16:36:21 +0000361 mBuffer->getBuffer()->unlock();
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800362 }
363
364 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
365 size_t c;
366 Rect const* rect = region.getArray(&c);
367 for (size_t i = 0; i < c; i++, rect++) {
368 expectBufferColor(*rect, r, g, b, a);
369 }
370 }
371
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -0400372 void expectBufferColor(const Point& point, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
373 uint8_t tolerance = 0) {
374 expectBufferColor(Rect(point.x, point.y, point.x + 1, point.y + 1), r, g, b, a, tolerance);
375 }
376
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800377 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
378 uint8_t tolerance = 0) {
Alec Mouri4049b532021-10-15 20:59:33 -0700379 auto generator = [=](Point) { return ubyte4(r, g, b, a); };
380 expectBufferColor(rect, generator, tolerance);
381 }
382
383 using ColorGenerator = std::function<ubyte4(Point location)>;
384
385 void expectBufferColor(const Rect& rect, ColorGenerator generator, uint8_t tolerance = 0) {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800386 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
387 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
388 uint8_t tmp = a >= b ? a - b : b - a;
389 return tmp <= tolerance;
390 };
391 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700392 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800393
Alec Mouri4049b532021-10-15 20:59:33 -0700394 expectBufferColor(rect, generator, colorCompare);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800395 }
396
Alec Mouri4049b532021-10-15 20:59:33 -0700397 void expectBufferColor(const Rect& region, ColorGenerator generator,
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800398 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
399 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000400 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
401 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700402 int32_t maxFails = 10;
403 int32_t fails = 0;
404 for (int32_t j = 0; j < region.getHeight(); j++) {
Alec Mouria90a5702021-04-16 16:36:21 +0000405 const uint8_t* src = pixels +
406 (mBuffer->getBuffer()->getStride() * (region.top + j) + region.left) * 4;
Alec Mouri1089aed2018-10-25 21:33:57 -0700407 for (int32_t i = 0; i < region.getWidth(); i++) {
Alec Mouri4049b532021-10-15 20:59:33 -0700408 const auto location = Point(region.left + i, region.top + j);
409 const ubyte4 colors = generator(location);
410 const uint8_t expected[4] = {colors.r, colors.g, colors.b, colors.a};
411 bool colorMatches = colorCompare(src, expected);
412 EXPECT_TRUE(colorMatches)
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400413 << GetParam()->name().c_str() << ": "
Alec Mouri4049b532021-10-15 20:59:33 -0700414 << "pixel @ (" << location.x << ", " << location.y << "): "
415 << "expected (" << static_cast<uint32_t>(colors.r) << ", "
416 << static_cast<uint32_t>(colors.g) << ", "
417 << static_cast<uint32_t>(colors.b) << ", "
418 << static_cast<uint32_t>(colors.a) << "), "
Alec Mouri1089aed2018-10-25 21:33:57 -0700419 << "got (" << static_cast<uint32_t>(src[0]) << ", "
420 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
421 << ", " << static_cast<uint32_t>(src[3]) << ")";
422 src += 4;
Alec Mouri4049b532021-10-15 20:59:33 -0700423 if (!colorMatches && ++fails >= maxFails) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700424 break;
425 }
426 }
427 if (fails >= maxFails) {
428 break;
429 }
430 }
Alec Mouria90a5702021-04-16 16:36:21 +0000431 mBuffer->getBuffer()->unlock();
Alec Mouri1089aed2018-10-25 21:33:57 -0700432 }
433
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800434 void expectAlpha(const Rect& rect, uint8_t a) {
Alec Mouri4049b532021-10-15 20:59:33 -0700435 auto generator = [=](Point) { return ubyte4(0, 0, 0, a); };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800436 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
437 return colorA[3] == colorB[3];
438 };
Alec Mouri4049b532021-10-15 20:59:33 -0700439 expectBufferColor(rect, generator, colorCompare);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800440 }
441
442 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
443 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
444 const ubyte4& backgroundColor) {
445 const Rect casterRect(castingLayer.geometry.boundaries);
446 Region casterRegion = Region(casterRect);
447 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
448 if (casterCornerRadius > 0.0f) {
449 // ignore the corners if a corner radius is set
450 Rect cornerRect(casterCornerRadius, casterCornerRadius);
451 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
452 casterRegion.subtractSelf(
453 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
454 casterRegion.subtractSelf(
455 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
456 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
457 casterRect.bottom - casterCornerRadius));
458 }
459
460 const float shadowInset = shadow.length * -1.0f;
461 const Rect casterWithShadow =
462 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
463 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
464 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
465
466 // verify casting layer
467 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
468
469 // verify shadows by testing just the alpha since its difficult to validate the shadow color
470 size_t c;
471 Rect const* r = shadowRegion.getArray(&c);
472 for (size_t i = 0; i < c; i++, r++) {
473 expectAlpha(*r, 255);
474 }
475
476 // verify background
477 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
478 backgroundColor.a);
479 }
480
Alec Mouribd17b3b2020-12-17 11:08:30 -0800481 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
482 const renderengine::ShadowSettings& shadow,
483 const ubyte4& backgroundColor) {
484 const float shadowInset = shadow.length * -1.0f;
485 const Rect casterRect(casterBounds);
486 const Rect shadowRect =
487 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
488
489 const Region backgroundRegion =
490 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
491
492 expectAlpha(shadowRect, 255);
493 // (0, 0, 0) fill on the bounds of the layer should be ignored.
494 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
495
496 // verify background
497 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
498 backgroundColor.a);
499 }
500
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800501 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
502 bool casterIsTranslucent) {
503 renderengine::ShadowSettings shadow;
504 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
505 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
506 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
507 shadow.lightRadius = 0.0f;
508 shadow.length = shadowLength;
509 shadow.casterIsTranslucent = casterIsTranslucent;
510 return shadow;
511 }
512
Alec Mouri1089aed2018-10-25 21:33:57 -0700513 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
514
515 static Rect offsetRect() {
516 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
517 DEFAULT_DISPLAY_HEIGHT);
518 }
519
520 static Rect offsetRectAtZero() {
521 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
522 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
523 }
524
Sally Qi59a9f502021-10-12 18:53:23 +0000525 void invokeDraw(const renderengine::DisplaySettings& settings,
526 const std::vector<renderengine::LayerSettings>& layers) {
Sally Qi4cabdd02021-08-05 16:45:57 -0700527 std::future<renderengine::RenderEngineResult> result =
528 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd());
Sally Qi59a9f502021-10-12 18:53:23 +0000529
Sally Qi4cabdd02021-08-05 16:45:57 -0700530 ASSERT_TRUE(result.valid());
531 auto [status, fence] = result.get();
Alec Mouri1089aed2018-10-25 21:33:57 -0700532
Derek Sollenbergerec411212021-08-25 10:54:47 -0400533 ASSERT_EQ(NO_ERROR, status);
534 if (fence.ok()) {
535 sync_wait(fence.get(), -1);
Alec Mouri1089aed2018-10-25 21:33:57 -0700536 }
537
Alec Mouric0aae732021-01-12 13:32:18 -0800538 if (layers.size() > 0 && mGLESRE != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000539 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700540 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700541 }
542
Alec Mourid43ccab2019-03-13 12:23:45 -0700543 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700544 renderengine::DisplaySettings settings;
Sally Qi59a9f502021-10-12 18:53:23 +0000545 std::vector<renderengine::LayerSettings> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800546 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700547 }
548
Alec Mouri1089aed2018-10-25 21:33:57 -0700549 template <typename SourceVariant>
550 void fillBuffer(half r, half g, half b, half a);
551
552 template <typename SourceVariant>
553 void fillRedBuffer();
554
555 template <typename SourceVariant>
556 void fillGreenBuffer();
557
558 template <typename SourceVariant>
559 void fillBlueBuffer();
560
561 template <typename SourceVariant>
562 void fillRedTransparentBuffer();
563
564 template <typename SourceVariant>
565 void fillRedOffsetBuffer();
566
567 template <typename SourceVariant>
568 void fillBufferPhysicalOffset();
569
570 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700571 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700572
573 template <typename SourceVariant>
574 void fillBufferCheckersRotate0();
575
576 template <typename SourceVariant>
577 void fillBufferCheckersRotate90();
578
579 template <typename SourceVariant>
580 void fillBufferCheckersRotate180();
581
582 template <typename SourceVariant>
583 void fillBufferCheckersRotate270();
584
585 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800586 void fillBufferWithLayerTransform();
587
588 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700589 void fillBufferLayerTransform();
590
591 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800592 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800593
594 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700595 void fillBufferColorTransform();
596
Alec Mouri7c94edb2018-12-03 21:23:26 -0800597 template <typename SourceVariant>
Sally Qi2019fd22021-11-22 10:19:04 -0800598 void fillBufferWithColorTransformAndSourceDataspace(const ui::Dataspace sourceDataspace);
599
600 template <typename SourceVariant>
601 void fillBufferColorTransformAndSourceDataspace();
602
603 template <typename SourceVariant>
604 void fillBufferWithColorTransformAndOutputDataspace(const ui::Dataspace outputDataspace);
605
606 template <typename SourceVariant>
607 void fillBufferColorTransformAndOutputDataspace();
608
609 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800610 void fillBufferWithColorTransformZeroLayerAlpha();
611
612 template <typename SourceVariant>
613 void fillBufferColorTransformZeroLayerAlpha();
614
615 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800616 void fillRedBufferWithRoundedCorners();
617
618 template <typename SourceVariant>
619 void fillBufferWithRoundedCorners();
620
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000621 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800622 void fillBufferAndBlurBackground();
623
624 template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700625 void fillSmallLayerAndBlurBackground();
626
627 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000628 void overlayCorners();
629
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800630 void fillRedBufferTextureTransform();
631
632 void fillBufferTextureTransform();
633
634 void fillRedBufferWithPremultiplyAlpha();
635
636 void fillBufferWithPremultiplyAlpha();
637
638 void fillRedBufferWithoutPremultiplyAlpha();
639
640 void fillBufferWithoutPremultiplyAlpha();
641
Alec Mouriac335532018-11-12 15:01:33 -0800642 void fillGreenColorBufferThenClearRegion();
643
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800644 template <typename SourceVariant>
645 void drawShadow(const renderengine::LayerSettings& castingLayer,
646 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
647 const ubyte4& backgroundColor);
648
Alec Mouribd17b3b2020-12-17 11:08:30 -0800649 void drawShadowWithoutCaster(const FloatRect& castingBounds,
650 const renderengine::ShadowSettings& shadow,
651 const ubyte4& backgroundColor);
652
Alec Mouri5a493722022-01-26 16:43:02 -0800653 // Tonemaps grey values from sourceDataspace -> Display P3 and checks that GPU and CPU
654 // implementations are identical Also implicitly checks that the injected tonemap shader
655 // compiles
656 void tonemap(ui::Dataspace sourceDataspace, std::function<vec3(vec3)> eotf,
657 std::function<vec3(vec3, float)> scaleOotf);
658
Alec Mouric0aae732021-01-12 13:32:18 -0800659 void initializeRenderEngine();
660
661 std::unique_ptr<renderengine::RenderEngine> mRE;
Alec Mouria90a5702021-04-16 16:36:21 +0000662 std::shared_ptr<renderengine::ExternalTexture> mBuffer;
Alec Mouric0aae732021-01-12 13:32:18 -0800663 // GLESRenderEngine for testing GLES-specific behavior.
664 // Owened by mRE, but this is downcasted.
665 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800666
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800667 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700668};
669
Alec Mouric0aae732021-01-12 13:32:18 -0800670void RenderEngineTest::initializeRenderEngine() {
671 const auto& renderEngineFactory = GetParam();
672 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
673 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
674 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
675 // every time.
676 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
677 renderEngineFactory->createGLESRenderEngine();
678 mGLESRE = renderEngine.get();
679 mRE = std::move(renderEngine);
680 } else {
681 mRE = renderEngineFactory->createRenderEngine();
682 }
Alec Mouria90a5702021-04-16 16:36:21 +0000683 mBuffer = allocateDefaultBuffer();
Alec Mouric0aae732021-01-12 13:32:18 -0800684}
685
Alec Mouri1089aed2018-10-25 21:33:57 -0700686struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800687 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800688 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700689 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800690 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700691 }
692};
693
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800694struct RelaxOpaqueBufferVariant {
695 static void setOpaqueBit(renderengine::LayerSettings& layer) {
696 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800697 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800698 }
699
700 static uint8_t getAlphaChannel() { return 255; }
701};
702
703struct ForceOpaqueBufferVariant {
704 static void setOpaqueBit(renderengine::LayerSettings& layer) {
705 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800706 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800707 }
708
709 static uint8_t getAlphaChannel() {
710 // The isOpaque bit will override the alpha channel, so this should be
711 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800712 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800713 }
714};
715
716template <typename OpaquenessVariant>
717struct BufferSourceVariant {
718 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800719 RenderEngineTest* fixture) {
Alec Mouria90a5702021-04-16 16:36:21 +0000720 const auto buf = fixture->allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800721 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800722 fixture->mRE->genTextures(1, &texName);
723 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800724
725 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000726 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
727 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800728
Alec Mouria90a5702021-04-16 16:36:21 +0000729 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
730 uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
731 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800732 iter[0] = uint8_t(r * 255);
733 iter[1] = uint8_t(g * 255);
734 iter[2] = uint8_t(b * 255);
735 iter[3] = OpaquenessVariant::getAlphaChannel();
736 iter += 4;
737 }
738 }
739
Alec Mouria90a5702021-04-16 16:36:21 +0000740 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800741
742 layer.source.buffer.buffer = buf;
743 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800744 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800745 OpaquenessVariant::setOpaqueBit(layer);
746 }
747};
748
Alec Mouri1089aed2018-10-25 21:33:57 -0700749template <typename SourceVariant>
750void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
751 renderengine::DisplaySettings settings;
752 settings.physicalDisplay = fullscreenRect();
753 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800754 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700755
Sally Qi59a9f502021-10-12 18:53:23 +0000756 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700757
758 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800759 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700760 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800761 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700762 layer.alpha = a;
763
Sally Qi59a9f502021-10-12 18:53:23 +0000764 layers.push_back(layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700765
Alec Mouric0aae732021-01-12 13:32:18 -0800766 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700767}
768
769template <typename SourceVariant>
770void RenderEngineTest::fillRedBuffer() {
771 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
772 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
773}
774
775template <typename SourceVariant>
776void RenderEngineTest::fillGreenBuffer() {
777 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
778 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
779}
780
781template <typename SourceVariant>
782void RenderEngineTest::fillBlueBuffer() {
783 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
784 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
785}
786
787template <typename SourceVariant>
788void RenderEngineTest::fillRedTransparentBuffer() {
789 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
790 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
791}
792
793template <typename SourceVariant>
794void RenderEngineTest::fillRedOffsetBuffer() {
795 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800796 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700797 settings.physicalDisplay = offsetRect();
798 settings.clip = offsetRectAtZero();
799
Sally Qi59a9f502021-10-12 18:53:23 +0000800 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700801
802 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800803 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700804 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800805 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700806 layer.alpha = 1.0f;
807
Sally Qi59a9f502021-10-12 18:53:23 +0000808 layers.push_back(layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800809 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700810}
811
812template <typename SourceVariant>
813void RenderEngineTest::fillBufferPhysicalOffset() {
814 fillRedOffsetBuffer<SourceVariant>();
815
816 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
817 DEFAULT_DISPLAY_HEIGHT),
818 255, 0, 0, 255);
819 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
820 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
821
822 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
823 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
824}
825
826template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700827void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700828 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800829 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700830 settings.physicalDisplay = fullscreenRect();
831 // Here logical space is 2x2
832 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700833 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700834
Sally Qi59a9f502021-10-12 18:53:23 +0000835 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700836
837 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800838 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700839 Rect rectOne(0, 0, 1, 1);
840 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800841 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700842 layerOne.alpha = 1.0f;
843
844 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800845 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700846 Rect rectTwo(0, 1, 1, 2);
847 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800848 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700849 layerTwo.alpha = 1.0f;
850
851 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800852 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700853 Rect rectThree(1, 0, 2, 1);
854 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800855 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700856 layerThree.alpha = 1.0f;
857
Sally Qi59a9f502021-10-12 18:53:23 +0000858 layers.push_back(layerOne);
859 layers.push_back(layerTwo);
860 layers.push_back(layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700861
Alec Mouric0aae732021-01-12 13:32:18 -0800862 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700863}
864
865template <typename SourceVariant>
866void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700867 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700868 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
869 255);
870 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
871 DEFAULT_DISPLAY_HEIGHT / 2),
872 0, 0, 255, 255);
873 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
874 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
875 0, 0, 0, 0);
876 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
877 DEFAULT_DISPLAY_HEIGHT),
878 0, 255, 0, 255);
879}
880
881template <typename SourceVariant>
882void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700883 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700884 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
885 255);
886 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
887 DEFAULT_DISPLAY_HEIGHT / 2),
888 255, 0, 0, 255);
889 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
890 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
891 0, 0, 255, 255);
892 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
893 DEFAULT_DISPLAY_HEIGHT),
894 0, 0, 0, 0);
895}
896
897template <typename SourceVariant>
898void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700899 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700900 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
901 0);
902 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
903 DEFAULT_DISPLAY_HEIGHT / 2),
904 0, 255, 0, 255);
905 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
906 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
907 255, 0, 0, 255);
908 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
909 DEFAULT_DISPLAY_HEIGHT),
910 0, 0, 255, 255);
911}
912
913template <typename SourceVariant>
914void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700915 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700916 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
917 255);
918 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
919 DEFAULT_DISPLAY_HEIGHT / 2),
920 0, 0, 0, 0);
921 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
922 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
923 0, 255, 0, 255);
924 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
925 DEFAULT_DISPLAY_HEIGHT),
926 255, 0, 0, 255);
927}
928
929template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800930void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700931 renderengine::DisplaySettings settings;
932 settings.physicalDisplay = fullscreenRect();
933 // Here logical space is 2x2
934 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800935 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700936
Sally Qi59a9f502021-10-12 18:53:23 +0000937 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700938
939 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800940 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700941 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
942 // Translate one pixel diagonally
943 layer.geometry.positionTransform = mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800944 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700945 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
946 layer.alpha = 1.0f;
947
Sally Qi59a9f502021-10-12 18:53:23 +0000948 layers.push_back(layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700949
Alec Mouric0aae732021-01-12 13:32:18 -0800950 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800951}
Alec Mouri1089aed2018-10-25 21:33:57 -0700952
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800953template <typename SourceVariant>
954void RenderEngineTest::fillBufferLayerTransform() {
955 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700956 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
957 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
958 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
959 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
960 255, 0, 0, 255);
961}
962
963template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800964void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700965 renderengine::DisplaySettings settings;
966 settings.physicalDisplay = fullscreenRect();
967 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800968 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700969
Sally Qi59a9f502021-10-12 18:53:23 +0000970 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700971
972 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800973 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700974 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800975 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700976 layer.alpha = 1.0f;
977
978 // construct a fake color matrix
979 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800980 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700981 // set red channel to red + green
982 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
983
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800984 layer.alpha = 1.0f;
985 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
986
Sally Qi59a9f502021-10-12 18:53:23 +0000987 layers.push_back(layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700988
Alec Mouric0aae732021-01-12 13:32:18 -0800989 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800990}
Alec Mouri1089aed2018-10-25 21:33:57 -0700991
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800992template <typename SourceVariant>
Sally Qi2019fd22021-11-22 10:19:04 -0800993void RenderEngineTest::fillBufferWithColorTransformAndSourceDataspace(
994 const ui::Dataspace sourceDataspace) {
995 renderengine::DisplaySettings settings;
996 settings.physicalDisplay = fullscreenRect();
997 settings.clip = Rect(1, 1);
998 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
999
1000 std::vector<renderengine::LayerSettings> layers;
1001
1002 renderengine::LayerSettings layer;
1003 layer.sourceDataspace = sourceDataspace;
1004 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1005 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
1006 layer.alpha = 1.0f;
1007
1008 // construct a fake color matrix
1009 // annihilate green and blue channels
1010 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
1011 // set red channel to red + green
1012 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1013
1014 layer.alpha = 1.0f;
1015 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1016
1017 layers.push_back(layer);
1018
1019 invokeDraw(settings, layers);
1020}
1021
1022template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001023void RenderEngineTest::fillBufferColorTransform() {
1024 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001025 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
1026}
1027
1028template <typename SourceVariant>
Sally Qi2019fd22021-11-22 10:19:04 -08001029void RenderEngineTest::fillBufferColorTransformAndSourceDataspace() {
1030 unordered_map<ui::Dataspace, ubyte4> dataspaceToColorMap;
1031 dataspaceToColorMap[ui::Dataspace::V0_BT709] = {172, 0, 0, 255};
1032 dataspaceToColorMap[ui::Dataspace::BT2020] = {172, 0, 0, 255};
1033 dataspaceToColorMap[ui::Dataspace::ADOBE_RGB] = {172, 0, 0, 255};
1034 ui::Dataspace customizedDataspace = static_cast<ui::Dataspace>(
1035 ui::Dataspace::STANDARD_BT709 | ui::Dataspace::TRANSFER_GAMMA2_2 |
1036 ui::Dataspace::RANGE_FULL);
1037 dataspaceToColorMap[customizedDataspace] = {172, 0, 0, 255};
1038 for (const auto& [sourceDataspace, color] : dataspaceToColorMap) {
1039 fillBufferWithColorTransformAndSourceDataspace<SourceVariant>(sourceDataspace);
1040 expectBufferColor(fullscreenRect(), color.r, color.g, color.b, color.a, 1);
1041 }
1042}
1043
1044template <typename SourceVariant>
1045void RenderEngineTest::fillBufferWithColorTransformAndOutputDataspace(
1046 const ui::Dataspace outputDataspace) {
1047 renderengine::DisplaySettings settings;
1048 settings.physicalDisplay = fullscreenRect();
1049 settings.clip = Rect(1, 1);
1050 settings.outputDataspace = outputDataspace;
1051
1052 std::vector<renderengine::LayerSettings> layers;
1053
1054 renderengine::LayerSettings layer;
1055 layer.sourceDataspace = ui::Dataspace::V0_SCRGB_LINEAR;
1056 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1057 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
1058 layer.alpha = 1.0f;
1059
1060 // construct a fake color matrix
1061 // annihilate green and blue channels
1062 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
1063 // set red channel to red + green
1064 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1065
1066 layer.alpha = 1.0f;
1067 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1068
1069 layers.push_back(layer);
1070
1071 invokeDraw(settings, layers);
1072}
1073
1074template <typename SourceVariant>
1075void RenderEngineTest::fillBufferColorTransformAndOutputDataspace() {
1076 unordered_map<ui::Dataspace, ubyte4> dataspaceToColorMap;
1077 dataspaceToColorMap[ui::Dataspace::V0_BT709] = {202, 0, 0, 255};
1078 dataspaceToColorMap[ui::Dataspace::BT2020] = {192, 0, 0, 255};
1079 dataspaceToColorMap[ui::Dataspace::ADOBE_RGB] = {202, 0, 0, 255};
1080 ui::Dataspace customizedDataspace = static_cast<ui::Dataspace>(
1081 ui::Dataspace::STANDARD_BT709 | ui::Dataspace::TRANSFER_GAMMA2_6 |
1082 ui::Dataspace::RANGE_FULL);
1083 dataspaceToColorMap[customizedDataspace] = {202, 0, 0, 255};
1084 for (const auto& [outputDataspace, color] : dataspaceToColorMap) {
1085 fillBufferWithColorTransformAndOutputDataspace<SourceVariant>(outputDataspace);
1086 expectBufferColor(fullscreenRect(), color.r, color.g, color.b, color.a, 1);
1087 }
1088}
1089
1090template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001091void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
1092 renderengine::DisplaySettings settings;
1093 settings.physicalDisplay = fullscreenRect();
1094 settings.clip = Rect(1, 1);
1095
Sally Qi59a9f502021-10-12 18:53:23 +00001096 std::vector<renderengine::LayerSettings> layers;
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001097
1098 renderengine::LayerSettings layer;
1099 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1100 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
1101 layer.alpha = 0;
1102
1103 // construct a fake color matrix
1104 // simple inverse color
1105 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
1106
1107 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1108
Sally Qi59a9f502021-10-12 18:53:23 +00001109 layers.push_back(layer);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001110
Alec Mouric0aae732021-01-12 13:32:18 -08001111 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001112}
1113
1114template <typename SourceVariant>
1115void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
1116 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
1117 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
1118}
1119
1120template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -08001121void RenderEngineTest::fillRedBufferWithRoundedCorners() {
1122 renderengine::DisplaySettings settings;
1123 settings.physicalDisplay = fullscreenRect();
1124 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001125 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -08001126
Sally Qi59a9f502021-10-12 18:53:23 +00001127 std::vector<renderengine::LayerSettings> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -08001128
1129 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001130 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -08001131 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1132 layer.geometry.roundedCornersRadius = 5.0f;
1133 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1134 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1135 layer.alpha = 1.0f;
1136
Sally Qi59a9f502021-10-12 18:53:23 +00001137 layers.push_back(layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -08001138
Alec Mouric0aae732021-01-12 13:32:18 -08001139 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -08001140}
1141
1142template <typename SourceVariant>
1143void RenderEngineTest::fillBufferWithRoundedCorners() {
1144 fillRedBufferWithRoundedCorners<SourceVariant>();
1145 // Corners should be ignored...
1146 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1147 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1148 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1149 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1150 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1151 0, 0, 0, 0);
1152 // ...And the non-rounded portion should be red.
1153 // Other pixels may be anti-aliased, so let's not check those.
1154 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
1155 255);
1156}
1157
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001158template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001159void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001160 auto blurRadius = 50;
1161 auto center = DEFAULT_DISPLAY_WIDTH / 2;
1162
1163 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001164 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001165 settings.physicalDisplay = fullscreenRect();
1166 settings.clip = fullscreenRect();
1167
Sally Qi59a9f502021-10-12 18:53:23 +00001168 std::vector<renderengine::LayerSettings> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001169
1170 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001171 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001172 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1173 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
1174 backgroundLayer.alpha = 1.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001175 layers.emplace_back(backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001176
1177 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001178 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001179 leftLayer.geometry.boundaries =
1180 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
1181 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
1182 leftLayer.alpha = 1.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001183 layers.emplace_back(leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001184
1185 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001186 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001187 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1188 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -05001189 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001190 blurLayer.alpha = 0;
Sally Qi59a9f502021-10-12 18:53:23 +00001191 layers.emplace_back(blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001192
Alec Mouric0aae732021-01-12 13:32:18 -08001193 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001194
Derek Sollenbergerecb21462021-01-29 16:53:49 -05001195 // solid color
1196 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
1197
Derek Sollenbergerb3998372021-02-16 15:16:56 -05001198 if (mRE->supportsBackgroundBlur()) {
1199 // blurred color (downsampling should result in the center color being close to 128)
1200 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001201 50 /* tolerance */);
Derek Sollenbergerb3998372021-02-16 15:16:56 -05001202 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001203}
1204
1205template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -07001206void RenderEngineTest::fillSmallLayerAndBlurBackground() {
1207 auto blurRadius = 50;
1208 renderengine::DisplaySettings settings;
1209 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1210 settings.physicalDisplay = fullscreenRect();
1211 settings.clip = fullscreenRect();
1212
Sally Qi59a9f502021-10-12 18:53:23 +00001213 std::vector<renderengine::LayerSettings> layers;
Alec Mourie8489fd2021-04-29 16:08:56 -07001214
1215 renderengine::LayerSettings backgroundLayer;
1216 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1217 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1218 SourceVariant::fillColor(backgroundLayer, 1.0f, 0.0f, 0.0f, this);
1219 backgroundLayer.alpha = 1.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001220 layers.push_back(backgroundLayer);
Alec Mourie8489fd2021-04-29 16:08:56 -07001221
1222 renderengine::LayerSettings blurLayer;
1223 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1224 blurLayer.geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f);
1225 blurLayer.backgroundBlurRadius = blurRadius;
1226 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
1227 blurLayer.alpha = 0;
Sally Qi59a9f502021-10-12 18:53:23 +00001228 layers.push_back(blurLayer);
Alec Mourie8489fd2021-04-29 16:08:56 -07001229
1230 invokeDraw(settings, layers);
1231
1232 // Give a generous tolerance - the blur rectangle is very small and this test is
1233 // mainly concerned with ensuring that there's no device failure.
1234 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 255, 0, 0, 255,
1235 40 /* tolerance */);
1236}
1237
1238template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001239void RenderEngineTest::overlayCorners() {
1240 renderengine::DisplaySettings settings;
1241 settings.physicalDisplay = fullscreenRect();
1242 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001243 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001244
Sally Qi59a9f502021-10-12 18:53:23 +00001245 std::vector<renderengine::LayerSettings> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001246
1247 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001248 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001249 layerOne.geometry.boundaries =
1250 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
1251 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
1252 layerOne.alpha = 0.2;
1253
Sally Qi59a9f502021-10-12 18:53:23 +00001254 layersFirst.push_back(layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -08001255 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001256 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
1257 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1258 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1259 0, 0, 0, 0);
1260
Sally Qi59a9f502021-10-12 18:53:23 +00001261 std::vector<renderengine::LayerSettings> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001262 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001263 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001264 layerTwo.geometry.boundaries =
1265 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1266 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1267 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1268 layerTwo.alpha = 1.0f;
1269
Sally Qi59a9f502021-10-12 18:53:23 +00001270 layersSecond.push_back(layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001271 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001272
1273 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1274 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1275 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1276 0, 255, 0, 255);
1277}
1278
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001279void RenderEngineTest::fillRedBufferTextureTransform() {
1280 renderengine::DisplaySettings settings;
1281 settings.physicalDisplay = fullscreenRect();
1282 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001283 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001284
Sally Qi59a9f502021-10-12 18:53:23 +00001285 std::vector<renderengine::LayerSettings> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001286
1287 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001288 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001289 // Here will allocate a checker board texture, but transform texture
1290 // coordinates so that only the upper left is applied.
Alec Mouria90a5702021-04-16 16:36:21 +00001291 const auto buf = allocateSourceBuffer(2, 2);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001292 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001293 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001294 this->mTexNames.push_back(texName);
1295
1296 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001297 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1298 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001299 // Red top left, Green top right, Blue bottom left, Black bottom right
1300 pixels[0] = 255;
1301 pixels[1] = 0;
1302 pixels[2] = 0;
1303 pixels[3] = 255;
1304 pixels[4] = 0;
1305 pixels[5] = 255;
1306 pixels[6] = 0;
1307 pixels[7] = 255;
1308 pixels[8] = 0;
1309 pixels[9] = 0;
1310 pixels[10] = 255;
1311 pixels[11] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001312 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001313
1314 layer.source.buffer.buffer = buf;
1315 layer.source.buffer.textureName = texName;
1316 // Transform coordinates to only be inside the red quadrant.
Alec Mouri4049b532021-10-15 20:59:33 -07001317 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2f, 0.2f, 1.f, 1.f));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001318 layer.alpha = 1.0f;
1319 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1320
Sally Qi59a9f502021-10-12 18:53:23 +00001321 layers.push_back(layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001322
Alec Mouric0aae732021-01-12 13:32:18 -08001323 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001324}
1325
1326void RenderEngineTest::fillBufferTextureTransform() {
1327 fillRedBufferTextureTransform();
1328 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1329}
1330
1331void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1332 renderengine::DisplaySettings settings;
1333 settings.physicalDisplay = fullscreenRect();
1334 // Here logical space is 1x1
1335 settings.clip = Rect(1, 1);
1336
Sally Qi59a9f502021-10-12 18:53:23 +00001337 std::vector<renderengine::LayerSettings> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001338
1339 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001340 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001341 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001342 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001343 this->mTexNames.push_back(texName);
1344
1345 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001346 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1347 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001348 pixels[0] = 255;
1349 pixels[1] = 0;
1350 pixels[2] = 0;
1351 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001352 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001353
1354 layer.source.buffer.buffer = buf;
1355 layer.source.buffer.textureName = texName;
1356 layer.source.buffer.usePremultipliedAlpha = true;
1357 layer.alpha = 0.5f;
1358 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1359
Sally Qi59a9f502021-10-12 18:53:23 +00001360 layers.push_back(layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001361
Alec Mouric0aae732021-01-12 13:32:18 -08001362 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001363}
1364
1365void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1366 fillRedBufferWithPremultiplyAlpha();
1367 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1368}
1369
1370void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1371 renderengine::DisplaySettings settings;
1372 settings.physicalDisplay = fullscreenRect();
1373 // Here logical space is 1x1
1374 settings.clip = Rect(1, 1);
1375
Sally Qi59a9f502021-10-12 18:53:23 +00001376 std::vector<renderengine::LayerSettings> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001377
1378 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001379 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001380 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001381 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001382 this->mTexNames.push_back(texName);
1383
1384 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001385 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1386 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001387 pixels[0] = 255;
1388 pixels[1] = 0;
1389 pixels[2] = 0;
1390 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001391 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001392
1393 layer.source.buffer.buffer = buf;
1394 layer.source.buffer.textureName = texName;
1395 layer.source.buffer.usePremultipliedAlpha = false;
1396 layer.alpha = 0.5f;
1397 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1398
Sally Qi59a9f502021-10-12 18:53:23 +00001399 layers.push_back(layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001400
Alec Mouric0aae732021-01-12 13:32:18 -08001401 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001402}
1403
1404void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1405 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001406 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001407}
1408
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001409template <typename SourceVariant>
1410void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1411 const renderengine::ShadowSettings& shadow,
1412 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1413 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001414 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001415 settings.physicalDisplay = fullscreenRect();
1416 settings.clip = fullscreenRect();
1417
Sally Qi59a9f502021-10-12 18:53:23 +00001418 std::vector<renderengine::LayerSettings> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001419
1420 // add background layer
1421 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001422 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001423 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1424 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1425 backgroundColor.b / 255.0f, this);
1426 bgLayer.alpha = backgroundColor.a / 255.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001427 layers.push_back(bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001428
1429 // add shadow layer
1430 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001431 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001432 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1433 shadowLayer.alpha = castingLayer.alpha;
1434 shadowLayer.shadow = shadow;
Sally Qi59a9f502021-10-12 18:53:23 +00001435 layers.push_back(shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001436
1437 // add layer casting the shadow
1438 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001439 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001440 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1441 casterColor.b / 255.0f, this);
Sally Qi59a9f502021-10-12 18:53:23 +00001442 layers.push_back(layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001443
Alec Mouric0aae732021-01-12 13:32:18 -08001444 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001445}
1446
Alec Mouribd17b3b2020-12-17 11:08:30 -08001447void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1448 const renderengine::ShadowSettings& shadow,
1449 const ubyte4& backgroundColor) {
1450 renderengine::DisplaySettings settings;
1451 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1452 settings.physicalDisplay = fullscreenRect();
1453 settings.clip = fullscreenRect();
1454
Sally Qi59a9f502021-10-12 18:53:23 +00001455 std::vector<renderengine::LayerSettings> layers;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001456
1457 // add background layer
1458 renderengine::LayerSettings bgLayer;
1459 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1460 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1461 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1462 backgroundColor.b / 255.0f, this);
1463 bgLayer.alpha = backgroundColor.a / 255.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001464 layers.push_back(bgLayer);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001465
1466 // add shadow layer
1467 renderengine::LayerSettings shadowLayer;
1468 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1469 shadowLayer.geometry.boundaries = castingBounds;
Derek Sollenbergerc31985e2021-05-18 16:38:17 -04001470 shadowLayer.skipContentDraw = true;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001471 shadowLayer.alpha = 1.0f;
1472 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1473 shadowLayer.shadow = shadow;
Sally Qi59a9f502021-10-12 18:53:23 +00001474 layers.push_back(shadowLayer);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001475
Alec Mouric0aae732021-01-12 13:32:18 -08001476 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001477}
1478
Alec Mouri5a493722022-01-26 16:43:02 -08001479void RenderEngineTest::tonemap(ui::Dataspace sourceDataspace, std::function<vec3(vec3)> eotf,
1480 std::function<vec3(vec3, float)> scaleOotf) {
1481 constexpr int32_t kGreyLevels = 256;
1482
1483 const auto rect = Rect(0, 0, kGreyLevels, 1);
1484
1485 constexpr float kMaxLuminance = 750.f;
1486 constexpr float kCurrentLuminanceNits = 500.f;
1487 const renderengine::DisplaySettings display{
1488 .physicalDisplay = rect,
1489 .clip = rect,
1490 .maxLuminance = kMaxLuminance,
1491 .currentLuminanceNits = kCurrentLuminanceNits,
1492 .outputDataspace = ui::Dataspace::DISPLAY_P3,
1493 };
1494
1495 auto buf = std::make_shared<
1496 renderengine::impl::
1497 ExternalTexture>(new GraphicBuffer(kGreyLevels, 1, HAL_PIXEL_FORMAT_RGBA_8888,
1498 1,
1499 GRALLOC_USAGE_SW_READ_OFTEN |
1500 GRALLOC_USAGE_SW_WRITE_OFTEN |
1501 GRALLOC_USAGE_HW_RENDER |
1502 GRALLOC_USAGE_HW_TEXTURE,
1503 "input"),
1504 *mRE,
1505 renderengine::impl::ExternalTexture::Usage::READABLE |
1506 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
1507 ASSERT_EQ(0, buf->getBuffer()->initCheck());
1508 {
1509 uint8_t* pixels;
1510 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1511 reinterpret_cast<void**>(&pixels));
1512
1513 uint8_t color = 0;
1514 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
1515 uint8_t* dest = pixels + (buf->getBuffer()->getStride() * j * 4);
1516 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
1517 dest[0] = color;
1518 dest[1] = color;
1519 dest[2] = color;
1520 dest[3] = 255;
1521 color++;
1522 dest += 4;
1523 }
1524 }
1525 buf->getBuffer()->unlock();
1526 }
1527
1528 mBuffer = std::make_shared<
1529 renderengine::impl::
1530 ExternalTexture>(new GraphicBuffer(kGreyLevels, 1, HAL_PIXEL_FORMAT_RGBA_8888,
1531 1,
1532 GRALLOC_USAGE_SW_READ_OFTEN |
1533 GRALLOC_USAGE_SW_WRITE_OFTEN |
1534 GRALLOC_USAGE_HW_RENDER |
1535 GRALLOC_USAGE_HW_TEXTURE,
1536 "output"),
1537 *mRE,
1538 renderengine::impl::ExternalTexture::Usage::READABLE |
1539 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
1540 ASSERT_EQ(0, mBuffer->getBuffer()->initCheck());
1541
1542 const renderengine::LayerSettings layer{.geometry.boundaries = rect.toFloatRect(),
1543 .source =
1544 renderengine::PixelSource{
1545 .buffer =
1546 renderengine::Buffer{
1547 .buffer =
1548 std::move(buf),
1549 .usePremultipliedAlpha =
1550 true,
1551 },
1552 },
1553 .alpha = 1.0f,
1554 .sourceDataspace = sourceDataspace};
1555
1556 std::vector<renderengine::LayerSettings> layers{layer};
1557 invokeDraw(display, layers);
1558
1559 ColorSpace displayP3 = ColorSpace::DisplayP3();
1560 ColorSpace bt2020 = ColorSpace::BT2020();
1561
1562 tonemap::Metadata metadata{.displayMaxLuminance = 750.0f};
1563
1564 auto generator = [=](Point location) {
1565 const double normColor = static_cast<double>(location.x) / (kGreyLevels - 1);
1566 const vec3 rgb = vec3(normColor, normColor, normColor);
1567
1568 const vec3 linearRGB = eotf(rgb);
1569
1570 const vec3 xyz = bt2020.getRGBtoXYZ() * linearRGB;
1571
1572 const vec3 scaledXYZ = scaleOotf(xyz, kCurrentLuminanceNits);
Alec Mouri196b0f22022-03-04 22:13:48 +00001573 const auto gains =
Alec Mouri5a493722022-01-26 16:43:02 -08001574 tonemap::getToneMapper()
1575 ->lookupTonemapGain(static_cast<aidl::android::hardware::graphics::common::
1576 Dataspace>(sourceDataspace),
1577 static_cast<aidl::android::hardware::graphics::common::
1578 Dataspace>(
1579 ui::Dataspace::DISPLAY_P3),
Alec Mouri196b0f22022-03-04 22:13:48 +00001580 {tonemap::
1581 Color{.linearRGB =
1582 scaleOotf(linearRGB,
1583 kCurrentLuminanceNits),
1584 .xyz = scaledXYZ}},
Alec Mouri5a493722022-01-26 16:43:02 -08001585 metadata);
Alec Mouri196b0f22022-03-04 22:13:48 +00001586 EXPECT_EQ(1, gains.size());
1587 const double gain = gains.front();
Alec Mouri5a493722022-01-26 16:43:02 -08001588 const vec3 normalizedXYZ = scaledXYZ * gain / metadata.displayMaxLuminance;
1589
1590 const vec3 targetRGB = OETF_sRGB(displayP3.getXYZtoRGB() * normalizedXYZ) * 255;
1591 return ubyte4(static_cast<uint8_t>(targetRGB.r), static_cast<uint8_t>(targetRGB.g),
1592 static_cast<uint8_t>(targetRGB.b), 255);
1593 };
1594
1595 expectBufferColor(Rect(kGreyLevels, 1), generator, 2);
1596}
1597
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001598INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001599 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001600 std::make_shared<GLESCMRenderEngineFactory>(),
1601 std::make_shared<SkiaGLESRenderEngineFactory>(),
1602 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001603
1604TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001605 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001606 drawEmptyLayers();
1607}
1608
Ana Krulec07b98df2021-01-07 14:38:40 -08001609TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
Alec Mouria90a5702021-04-16 16:36:21 +00001610 initializeRenderEngine();
Ana Krulec07b98df2021-01-07 14:38:40 -08001611
1612 renderengine::DisplaySettings settings;
1613 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1614 settings.physicalDisplay = fullscreenRect();
1615 settings.clip = fullscreenRect();
1616
1617 // 255, 255, 255, 255 is full opaque white.
Alec Mouri4049b532021-10-15 20:59:33 -07001618 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
1619 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Ana Krulec07b98df2021-01-07 14:38:40 -08001620 // Create layer with given color.
1621 renderengine::LayerSettings bgLayer;
1622 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1623 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1624 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1625 backgroundColor.b / 255.0f);
1626 bgLayer.alpha = backgroundColor.a / 255.0f;
1627 // Transform the red color.
1628 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1629
Sally Qi59a9f502021-10-12 18:53:23 +00001630 std::vector<renderengine::LayerSettings> layers;
1631 layers.push_back(bgLayer);
Ana Krulec07b98df2021-01-07 14:38:40 -08001632
Alec Mouric0aae732021-01-12 13:32:18 -08001633 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001634
1635 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001636 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001637 backgroundColor.a);
1638}
1639
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001640TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001641 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001642
Alec Mourid43ccab2019-03-13 12:23:45 -07001643 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001644 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Sally Qi59a9f502021-10-12 18:53:23 +00001645 std::vector<renderengine::LayerSettings> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001646 renderengine::LayerSettings layer;
1647 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1648 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Sally Qi59a9f502021-10-12 18:53:23 +00001649 layers.push_back(layer);
Sally Qi4cabdd02021-08-05 16:45:57 -07001650 std::future<renderengine::RenderEngineResult> result =
1651 mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd());
Alec Mourid43ccab2019-03-13 12:23:45 -07001652
Sally Qi4cabdd02021-08-05 16:45:57 -07001653 ASSERT_TRUE(result.valid());
Derek Sollenbergerec411212021-08-25 10:54:47 -04001654 auto [status, fence] = result.get();
Alec Mourid43ccab2019-03-13 12:23:45 -07001655 ASSERT_EQ(BAD_VALUE, status);
Derek Sollenbergerec411212021-08-25 10:54:47 -04001656 ASSERT_FALSE(fence.ok());
Alec Mourid43ccab2019-03-13 12:23:45 -07001657}
1658
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001659TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1660 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001661
1662 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1663 // GLES-specific test
1664 return;
1665 }
1666
1667 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001668
Alec Mourife0d72b2019-03-21 14:05:56 -07001669 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001670 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001671 settings.physicalDisplay = fullscreenRect();
1672 settings.clip = fullscreenRect();
1673
Sally Qi59a9f502021-10-12 18:53:23 +00001674 std::vector<renderengine::LayerSettings> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001675 renderengine::LayerSettings layer;
1676 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1677 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1678 layer.alpha = 1.0;
Sally Qi59a9f502021-10-12 18:53:23 +00001679 layers.push_back(layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001680
Sally Qi4cabdd02021-08-05 16:45:57 -07001681 std::future<renderengine::RenderEngineResult> result =
1682 mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd());
1683 ASSERT_TRUE(result.valid());
Derek Sollenbergerec411212021-08-25 10:54:47 -04001684 auto [status, fence] = result.get();
1685
Alec Mourife0d72b2019-03-21 14:05:56 -07001686 ASSERT_EQ(NO_ERROR, status);
Derek Sollenbergerec411212021-08-25 10:54:47 -04001687 if (fence.ok()) {
1688 sync_wait(fence.get(), -1);
1689 }
1690
Alec Mouria90a5702021-04-16 16:36:21 +00001691 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001692 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1693}
1694
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001695TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001696 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001697 fillRedBuffer<ColorSourceVariant>();
1698}
1699
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001700TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001701 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001702 fillGreenBuffer<ColorSourceVariant>();
1703}
1704
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001705TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001706 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001707 fillBlueBuffer<ColorSourceVariant>();
1708}
1709
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001710TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001711 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001712 fillRedTransparentBuffer<ColorSourceVariant>();
1713}
1714
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001715TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001716 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001717 fillBufferPhysicalOffset<ColorSourceVariant>();
1718}
1719
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001720TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001721 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001722 fillBufferCheckersRotate0<ColorSourceVariant>();
1723}
1724
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001725TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001726 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001727 fillBufferCheckersRotate90<ColorSourceVariant>();
1728}
1729
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001730TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001731 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001732 fillBufferCheckersRotate180<ColorSourceVariant>();
1733}
1734
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001735TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001736 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001737 fillBufferCheckersRotate270<ColorSourceVariant>();
1738}
1739
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001740TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001741 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001742 fillBufferLayerTransform<ColorSourceVariant>();
1743}
1744
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001745TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001746 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001747 fillBufferColorTransform<ColorSourceVariant>();
1748}
1749
Sally Qi2019fd22021-11-22 10:19:04 -08001750TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_sourceDataspace) {
1751 const auto& renderEngineFactory = GetParam();
1752 // skip for non color management
1753 if (!renderEngineFactory->useColorManagement()) {
1754 return;
1755 }
1756 // skip for GLESRenderEngine
1757 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1758 return;
1759 }
1760
1761 initializeRenderEngine();
1762 fillBufferColorTransformAndSourceDataspace<ColorSourceVariant>();
1763}
1764
1765TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_outputDataspace) {
1766 const auto& renderEngineFactory = GetParam();
1767 // skip for non color management
1768 if (!renderEngineFactory->useColorManagement()) {
1769 return;
1770 }
1771 // skip for GLESRenderEngine
1772 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1773 return;
1774 }
1775
1776 initializeRenderEngine();
1777 fillBufferColorTransformAndOutputDataspace<ColorSourceVariant>();
1778}
1779
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001780TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001781 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001782 fillBufferWithRoundedCorners<ColorSourceVariant>();
1783}
1784
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001785TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001786 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001787 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1788}
1789
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001790TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001791 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001792 fillBufferAndBlurBackground<ColorSourceVariant>();
1793}
1794
Alec Mourie8489fd2021-04-29 16:08:56 -07001795TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1796 initializeRenderEngine();
1797 fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1798}
1799
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001800TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001801 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001802 overlayCorners<ColorSourceVariant>();
1803}
1804
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001805TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001806 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001807 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1808}
1809
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001810TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001811 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001812 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1813}
1814
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001815TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001816 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001817 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1818}
1819
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001820TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001821 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001822 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1823}
1824
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001825TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001826 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001827 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1828}
1829
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001830TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001831 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001832 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1833}
1834
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001835TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001836 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001837 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1838}
1839
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001840TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001841 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001842 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1843}
1844
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001845TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001846 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001847 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1848}
1849
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001850TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001851 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001852 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1853}
1854
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001855TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001856 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001857 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1858}
1859
Sally Qi2019fd22021-11-22 10:19:04 -08001860TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndSourceDataspace_opaqueBufferSource) {
1861 const auto& renderEngineFactory = GetParam();
1862 // skip for non color management
1863 if (!renderEngineFactory->useColorManagement()) {
1864 return;
1865 }
1866 // skip for GLESRenderEngine
1867 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1868 return;
1869 }
1870
1871 initializeRenderEngine();
1872 fillBufferColorTransformAndSourceDataspace<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1873}
1874
1875TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndOutputDataspace_opaqueBufferSource) {
1876 const auto& renderEngineFactory = GetParam();
1877 // skip for non color management
1878 if (!renderEngineFactory->useColorManagement()) {
1879 return;
1880 }
1881 // skip for GLESRenderEngine
1882 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1883 return;
1884 }
1885
1886 initializeRenderEngine();
1887 fillBufferColorTransformAndOutputDataspace<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1888}
1889
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001890TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001891 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001892 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1893}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001894
Alec Mouric0aae732021-01-12 13:32:18 -08001895TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1896 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001897 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1898}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001899
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001900TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001901 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001902 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1903}
1904
Alec Mourie8489fd2021-04-29 16:08:56 -07001905TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1906 initializeRenderEngine();
1907 fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1908}
1909
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001910TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001911 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001912 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1913}
1914
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001915TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001916 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001917 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1918}
1919
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001920TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001921 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001922 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1923}
1924
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001925TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001926 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001927 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1928}
1929
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001930TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001931 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001932 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1933}
1934
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001935TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001936 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001937 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1938}
1939
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001940TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001941 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001942 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1943}
1944
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001945TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001946 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001947 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1948}
1949
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001950TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001951 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001952 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1953}
1954
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001955TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001956 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001957 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1958}
1959
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001960TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001961 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001962 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1963}
1964
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001965TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001966 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001967 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1968}
1969
Sally Qi2019fd22021-11-22 10:19:04 -08001970TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndSourceDataspace_bufferSource) {
1971 const auto& renderEngineFactory = GetParam();
1972 // skip for non color management
1973 if (!renderEngineFactory->useColorManagement()) {
1974 return;
1975 }
1976 // skip for GLESRenderEngine
1977 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1978 return;
1979 }
1980
1981 initializeRenderEngine();
1982 fillBufferColorTransformAndSourceDataspace<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1983}
1984
1985TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndOutputDataspace_bufferSource) {
1986 const auto& renderEngineFactory = GetParam();
1987 // skip for non color management
1988 if (!renderEngineFactory->useColorManagement()) {
1989 return;
1990 }
1991 // skip for GLESRenderEngine
1992 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1993 return;
1994 }
1995
1996 initializeRenderEngine();
1997 fillBufferColorTransformAndOutputDataspace<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1998}
1999
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002000TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08002001 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08002002 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2003}
2004
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08002005TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08002006 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08002007 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2008}
2009
Nathaniel Nifong53494f32021-04-30 14:05:39 -04002010TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08002011 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08002012 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2013}
2014
Alec Mourie8489fd2021-04-29 16:08:56 -07002015TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
2016 initializeRenderEngine();
2017 fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2018}
2019
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002020TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08002021 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00002022 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2023}
2024
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002025TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08002026 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08002027 fillBufferTextureTransform();
2028}
2029
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002030TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08002031 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08002032 fillBufferWithPremultiplyAlpha();
2033}
2034
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002035TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08002036 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08002037 fillBufferWithoutPremultiplyAlpha();
2038}
2039
Alec Mouribd17b3b2020-12-17 11:08:30 -08002040TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08002041 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08002042
Alec Mouri4049b532021-10-15 20:59:33 -07002043 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2044 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Alec Mouribd17b3b2020-12-17 11:08:30 -08002045 const float shadowLength = 5.0f;
2046 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2047 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2048 renderengine::ShadowSettings settings =
2049 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2050 false /* casterIsTranslucent */);
2051
2052 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
2053 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
2054}
2055
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002056TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08002057 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002058
Alec Mouri4049b532021-10-15 20:59:33 -07002059 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2060 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2061 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2062 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002063 const float shadowLength = 5.0f;
2064 Rect casterBounds(1, 1);
2065 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2066 renderengine::LayerSettings castingLayer;
2067 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2068 castingLayer.alpha = 1.0f;
2069 renderengine::ShadowSettings settings =
2070 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2071 false /* casterIsTranslucent */);
2072
2073 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
2074 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2075}
2076
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002077TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08002078 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002079
Alec Mouri4049b532021-10-15 20:59:33 -07002080 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2081 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2082 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2083 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002084 const float shadowLength = 5.0f;
2085 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2086 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2087 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08002088 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002089 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2090 castingLayer.alpha = 1.0f;
2091 renderengine::ShadowSettings settings =
2092 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2093 false /* casterIsTranslucent */);
2094
2095 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
2096 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2097}
2098
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002099TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08002100 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002101
Alec Mouri4049b532021-10-15 20:59:33 -07002102 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2103 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2104 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2105 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002106 const float shadowLength = 5.0f;
2107 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2108 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2109 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08002110 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002111 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2112 castingLayer.alpha = 1.0f;
2113 renderengine::ShadowSettings settings =
2114 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2115 false /* casterIsTranslucent */);
2116
2117 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
2118 backgroundColor);
2119 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2120}
2121
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002122TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08002123 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002124
Alec Mouri4049b532021-10-15 20:59:33 -07002125 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2126 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2127 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2128 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002129 const float shadowLength = 5.0f;
2130 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2131 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2132 renderengine::LayerSettings castingLayer;
2133 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2134 castingLayer.geometry.roundedCornersRadius = 3.0f;
2135 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
2136 castingLayer.alpha = 1.0f;
2137 renderengine::ShadowSettings settings =
2138 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2139 false /* casterIsTranslucent */);
2140
2141 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
2142 backgroundColor);
2143 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2144}
2145
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002146TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08002147 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002148
Vishnu Nair16efdbf2019-12-10 11:55:42 -08002149 const ubyte4 casterColor(255, 0, 0, 255);
2150 const ubyte4 backgroundColor(255, 255, 255, 255);
2151 const float shadowLength = 5.0f;
2152 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2153 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2154 renderengine::LayerSettings castingLayer;
2155 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2156 castingLayer.alpha = 0.5f;
2157 renderengine::ShadowSettings settings =
2158 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
2159 true /* casterIsTranslucent */);
2160
2161 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
2162 backgroundColor);
2163
2164 // verify only the background since the shadow will draw behind the caster
2165 const float shadowInset = settings.length * -1.0f;
2166 const Rect casterWithShadow =
2167 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
2168 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
2169 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
2170 backgroundColor.a);
2171}
2172
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002173TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
Alec Mouric0aae732021-01-12 13:32:18 -08002174 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08002175
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002176 renderengine::DisplaySettings settings;
2177 settings.physicalDisplay = fullscreenRect();
2178 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08002179 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002180
Sally Qi59a9f502021-10-12 18:53:23 +00002181 std::vector<renderengine::LayerSettings> layers;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002182 renderengine::LayerSettings layer;
2183 layer.geometry.boundaries = fullscreenRect().toFloatRect();
2184 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
2185 layer.alpha = 1.0;
Sally Qi59a9f502021-10-12 18:53:23 +00002186 layers.push_back(layer);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002187
Sally Qi4cabdd02021-08-05 16:45:57 -07002188 std::future<renderengine::RenderEngineResult> resultOne =
2189 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd());
2190 ASSERT_TRUE(resultOne.valid());
2191 auto [statusOne, fenceOne] = resultOne.get();
2192 ASSERT_EQ(NO_ERROR, statusOne);
2193
2194 std::future<renderengine::RenderEngineResult> resultTwo =
2195 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne));
2196 ASSERT_TRUE(resultTwo.valid());
2197 auto [statusTwo, fenceTwo] = resultTwo.get();
2198 ASSERT_EQ(NO_ERROR, statusTwo);
Derek Sollenbergerec411212021-08-25 10:54:47 -04002199 if (fenceTwo.ok()) {
2200 sync_wait(fenceTwo.get(), -1);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002201 }
Derek Sollenbergerec411212021-08-25 10:54:47 -04002202
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002203 // Only cleanup the first time.
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04002204 EXPECT_FALSE(mRE->canSkipPostRenderCleanup());
2205 mRE->cleanupPostRender();
2206 EXPECT_TRUE(mRE->canSkipPostRenderCleanup());
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00002207}
2208
Ana Krulecf9a15d92020-12-11 08:35:00 -08002209TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08002210 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08002211
2212 renderengine::DisplaySettings settings;
2213 settings.physicalDisplay = fullscreenRect();
2214 settings.clip = fullscreenRect();
2215 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2216
Sally Qi59a9f502021-10-12 18:53:23 +00002217 std::vector<renderengine::LayerSettings> layers;
Ana Krulecf9a15d92020-12-11 08:35:00 -08002218
2219 renderengine::LayerSettings redLayer;
2220 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2221 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2222 redLayer.geometry.roundedCornersRadius = 5.0f;
2223 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
2224 // Red background.
2225 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2226 redLayer.alpha = 1.0f;
2227
Sally Qi59a9f502021-10-12 18:53:23 +00002228 layers.push_back(redLayer);
Ana Krulecf9a15d92020-12-11 08:35:00 -08002229
2230 // Green layer with 1/3 size.
2231 renderengine::LayerSettings greenLayer;
2232 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2233 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2234 greenLayer.geometry.roundedCornersRadius = 5.0f;
2235 // Bottom right corner is not going to be rounded.
2236 greenLayer.geometry.roundedCornersCrop =
2237 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
2238 DEFAULT_DISPLAY_HEIGHT)
2239 .toFloatRect();
2240 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
2241 greenLayer.alpha = 1.0f;
2242
Sally Qi59a9f502021-10-12 18:53:23 +00002243 layers.push_back(greenLayer);
Ana Krulecf9a15d92020-12-11 08:35:00 -08002244
Alec Mouric0aae732021-01-12 13:32:18 -08002245 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08002246
2247 // Corners should be ignored...
2248 // Screen size: width is 128, height is 256.
2249 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
2250 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
2251 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
2252 // Bottom right corner is kept out of the clipping, and it's green.
2253 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
2254 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
2255 0, 255, 0, 255);
2256}
2257
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002258TEST_P(RenderEngineTest, testRoundedCornersParentCrop) {
2259 initializeRenderEngine();
2260
2261 renderengine::DisplaySettings settings;
2262 settings.physicalDisplay = fullscreenRect();
2263 settings.clip = fullscreenRect();
2264 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2265
Sally Qi59a9f502021-10-12 18:53:23 +00002266 std::vector<renderengine::LayerSettings> layers;
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002267
2268 renderengine::LayerSettings redLayer;
2269 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2270 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2271 redLayer.geometry.roundedCornersRadius = 5.0f;
2272 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
2273 // Red background.
2274 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2275 redLayer.alpha = 1.0f;
2276
Sally Qi59a9f502021-10-12 18:53:23 +00002277 layers.push_back(redLayer);
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002278
2279 // Green layer with 1/2 size with parent crop rect.
2280 renderengine::LayerSettings greenLayer = redLayer;
2281 greenLayer.geometry.boundaries =
2282 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2);
2283 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
2284
Sally Qi59a9f502021-10-12 18:53:23 +00002285 layers.push_back(greenLayer);
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002286
2287 invokeDraw(settings, layers);
2288
2289 // Due to roundedCornersRadius, the corners are untouched.
2290 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
2291 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
2292 expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
2293 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
2294
2295 // top middle should be green and the bottom middle red
2296 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 0), 0, 255, 0, 255);
2297 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 255);
2298
2299 // the bottom edge of the green layer should not be rounded
2300 expectBufferColor(Point(0, (DEFAULT_DISPLAY_HEIGHT / 2) - 1), 0, 255, 0, 255);
2301}
2302
Derek Sollenberger547d0a62021-07-27 14:09:17 -04002303TEST_P(RenderEngineTest, testRoundedCornersParentCropSmallBounds) {
2304 initializeRenderEngine();
2305
2306 renderengine::DisplaySettings settings;
2307 settings.physicalDisplay = fullscreenRect();
2308 settings.clip = fullscreenRect();
2309 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2310
Sally Qi59a9f502021-10-12 18:53:23 +00002311 std::vector<renderengine::LayerSettings> layers;
Derek Sollenberger547d0a62021-07-27 14:09:17 -04002312
2313 renderengine::LayerSettings redLayer;
2314 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2315 redLayer.geometry.boundaries = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 32);
2316 redLayer.geometry.roundedCornersRadius = 64;
2317 redLayer.geometry.roundedCornersCrop = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 128);
2318 // Red background.
2319 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2320 redLayer.alpha = 1.0f;
2321
Sally Qi59a9f502021-10-12 18:53:23 +00002322 layers.push_back(redLayer);
Derek Sollenberger547d0a62021-07-27 14:09:17 -04002323 invokeDraw(settings, layers);
2324
2325 // Due to roundedCornersRadius, the top corners are untouched.
2326 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
2327 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
2328
2329 // ensure that the entire height of the red layer was clipped by the rounded corners crop.
2330 expectBufferColor(Point(0, 31), 0, 0, 0, 0);
2331 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 31), 0, 0, 0, 0);
2332
2333 // the bottom middle should be red
2334 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 31), 255, 0, 0, 255);
2335}
2336
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002337TEST_P(RenderEngineTest, testClear) {
2338 initializeRenderEngine();
2339
2340 const auto rect = fullscreenRect();
2341 const renderengine::DisplaySettings display{
2342 .physicalDisplay = rect,
2343 .clip = rect,
2344 };
2345
2346 const renderengine::LayerSettings redLayer{
2347 .geometry.boundaries = rect.toFloatRect(),
2348 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
2349 .alpha = 1.0f,
2350 };
2351
2352 // This mimics prepareClearClientComposition. This layer should overwrite
2353 // the redLayer, so that the buffer is transparent, rather than red.
2354 const renderengine::LayerSettings clearLayer{
2355 .geometry.boundaries = rect.toFloatRect(),
2356 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
2357 .alpha = 0.0f,
2358 .disableBlending = true,
2359 };
2360
Sally Qi59a9f502021-10-12 18:53:23 +00002361 std::vector<renderengine::LayerSettings> layers{redLayer, clearLayer};
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002362 invokeDraw(display, layers);
2363 expectBufferColor(rect, 0, 0, 0, 0);
2364}
2365
2366TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
2367 initializeRenderEngine();
2368
2369 const auto rect = Rect(0, 0, 1, 1);
2370 const renderengine::DisplaySettings display{
2371 .physicalDisplay = rect,
2372 .clip = rect,
2373 };
2374
2375 const renderengine::LayerSettings redLayer{
2376 .geometry.boundaries = rect.toFloatRect(),
2377 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
2378 .alpha = 1.0f,
2379 };
2380
2381 // The next layer will overwrite redLayer with a GraphicBuffer that is green
2382 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00002383 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002384 {
2385 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00002386 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2387 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002388 pixels[0] = 0;
2389 pixels[1] = 255;
2390 pixels[2] = 0;
2391 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00002392 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002393 }
2394
2395 const renderengine::LayerSettings greenLayer{
2396 .geometry.boundaries = rect.toFloatRect(),
2397 .source =
2398 renderengine::PixelSource{
2399 .buffer =
2400 renderengine::Buffer{
2401 .buffer = buf,
2402 .usePremultipliedAlpha = true,
2403 },
2404 },
2405 .alpha = 0.5f,
2406 .disableBlending = true,
2407 };
2408
Sally Qi59a9f502021-10-12 18:53:23 +00002409 std::vector<renderengine::LayerSettings> layers{redLayer, greenLayer};
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002410 invokeDraw(display, layers);
2411 expectBufferColor(rect, 0, 128, 0, 128);
2412}
2413
Tianhao Yao67dd7122022-02-22 17:48:33 +00002414TEST_P(RenderEngineTest, testBorder) {
2415 if (GetParam()->type() != renderengine::RenderEngine::RenderEngineType::SKIA_GL) {
2416 GTEST_SKIP();
2417 }
2418
2419 if (!GetParam()->useColorManagement()) {
2420 GTEST_SKIP();
2421 }
2422
2423 initializeRenderEngine();
2424
2425 const ui::Dataspace dataspace = ui::Dataspace::V0_SRGB;
2426
2427 const auto displayRect = Rect(1080, 2280);
2428 renderengine::DisplaySettings display{
2429 .physicalDisplay = displayRect,
2430 .clip = displayRect,
2431 .outputDataspace = dataspace,
2432 };
2433 display.borderInfoList.clear();
2434 renderengine::BorderRenderInfo info;
2435 info.combinedRegion = Region(Rect(99, 99, 199, 199));
2436 display.borderInfoList.emplace_back(info);
2437
2438 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2439 const renderengine::LayerSettings greenLayer{
2440 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2441 .source =
2442 renderengine::PixelSource{
2443 .buffer =
2444 renderengine::Buffer{
2445 .buffer = greenBuffer,
2446 .usePremultipliedAlpha = true,
2447 },
2448 },
2449 .alpha = 1.0f,
2450 .sourceDataspace = dataspace,
2451 .whitePointNits = 200.f,
2452 };
2453
2454 std::vector<renderengine::LayerSettings> layers;
2455 layers.emplace_back(greenLayer);
2456 invokeDraw(display, layers);
2457
2458 expectBufferColor(Rect(99, 99, 101, 101), 255, 128, 0, 255, 1);
2459}
2460
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002461TEST_P(RenderEngineTest, testDimming) {
2462 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
Alec Mouri85065692022-03-18 00:58:26 +00002463 GTEST_SKIP();
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002464 }
Alec Mouri85065692022-03-18 00:58:26 +00002465
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002466 initializeRenderEngine();
2467
Alec Mouri85065692022-03-18 00:58:26 +00002468 const ui::Dataspace dataspace = ui::Dataspace::V0_SRGB_LINEAR;
2469
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002470 const auto displayRect = Rect(3, 1);
2471 const renderengine::DisplaySettings display{
2472 .physicalDisplay = displayRect,
2473 .clip = displayRect,
Alec Mouri85065692022-03-18 00:58:26 +00002474 .outputDataspace = dataspace,
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002475 .targetLuminanceNits = 1000.f,
2476 };
2477
2478 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2479 const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2480 const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255));
2481
2482 const renderengine::LayerSettings greenLayer{
2483 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2484 .source =
2485 renderengine::PixelSource{
2486 .buffer =
2487 renderengine::Buffer{
2488 .buffer = greenBuffer,
2489 .usePremultipliedAlpha = true,
2490 },
2491 },
2492 .alpha = 1.0f,
Alec Mouri85065692022-03-18 00:58:26 +00002493 .sourceDataspace = dataspace,
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002494 .whitePointNits = 200.f,
2495 };
2496
2497 const renderengine::LayerSettings blueLayer{
2498 .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2499 .source =
2500 renderengine::PixelSource{
2501 .buffer =
2502 renderengine::Buffer{
2503 .buffer = blueBuffer,
2504 .usePremultipliedAlpha = true,
2505 },
2506 },
2507 .alpha = 1.0f,
Alec Mouri85065692022-03-18 00:58:26 +00002508 .sourceDataspace = dataspace,
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002509 .whitePointNits = 1000.f / 51.f,
2510 };
2511
2512 const renderengine::LayerSettings redLayer{
2513 .geometry.boundaries = FloatRect(2.f, 0.f, 3.f, 1.f),
2514 .source =
2515 renderengine::PixelSource{
2516 .buffer =
2517 renderengine::Buffer{
2518 .buffer = redBuffer,
2519 .usePremultipliedAlpha = true,
2520 },
2521 },
2522 .alpha = 1.0f,
Alec Mouri85065692022-03-18 00:58:26 +00002523 .sourceDataspace = dataspace,
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002524 // When the white point is not set for a layer, just ignore it and treat it as the same
2525 // as the max layer
2526 .whitePointNits = -1.f,
2527 };
2528
2529 std::vector<renderengine::LayerSettings> layers{greenLayer, blueLayer, redLayer};
2530 invokeDraw(display, layers);
2531
2532 expectBufferColor(Rect(1, 1), 0, 51, 0, 255, 1);
2533 expectBufferColor(Rect(1, 0, 2, 1), 0, 0, 5, 255, 1);
2534 expectBufferColor(Rect(2, 0, 3, 1), 51, 0, 0, 255, 1);
2535}
2536
Alec Mouri85065692022-03-18 00:58:26 +00002537TEST_P(RenderEngineTest, testDimming_inGammaSpace) {
2538 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2539 GTEST_SKIP();
2540 }
2541 initializeRenderEngine();
2542
2543 const ui::Dataspace dataspace = static_cast<ui::Dataspace>(ui::Dataspace::STANDARD_BT709 |
2544 ui::Dataspace::TRANSFER_GAMMA2_2 |
2545 ui::Dataspace::RANGE_FULL);
2546
2547 const auto displayRect = Rect(3, 1);
2548 const renderengine::DisplaySettings display{
2549 .physicalDisplay = displayRect,
2550 .clip = displayRect,
2551 .outputDataspace = dataspace,
2552 .targetLuminanceNits = 1000.f,
2553 .dimmingStage = aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF,
2554 };
2555
2556 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2557 const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2558 const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255));
2559
2560 const renderengine::LayerSettings greenLayer{
2561 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2562 .source =
2563 renderengine::PixelSource{
2564 .buffer =
2565 renderengine::Buffer{
2566 .buffer = greenBuffer,
2567 .usePremultipliedAlpha = true,
2568 },
2569 },
2570 .alpha = 1.0f,
2571 .sourceDataspace = dataspace,
2572 .whitePointNits = 200.f,
2573 };
2574
2575 const renderengine::LayerSettings blueLayer{
2576 .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2577 .source =
2578 renderengine::PixelSource{
2579 .buffer =
2580 renderengine::Buffer{
2581 .buffer = blueBuffer,
2582 .usePremultipliedAlpha = true,
2583 },
2584 },
2585 .alpha = 1.0f,
2586 .sourceDataspace = dataspace,
2587 .whitePointNits = 1000.f / 51.f,
2588 };
2589
2590 const renderengine::LayerSettings redLayer{
2591 .geometry.boundaries = FloatRect(2.f, 0.f, 3.f, 1.f),
2592 .source =
2593 renderengine::PixelSource{
2594 .buffer =
2595 renderengine::Buffer{
2596 .buffer = redBuffer,
2597 .usePremultipliedAlpha = true,
2598 },
2599 },
2600 .alpha = 1.0f,
2601 .sourceDataspace = dataspace,
2602 // When the white point is not set for a layer, just ignore it and treat it as the same
2603 // as the max layer
2604 .whitePointNits = -1.f,
2605 };
2606
2607 std::vector<renderengine::LayerSettings> layers{greenLayer, blueLayer, redLayer};
2608 invokeDraw(display, layers);
2609
2610 expectBufferColor(Rect(1, 1), 0, 122, 0, 255, 1);
2611 expectBufferColor(Rect(1, 0, 2, 1), 0, 0, 42, 255, 1);
2612 expectBufferColor(Rect(2, 0, 3, 1), 122, 0, 0, 255, 1);
2613}
2614
Alec Mouri9bcd1d12022-04-21 22:16:56 +00002615TEST_P(RenderEngineTest, testDimming_inGammaSpace_withDisplayColorTransform) {
2616 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2617 GTEST_SKIP();
2618 }
2619 initializeRenderEngine();
2620
2621 const ui::Dataspace dataspace = static_cast<ui::Dataspace>(ui::Dataspace::STANDARD_BT709 |
2622 ui::Dataspace::TRANSFER_GAMMA2_2 |
2623 ui::Dataspace::RANGE_FULL);
2624
2625 const auto displayRect = Rect(3, 1);
2626 const renderengine::DisplaySettings display{
2627 .physicalDisplay = displayRect,
2628 .clip = displayRect,
2629 .outputDataspace = dataspace,
2630 .colorTransform = kRemoveGreenAndMoveRedToGreenMat4,
2631 .targetLuminanceNits = 1000.f,
2632 .dimmingStage = aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF,
2633 };
2634
2635 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2636 const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2637 const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255));
2638
2639 const renderengine::LayerSettings greenLayer{
2640 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2641 .source =
2642 renderengine::PixelSource{
2643 .buffer =
2644 renderengine::Buffer{
2645 .buffer = greenBuffer,
2646 .usePremultipliedAlpha = true,
2647 },
2648 },
2649 .alpha = 1.0f,
2650 .sourceDataspace = dataspace,
2651 .whitePointNits = 200.f,
2652 };
2653
2654 const renderengine::LayerSettings redLayer{
2655 .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2656 .source =
2657 renderengine::PixelSource{
2658 .buffer =
2659 renderengine::Buffer{
2660 .buffer = redBuffer,
2661 .usePremultipliedAlpha = true,
2662 },
2663 },
2664 .alpha = 1.0f,
2665 .sourceDataspace = dataspace,
2666 // When the white point is not set for a layer, just ignore it and treat it as the same
2667 // as the max layer
2668 .whitePointNits = -1.f,
2669 };
2670
2671 std::vector<renderengine::LayerSettings> layers{greenLayer, redLayer};
2672 invokeDraw(display, layers);
2673
2674 expectBufferColor(Rect(1, 1), 0, 0, 0, 255, 1);
2675 expectBufferColor(Rect(1, 0, 2, 1), 0, 122, 0, 255, 1);
2676}
2677
2678TEST_P(RenderEngineTest, testDimming_inGammaSpace_withDisplayColorTransform_deviceHandles) {
2679 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2680 GTEST_SKIP();
2681 }
2682 initializeRenderEngine();
2683
2684 const ui::Dataspace dataspace = static_cast<ui::Dataspace>(ui::Dataspace::STANDARD_BT709 |
2685 ui::Dataspace::TRANSFER_GAMMA2_2 |
2686 ui::Dataspace::RANGE_FULL);
2687
2688 const auto displayRect = Rect(3, 1);
2689 const renderengine::DisplaySettings display{
2690 .physicalDisplay = displayRect,
2691 .clip = displayRect,
2692 .outputDataspace = dataspace,
2693 .colorTransform = kRemoveGreenAndMoveRedToGreenMat4,
2694 .deviceHandlesColorTransform = true,
2695 .targetLuminanceNits = 1000.f,
2696 .dimmingStage = aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF,
2697 };
2698
2699 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2700 const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2701 const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255));
2702
2703 const renderengine::LayerSettings greenLayer{
2704 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2705 .source =
2706 renderengine::PixelSource{
2707 .buffer =
2708 renderengine::Buffer{
2709 .buffer = greenBuffer,
2710 .usePremultipliedAlpha = true,
2711 },
2712 },
2713 .alpha = 1.0f,
2714 .sourceDataspace = dataspace,
2715 .whitePointNits = 200.f,
2716 };
2717
2718 const renderengine::LayerSettings redLayer{
2719 .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2720 .source =
2721 renderengine::PixelSource{
2722 .buffer =
2723 renderengine::Buffer{
2724 .buffer = redBuffer,
2725 .usePremultipliedAlpha = true,
2726 },
2727 },
2728 .alpha = 1.0f,
2729 .sourceDataspace = dataspace,
2730 // When the white point is not set for a layer, just ignore it and treat it as the same
2731 // as the max layer
2732 .whitePointNits = -1.f,
2733 };
2734
2735 std::vector<renderengine::LayerSettings> layers{greenLayer, redLayer};
2736 invokeDraw(display, layers);
2737
2738 expectBufferColor(Rect(1, 1), 0, 122, 0, 255, 1);
2739 expectBufferColor(Rect(1, 0, 2, 1), 122, 0, 0, 255, 1);
2740}
2741
Alec Mouricdf6cbc2021-11-01 17:21:15 -07002742TEST_P(RenderEngineTest, testDimming_withoutTargetLuminance) {
2743 initializeRenderEngine();
2744 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2745 return;
2746 }
2747
2748 const auto displayRect = Rect(2, 1);
2749 const renderengine::DisplaySettings display{
2750 .physicalDisplay = displayRect,
2751 .clip = displayRect,
2752 .outputDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2753 .targetLuminanceNits = -1.f,
2754 };
2755
2756 const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2757 const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2758
2759 const renderengine::LayerSettings greenLayer{
2760 .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2761 .source =
2762 renderengine::PixelSource{
2763 .buffer =
2764 renderengine::Buffer{
2765 .buffer = greenBuffer,
2766 .usePremultipliedAlpha = true,
2767 },
2768 },
2769 .alpha = 1.0f,
2770 .sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2771 .whitePointNits = 200.f,
2772 };
2773
2774 const renderengine::LayerSettings blueLayer{
2775 .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2776 .source =
2777 renderengine::PixelSource{
2778 .buffer =
2779 renderengine::Buffer{
2780 .buffer = blueBuffer,
2781 .usePremultipliedAlpha = true,
2782 },
2783 },
2784 .alpha = 1.0f,
2785 .sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2786 .whitePointNits = 1000.f,
2787 };
2788
2789 std::vector<renderengine::LayerSettings> layers{greenLayer, blueLayer};
2790 invokeDraw(display, layers);
2791
2792 expectBufferColor(Rect(1, 1), 0, 51, 0, 255, 1);
2793 expectBufferColor(Rect(1, 0, 2, 1), 0, 0, 255, 255);
2794}
2795
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04002796TEST_P(RenderEngineTest, test_isOpaque) {
2797 initializeRenderEngine();
2798
2799 const auto rect = Rect(0, 0, 1, 1);
2800 const renderengine::DisplaySettings display{
2801 .physicalDisplay = rect,
2802 .clip = rect,
2803 .outputDataspace = ui::Dataspace::DISPLAY_P3,
2804 };
2805
2806 // Create an unpremul buffer that is green with no alpha. Using isOpaque
2807 // should make the green show.
2808 const auto buf = allocateSourceBuffer(1, 1);
2809 {
2810 uint8_t* pixels;
2811 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2812 reinterpret_cast<void**>(&pixels));
2813 pixels[0] = 0;
2814 pixels[1] = 255;
2815 pixels[2] = 0;
2816 pixels[3] = 0;
2817 buf->getBuffer()->unlock();
2818 }
2819
2820 const renderengine::LayerSettings greenLayer{
2821 .geometry.boundaries = rect.toFloatRect(),
2822 .source =
2823 renderengine::PixelSource{
2824 .buffer =
2825 renderengine::Buffer{
2826 .buffer = buf,
2827 // Although the pixels are not
2828 // premultiplied in practice, this
2829 // matches the input we see.
2830 .usePremultipliedAlpha = true,
2831 .isOpaque = true,
2832 },
2833 },
2834 .alpha = 1.0f,
2835 };
2836
Sally Qi59a9f502021-10-12 18:53:23 +00002837 std::vector<renderengine::LayerSettings> layers{greenLayer};
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04002838 invokeDraw(display, layers);
2839
2840 if (GetParam()->useColorManagement()) {
2841 expectBufferColor(rect, 117, 251, 76, 255);
2842 } else {
2843 expectBufferColor(rect, 0, 255, 0, 255);
2844 }
2845}
Alec Mouri4049b532021-10-15 20:59:33 -07002846
Alec Mouri4049b532021-10-15 20:59:33 -07002847TEST_P(RenderEngineTest, test_tonemapPQMatches) {
2848 if (!GetParam()->useColorManagement()) {
Alec Mouri5a493722022-01-26 16:43:02 -08002849 GTEST_SKIP();
Alec Mouri4049b532021-10-15 20:59:33 -07002850 }
2851
2852 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
Alec Mouri5a493722022-01-26 16:43:02 -08002853 GTEST_SKIP();
Alec Mouri4049b532021-10-15 20:59:33 -07002854 }
2855
2856 initializeRenderEngine();
2857
Alec Mouri5a493722022-01-26 16:43:02 -08002858 tonemap(
2859 static_cast<ui::Dataspace>(HAL_DATASPACE_STANDARD_BT2020 |
2860 HAL_DATASPACE_TRANSFER_ST2084 | HAL_DATASPACE_RANGE_FULL),
2861 [](vec3 color) { return EOTF_PQ(color); },
2862 [](vec3 color, float) {
2863 static constexpr float kMaxPQLuminance = 10000.f;
2864 return color * kMaxPQLuminance;
2865 });
2866}
Alec Mouri4049b532021-10-15 20:59:33 -07002867
Alec Mouri5a493722022-01-26 16:43:02 -08002868TEST_P(RenderEngineTest, test_tonemapHLGMatches) {
2869 if (!GetParam()->useColorManagement()) {
2870 GTEST_SKIP();
Alec Mouri4049b532021-10-15 20:59:33 -07002871 }
2872
Alec Mouri5a493722022-01-26 16:43:02 -08002873 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2874 GTEST_SKIP();
2875 }
Alec Mouri4049b532021-10-15 20:59:33 -07002876
Alec Mouri5a493722022-01-26 16:43:02 -08002877 initializeRenderEngine();
Alec Mouri4049b532021-10-15 20:59:33 -07002878
Alec Mouri5a493722022-01-26 16:43:02 -08002879 tonemap(
2880 static_cast<ui::Dataspace>(HAL_DATASPACE_STANDARD_BT2020 | HAL_DATASPACE_TRANSFER_HLG |
2881 HAL_DATASPACE_RANGE_FULL),
2882 [](vec3 color) { return EOTF_HLG(color); },
2883 [](vec3 color, float currentLuminaceNits) {
2884 static constexpr float kMaxHLGLuminance = 1000.f;
Alec Mouri7a577452022-03-04 23:41:38 +00002885 return color * kMaxHLGLuminance;
Alec Mouri5a493722022-01-26 16:43:02 -08002886 });
Alec Mouri4049b532021-10-15 20:59:33 -07002887}
Leon Scroggins III2c1d9ef2022-01-21 13:46:56 -05002888
2889TEST_P(RenderEngineTest, r8_behaves_as_mask) {
2890 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2891 return;
2892 }
2893
2894 initializeRenderEngine();
2895
2896 const auto r8Buffer = allocateR8Buffer(2, 1);
2897 if (!r8Buffer) {
Leon Scroggins III745dcaa2022-01-26 11:55:58 -05002898 GTEST_SKIP() << "Test is only necessary on devices that support r8";
Leon Scroggins III2c1d9ef2022-01-21 13:46:56 -05002899 return;
2900 }
2901 {
2902 uint8_t* pixels;
2903 r8Buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2904 reinterpret_cast<void**>(&pixels));
2905 // This will be drawn on top of a green buffer. We'll verify that 255
2906 // results in keeping the original green and 0 results in black.
2907 pixels[0] = 0;
2908 pixels[1] = 255;
2909 r8Buffer->getBuffer()->unlock();
2910 }
2911
2912 const auto rect = Rect(0, 0, 2, 1);
2913 const renderengine::DisplaySettings display{
2914 .physicalDisplay = rect,
2915 .clip = rect,
2916 .outputDataspace = ui::Dataspace::SRGB,
2917 };
2918
2919 const auto greenBuffer = allocateAndFillSourceBuffer(2, 1, ubyte4(0, 255, 0, 255));
2920 const renderengine::LayerSettings greenLayer{
2921 .geometry.boundaries = rect.toFloatRect(),
2922 .source =
2923 renderengine::PixelSource{
2924 .buffer =
2925 renderengine::Buffer{
2926 .buffer = greenBuffer,
2927 },
2928 },
2929 .alpha = 1.0f,
2930 };
2931 const renderengine::LayerSettings r8Layer{
2932 .geometry.boundaries = rect.toFloatRect(),
2933 .source =
2934 renderengine::PixelSource{
2935 .buffer =
2936 renderengine::Buffer{
2937 .buffer = r8Buffer,
2938 },
2939 },
2940 .alpha = 1.0f,
2941 };
2942
2943 std::vector<renderengine::LayerSettings> layers{greenLayer, r8Layer};
2944 invokeDraw(display, layers);
2945
2946 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 255);
2947 expectBufferColor(Rect(1, 0, 2, 1), 0, 255, 0, 255);
2948}
Leon Scroggins III745dcaa2022-01-26 11:55:58 -05002949
2950TEST_P(RenderEngineTest, r8_respects_color_transform) {
2951 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2952 return;
2953 }
2954
2955 initializeRenderEngine();
2956
2957 const auto r8Buffer = allocateR8Buffer(2, 1);
2958 if (!r8Buffer) {
2959 GTEST_SKIP() << "Test is only necessary on devices that support r8";
2960 return;
2961 }
2962 {
2963 uint8_t* pixels;
2964 r8Buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2965 reinterpret_cast<void**>(&pixels));
2966 pixels[0] = 0;
2967 pixels[1] = 255;
2968 r8Buffer->getBuffer()->unlock();
2969 }
2970
2971 const auto rect = Rect(0, 0, 2, 1);
2972 const renderengine::DisplaySettings display{
2973 .physicalDisplay = rect,
2974 .clip = rect,
2975 .outputDataspace = ui::Dataspace::SRGB,
2976 // Verify that the R8 layer respects the color transform when
2977 // deviceHandlesColorTransform is false. This transform converts
2978 // pure red to pure green. That will occur when the R8 buffer is
2979 // 255. When the R8 buffer is 0, it will still change to black, as
2980 // with r8_behaves_as_mask.
Alec Mouri9bcd1d12022-04-21 22:16:56 +00002981 .colorTransform = kRemoveGreenAndMoveRedToGreenMat4,
Leon Scroggins III745dcaa2022-01-26 11:55:58 -05002982 .deviceHandlesColorTransform = false,
2983 };
2984
2985 const auto redBuffer = allocateAndFillSourceBuffer(2, 1, ubyte4(255, 0, 0, 255));
2986 const renderengine::LayerSettings redLayer{
2987 .geometry.boundaries = rect.toFloatRect(),
2988 .source =
2989 renderengine::PixelSource{
2990 .buffer =
2991 renderengine::Buffer{
2992 .buffer = redBuffer,
2993 },
2994 },
2995 .alpha = 1.0f,
2996 };
2997 const renderengine::LayerSettings r8Layer{
2998 .geometry.boundaries = rect.toFloatRect(),
2999 .source =
3000 renderengine::PixelSource{
3001 .buffer =
3002 renderengine::Buffer{
3003 .buffer = r8Buffer,
3004 },
3005 },
3006 .alpha = 1.0f,
3007 };
3008
3009 std::vector<renderengine::LayerSettings> layers{redLayer, r8Layer};
3010 invokeDraw(display, layers);
3011
3012 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 255);
3013 expectBufferColor(Rect(1, 0, 2, 1), 0, 255, 0, 255);
3014}
3015
3016TEST_P(RenderEngineTest, r8_respects_color_transform_when_device_handles) {
3017 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
3018 return;
3019 }
3020
3021 initializeRenderEngine();
3022
3023 const auto r8Buffer = allocateR8Buffer(2, 1);
3024 if (!r8Buffer) {
3025 GTEST_SKIP() << "Test is only necessary on devices that support r8";
3026 return;
3027 }
3028 {
3029 uint8_t* pixels;
3030 r8Buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
3031 reinterpret_cast<void**>(&pixels));
3032 pixels[0] = 0;
3033 pixels[1] = 255;
3034 r8Buffer->getBuffer()->unlock();
3035 }
3036
3037 const auto rect = Rect(0, 0, 2, 1);
3038 const renderengine::DisplaySettings display{
3039 .physicalDisplay = rect,
3040 .clip = rect,
3041 .outputDataspace = ui::Dataspace::SRGB,
3042 // If deviceHandlesColorTransform is true, pixels where the A8
3043 // buffer is opaque are unaffected. If the colorTransform is
3044 // invertible, pixels where the A8 buffer are transparent have the
3045 // inverse applied to them so that the DPU will convert them back to
3046 // black. Test with an arbitrary, invertible matrix.
3047 .colorTransform = mat4(1, 0, 0, 2,
3048 3, 1, 2, 5,
3049 0, 5, 3, 0,
3050 0, 1, 0, 2),
3051 .deviceHandlesColorTransform = true,
3052 };
3053
3054 const auto redBuffer = allocateAndFillSourceBuffer(2, 1, ubyte4(255, 0, 0, 255));
3055 const renderengine::LayerSettings redLayer{
3056 .geometry.boundaries = rect.toFloatRect(),
3057 .source =
3058 renderengine::PixelSource{
3059 .buffer =
3060 renderengine::Buffer{
3061 .buffer = redBuffer,
3062 },
3063 },
3064 .alpha = 1.0f,
3065 };
3066 const renderengine::LayerSettings r8Layer{
3067 .geometry.boundaries = rect.toFloatRect(),
3068 .source =
3069 renderengine::PixelSource{
3070 .buffer =
3071 renderengine::Buffer{
3072 .buffer = r8Buffer,
3073 },
3074 },
3075 .alpha = 1.0f,
3076 };
3077
3078 std::vector<renderengine::LayerSettings> layers{redLayer, r8Layer};
3079 invokeDraw(display, layers);
3080
3081 expectBufferColor(Rect(1, 0, 2, 1), 255, 0, 0, 255); // Still red.
3082 expectBufferColor(Rect(0, 0, 1, 1), 0, 70, 0, 255);
3083}
Leon Scroggins III45be9182022-04-27 10:37:11 -04003084
3085TEST_P(RenderEngineTest, primeShaderCache) {
3086 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
3087 GTEST_SKIP();
3088 }
3089
3090 initializeRenderEngine();
3091
3092 auto fut = mRE->primeCache();
3093 if (fut.valid()) {
3094 fut.wait();
3095 }
3096
3097 const int minimumExpectedShadersCompiled = GetParam()->useColorManagement() ? 60 : 30;
3098 ASSERT_GT(static_cast<skia::SkiaGLRenderEngine*>(mRE.get())->reportShadersCompiled(),
3099 minimumExpectedShadersCompiled);
3100}
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04003101} // namespace renderengine
Alec Mouri6e57f682018-09-29 20:45:08 -07003102} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08003103
3104// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01003105#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"