blob: 82590638a8aa1a1393760b22cf1533bf798e1611 [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>
Alec Mouri1089aed2018-10-25 21:33:57 -070029#include <sync/sync.h>
Alec Mouri4049b532021-10-15 20:59:33 -070030#include <system/graphics-base-v1.0.h>
31#include <tonemap/tonemap.h>
32#include <ui/ColorSpace.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070033#include <ui/PixelFormat.h>
Alec Mouric0aae732021-01-12 13:32:18 -080034
35#include <chrono>
36#include <condition_variable>
37#include <fstream>
38
Alec Mourid43ccab2019-03-13 12:23:45 -070039#include "../gl/GLESRenderEngine.h"
Alec Mouric0aae732021-01-12 13:32:18 -080040#include "../skia/SkiaGLRenderEngine.h"
Ana Krulec9bc9dc62020-02-26 12:16:40 -080041#include "../threaded/RenderEngineThreaded.h"
Alec Mouri6e57f682018-09-29 20:45:08 -070042
Alec Mouri1089aed2018-10-25 21:33:57 -070043constexpr int DEFAULT_DISPLAY_WIDTH = 128;
44constexpr int DEFAULT_DISPLAY_HEIGHT = 256;
45constexpr int DEFAULT_DISPLAY_OFFSET = 64;
Vishnu Nair16efdbf2019-12-10 11:55:42 -080046constexpr bool WRITE_BUFFER_TO_FILE_ON_FAILURE = false;
Alec Mouri1089aed2018-10-25 21:33:57 -070047
Alec Mouri6e57f682018-09-29 20:45:08 -070048namespace android {
Derek Sollenbergerd3f60652021-06-11 15:34:36 -040049namespace renderengine {
Alec Mouri6e57f682018-09-29 20:45:08 -070050
Ana Krulec82ba2ec2020-11-21 13:33:20 -080051class RenderEngineFactory {
52public:
53 virtual ~RenderEngineFactory() = default;
54
55 virtual std::string name() = 0;
Alec Mouric0aae732021-01-12 13:32:18 -080056 virtual renderengine::RenderEngine::RenderEngineType type() = 0;
57 virtual std::unique_ptr<renderengine::RenderEngine> createRenderEngine() = 0;
58 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
59 return nullptr;
60 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -040061 virtual bool useColorManagement() const = 0;
Ana Krulec82ba2ec2020-11-21 13:33:20 -080062};
63
64class GLESRenderEngineFactory : public RenderEngineFactory {
65public:
66 std::string name() override { return "GLESRenderEngineFactory"; }
67
Alec Mouric0aae732021-01-12 13:32:18 -080068 renderengine::RenderEngine::RenderEngineType type() {
69 return renderengine::RenderEngine::RenderEngineType::GLES;
70 }
71
72 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
73 return createGLESRenderEngine();
74 }
75
76 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
KaiChieh Chuang436fc192020-09-07 13:48:42 +080077 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -070078 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -080079 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
80 .setImageCacheSize(1)
81 .setUseColorManagerment(false)
82 .setEnableProtectedContext(false)
83 .setPrecacheToneMapperShaderOnly(false)
84 .setSupportsBackgroundBlur(true)
85 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -080086 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -070087 .setUseColorManagerment(useColorManagement())
KaiChieh Chuang436fc192020-09-07 13:48:42 +080088 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -080089 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -070090 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -040091
92 bool useColorManagement() const override { return false; }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080093};
Alec Mourid43ccab2019-03-13 12:23:45 -070094
Ana Krulecaa2fe7f2020-11-24 15:06:36 -080095class GLESCMRenderEngineFactory : public RenderEngineFactory {
96public:
97 std::string name() override { return "GLESCMRenderEngineFactory"; }
98
Alec Mouric0aae732021-01-12 13:32:18 -080099 renderengine::RenderEngine::RenderEngineType type() {
100 return renderengine::RenderEngine::RenderEngineType::GLES;
101 }
102
103 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
104 return createGLESRenderEngine();
105 }
106
107 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() override {
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800108 renderengine::RenderEngineCreationArgs reCreationArgs =
109 renderengine::RenderEngineCreationArgs::Builder()
110 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
111 .setImageCacheSize(1)
112 .setEnableProtectedContext(false)
113 .setPrecacheToneMapperShaderOnly(false)
114 .setSupportsBackgroundBlur(true)
115 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800116 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700117 .setUseColorManagerment(useColorManagement())
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800118 .build();
119 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
120 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400121
122 bool useColorManagement() const override { return true; }
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800123};
124
Alec Mouri0eab3e82020-12-08 18:10:27 -0800125class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
126public:
Alec Mouric0aae732021-01-12 13:32:18 -0800127 std::string name() override { return "SkiaGLRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800128
Alec Mouric0aae732021-01-12 13:32:18 -0800129 renderengine::RenderEngine::RenderEngineType type() {
130 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
131 }
132
133 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800134 renderengine::RenderEngineCreationArgs reCreationArgs =
135 renderengine::RenderEngineCreationArgs::Builder()
136 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
137 .setImageCacheSize(1)
138 .setEnableProtectedContext(false)
139 .setPrecacheToneMapperShaderOnly(false)
140 .setSupportsBackgroundBlur(true)
141 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800142 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700143 .setUseColorManagerment(useColorManagement())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800144 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800145 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800146 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400147
Alec Mourid2bcbae2021-06-28 17:02:17 -0700148 bool useColorManagement() const override { return false; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800149};
150
151class SkiaGLESCMRenderEngineFactory : public RenderEngineFactory {
152public:
Alec Mouric0aae732021-01-12 13:32:18 -0800153 std::string name() override { return "SkiaGLCMRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800154
Alec Mouric0aae732021-01-12 13:32:18 -0800155 renderengine::RenderEngine::RenderEngineType type() {
156 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
157 }
158
159 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800160 renderengine::RenderEngineCreationArgs reCreationArgs =
161 renderengine::RenderEngineCreationArgs::Builder()
162 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
163 .setImageCacheSize(1)
164 .setEnableProtectedContext(false)
165 .setPrecacheToneMapperShaderOnly(false)
166 .setSupportsBackgroundBlur(true)
167 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800168 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700169 .setUseColorManagerment(useColorManagement())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800170 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800171 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800172 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400173
174 bool useColorManagement() const override { return true; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800175};
176
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800177class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
178public:
Alec Mouria90a5702021-04-16 16:36:21 +0000179 std::shared_ptr<renderengine::ExternalTexture> allocateDefaultBuffer() {
180 return std::make_shared<
181 renderengine::
182 ExternalTexture>(new GraphicBuffer(DEFAULT_DISPLAY_WIDTH,
183 DEFAULT_DISPLAY_HEIGHT,
184 HAL_PIXEL_FORMAT_RGBA_8888, 1,
185 GRALLOC_USAGE_SW_READ_OFTEN |
186 GRALLOC_USAGE_SW_WRITE_OFTEN |
187 GRALLOC_USAGE_HW_RENDER |
188 GRALLOC_USAGE_HW_TEXTURE,
189 "output"),
190 *mRE,
191 renderengine::ExternalTexture::Usage::READABLE |
192 renderengine::ExternalTexture::Usage::WRITEABLE);
Alec Mouri6e57f682018-09-29 20:45:08 -0700193 }
194
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800195 // Allocates a 1x1 buffer to fill with a solid color
Alec Mouria90a5702021-04-16 16:36:21 +0000196 std::shared_ptr<renderengine::ExternalTexture> allocateSourceBuffer(uint32_t width,
197 uint32_t height) {
198 return std::make_shared<
199 renderengine::
200 ExternalTexture>(new GraphicBuffer(width, height,
201 HAL_PIXEL_FORMAT_RGBA_8888, 1,
202 GRALLOC_USAGE_SW_READ_OFTEN |
203 GRALLOC_USAGE_SW_WRITE_OFTEN |
204 GRALLOC_USAGE_HW_TEXTURE,
205 "input"),
206 *mRE,
207 renderengine::ExternalTexture::Usage::READABLE |
208 renderengine::ExternalTexture::Usage::WRITEABLE);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800209 }
210
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800211 RenderEngineTest() {
212 const ::testing::TestInfo* const test_info =
213 ::testing::UnitTest::GetInstance()->current_test_info();
214 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800215 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700216
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800217 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800218 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
219 writeBufferToFile("/data/texture_out_");
220 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800221 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800222 mRE->deleteTextures(1, &texName);
Alec Mouric0aae732021-01-12 13:32:18 -0800223 if (mGLESRE != nullptr) {
224 EXPECT_FALSE(mGLESRE->isTextureNameKnownForTesting(texName));
225 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800226 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800227 const ::testing::TestInfo* const test_info =
228 ::testing::UnitTest::GetInstance()->current_test_info();
229 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800230 }
231
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800232 void writeBufferToFile(const char* basename) {
233 std::string filename(basename);
234 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
235 filename.append(".ppm");
236 std::ofstream file(filename.c_str(), std::ios::binary);
237 if (!file.is_open()) {
238 ALOGE("Unable to open file: %s", filename.c_str());
239 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
240 "surfaceflinger to write debug images");
241 return;
242 }
243
Alec Mouri1089aed2018-10-25 21:33:57 -0700244 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000245 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
246 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700247
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800248 file << "P6\n";
Alec Mouria90a5702021-04-16 16:36:21 +0000249 file << mBuffer->getBuffer()->getWidth() << "\n";
250 file << mBuffer->getBuffer()->getHeight() << "\n";
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800251 file << 255 << "\n";
252
Alec Mouria90a5702021-04-16 16:36:21 +0000253 std::vector<uint8_t> outBuffer(mBuffer->getBuffer()->getWidth() *
254 mBuffer->getBuffer()->getHeight() * 3);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800255 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
256
Alec Mouria90a5702021-04-16 16:36:21 +0000257 for (int32_t j = 0; j < mBuffer->getBuffer()->getHeight(); j++) {
258 const uint8_t* src = pixels + (mBuffer->getBuffer()->getStride() * j) * 4;
259 for (int32_t i = 0; i < mBuffer->getBuffer()->getWidth(); i++) {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800260 // Only copy R, G and B components
261 outPtr[0] = src[0];
262 outPtr[1] = src[1];
263 outPtr[2] = src[2];
264 outPtr += 3;
265
266 src += 4;
267 }
268 }
269 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
Alec Mouria90a5702021-04-16 16:36:21 +0000270 mBuffer->getBuffer()->unlock();
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800271 }
272
273 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
274 size_t c;
275 Rect const* rect = region.getArray(&c);
276 for (size_t i = 0; i < c; i++, rect++) {
277 expectBufferColor(*rect, r, g, b, a);
278 }
279 }
280
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -0400281 void expectBufferColor(const Point& point, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
282 uint8_t tolerance = 0) {
283 expectBufferColor(Rect(point.x, point.y, point.x + 1, point.y + 1), r, g, b, a, tolerance);
284 }
285
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800286 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
287 uint8_t tolerance = 0) {
Alec Mouri4049b532021-10-15 20:59:33 -0700288 auto generator = [=](Point) { return ubyte4(r, g, b, a); };
289 expectBufferColor(rect, generator, tolerance);
290 }
291
292 using ColorGenerator = std::function<ubyte4(Point location)>;
293
294 void expectBufferColor(const Rect& rect, ColorGenerator generator, uint8_t tolerance = 0) {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800295 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
296 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
297 uint8_t tmp = a >= b ? a - b : b - a;
298 return tmp <= tolerance;
299 };
300 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700301 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800302
Alec Mouri4049b532021-10-15 20:59:33 -0700303 expectBufferColor(rect, generator, colorCompare);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800304 }
305
Alec Mouri4049b532021-10-15 20:59:33 -0700306 void expectBufferColor(const Rect& region, ColorGenerator generator,
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800307 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
308 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000309 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
310 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700311 int32_t maxFails = 10;
312 int32_t fails = 0;
313 for (int32_t j = 0; j < region.getHeight(); j++) {
Alec Mouria90a5702021-04-16 16:36:21 +0000314 const uint8_t* src = pixels +
315 (mBuffer->getBuffer()->getStride() * (region.top + j) + region.left) * 4;
Alec Mouri1089aed2018-10-25 21:33:57 -0700316 for (int32_t i = 0; i < region.getWidth(); i++) {
Alec Mouri4049b532021-10-15 20:59:33 -0700317 const auto location = Point(region.left + i, region.top + j);
318 const ubyte4 colors = generator(location);
319 const uint8_t expected[4] = {colors.r, colors.g, colors.b, colors.a};
320 bool colorMatches = colorCompare(src, expected);
321 EXPECT_TRUE(colorMatches)
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400322 << GetParam()->name().c_str() << ": "
Alec Mouri4049b532021-10-15 20:59:33 -0700323 << "pixel @ (" << location.x << ", " << location.y << "): "
324 << "expected (" << static_cast<uint32_t>(colors.r) << ", "
325 << static_cast<uint32_t>(colors.g) << ", "
326 << static_cast<uint32_t>(colors.b) << ", "
327 << static_cast<uint32_t>(colors.a) << "), "
Alec Mouri1089aed2018-10-25 21:33:57 -0700328 << "got (" << static_cast<uint32_t>(src[0]) << ", "
329 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
330 << ", " << static_cast<uint32_t>(src[3]) << ")";
331 src += 4;
Alec Mouri4049b532021-10-15 20:59:33 -0700332 if (!colorMatches && ++fails >= maxFails) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700333 break;
334 }
335 }
336 if (fails >= maxFails) {
337 break;
338 }
339 }
Alec Mouria90a5702021-04-16 16:36:21 +0000340 mBuffer->getBuffer()->unlock();
Alec Mouri1089aed2018-10-25 21:33:57 -0700341 }
342
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800343 void expectAlpha(const Rect& rect, uint8_t a) {
Alec Mouri4049b532021-10-15 20:59:33 -0700344 auto generator = [=](Point) { return ubyte4(0, 0, 0, a); };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800345 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
346 return colorA[3] == colorB[3];
347 };
Alec Mouri4049b532021-10-15 20:59:33 -0700348 expectBufferColor(rect, generator, colorCompare);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800349 }
350
351 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
352 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
353 const ubyte4& backgroundColor) {
354 const Rect casterRect(castingLayer.geometry.boundaries);
355 Region casterRegion = Region(casterRect);
356 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
357 if (casterCornerRadius > 0.0f) {
358 // ignore the corners if a corner radius is set
359 Rect cornerRect(casterCornerRadius, casterCornerRadius);
360 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
361 casterRegion.subtractSelf(
362 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
363 casterRegion.subtractSelf(
364 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
365 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
366 casterRect.bottom - casterCornerRadius));
367 }
368
369 const float shadowInset = shadow.length * -1.0f;
370 const Rect casterWithShadow =
371 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
372 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
373 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
374
375 // verify casting layer
376 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
377
378 // verify shadows by testing just the alpha since its difficult to validate the shadow color
379 size_t c;
380 Rect const* r = shadowRegion.getArray(&c);
381 for (size_t i = 0; i < c; i++, r++) {
382 expectAlpha(*r, 255);
383 }
384
385 // verify background
386 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
387 backgroundColor.a);
388 }
389
Alec Mouribd17b3b2020-12-17 11:08:30 -0800390 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
391 const renderengine::ShadowSettings& shadow,
392 const ubyte4& backgroundColor) {
393 const float shadowInset = shadow.length * -1.0f;
394 const Rect casterRect(casterBounds);
395 const Rect shadowRect =
396 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
397
398 const Region backgroundRegion =
399 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
400
401 expectAlpha(shadowRect, 255);
402 // (0, 0, 0) fill on the bounds of the layer should be ignored.
403 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
404
405 // verify background
406 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
407 backgroundColor.a);
408 }
409
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800410 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
411 bool casterIsTranslucent) {
412 renderengine::ShadowSettings shadow;
413 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
414 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
415 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
416 shadow.lightRadius = 0.0f;
417 shadow.length = shadowLength;
418 shadow.casterIsTranslucent = casterIsTranslucent;
419 return shadow;
420 }
421
Alec Mouri1089aed2018-10-25 21:33:57 -0700422 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
423
424 static Rect offsetRect() {
425 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
426 DEFAULT_DISPLAY_HEIGHT);
427 }
428
429 static Rect offsetRectAtZero() {
430 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
431 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
432 }
433
Sally Qi59a9f502021-10-12 18:53:23 +0000434 void invokeDraw(const renderengine::DisplaySettings& settings,
435 const std::vector<renderengine::LayerSettings>& layers) {
Sally Qi4cabdd02021-08-05 16:45:57 -0700436 std::future<renderengine::RenderEngineResult> result =
437 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd());
Sally Qi59a9f502021-10-12 18:53:23 +0000438
Sally Qi4cabdd02021-08-05 16:45:57 -0700439 ASSERT_TRUE(result.valid());
440 auto [status, fence] = result.get();
Alec Mouri1089aed2018-10-25 21:33:57 -0700441
Derek Sollenbergerec411212021-08-25 10:54:47 -0400442 ASSERT_EQ(NO_ERROR, status);
443 if (fence.ok()) {
444 sync_wait(fence.get(), -1);
Alec Mouri1089aed2018-10-25 21:33:57 -0700445 }
446
Alec Mouric0aae732021-01-12 13:32:18 -0800447 if (layers.size() > 0 && mGLESRE != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000448 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700449 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700450 }
451
Alec Mourid43ccab2019-03-13 12:23:45 -0700452 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700453 renderengine::DisplaySettings settings;
Sally Qi59a9f502021-10-12 18:53:23 +0000454 std::vector<renderengine::LayerSettings> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800455 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700456 }
457
Alec Mouri1089aed2018-10-25 21:33:57 -0700458 template <typename SourceVariant>
459 void fillBuffer(half r, half g, half b, half a);
460
461 template <typename SourceVariant>
462 void fillRedBuffer();
463
464 template <typename SourceVariant>
465 void fillGreenBuffer();
466
467 template <typename SourceVariant>
468 void fillBlueBuffer();
469
470 template <typename SourceVariant>
471 void fillRedTransparentBuffer();
472
473 template <typename SourceVariant>
474 void fillRedOffsetBuffer();
475
476 template <typename SourceVariant>
477 void fillBufferPhysicalOffset();
478
479 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700480 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700481
482 template <typename SourceVariant>
483 void fillBufferCheckersRotate0();
484
485 template <typename SourceVariant>
486 void fillBufferCheckersRotate90();
487
488 template <typename SourceVariant>
489 void fillBufferCheckersRotate180();
490
491 template <typename SourceVariant>
492 void fillBufferCheckersRotate270();
493
494 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800495 void fillBufferWithLayerTransform();
496
497 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700498 void fillBufferLayerTransform();
499
500 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800501 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800502
503 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700504 void fillBufferColorTransform();
505
Alec Mouri7c94edb2018-12-03 21:23:26 -0800506 template <typename SourceVariant>
Sally Qi2019fd22021-11-22 10:19:04 -0800507 void fillBufferWithColorTransformAndSourceDataspace(const ui::Dataspace sourceDataspace);
508
509 template <typename SourceVariant>
510 void fillBufferColorTransformAndSourceDataspace();
511
512 template <typename SourceVariant>
513 void fillBufferWithColorTransformAndOutputDataspace(const ui::Dataspace outputDataspace);
514
515 template <typename SourceVariant>
516 void fillBufferColorTransformAndOutputDataspace();
517
518 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800519 void fillBufferWithColorTransformZeroLayerAlpha();
520
521 template <typename SourceVariant>
522 void fillBufferColorTransformZeroLayerAlpha();
523
524 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800525 void fillRedBufferWithRoundedCorners();
526
527 template <typename SourceVariant>
528 void fillBufferWithRoundedCorners();
529
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000530 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800531 void fillBufferAndBlurBackground();
532
533 template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700534 void fillSmallLayerAndBlurBackground();
535
536 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000537 void overlayCorners();
538
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800539 void fillRedBufferTextureTransform();
540
541 void fillBufferTextureTransform();
542
543 void fillRedBufferWithPremultiplyAlpha();
544
545 void fillBufferWithPremultiplyAlpha();
546
547 void fillRedBufferWithoutPremultiplyAlpha();
548
549 void fillBufferWithoutPremultiplyAlpha();
550
Alec Mouriac335532018-11-12 15:01:33 -0800551 void fillGreenColorBufferThenClearRegion();
552
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800553 template <typename SourceVariant>
554 void drawShadow(const renderengine::LayerSettings& castingLayer,
555 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
556 const ubyte4& backgroundColor);
557
Alec Mouribd17b3b2020-12-17 11:08:30 -0800558 void drawShadowWithoutCaster(const FloatRect& castingBounds,
559 const renderengine::ShadowSettings& shadow,
560 const ubyte4& backgroundColor);
561
Alec Mouric0aae732021-01-12 13:32:18 -0800562 void initializeRenderEngine();
563
564 std::unique_ptr<renderengine::RenderEngine> mRE;
Alec Mouria90a5702021-04-16 16:36:21 +0000565 std::shared_ptr<renderengine::ExternalTexture> mBuffer;
Alec Mouric0aae732021-01-12 13:32:18 -0800566 // GLESRenderEngine for testing GLES-specific behavior.
567 // Owened by mRE, but this is downcasted.
568 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800569
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800570 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700571};
572
Alec Mouric0aae732021-01-12 13:32:18 -0800573void RenderEngineTest::initializeRenderEngine() {
574 const auto& renderEngineFactory = GetParam();
575 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
576 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
577 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
578 // every time.
579 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
580 renderEngineFactory->createGLESRenderEngine();
581 mGLESRE = renderEngine.get();
582 mRE = std::move(renderEngine);
583 } else {
584 mRE = renderEngineFactory->createRenderEngine();
585 }
Alec Mouria90a5702021-04-16 16:36:21 +0000586 mBuffer = allocateDefaultBuffer();
Alec Mouric0aae732021-01-12 13:32:18 -0800587}
588
Alec Mouri1089aed2018-10-25 21:33:57 -0700589struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800590 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800591 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700592 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800593 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700594 }
595};
596
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800597struct RelaxOpaqueBufferVariant {
598 static void setOpaqueBit(renderengine::LayerSettings& layer) {
599 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800600 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800601 }
602
603 static uint8_t getAlphaChannel() { return 255; }
604};
605
606struct ForceOpaqueBufferVariant {
607 static void setOpaqueBit(renderengine::LayerSettings& layer) {
608 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800609 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800610 }
611
612 static uint8_t getAlphaChannel() {
613 // The isOpaque bit will override the alpha channel, so this should be
614 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800615 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800616 }
617};
618
619template <typename OpaquenessVariant>
620struct BufferSourceVariant {
621 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800622 RenderEngineTest* fixture) {
Alec Mouria90a5702021-04-16 16:36:21 +0000623 const auto buf = fixture->allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800624 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800625 fixture->mRE->genTextures(1, &texName);
626 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800627
628 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000629 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
630 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800631
Alec Mouria90a5702021-04-16 16:36:21 +0000632 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
633 uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
634 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800635 iter[0] = uint8_t(r * 255);
636 iter[1] = uint8_t(g * 255);
637 iter[2] = uint8_t(b * 255);
638 iter[3] = OpaquenessVariant::getAlphaChannel();
639 iter += 4;
640 }
641 }
642
Alec Mouria90a5702021-04-16 16:36:21 +0000643 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800644
645 layer.source.buffer.buffer = buf;
646 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800647 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800648 OpaquenessVariant::setOpaqueBit(layer);
649 }
650};
651
Alec Mouri1089aed2018-10-25 21:33:57 -0700652template <typename SourceVariant>
653void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
654 renderengine::DisplaySettings settings;
655 settings.physicalDisplay = fullscreenRect();
656 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800657 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700658
Sally Qi59a9f502021-10-12 18:53:23 +0000659 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700660
661 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800662 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700663 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800664 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700665 layer.alpha = a;
666
Sally Qi59a9f502021-10-12 18:53:23 +0000667 layers.push_back(layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700668
Alec Mouric0aae732021-01-12 13:32:18 -0800669 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700670}
671
672template <typename SourceVariant>
673void RenderEngineTest::fillRedBuffer() {
674 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
675 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
676}
677
678template <typename SourceVariant>
679void RenderEngineTest::fillGreenBuffer() {
680 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
681 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
682}
683
684template <typename SourceVariant>
685void RenderEngineTest::fillBlueBuffer() {
686 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
687 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
688}
689
690template <typename SourceVariant>
691void RenderEngineTest::fillRedTransparentBuffer() {
692 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
693 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
694}
695
696template <typename SourceVariant>
697void RenderEngineTest::fillRedOffsetBuffer() {
698 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800699 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700700 settings.physicalDisplay = offsetRect();
701 settings.clip = offsetRectAtZero();
702
Sally Qi59a9f502021-10-12 18:53:23 +0000703 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700704
705 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800706 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700707 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800708 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700709 layer.alpha = 1.0f;
710
Sally Qi59a9f502021-10-12 18:53:23 +0000711 layers.push_back(layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800712 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700713}
714
715template <typename SourceVariant>
716void RenderEngineTest::fillBufferPhysicalOffset() {
717 fillRedOffsetBuffer<SourceVariant>();
718
719 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
720 DEFAULT_DISPLAY_HEIGHT),
721 255, 0, 0, 255);
722 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
723 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
724
725 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
726 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
727}
728
729template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700730void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700731 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800732 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700733 settings.physicalDisplay = fullscreenRect();
734 // Here logical space is 2x2
735 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700736 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700737
Sally Qi59a9f502021-10-12 18:53:23 +0000738 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700739
740 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800741 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700742 Rect rectOne(0, 0, 1, 1);
743 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800744 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700745 layerOne.alpha = 1.0f;
746
747 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800748 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700749 Rect rectTwo(0, 1, 1, 2);
750 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800751 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700752 layerTwo.alpha = 1.0f;
753
754 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800755 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700756 Rect rectThree(1, 0, 2, 1);
757 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800758 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700759 layerThree.alpha = 1.0f;
760
Sally Qi59a9f502021-10-12 18:53:23 +0000761 layers.push_back(layerOne);
762 layers.push_back(layerTwo);
763 layers.push_back(layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700764
Alec Mouric0aae732021-01-12 13:32:18 -0800765 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700766}
767
768template <typename SourceVariant>
769void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700770 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700771 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
772 255);
773 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
774 DEFAULT_DISPLAY_HEIGHT / 2),
775 0, 0, 255, 255);
776 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
777 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
778 0, 0, 0, 0);
779 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
780 DEFAULT_DISPLAY_HEIGHT),
781 0, 255, 0, 255);
782}
783
784template <typename SourceVariant>
785void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700786 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700787 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
788 255);
789 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
790 DEFAULT_DISPLAY_HEIGHT / 2),
791 255, 0, 0, 255);
792 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
793 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
794 0, 0, 255, 255);
795 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
796 DEFAULT_DISPLAY_HEIGHT),
797 0, 0, 0, 0);
798}
799
800template <typename SourceVariant>
801void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700802 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700803 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
804 0);
805 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
806 DEFAULT_DISPLAY_HEIGHT / 2),
807 0, 255, 0, 255);
808 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
809 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
810 255, 0, 0, 255);
811 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
812 DEFAULT_DISPLAY_HEIGHT),
813 0, 0, 255, 255);
814}
815
816template <typename SourceVariant>
817void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700818 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700819 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
820 255);
821 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
822 DEFAULT_DISPLAY_HEIGHT / 2),
823 0, 0, 0, 0);
824 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
825 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
826 0, 255, 0, 255);
827 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
828 DEFAULT_DISPLAY_HEIGHT),
829 255, 0, 0, 255);
830}
831
832template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800833void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700834 renderengine::DisplaySettings settings;
835 settings.physicalDisplay = fullscreenRect();
836 // Here logical space is 2x2
837 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800838 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700839
Sally Qi59a9f502021-10-12 18:53:23 +0000840 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700841
842 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800843 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700844 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
845 // Translate one pixel diagonally
846 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 -0800847 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700848 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
849 layer.alpha = 1.0f;
850
Sally Qi59a9f502021-10-12 18:53:23 +0000851 layers.push_back(layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700852
Alec Mouric0aae732021-01-12 13:32:18 -0800853 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800854}
Alec Mouri1089aed2018-10-25 21:33:57 -0700855
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800856template <typename SourceVariant>
857void RenderEngineTest::fillBufferLayerTransform() {
858 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700859 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
860 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
861 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
862 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
863 255, 0, 0, 255);
864}
865
866template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800867void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700868 renderengine::DisplaySettings settings;
869 settings.physicalDisplay = fullscreenRect();
870 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800871 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700872
Sally Qi59a9f502021-10-12 18:53:23 +0000873 std::vector<renderengine::LayerSettings> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700874
875 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800876 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700877 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800878 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700879 layer.alpha = 1.0f;
880
881 // construct a fake color matrix
882 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800883 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700884 // set red channel to red + green
885 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
886
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800887 layer.alpha = 1.0f;
888 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
889
Sally Qi59a9f502021-10-12 18:53:23 +0000890 layers.push_back(layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700891
Alec Mouric0aae732021-01-12 13:32:18 -0800892 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800893}
Alec Mouri1089aed2018-10-25 21:33:57 -0700894
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800895template <typename SourceVariant>
Sally Qi2019fd22021-11-22 10:19:04 -0800896void RenderEngineTest::fillBufferWithColorTransformAndSourceDataspace(
897 const ui::Dataspace sourceDataspace) {
898 renderengine::DisplaySettings settings;
899 settings.physicalDisplay = fullscreenRect();
900 settings.clip = Rect(1, 1);
901 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
902
903 std::vector<renderengine::LayerSettings> layers;
904
905 renderengine::LayerSettings layer;
906 layer.sourceDataspace = sourceDataspace;
907 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
908 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
909 layer.alpha = 1.0f;
910
911 // construct a fake color matrix
912 // annihilate green and blue channels
913 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
914 // set red channel to red + green
915 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
916
917 layer.alpha = 1.0f;
918 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
919
920 layers.push_back(layer);
921
922 invokeDraw(settings, layers);
923}
924
925template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800926void RenderEngineTest::fillBufferColorTransform() {
927 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800928 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
929}
930
931template <typename SourceVariant>
Sally Qi2019fd22021-11-22 10:19:04 -0800932void RenderEngineTest::fillBufferColorTransformAndSourceDataspace() {
933 unordered_map<ui::Dataspace, ubyte4> dataspaceToColorMap;
934 dataspaceToColorMap[ui::Dataspace::V0_BT709] = {172, 0, 0, 255};
935 dataspaceToColorMap[ui::Dataspace::BT2020] = {172, 0, 0, 255};
936 dataspaceToColorMap[ui::Dataspace::ADOBE_RGB] = {172, 0, 0, 255};
937 ui::Dataspace customizedDataspace = static_cast<ui::Dataspace>(
938 ui::Dataspace::STANDARD_BT709 | ui::Dataspace::TRANSFER_GAMMA2_2 |
939 ui::Dataspace::RANGE_FULL);
940 dataspaceToColorMap[customizedDataspace] = {172, 0, 0, 255};
941 for (const auto& [sourceDataspace, color] : dataspaceToColorMap) {
942 fillBufferWithColorTransformAndSourceDataspace<SourceVariant>(sourceDataspace);
943 expectBufferColor(fullscreenRect(), color.r, color.g, color.b, color.a, 1);
944 }
945}
946
947template <typename SourceVariant>
948void RenderEngineTest::fillBufferWithColorTransformAndOutputDataspace(
949 const ui::Dataspace outputDataspace) {
950 renderengine::DisplaySettings settings;
951 settings.physicalDisplay = fullscreenRect();
952 settings.clip = Rect(1, 1);
953 settings.outputDataspace = outputDataspace;
954
955 std::vector<renderengine::LayerSettings> layers;
956
957 renderengine::LayerSettings layer;
958 layer.sourceDataspace = ui::Dataspace::V0_SCRGB_LINEAR;
959 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
960 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
961 layer.alpha = 1.0f;
962
963 // construct a fake color matrix
964 // annihilate green and blue channels
965 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
966 // set red channel to red + green
967 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
968
969 layer.alpha = 1.0f;
970 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
971
972 layers.push_back(layer);
973
974 invokeDraw(settings, layers);
975}
976
977template <typename SourceVariant>
978void RenderEngineTest::fillBufferColorTransformAndOutputDataspace() {
979 unordered_map<ui::Dataspace, ubyte4> dataspaceToColorMap;
980 dataspaceToColorMap[ui::Dataspace::V0_BT709] = {202, 0, 0, 255};
981 dataspaceToColorMap[ui::Dataspace::BT2020] = {192, 0, 0, 255};
982 dataspaceToColorMap[ui::Dataspace::ADOBE_RGB] = {202, 0, 0, 255};
983 ui::Dataspace customizedDataspace = static_cast<ui::Dataspace>(
984 ui::Dataspace::STANDARD_BT709 | ui::Dataspace::TRANSFER_GAMMA2_6 |
985 ui::Dataspace::RANGE_FULL);
986 dataspaceToColorMap[customizedDataspace] = {202, 0, 0, 255};
987 for (const auto& [outputDataspace, color] : dataspaceToColorMap) {
988 fillBufferWithColorTransformAndOutputDataspace<SourceVariant>(outputDataspace);
989 expectBufferColor(fullscreenRect(), color.r, color.g, color.b, color.a, 1);
990 }
991}
992
993template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800994void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
995 renderengine::DisplaySettings settings;
996 settings.physicalDisplay = fullscreenRect();
997 settings.clip = Rect(1, 1);
998
Sally Qi59a9f502021-10-12 18:53:23 +0000999 std::vector<renderengine::LayerSettings> layers;
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001000
1001 renderengine::LayerSettings layer;
1002 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1003 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
1004 layer.alpha = 0;
1005
1006 // construct a fake color matrix
1007 // simple inverse color
1008 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
1009
1010 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1011
Sally Qi59a9f502021-10-12 18:53:23 +00001012 layers.push_back(layer);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001013
Alec Mouric0aae732021-01-12 13:32:18 -08001014 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001015}
1016
1017template <typename SourceVariant>
1018void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
1019 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
1020 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
1021}
1022
1023template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -08001024void RenderEngineTest::fillRedBufferWithRoundedCorners() {
1025 renderengine::DisplaySettings settings;
1026 settings.physicalDisplay = fullscreenRect();
1027 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001028 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -08001029
Sally Qi59a9f502021-10-12 18:53:23 +00001030 std::vector<renderengine::LayerSettings> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -08001031
1032 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001033 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -08001034 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1035 layer.geometry.roundedCornersRadius = 5.0f;
1036 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1037 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1038 layer.alpha = 1.0f;
1039
Sally Qi59a9f502021-10-12 18:53:23 +00001040 layers.push_back(layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -08001041
Alec Mouric0aae732021-01-12 13:32:18 -08001042 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -08001043}
1044
1045template <typename SourceVariant>
1046void RenderEngineTest::fillBufferWithRoundedCorners() {
1047 fillRedBufferWithRoundedCorners<SourceVariant>();
1048 // Corners should be ignored...
1049 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1050 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1051 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1052 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1053 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1054 0, 0, 0, 0);
1055 // ...And the non-rounded portion should be red.
1056 // Other pixels may be anti-aliased, so let's not check those.
1057 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
1058 255);
1059}
1060
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001061template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001062void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001063 auto blurRadius = 50;
1064 auto center = DEFAULT_DISPLAY_WIDTH / 2;
1065
1066 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001067 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001068 settings.physicalDisplay = fullscreenRect();
1069 settings.clip = fullscreenRect();
1070
Sally Qi59a9f502021-10-12 18:53:23 +00001071 std::vector<renderengine::LayerSettings> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001072
1073 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001074 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001075 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1076 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
1077 backgroundLayer.alpha = 1.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001078 layers.emplace_back(backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001079
1080 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001081 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001082 leftLayer.geometry.boundaries =
1083 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
1084 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
1085 leftLayer.alpha = 1.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001086 layers.emplace_back(leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001087
1088 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001089 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001090 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1091 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -05001092 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001093 blurLayer.alpha = 0;
Sally Qi59a9f502021-10-12 18:53:23 +00001094 layers.emplace_back(blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001095
Alec Mouric0aae732021-01-12 13:32:18 -08001096 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001097
Derek Sollenbergerecb21462021-01-29 16:53:49 -05001098 // solid color
1099 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
1100
Derek Sollenbergerb3998372021-02-16 15:16:56 -05001101 if (mRE->supportsBackgroundBlur()) {
1102 // blurred color (downsampling should result in the center color being close to 128)
1103 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001104 50 /* tolerance */);
Derek Sollenbergerb3998372021-02-16 15:16:56 -05001105 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001106}
1107
1108template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -07001109void RenderEngineTest::fillSmallLayerAndBlurBackground() {
1110 auto blurRadius = 50;
1111 renderengine::DisplaySettings settings;
1112 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1113 settings.physicalDisplay = fullscreenRect();
1114 settings.clip = fullscreenRect();
1115
Sally Qi59a9f502021-10-12 18:53:23 +00001116 std::vector<renderengine::LayerSettings> layers;
Alec Mourie8489fd2021-04-29 16:08:56 -07001117
1118 renderengine::LayerSettings backgroundLayer;
1119 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1120 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1121 SourceVariant::fillColor(backgroundLayer, 1.0f, 0.0f, 0.0f, this);
1122 backgroundLayer.alpha = 1.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001123 layers.push_back(backgroundLayer);
Alec Mourie8489fd2021-04-29 16:08:56 -07001124
1125 renderengine::LayerSettings blurLayer;
1126 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1127 blurLayer.geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f);
1128 blurLayer.backgroundBlurRadius = blurRadius;
1129 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
1130 blurLayer.alpha = 0;
Sally Qi59a9f502021-10-12 18:53:23 +00001131 layers.push_back(blurLayer);
Alec Mourie8489fd2021-04-29 16:08:56 -07001132
1133 invokeDraw(settings, layers);
1134
1135 // Give a generous tolerance - the blur rectangle is very small and this test is
1136 // mainly concerned with ensuring that there's no device failure.
1137 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 255, 0, 0, 255,
1138 40 /* tolerance */);
1139}
1140
1141template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001142void RenderEngineTest::overlayCorners() {
1143 renderengine::DisplaySettings settings;
1144 settings.physicalDisplay = fullscreenRect();
1145 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001146 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001147
Sally Qi59a9f502021-10-12 18:53:23 +00001148 std::vector<renderengine::LayerSettings> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001149
1150 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001151 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001152 layerOne.geometry.boundaries =
1153 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
1154 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
1155 layerOne.alpha = 0.2;
1156
Sally Qi59a9f502021-10-12 18:53:23 +00001157 layersFirst.push_back(layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -08001158 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001159 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
1160 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1161 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1162 0, 0, 0, 0);
1163
Sally Qi59a9f502021-10-12 18:53:23 +00001164 std::vector<renderengine::LayerSettings> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001165 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001166 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001167 layerTwo.geometry.boundaries =
1168 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1169 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1170 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1171 layerTwo.alpha = 1.0f;
1172
Sally Qi59a9f502021-10-12 18:53:23 +00001173 layersSecond.push_back(layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001174 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001175
1176 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1177 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1178 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1179 0, 255, 0, 255);
1180}
1181
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001182void RenderEngineTest::fillRedBufferTextureTransform() {
1183 renderengine::DisplaySettings settings;
1184 settings.physicalDisplay = fullscreenRect();
1185 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001186 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001187
Sally Qi59a9f502021-10-12 18:53:23 +00001188 std::vector<renderengine::LayerSettings> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001189
1190 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001191 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001192 // Here will allocate a checker board texture, but transform texture
1193 // coordinates so that only the upper left is applied.
Alec Mouria90a5702021-04-16 16:36:21 +00001194 const auto buf = allocateSourceBuffer(2, 2);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001195 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001196 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001197 this->mTexNames.push_back(texName);
1198
1199 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001200 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1201 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001202 // Red top left, Green top right, Blue bottom left, Black bottom right
1203 pixels[0] = 255;
1204 pixels[1] = 0;
1205 pixels[2] = 0;
1206 pixels[3] = 255;
1207 pixels[4] = 0;
1208 pixels[5] = 255;
1209 pixels[6] = 0;
1210 pixels[7] = 255;
1211 pixels[8] = 0;
1212 pixels[9] = 0;
1213 pixels[10] = 255;
1214 pixels[11] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001215 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001216
1217 layer.source.buffer.buffer = buf;
1218 layer.source.buffer.textureName = texName;
1219 // Transform coordinates to only be inside the red quadrant.
Alec Mouri4049b532021-10-15 20:59:33 -07001220 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2f, 0.2f, 1.f, 1.f));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001221 layer.alpha = 1.0f;
1222 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1223
Sally Qi59a9f502021-10-12 18:53:23 +00001224 layers.push_back(layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001225
Alec Mouric0aae732021-01-12 13:32:18 -08001226 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001227}
1228
1229void RenderEngineTest::fillBufferTextureTransform() {
1230 fillRedBufferTextureTransform();
1231 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1232}
1233
1234void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1235 renderengine::DisplaySettings settings;
1236 settings.physicalDisplay = fullscreenRect();
1237 // Here logical space is 1x1
1238 settings.clip = Rect(1, 1);
1239
Sally Qi59a9f502021-10-12 18:53:23 +00001240 std::vector<renderengine::LayerSettings> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001241
1242 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001243 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001244 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001245 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001246 this->mTexNames.push_back(texName);
1247
1248 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001249 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1250 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001251 pixels[0] = 255;
1252 pixels[1] = 0;
1253 pixels[2] = 0;
1254 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001255 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001256
1257 layer.source.buffer.buffer = buf;
1258 layer.source.buffer.textureName = texName;
1259 layer.source.buffer.usePremultipliedAlpha = true;
1260 layer.alpha = 0.5f;
1261 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1262
Sally Qi59a9f502021-10-12 18:53:23 +00001263 layers.push_back(layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001264
Alec Mouric0aae732021-01-12 13:32:18 -08001265 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001266}
1267
1268void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1269 fillRedBufferWithPremultiplyAlpha();
1270 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1271}
1272
1273void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1274 renderengine::DisplaySettings settings;
1275 settings.physicalDisplay = fullscreenRect();
1276 // Here logical space is 1x1
1277 settings.clip = Rect(1, 1);
1278
Sally Qi59a9f502021-10-12 18:53:23 +00001279 std::vector<renderengine::LayerSettings> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001280
1281 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001282 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001283 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001284 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001285 this->mTexNames.push_back(texName);
1286
1287 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001288 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1289 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001290 pixels[0] = 255;
1291 pixels[1] = 0;
1292 pixels[2] = 0;
1293 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001294 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001295
1296 layer.source.buffer.buffer = buf;
1297 layer.source.buffer.textureName = texName;
1298 layer.source.buffer.usePremultipliedAlpha = false;
1299 layer.alpha = 0.5f;
1300 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1301
Sally Qi59a9f502021-10-12 18:53:23 +00001302 layers.push_back(layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001303
Alec Mouric0aae732021-01-12 13:32:18 -08001304 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001305}
1306
1307void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1308 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001309 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001310}
1311
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001312template <typename SourceVariant>
1313void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1314 const renderengine::ShadowSettings& shadow,
1315 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1316 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001317 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001318 settings.physicalDisplay = fullscreenRect();
1319 settings.clip = fullscreenRect();
1320
Sally Qi59a9f502021-10-12 18:53:23 +00001321 std::vector<renderengine::LayerSettings> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001322
1323 // add background layer
1324 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001325 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001326 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1327 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1328 backgroundColor.b / 255.0f, this);
1329 bgLayer.alpha = backgroundColor.a / 255.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001330 layers.push_back(bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001331
1332 // add shadow layer
1333 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001334 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001335 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1336 shadowLayer.alpha = castingLayer.alpha;
1337 shadowLayer.shadow = shadow;
Sally Qi59a9f502021-10-12 18:53:23 +00001338 layers.push_back(shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001339
1340 // add layer casting the shadow
1341 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001342 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001343 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1344 casterColor.b / 255.0f, this);
Sally Qi59a9f502021-10-12 18:53:23 +00001345 layers.push_back(layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001346
Alec Mouric0aae732021-01-12 13:32:18 -08001347 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001348}
1349
Alec Mouribd17b3b2020-12-17 11:08:30 -08001350void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1351 const renderengine::ShadowSettings& shadow,
1352 const ubyte4& backgroundColor) {
1353 renderengine::DisplaySettings settings;
1354 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1355 settings.physicalDisplay = fullscreenRect();
1356 settings.clip = fullscreenRect();
1357
Sally Qi59a9f502021-10-12 18:53:23 +00001358 std::vector<renderengine::LayerSettings> layers;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001359
1360 // add background layer
1361 renderengine::LayerSettings bgLayer;
1362 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1363 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1364 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1365 backgroundColor.b / 255.0f, this);
1366 bgLayer.alpha = backgroundColor.a / 255.0f;
Sally Qi59a9f502021-10-12 18:53:23 +00001367 layers.push_back(bgLayer);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001368
1369 // add shadow layer
1370 renderengine::LayerSettings shadowLayer;
1371 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1372 shadowLayer.geometry.boundaries = castingBounds;
Derek Sollenbergerc31985e2021-05-18 16:38:17 -04001373 shadowLayer.skipContentDraw = true;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001374 shadowLayer.alpha = 1.0f;
1375 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1376 shadowLayer.shadow = shadow;
Sally Qi59a9f502021-10-12 18:53:23 +00001377 layers.push_back(shadowLayer);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001378
Alec Mouric0aae732021-01-12 13:32:18 -08001379 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001380}
1381
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001382INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001383 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001384 std::make_shared<GLESCMRenderEngineFactory>(),
1385 std::make_shared<SkiaGLESRenderEngineFactory>(),
1386 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001387
1388TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001389 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001390 drawEmptyLayers();
1391}
1392
Ana Krulec07b98df2021-01-07 14:38:40 -08001393TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
Alec Mouria90a5702021-04-16 16:36:21 +00001394 initializeRenderEngine();
Ana Krulec07b98df2021-01-07 14:38:40 -08001395
1396 renderengine::DisplaySettings settings;
1397 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1398 settings.physicalDisplay = fullscreenRect();
1399 settings.clip = fullscreenRect();
1400
1401 // 255, 255, 255, 255 is full opaque white.
Alec Mouri4049b532021-10-15 20:59:33 -07001402 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
1403 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Ana Krulec07b98df2021-01-07 14:38:40 -08001404 // Create layer with given color.
1405 renderengine::LayerSettings bgLayer;
1406 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1407 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1408 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1409 backgroundColor.b / 255.0f);
1410 bgLayer.alpha = backgroundColor.a / 255.0f;
1411 // Transform the red color.
1412 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1413
Sally Qi59a9f502021-10-12 18:53:23 +00001414 std::vector<renderengine::LayerSettings> layers;
1415 layers.push_back(bgLayer);
Ana Krulec07b98df2021-01-07 14:38:40 -08001416
Alec Mouric0aae732021-01-12 13:32:18 -08001417 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001418
1419 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001420 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001421 backgroundColor.a);
1422}
1423
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001424TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001425 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001426
Alec Mourid43ccab2019-03-13 12:23:45 -07001427 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001428 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Sally Qi59a9f502021-10-12 18:53:23 +00001429 std::vector<renderengine::LayerSettings> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001430 renderengine::LayerSettings layer;
1431 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1432 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Sally Qi59a9f502021-10-12 18:53:23 +00001433 layers.push_back(layer);
Sally Qi4cabdd02021-08-05 16:45:57 -07001434 std::future<renderengine::RenderEngineResult> result =
1435 mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd());
Alec Mourid43ccab2019-03-13 12:23:45 -07001436
Sally Qi4cabdd02021-08-05 16:45:57 -07001437 ASSERT_TRUE(result.valid());
Derek Sollenbergerec411212021-08-25 10:54:47 -04001438 auto [status, fence] = result.get();
Alec Mourid43ccab2019-03-13 12:23:45 -07001439 ASSERT_EQ(BAD_VALUE, status);
Derek Sollenbergerec411212021-08-25 10:54:47 -04001440 ASSERT_FALSE(fence.ok());
Alec Mourid43ccab2019-03-13 12:23:45 -07001441}
1442
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001443TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1444 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001445
1446 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1447 // GLES-specific test
1448 return;
1449 }
1450
1451 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001452
Alec Mourife0d72b2019-03-21 14:05:56 -07001453 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001454 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001455 settings.physicalDisplay = fullscreenRect();
1456 settings.clip = fullscreenRect();
1457
Sally Qi59a9f502021-10-12 18:53:23 +00001458 std::vector<renderengine::LayerSettings> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001459 renderengine::LayerSettings layer;
1460 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1461 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1462 layer.alpha = 1.0;
Sally Qi59a9f502021-10-12 18:53:23 +00001463 layers.push_back(layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001464
Sally Qi4cabdd02021-08-05 16:45:57 -07001465 std::future<renderengine::RenderEngineResult> result =
1466 mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd());
1467 ASSERT_TRUE(result.valid());
Derek Sollenbergerec411212021-08-25 10:54:47 -04001468 auto [status, fence] = result.get();
1469
Alec Mourife0d72b2019-03-21 14:05:56 -07001470 ASSERT_EQ(NO_ERROR, status);
Derek Sollenbergerec411212021-08-25 10:54:47 -04001471 if (fence.ok()) {
1472 sync_wait(fence.get(), -1);
1473 }
1474
Alec Mouria90a5702021-04-16 16:36:21 +00001475 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001476 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1477}
1478
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001479TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001480 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001481 fillRedBuffer<ColorSourceVariant>();
1482}
1483
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001484TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001485 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001486 fillGreenBuffer<ColorSourceVariant>();
1487}
1488
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001489TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001490 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001491 fillBlueBuffer<ColorSourceVariant>();
1492}
1493
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001494TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001495 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001496 fillRedTransparentBuffer<ColorSourceVariant>();
1497}
1498
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001499TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001500 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001501 fillBufferPhysicalOffset<ColorSourceVariant>();
1502}
1503
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001504TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001505 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001506 fillBufferCheckersRotate0<ColorSourceVariant>();
1507}
1508
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001509TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001510 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001511 fillBufferCheckersRotate90<ColorSourceVariant>();
1512}
1513
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001514TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001515 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001516 fillBufferCheckersRotate180<ColorSourceVariant>();
1517}
1518
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001519TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001520 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001521 fillBufferCheckersRotate270<ColorSourceVariant>();
1522}
1523
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001524TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001525 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001526 fillBufferLayerTransform<ColorSourceVariant>();
1527}
1528
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001529TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001530 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001531 fillBufferColorTransform<ColorSourceVariant>();
1532}
1533
Sally Qi2019fd22021-11-22 10:19:04 -08001534TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_sourceDataspace) {
1535 const auto& renderEngineFactory = GetParam();
1536 // skip for non color management
1537 if (!renderEngineFactory->useColorManagement()) {
1538 return;
1539 }
1540 // skip for GLESRenderEngine
1541 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1542 return;
1543 }
1544
1545 initializeRenderEngine();
1546 fillBufferColorTransformAndSourceDataspace<ColorSourceVariant>();
1547}
1548
1549TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_outputDataspace) {
1550 const auto& renderEngineFactory = GetParam();
1551 // skip for non color management
1552 if (!renderEngineFactory->useColorManagement()) {
1553 return;
1554 }
1555 // skip for GLESRenderEngine
1556 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1557 return;
1558 }
1559
1560 initializeRenderEngine();
1561 fillBufferColorTransformAndOutputDataspace<ColorSourceVariant>();
1562}
1563
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001564TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001565 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001566 fillBufferWithRoundedCorners<ColorSourceVariant>();
1567}
1568
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001569TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001570 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001571 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1572}
1573
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001574TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001575 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001576 fillBufferAndBlurBackground<ColorSourceVariant>();
1577}
1578
Alec Mourie8489fd2021-04-29 16:08:56 -07001579TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1580 initializeRenderEngine();
1581 fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1582}
1583
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001584TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001585 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001586 overlayCorners<ColorSourceVariant>();
1587}
1588
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001589TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001590 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001591 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1592}
1593
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001594TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001595 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001596 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1597}
1598
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001599TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001600 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001601 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1602}
1603
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001604TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001605 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001606 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1607}
1608
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001609TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001610 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001611 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1612}
1613
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001614TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001615 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001616 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1617}
1618
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001619TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001620 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001621 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1622}
1623
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001624TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001625 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001626 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1627}
1628
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001629TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001630 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001631 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1632}
1633
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001634TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001635 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001636 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1637}
1638
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001639TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001640 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001641 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1642}
1643
Sally Qi2019fd22021-11-22 10:19:04 -08001644TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndSourceDataspace_opaqueBufferSource) {
1645 const auto& renderEngineFactory = GetParam();
1646 // skip for non color management
1647 if (!renderEngineFactory->useColorManagement()) {
1648 return;
1649 }
1650 // skip for GLESRenderEngine
1651 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1652 return;
1653 }
1654
1655 initializeRenderEngine();
1656 fillBufferColorTransformAndSourceDataspace<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1657}
1658
1659TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndOutputDataspace_opaqueBufferSource) {
1660 const auto& renderEngineFactory = GetParam();
1661 // skip for non color management
1662 if (!renderEngineFactory->useColorManagement()) {
1663 return;
1664 }
1665 // skip for GLESRenderEngine
1666 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1667 return;
1668 }
1669
1670 initializeRenderEngine();
1671 fillBufferColorTransformAndOutputDataspace<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1672}
1673
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001674TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001675 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001676 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1677}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001678
Alec Mouric0aae732021-01-12 13:32:18 -08001679TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1680 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001681 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1682}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001683
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001684TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001685 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001686 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1687}
1688
Alec Mourie8489fd2021-04-29 16:08:56 -07001689TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1690 initializeRenderEngine();
1691 fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1692}
1693
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001694TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001695 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001696 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1697}
1698
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001699TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001700 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001701 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1702}
1703
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001704TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001705 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001706 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1707}
1708
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001709TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001710 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001711 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1712}
1713
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001714TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001715 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001716 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1717}
1718
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001719TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001720 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001721 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1722}
1723
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001724TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001725 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001726 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1727}
1728
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001729TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001730 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001731 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1732}
1733
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001734TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001735 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001736 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1737}
1738
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001739TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001740 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001741 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1742}
1743
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001744TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001745 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001746 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1747}
1748
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001749TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001750 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001751 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1752}
1753
Sally Qi2019fd22021-11-22 10:19:04 -08001754TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndSourceDataspace_bufferSource) {
1755 const auto& renderEngineFactory = GetParam();
1756 // skip for non color management
1757 if (!renderEngineFactory->useColorManagement()) {
1758 return;
1759 }
1760 // skip for GLESRenderEngine
1761 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1762 return;
1763 }
1764
1765 initializeRenderEngine();
1766 fillBufferColorTransformAndSourceDataspace<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1767}
1768
1769TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndOutputDataspace_bufferSource) {
1770 const auto& renderEngineFactory = GetParam();
1771 // skip for non color management
1772 if (!renderEngineFactory->useColorManagement()) {
1773 return;
1774 }
1775 // skip for GLESRenderEngine
1776 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1777 return;
1778 }
1779
1780 initializeRenderEngine();
1781 fillBufferColorTransformAndOutputDataspace<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1782}
1783
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001784TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001785 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001786 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1787}
1788
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001789TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001790 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001791 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1792}
1793
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001794TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001795 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001796 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1797}
1798
Alec Mourie8489fd2021-04-29 16:08:56 -07001799TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
1800 initializeRenderEngine();
1801 fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1802}
1803
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001804TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001805 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001806 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1807}
1808
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001809TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08001810 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001811 fillBufferTextureTransform();
1812}
1813
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001814TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001815 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001816 fillBufferWithPremultiplyAlpha();
1817}
1818
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001819TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001820 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001821 fillBufferWithoutPremultiplyAlpha();
1822}
1823
Alec Mouribd17b3b2020-12-17 11:08:30 -08001824TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001825 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08001826
Alec Mouri4049b532021-10-15 20:59:33 -07001827 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
1828 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Alec Mouribd17b3b2020-12-17 11:08:30 -08001829 const float shadowLength = 5.0f;
1830 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1831 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1832 renderengine::ShadowSettings settings =
1833 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1834 false /* casterIsTranslucent */);
1835
1836 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1837 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1838}
1839
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001840TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08001841 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001842
Alec Mouri4049b532021-10-15 20:59:33 -07001843 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
1844 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
1845 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
1846 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001847 const float shadowLength = 5.0f;
1848 Rect casterBounds(1, 1);
1849 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1850 renderengine::LayerSettings castingLayer;
1851 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1852 castingLayer.alpha = 1.0f;
1853 renderengine::ShadowSettings settings =
1854 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1855 false /* casterIsTranslucent */);
1856
1857 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1858 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1859}
1860
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001861TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001862 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001863
Alec Mouri4049b532021-10-15 20:59:33 -07001864 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
1865 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
1866 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
1867 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001868 const float shadowLength = 5.0f;
1869 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1870 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1871 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001872 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001873 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1874 castingLayer.alpha = 1.0f;
1875 renderengine::ShadowSettings settings =
1876 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1877 false /* casterIsTranslucent */);
1878
1879 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1880 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1881}
1882
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001883TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001884 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001885
Alec Mouri4049b532021-10-15 20:59:33 -07001886 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
1887 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
1888 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
1889 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001890 const float shadowLength = 5.0f;
1891 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1892 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1893 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001894 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001895 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1896 castingLayer.alpha = 1.0f;
1897 renderengine::ShadowSettings settings =
1898 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1899 false /* casterIsTranslucent */);
1900
1901 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1902 backgroundColor);
1903 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1904}
1905
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001906TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08001907 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001908
Alec Mouri4049b532021-10-15 20:59:33 -07001909 const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
1910 static_cast<uint8_t>(0), static_cast<uint8_t>(255));
1911 const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
1912 static_cast<uint8_t>(255), static_cast<uint8_t>(255));
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001913 const float shadowLength = 5.0f;
1914 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1915 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1916 renderengine::LayerSettings castingLayer;
1917 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1918 castingLayer.geometry.roundedCornersRadius = 3.0f;
1919 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1920 castingLayer.alpha = 1.0f;
1921 renderengine::ShadowSettings settings =
1922 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1923 false /* casterIsTranslucent */);
1924
1925 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1926 backgroundColor);
1927 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1928}
1929
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001930TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001931 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001932
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001933 const ubyte4 casterColor(255, 0, 0, 255);
1934 const ubyte4 backgroundColor(255, 255, 255, 255);
1935 const float shadowLength = 5.0f;
1936 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1937 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1938 renderengine::LayerSettings castingLayer;
1939 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1940 castingLayer.alpha = 0.5f;
1941 renderengine::ShadowSettings settings =
1942 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1943 true /* casterIsTranslucent */);
1944
1945 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1946 backgroundColor);
1947
1948 // verify only the background since the shadow will draw behind the caster
1949 const float shadowInset = settings.length * -1.0f;
1950 const Rect casterWithShadow =
1951 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1952 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1953 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1954 backgroundColor.a);
1955}
1956
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001957TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
Alec Mouric0aae732021-01-12 13:32:18 -08001958 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001959
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001960 renderengine::DisplaySettings settings;
1961 settings.physicalDisplay = fullscreenRect();
1962 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001963 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001964
Sally Qi59a9f502021-10-12 18:53:23 +00001965 std::vector<renderengine::LayerSettings> layers;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001966 renderengine::LayerSettings layer;
1967 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1968 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1969 layer.alpha = 1.0;
Sally Qi59a9f502021-10-12 18:53:23 +00001970 layers.push_back(layer);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001971
Sally Qi4cabdd02021-08-05 16:45:57 -07001972 std::future<renderengine::RenderEngineResult> resultOne =
1973 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd());
1974 ASSERT_TRUE(resultOne.valid());
1975 auto [statusOne, fenceOne] = resultOne.get();
1976 ASSERT_EQ(NO_ERROR, statusOne);
1977
1978 std::future<renderengine::RenderEngineResult> resultTwo =
1979 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne));
1980 ASSERT_TRUE(resultTwo.valid());
1981 auto [statusTwo, fenceTwo] = resultTwo.get();
1982 ASSERT_EQ(NO_ERROR, statusTwo);
Derek Sollenbergerec411212021-08-25 10:54:47 -04001983 if (fenceTwo.ok()) {
1984 sync_wait(fenceTwo.get(), -1);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001985 }
Derek Sollenbergerec411212021-08-25 10:54:47 -04001986
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001987 // Only cleanup the first time.
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04001988 EXPECT_FALSE(mRE->canSkipPostRenderCleanup());
1989 mRE->cleanupPostRender();
1990 EXPECT_TRUE(mRE->canSkipPostRenderCleanup());
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001991}
1992
Ana Krulecf9a15d92020-12-11 08:35:00 -08001993TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08001994 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08001995
1996 renderengine::DisplaySettings settings;
1997 settings.physicalDisplay = fullscreenRect();
1998 settings.clip = fullscreenRect();
1999 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2000
Sally Qi59a9f502021-10-12 18:53:23 +00002001 std::vector<renderengine::LayerSettings> layers;
Ana Krulecf9a15d92020-12-11 08:35:00 -08002002
2003 renderengine::LayerSettings redLayer;
2004 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2005 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2006 redLayer.geometry.roundedCornersRadius = 5.0f;
2007 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
2008 // Red background.
2009 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2010 redLayer.alpha = 1.0f;
2011
Sally Qi59a9f502021-10-12 18:53:23 +00002012 layers.push_back(redLayer);
Ana Krulecf9a15d92020-12-11 08:35:00 -08002013
2014 // Green layer with 1/3 size.
2015 renderengine::LayerSettings greenLayer;
2016 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2017 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2018 greenLayer.geometry.roundedCornersRadius = 5.0f;
2019 // Bottom right corner is not going to be rounded.
2020 greenLayer.geometry.roundedCornersCrop =
2021 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
2022 DEFAULT_DISPLAY_HEIGHT)
2023 .toFloatRect();
2024 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
2025 greenLayer.alpha = 1.0f;
2026
Sally Qi59a9f502021-10-12 18:53:23 +00002027 layers.push_back(greenLayer);
Ana Krulecf9a15d92020-12-11 08:35:00 -08002028
Alec Mouric0aae732021-01-12 13:32:18 -08002029 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08002030
2031 // Corners should be ignored...
2032 // Screen size: width is 128, height is 256.
2033 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
2034 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
2035 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
2036 // Bottom right corner is kept out of the clipping, and it's green.
2037 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
2038 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
2039 0, 255, 0, 255);
2040}
2041
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002042TEST_P(RenderEngineTest, testRoundedCornersParentCrop) {
2043 initializeRenderEngine();
2044
2045 renderengine::DisplaySettings settings;
2046 settings.physicalDisplay = fullscreenRect();
2047 settings.clip = fullscreenRect();
2048 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2049
Sally Qi59a9f502021-10-12 18:53:23 +00002050 std::vector<renderengine::LayerSettings> layers;
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002051
2052 renderengine::LayerSettings redLayer;
2053 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2054 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2055 redLayer.geometry.roundedCornersRadius = 5.0f;
2056 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
2057 // Red background.
2058 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2059 redLayer.alpha = 1.0f;
2060
Sally Qi59a9f502021-10-12 18:53:23 +00002061 layers.push_back(redLayer);
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002062
2063 // Green layer with 1/2 size with parent crop rect.
2064 renderengine::LayerSettings greenLayer = redLayer;
2065 greenLayer.geometry.boundaries =
2066 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2);
2067 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
2068
Sally Qi59a9f502021-10-12 18:53:23 +00002069 layers.push_back(greenLayer);
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04002070
2071 invokeDraw(settings, layers);
2072
2073 // Due to roundedCornersRadius, the corners are untouched.
2074 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
2075 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
2076 expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
2077 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
2078
2079 // top middle should be green and the bottom middle red
2080 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 0), 0, 255, 0, 255);
2081 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 255);
2082
2083 // the bottom edge of the green layer should not be rounded
2084 expectBufferColor(Point(0, (DEFAULT_DISPLAY_HEIGHT / 2) - 1), 0, 255, 0, 255);
2085}
2086
Derek Sollenberger547d0a62021-07-27 14:09:17 -04002087TEST_P(RenderEngineTest, testRoundedCornersParentCropSmallBounds) {
2088 initializeRenderEngine();
2089
2090 renderengine::DisplaySettings settings;
2091 settings.physicalDisplay = fullscreenRect();
2092 settings.clip = fullscreenRect();
2093 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2094
Sally Qi59a9f502021-10-12 18:53:23 +00002095 std::vector<renderengine::LayerSettings> layers;
Derek Sollenberger547d0a62021-07-27 14:09:17 -04002096
2097 renderengine::LayerSettings redLayer;
2098 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2099 redLayer.geometry.boundaries = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 32);
2100 redLayer.geometry.roundedCornersRadius = 64;
2101 redLayer.geometry.roundedCornersCrop = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 128);
2102 // Red background.
2103 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2104 redLayer.alpha = 1.0f;
2105
Sally Qi59a9f502021-10-12 18:53:23 +00002106 layers.push_back(redLayer);
Derek Sollenberger547d0a62021-07-27 14:09:17 -04002107 invokeDraw(settings, layers);
2108
2109 // Due to roundedCornersRadius, the top corners are untouched.
2110 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
2111 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
2112
2113 // ensure that the entire height of the red layer was clipped by the rounded corners crop.
2114 expectBufferColor(Point(0, 31), 0, 0, 0, 0);
2115 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 31), 0, 0, 0, 0);
2116
2117 // the bottom middle should be red
2118 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 31), 255, 0, 0, 255);
2119}
2120
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002121TEST_P(RenderEngineTest, testClear) {
2122 initializeRenderEngine();
2123
2124 const auto rect = fullscreenRect();
2125 const renderengine::DisplaySettings display{
2126 .physicalDisplay = rect,
2127 .clip = rect,
2128 };
2129
2130 const renderengine::LayerSettings redLayer{
2131 .geometry.boundaries = rect.toFloatRect(),
2132 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
2133 .alpha = 1.0f,
2134 };
2135
2136 // This mimics prepareClearClientComposition. This layer should overwrite
2137 // the redLayer, so that the buffer is transparent, rather than red.
2138 const renderengine::LayerSettings clearLayer{
2139 .geometry.boundaries = rect.toFloatRect(),
2140 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
2141 .alpha = 0.0f,
2142 .disableBlending = true,
2143 };
2144
Sally Qi59a9f502021-10-12 18:53:23 +00002145 std::vector<renderengine::LayerSettings> layers{redLayer, clearLayer};
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002146 invokeDraw(display, layers);
2147 expectBufferColor(rect, 0, 0, 0, 0);
2148}
2149
2150TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
2151 initializeRenderEngine();
2152
2153 const auto rect = Rect(0, 0, 1, 1);
2154 const renderengine::DisplaySettings display{
2155 .physicalDisplay = rect,
2156 .clip = rect,
2157 };
2158
2159 const renderengine::LayerSettings redLayer{
2160 .geometry.boundaries = rect.toFloatRect(),
2161 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
2162 .alpha = 1.0f,
2163 };
2164
2165 // The next layer will overwrite redLayer with a GraphicBuffer that is green
2166 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00002167 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002168 {
2169 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00002170 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2171 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002172 pixels[0] = 0;
2173 pixels[1] = 255;
2174 pixels[2] = 0;
2175 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00002176 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002177 }
2178
2179 const renderengine::LayerSettings greenLayer{
2180 .geometry.boundaries = rect.toFloatRect(),
2181 .source =
2182 renderengine::PixelSource{
2183 .buffer =
2184 renderengine::Buffer{
2185 .buffer = buf,
2186 .usePremultipliedAlpha = true,
2187 },
2188 },
2189 .alpha = 0.5f,
2190 .disableBlending = true,
2191 };
2192
Sally Qi59a9f502021-10-12 18:53:23 +00002193 std::vector<renderengine::LayerSettings> layers{redLayer, greenLayer};
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04002194 invokeDraw(display, layers);
2195 expectBufferColor(rect, 0, 128, 0, 128);
2196}
2197
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04002198TEST_P(RenderEngineTest, test_isOpaque) {
2199 initializeRenderEngine();
2200
2201 const auto rect = Rect(0, 0, 1, 1);
2202 const renderengine::DisplaySettings display{
2203 .physicalDisplay = rect,
2204 .clip = rect,
2205 .outputDataspace = ui::Dataspace::DISPLAY_P3,
2206 };
2207
2208 // Create an unpremul buffer that is green with no alpha. Using isOpaque
2209 // should make the green show.
2210 const auto buf = allocateSourceBuffer(1, 1);
2211 {
2212 uint8_t* pixels;
2213 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2214 reinterpret_cast<void**>(&pixels));
2215 pixels[0] = 0;
2216 pixels[1] = 255;
2217 pixels[2] = 0;
2218 pixels[3] = 0;
2219 buf->getBuffer()->unlock();
2220 }
2221
2222 const renderengine::LayerSettings greenLayer{
2223 .geometry.boundaries = rect.toFloatRect(),
2224 .source =
2225 renderengine::PixelSource{
2226 .buffer =
2227 renderengine::Buffer{
2228 .buffer = buf,
2229 // Although the pixels are not
2230 // premultiplied in practice, this
2231 // matches the input we see.
2232 .usePremultipliedAlpha = true,
2233 .isOpaque = true,
2234 },
2235 },
2236 .alpha = 1.0f,
2237 };
2238
Sally Qi59a9f502021-10-12 18:53:23 +00002239 std::vector<renderengine::LayerSettings> layers{greenLayer};
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04002240 invokeDraw(display, layers);
2241
2242 if (GetParam()->useColorManagement()) {
2243 expectBufferColor(rect, 117, 251, 76, 255);
2244 } else {
2245 expectBufferColor(rect, 0, 255, 0, 255);
2246 }
2247}
Alec Mouri4049b532021-10-15 20:59:33 -07002248
2249double EOTF_PQ(double channel) {
2250 float m1 = (2610.0 / 4096.0) / 4.0;
2251 float m2 = (2523.0 / 4096.0) * 128.0;
2252 float c1 = (3424.0 / 4096.0);
2253 float c2 = (2413.0 / 4096.0) * 32.0;
2254 float c3 = (2392.0 / 4096.0) * 32.0;
2255
2256 float tmp = std::pow(std::clamp(channel, 0.0, 1.0), 1.0 / m2);
2257 tmp = std::fmax(tmp - c1, 0.0) / (c2 - c3 * tmp);
2258 return std::pow(tmp, 1.0 / m1);
2259}
2260
2261vec3 EOTF_PQ(vec3 color) {
2262 return vec3(EOTF_PQ(color.r), EOTF_PQ(color.g), EOTF_PQ(color.b));
2263}
2264
2265double OETF_sRGB(double channel) {
2266 return channel <= 0.0031308 ? channel * 12.92 : (pow(channel, 1.0 / 2.4) * 1.055) - 0.055;
2267}
2268
2269int sign(float in) {
2270 return in >= 0.0 ? 1 : -1;
2271}
2272
2273vec3 OETF_sRGB(vec3 linear) {
2274 return vec3(sign(linear.r) * OETF_sRGB(linear.r), sign(linear.g) * OETF_sRGB(linear.g),
2275 sign(linear.b) * OETF_sRGB(linear.b));
2276}
2277
2278TEST_P(RenderEngineTest, test_tonemapPQMatches) {
2279 if (!GetParam()->useColorManagement()) {
2280 return;
2281 }
2282
2283 if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
2284 return;
2285 }
2286
2287 initializeRenderEngine();
2288
2289 constexpr int32_t kGreyLevels = 256;
2290
2291 const auto rect = Rect(0, 0, kGreyLevels, 1);
2292 const renderengine::DisplaySettings display{
2293 .physicalDisplay = rect,
2294 .clip = rect,
2295 .maxLuminance = 750.0f,
2296 .outputDataspace = ui::Dataspace::DISPLAY_P3,
2297 };
2298
2299 auto buf = std::make_shared<
2300 renderengine::ExternalTexture>(new GraphicBuffer(kGreyLevels, 1,
2301 HAL_PIXEL_FORMAT_RGBA_8888, 1,
2302 GRALLOC_USAGE_SW_READ_OFTEN |
2303 GRALLOC_USAGE_SW_WRITE_OFTEN |
2304 GRALLOC_USAGE_HW_RENDER |
2305 GRALLOC_USAGE_HW_TEXTURE,
2306 "input"),
2307 *mRE,
2308 renderengine::ExternalTexture::Usage::READABLE |
2309 renderengine::ExternalTexture::Usage::WRITEABLE);
2310 ASSERT_EQ(0, buf->getBuffer()->initCheck());
2311
2312 {
2313 uint8_t* pixels;
2314 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2315 reinterpret_cast<void**>(&pixels));
2316
2317 uint8_t color = 0;
2318 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
2319 uint8_t* dest = pixels + (buf->getBuffer()->getStride() * j * 4);
2320 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
2321 dest[0] = color;
2322 dest[1] = color;
2323 dest[2] = color;
2324 dest[3] = 255;
2325 color++;
2326 dest += 4;
2327 }
2328 }
2329 buf->getBuffer()->unlock();
2330 }
2331
2332 mBuffer = std::make_shared<
2333 renderengine::ExternalTexture>(new GraphicBuffer(kGreyLevels, 1,
2334 HAL_PIXEL_FORMAT_RGBA_8888, 1,
2335 GRALLOC_USAGE_SW_READ_OFTEN |
2336 GRALLOC_USAGE_SW_WRITE_OFTEN |
2337 GRALLOC_USAGE_HW_RENDER |
2338 GRALLOC_USAGE_HW_TEXTURE,
2339 "output"),
2340 *mRE,
2341 renderengine::ExternalTexture::Usage::READABLE |
2342 renderengine::ExternalTexture::Usage::WRITEABLE);
2343 ASSERT_EQ(0, mBuffer->getBuffer()->initCheck());
2344
2345 const renderengine::LayerSettings layer{
2346 .geometry.boundaries = rect.toFloatRect(),
2347 .source =
2348 renderengine::PixelSource{
2349 .buffer =
2350 renderengine::Buffer{
2351 .buffer = std::move(buf),
2352 .usePremultipliedAlpha = true,
2353 },
2354 },
2355 .alpha = 1.0f,
2356 .sourceDataspace = static_cast<ui::Dataspace>(HAL_DATASPACE_STANDARD_BT2020 |
2357 HAL_DATASPACE_TRANSFER_ST2084 |
2358 HAL_DATASPACE_RANGE_FULL),
2359 };
2360
2361 std::vector<renderengine::LayerSettings> layers{layer};
2362 invokeDraw(display, layers);
2363
2364 ColorSpace displayP3 = ColorSpace::DisplayP3();
2365 ColorSpace bt2020 = ColorSpace::BT2020();
2366
2367 tonemap::Metadata metadata{.displayMaxLuminance = 750.0f};
2368
2369 auto generator = [=](Point location) {
2370 const double normColor = static_cast<double>(location.x) / (kGreyLevels - 1);
2371 const vec3 rgb = vec3(normColor, normColor, normColor);
2372
2373 const vec3 linearRGB = EOTF_PQ(rgb);
2374
2375 static constexpr float kMaxPQLuminance = 10000.f;
2376 const vec3 xyz = bt2020.getRGBtoXYZ() * linearRGB * kMaxPQLuminance;
2377 const double gain =
2378 tonemap::getToneMapper()
2379 ->lookupTonemapGain(static_cast<aidl::android::hardware::graphics::common::
2380 Dataspace>(
2381 HAL_DATASPACE_STANDARD_BT2020 |
2382 HAL_DATASPACE_TRANSFER_ST2084 |
2383 HAL_DATASPACE_RANGE_FULL),
2384 static_cast<aidl::android::hardware::graphics::common::
2385 Dataspace>(
2386 ui::Dataspace::DISPLAY_P3),
2387 linearRGB * 10000.0, xyz, metadata);
2388 const vec3 scaledXYZ = xyz * gain / metadata.displayMaxLuminance;
2389
2390 const vec3 targetRGB = OETF_sRGB(displayP3.getXYZtoRGB() * scaledXYZ) * 255;
2391 return ubyte4(static_cast<uint8_t>(targetRGB.r), static_cast<uint8_t>(targetRGB.g),
2392 static_cast<uint8_t>(targetRGB.b), 255);
2393 };
2394
2395 expectBufferColor(Rect(kGreyLevels, 1), generator, 2);
2396}
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04002397} // namespace renderengine
Alec Mouri6e57f682018-09-29 20:45:08 -07002398} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08002399
2400// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002401#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"