blob: 694bda65d4b65ee69a191293291b59a48b67fc60 [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 Mouri6e57f682018-09-29 20:45:08 -070030#include <ui/PixelFormat.h>
Alec Mouric0aae732021-01-12 13:32:18 -080031
32#include <chrono>
33#include <condition_variable>
34#include <fstream>
35
Alec Mourid43ccab2019-03-13 12:23:45 -070036#include "../gl/GLESRenderEngine.h"
Alec Mouric0aae732021-01-12 13:32:18 -080037#include "../skia/SkiaGLRenderEngine.h"
Ana Krulec9bc9dc62020-02-26 12:16:40 -080038#include "../threaded/RenderEngineThreaded.h"
Alec Mouri6e57f682018-09-29 20:45:08 -070039
Alec Mouri1089aed2018-10-25 21:33:57 -070040constexpr int DEFAULT_DISPLAY_WIDTH = 128;
41constexpr int DEFAULT_DISPLAY_HEIGHT = 256;
42constexpr int DEFAULT_DISPLAY_OFFSET = 64;
Vishnu Nair16efdbf2019-12-10 11:55:42 -080043constexpr bool WRITE_BUFFER_TO_FILE_ON_FAILURE = false;
Alec Mouri1089aed2018-10-25 21:33:57 -070044
Alec Mouri6e57f682018-09-29 20:45:08 -070045namespace android {
Derek Sollenbergerd3f60652021-06-11 15:34:36 -040046namespace renderengine {
Alec Mouri6e57f682018-09-29 20:45:08 -070047
Ana Krulec82ba2ec2020-11-21 13:33:20 -080048class RenderEngineFactory {
49public:
50 virtual ~RenderEngineFactory() = default;
51
52 virtual std::string name() = 0;
Alec Mouric0aae732021-01-12 13:32:18 -080053 virtual renderengine::RenderEngine::RenderEngineType type() = 0;
54 virtual std::unique_ptr<renderengine::RenderEngine> createRenderEngine() = 0;
55 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
56 return nullptr;
57 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -040058 virtual bool useColorManagement() const = 0;
Ana Krulec82ba2ec2020-11-21 13:33:20 -080059};
60
61class GLESRenderEngineFactory : public RenderEngineFactory {
62public:
63 std::string name() override { return "GLESRenderEngineFactory"; }
64
Alec Mouric0aae732021-01-12 13:32:18 -080065 renderengine::RenderEngine::RenderEngineType type() {
66 return renderengine::RenderEngine::RenderEngineType::GLES;
67 }
68
69 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
70 return createGLESRenderEngine();
71 }
72
73 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
KaiChieh Chuang436fc192020-09-07 13:48:42 +080074 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -070075 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -080076 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
77 .setImageCacheSize(1)
78 .setUseColorManagerment(false)
79 .setEnableProtectedContext(false)
80 .setPrecacheToneMapperShaderOnly(false)
81 .setSupportsBackgroundBlur(true)
82 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -080083 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -070084 .setUseColorManagerment(useColorManagement())
KaiChieh Chuang436fc192020-09-07 13:48:42 +080085 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -080086 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -070087 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -040088
89 bool useColorManagement() const override { return false; }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080090};
Alec Mourid43ccab2019-03-13 12:23:45 -070091
Ana Krulecaa2fe7f2020-11-24 15:06:36 -080092class GLESCMRenderEngineFactory : public RenderEngineFactory {
93public:
94 std::string name() override { return "GLESCMRenderEngineFactory"; }
95
Alec Mouric0aae732021-01-12 13:32:18 -080096 renderengine::RenderEngine::RenderEngineType type() {
97 return renderengine::RenderEngine::RenderEngineType::GLES;
98 }
99
100 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
101 return createGLESRenderEngine();
102 }
103
104 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() override {
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800105 renderengine::RenderEngineCreationArgs reCreationArgs =
106 renderengine::RenderEngineCreationArgs::Builder()
107 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
108 .setImageCacheSize(1)
109 .setEnableProtectedContext(false)
110 .setPrecacheToneMapperShaderOnly(false)
111 .setSupportsBackgroundBlur(true)
112 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800113 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700114 .setUseColorManagerment(useColorManagement())
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800115 .build();
116 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
117 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400118
119 bool useColorManagement() const override { return true; }
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800120};
121
Alec Mouri0eab3e82020-12-08 18:10:27 -0800122class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
123public:
Alec Mouric0aae732021-01-12 13:32:18 -0800124 std::string name() override { return "SkiaGLRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800125
Alec Mouric0aae732021-01-12 13:32:18 -0800126 renderengine::RenderEngine::RenderEngineType type() {
127 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
128 }
129
130 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800131 renderengine::RenderEngineCreationArgs reCreationArgs =
132 renderengine::RenderEngineCreationArgs::Builder()
133 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
134 .setImageCacheSize(1)
135 .setEnableProtectedContext(false)
136 .setPrecacheToneMapperShaderOnly(false)
137 .setSupportsBackgroundBlur(true)
138 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800139 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700140 .setUseColorManagerment(useColorManagement())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800141 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800142 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800143 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400144
Alec Mourid2bcbae2021-06-28 17:02:17 -0700145 bool useColorManagement() const override { return false; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800146};
147
148class SkiaGLESCMRenderEngineFactory : public RenderEngineFactory {
149public:
Alec Mouric0aae732021-01-12 13:32:18 -0800150 std::string name() override { return "SkiaGLCMRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800151
Alec Mouric0aae732021-01-12 13:32:18 -0800152 renderengine::RenderEngine::RenderEngineType type() {
153 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
154 }
155
156 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800157 renderengine::RenderEngineCreationArgs reCreationArgs =
158 renderengine::RenderEngineCreationArgs::Builder()
159 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
160 .setImageCacheSize(1)
161 .setEnableProtectedContext(false)
162 .setPrecacheToneMapperShaderOnly(false)
163 .setSupportsBackgroundBlur(true)
164 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800165 .setRenderEngineType(type())
Alec Mourid2bcbae2021-06-28 17:02:17 -0700166 .setUseColorManagerment(useColorManagement())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800167 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800168 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800169 }
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400170
171 bool useColorManagement() const override { return true; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800172};
173
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800174class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
175public:
Alec Mouria90a5702021-04-16 16:36:21 +0000176 std::shared_ptr<renderengine::ExternalTexture> allocateDefaultBuffer() {
177 return std::make_shared<
178 renderengine::
179 ExternalTexture>(new GraphicBuffer(DEFAULT_DISPLAY_WIDTH,
180 DEFAULT_DISPLAY_HEIGHT,
181 HAL_PIXEL_FORMAT_RGBA_8888, 1,
182 GRALLOC_USAGE_SW_READ_OFTEN |
183 GRALLOC_USAGE_SW_WRITE_OFTEN |
184 GRALLOC_USAGE_HW_RENDER |
185 GRALLOC_USAGE_HW_TEXTURE,
186 "output"),
187 *mRE,
188 renderengine::ExternalTexture::Usage::READABLE |
189 renderengine::ExternalTexture::Usage::WRITEABLE);
Alec Mouri6e57f682018-09-29 20:45:08 -0700190 }
191
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800192 // Allocates a 1x1 buffer to fill with a solid color
Alec Mouria90a5702021-04-16 16:36:21 +0000193 std::shared_ptr<renderengine::ExternalTexture> allocateSourceBuffer(uint32_t width,
194 uint32_t height) {
195 return std::make_shared<
196 renderengine::
197 ExternalTexture>(new GraphicBuffer(width, height,
198 HAL_PIXEL_FORMAT_RGBA_8888, 1,
199 GRALLOC_USAGE_SW_READ_OFTEN |
200 GRALLOC_USAGE_SW_WRITE_OFTEN |
201 GRALLOC_USAGE_HW_TEXTURE,
202 "input"),
203 *mRE,
204 renderengine::ExternalTexture::Usage::READABLE |
205 renderengine::ExternalTexture::Usage::WRITEABLE);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800206 }
207
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800208 RenderEngineTest() {
209 const ::testing::TestInfo* const test_info =
210 ::testing::UnitTest::GetInstance()->current_test_info();
211 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800212 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700213
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800214 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800215 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
216 writeBufferToFile("/data/texture_out_");
217 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800218 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800219 mRE->deleteTextures(1, &texName);
Alec Mouric0aae732021-01-12 13:32:18 -0800220 if (mGLESRE != nullptr) {
221 EXPECT_FALSE(mGLESRE->isTextureNameKnownForTesting(texName));
222 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800223 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800224 const ::testing::TestInfo* const test_info =
225 ::testing::UnitTest::GetInstance()->current_test_info();
226 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800227 }
228
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800229 void writeBufferToFile(const char* basename) {
230 std::string filename(basename);
231 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
232 filename.append(".ppm");
233 std::ofstream file(filename.c_str(), std::ios::binary);
234 if (!file.is_open()) {
235 ALOGE("Unable to open file: %s", filename.c_str());
236 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
237 "surfaceflinger to write debug images");
238 return;
239 }
240
Alec Mouri1089aed2018-10-25 21:33:57 -0700241 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000242 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
243 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700244
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800245 file << "P6\n";
Alec Mouria90a5702021-04-16 16:36:21 +0000246 file << mBuffer->getBuffer()->getWidth() << "\n";
247 file << mBuffer->getBuffer()->getHeight() << "\n";
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800248 file << 255 << "\n";
249
Alec Mouria90a5702021-04-16 16:36:21 +0000250 std::vector<uint8_t> outBuffer(mBuffer->getBuffer()->getWidth() *
251 mBuffer->getBuffer()->getHeight() * 3);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800252 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
253
Alec Mouria90a5702021-04-16 16:36:21 +0000254 for (int32_t j = 0; j < mBuffer->getBuffer()->getHeight(); j++) {
255 const uint8_t* src = pixels + (mBuffer->getBuffer()->getStride() * j) * 4;
256 for (int32_t i = 0; i < mBuffer->getBuffer()->getWidth(); i++) {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800257 // Only copy R, G and B components
258 outPtr[0] = src[0];
259 outPtr[1] = src[1];
260 outPtr[2] = src[2];
261 outPtr += 3;
262
263 src += 4;
264 }
265 }
266 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
Alec Mouria90a5702021-04-16 16:36:21 +0000267 mBuffer->getBuffer()->unlock();
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800268 }
269
270 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
271 size_t c;
272 Rect const* rect = region.getArray(&c);
273 for (size_t i = 0; i < c; i++, rect++) {
274 expectBufferColor(*rect, r, g, b, a);
275 }
276 }
277
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -0400278 void expectBufferColor(const Point& point, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
279 uint8_t tolerance = 0) {
280 expectBufferColor(Rect(point.x, point.y, point.x + 1, point.y + 1), r, g, b, a, tolerance);
281 }
282
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800283 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
284 uint8_t tolerance = 0) {
285 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
286 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
287 uint8_t tmp = a >= b ? a - b : b - a;
288 return tmp <= tolerance;
289 };
290 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700291 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800292
293 expectBufferColor(rect, r, g, b, a, colorCompare);
294 }
295
296 void expectBufferColor(const Rect& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
297 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
298 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000299 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
300 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700301 int32_t maxFails = 10;
302 int32_t fails = 0;
303 for (int32_t j = 0; j < region.getHeight(); j++) {
Alec Mouria90a5702021-04-16 16:36:21 +0000304 const uint8_t* src = pixels +
305 (mBuffer->getBuffer()->getStride() * (region.top + j) + region.left) * 4;
Alec Mouri1089aed2018-10-25 21:33:57 -0700306 for (int32_t i = 0; i < region.getWidth(); i++) {
307 const uint8_t expected[4] = {r, g, b, a};
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800308 bool equal = colorCompare(src, expected);
Alec Mouri1089aed2018-10-25 21:33:57 -0700309 EXPECT_TRUE(equal)
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -0400310 << GetParam()->name().c_str() << ": "
Alec Mouri1089aed2018-10-25 21:33:57 -0700311 << "pixel @ (" << region.left + i << ", " << region.top + j << "): "
312 << "expected (" << static_cast<uint32_t>(r) << ", "
313 << static_cast<uint32_t>(g) << ", " << static_cast<uint32_t>(b) << ", "
314 << static_cast<uint32_t>(a) << "), "
315 << "got (" << static_cast<uint32_t>(src[0]) << ", "
316 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
317 << ", " << static_cast<uint32_t>(src[3]) << ")";
318 src += 4;
319 if (!equal && ++fails >= maxFails) {
320 break;
321 }
322 }
323 if (fails >= maxFails) {
324 break;
325 }
326 }
Alec Mouria90a5702021-04-16 16:36:21 +0000327 mBuffer->getBuffer()->unlock();
Alec Mouri1089aed2018-10-25 21:33:57 -0700328 }
329
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800330 void expectAlpha(const Rect& rect, uint8_t a) {
331 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
332 return colorA[3] == colorB[3];
333 };
334 expectBufferColor(rect, 0.0f /* r */, 0.0f /*g */, 0.0f /* b */, a, colorCompare);
335 }
336
337 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
338 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
339 const ubyte4& backgroundColor) {
340 const Rect casterRect(castingLayer.geometry.boundaries);
341 Region casterRegion = Region(casterRect);
342 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
343 if (casterCornerRadius > 0.0f) {
344 // ignore the corners if a corner radius is set
345 Rect cornerRect(casterCornerRadius, casterCornerRadius);
346 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
347 casterRegion.subtractSelf(
348 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
349 casterRegion.subtractSelf(
350 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
351 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
352 casterRect.bottom - casterCornerRadius));
353 }
354
355 const float shadowInset = shadow.length * -1.0f;
356 const Rect casterWithShadow =
357 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
358 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
359 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
360
361 // verify casting layer
362 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
363
364 // verify shadows by testing just the alpha since its difficult to validate the shadow color
365 size_t c;
366 Rect const* r = shadowRegion.getArray(&c);
367 for (size_t i = 0; i < c; i++, r++) {
368 expectAlpha(*r, 255);
369 }
370
371 // verify background
372 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
373 backgroundColor.a);
374 }
375
Alec Mouribd17b3b2020-12-17 11:08:30 -0800376 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
377 const renderengine::ShadowSettings& shadow,
378 const ubyte4& backgroundColor) {
379 const float shadowInset = shadow.length * -1.0f;
380 const Rect casterRect(casterBounds);
381 const Rect shadowRect =
382 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
383
384 const Region backgroundRegion =
385 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
386
387 expectAlpha(shadowRect, 255);
388 // (0, 0, 0) fill on the bounds of the layer should be ignored.
389 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
390
391 // verify background
392 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
393 backgroundColor.a);
394 }
395
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800396 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
397 bool casterIsTranslucent) {
398 renderengine::ShadowSettings shadow;
399 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
400 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
401 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
402 shadow.lightRadius = 0.0f;
403 shadow.length = shadowLength;
404 shadow.casterIsTranslucent = casterIsTranslucent;
405 return shadow;
406 }
407
Alec Mouri1089aed2018-10-25 21:33:57 -0700408 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
409
410 static Rect offsetRect() {
411 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
412 DEFAULT_DISPLAY_HEIGHT);
413 }
414
415 static Rect offsetRectAtZero() {
416 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
417 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
418 }
419
Vladimir Marko21092702021-10-12 12:43:47 +0000420 void invokeDraw(renderengine::DisplaySettings settings,
421 std::vector<const renderengine::LayerSettings*> layers) {
Sally Qi4cabdd02021-08-05 16:45:57 -0700422 std::future<renderengine::RenderEngineResult> result =
423 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd());
424 ASSERT_TRUE(result.valid());
425 auto [status, fence] = result.get();
Alec Mouri1089aed2018-10-25 21:33:57 -0700426
Derek Sollenbergerec411212021-08-25 10:54:47 -0400427 ASSERT_EQ(NO_ERROR, status);
428 if (fence.ok()) {
429 sync_wait(fence.get(), -1);
Alec Mouri1089aed2018-10-25 21:33:57 -0700430 }
431
Alec Mouric0aae732021-01-12 13:32:18 -0800432 if (layers.size() > 0 && mGLESRE != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000433 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700434 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700435 }
436
Alec Mourid43ccab2019-03-13 12:23:45 -0700437 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700438 renderengine::DisplaySettings settings;
Vladimir Marko21092702021-10-12 12:43:47 +0000439 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800440 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700441 }
442
Alec Mouri1089aed2018-10-25 21:33:57 -0700443 template <typename SourceVariant>
444 void fillBuffer(half r, half g, half b, half a);
445
446 template <typename SourceVariant>
447 void fillRedBuffer();
448
449 template <typename SourceVariant>
450 void fillGreenBuffer();
451
452 template <typename SourceVariant>
453 void fillBlueBuffer();
454
455 template <typename SourceVariant>
456 void fillRedTransparentBuffer();
457
458 template <typename SourceVariant>
459 void fillRedOffsetBuffer();
460
461 template <typename SourceVariant>
462 void fillBufferPhysicalOffset();
463
464 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700465 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700466
467 template <typename SourceVariant>
468 void fillBufferCheckersRotate0();
469
470 template <typename SourceVariant>
471 void fillBufferCheckersRotate90();
472
473 template <typename SourceVariant>
474 void fillBufferCheckersRotate180();
475
476 template <typename SourceVariant>
477 void fillBufferCheckersRotate270();
478
479 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800480 void fillBufferWithLayerTransform();
481
482 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700483 void fillBufferLayerTransform();
484
485 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800486 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800487
488 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700489 void fillBufferColorTransform();
490
Alec Mouri7c94edb2018-12-03 21:23:26 -0800491 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800492 void fillBufferWithColorTransformZeroLayerAlpha();
493
494 template <typename SourceVariant>
495 void fillBufferColorTransformZeroLayerAlpha();
496
497 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800498 void fillRedBufferWithRoundedCorners();
499
500 template <typename SourceVariant>
501 void fillBufferWithRoundedCorners();
502
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000503 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800504 void fillBufferAndBlurBackground();
505
506 template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700507 void fillSmallLayerAndBlurBackground();
508
509 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000510 void overlayCorners();
511
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800512 void fillRedBufferTextureTransform();
513
514 void fillBufferTextureTransform();
515
516 void fillRedBufferWithPremultiplyAlpha();
517
518 void fillBufferWithPremultiplyAlpha();
519
520 void fillRedBufferWithoutPremultiplyAlpha();
521
522 void fillBufferWithoutPremultiplyAlpha();
523
Alec Mouriac335532018-11-12 15:01:33 -0800524 void fillGreenColorBufferThenClearRegion();
525
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800526 template <typename SourceVariant>
527 void drawShadow(const renderengine::LayerSettings& castingLayer,
528 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
529 const ubyte4& backgroundColor);
530
Alec Mouribd17b3b2020-12-17 11:08:30 -0800531 void drawShadowWithoutCaster(const FloatRect& castingBounds,
532 const renderengine::ShadowSettings& shadow,
533 const ubyte4& backgroundColor);
534
Alec Mouric0aae732021-01-12 13:32:18 -0800535 void initializeRenderEngine();
536
537 std::unique_ptr<renderengine::RenderEngine> mRE;
Alec Mouria90a5702021-04-16 16:36:21 +0000538 std::shared_ptr<renderengine::ExternalTexture> mBuffer;
Alec Mouric0aae732021-01-12 13:32:18 -0800539 // GLESRenderEngine for testing GLES-specific behavior.
540 // Owened by mRE, but this is downcasted.
541 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800542
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800543 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700544};
545
Alec Mouric0aae732021-01-12 13:32:18 -0800546void RenderEngineTest::initializeRenderEngine() {
547 const auto& renderEngineFactory = GetParam();
548 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
549 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
550 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
551 // every time.
552 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
553 renderEngineFactory->createGLESRenderEngine();
554 mGLESRE = renderEngine.get();
555 mRE = std::move(renderEngine);
556 } else {
557 mRE = renderEngineFactory->createRenderEngine();
558 }
Alec Mouria90a5702021-04-16 16:36:21 +0000559 mBuffer = allocateDefaultBuffer();
Alec Mouric0aae732021-01-12 13:32:18 -0800560}
561
Alec Mouri1089aed2018-10-25 21:33:57 -0700562struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800563 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800564 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700565 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800566 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700567 }
568};
569
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800570struct RelaxOpaqueBufferVariant {
571 static void setOpaqueBit(renderengine::LayerSettings& layer) {
572 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800573 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800574 }
575
576 static uint8_t getAlphaChannel() { return 255; }
577};
578
579struct ForceOpaqueBufferVariant {
580 static void setOpaqueBit(renderengine::LayerSettings& layer) {
581 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800582 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800583 }
584
585 static uint8_t getAlphaChannel() {
586 // The isOpaque bit will override the alpha channel, so this should be
587 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800588 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800589 }
590};
591
592template <typename OpaquenessVariant>
593struct BufferSourceVariant {
594 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800595 RenderEngineTest* fixture) {
Alec Mouria90a5702021-04-16 16:36:21 +0000596 const auto buf = fixture->allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800597 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800598 fixture->mRE->genTextures(1, &texName);
599 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800600
601 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000602 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
603 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800604
Alec Mouria90a5702021-04-16 16:36:21 +0000605 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
606 uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
607 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800608 iter[0] = uint8_t(r * 255);
609 iter[1] = uint8_t(g * 255);
610 iter[2] = uint8_t(b * 255);
611 iter[3] = OpaquenessVariant::getAlphaChannel();
612 iter += 4;
613 }
614 }
615
Alec Mouria90a5702021-04-16 16:36:21 +0000616 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800617
618 layer.source.buffer.buffer = buf;
619 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800620 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800621 OpaquenessVariant::setOpaqueBit(layer);
622 }
623};
624
Alec Mouri1089aed2018-10-25 21:33:57 -0700625template <typename SourceVariant>
626void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
627 renderengine::DisplaySettings settings;
628 settings.physicalDisplay = fullscreenRect();
629 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800630 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700631
Vladimir Marko21092702021-10-12 12:43:47 +0000632 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700633
634 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800635 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700636 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800637 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700638 layer.alpha = a;
639
Vladimir Marko21092702021-10-12 12:43:47 +0000640 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700641
Alec Mouric0aae732021-01-12 13:32:18 -0800642 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700643}
644
645template <typename SourceVariant>
646void RenderEngineTest::fillRedBuffer() {
647 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
648 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
649}
650
651template <typename SourceVariant>
652void RenderEngineTest::fillGreenBuffer() {
653 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
654 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
655}
656
657template <typename SourceVariant>
658void RenderEngineTest::fillBlueBuffer() {
659 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
660 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
661}
662
663template <typename SourceVariant>
664void RenderEngineTest::fillRedTransparentBuffer() {
665 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
666 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
667}
668
669template <typename SourceVariant>
670void RenderEngineTest::fillRedOffsetBuffer() {
671 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800672 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700673 settings.physicalDisplay = offsetRect();
674 settings.clip = offsetRectAtZero();
675
Vladimir Marko21092702021-10-12 12:43:47 +0000676 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700677
678 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800679 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700680 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800681 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700682 layer.alpha = 1.0f;
683
Vladimir Marko21092702021-10-12 12:43:47 +0000684 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800685 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700686}
687
688template <typename SourceVariant>
689void RenderEngineTest::fillBufferPhysicalOffset() {
690 fillRedOffsetBuffer<SourceVariant>();
691
692 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
693 DEFAULT_DISPLAY_HEIGHT),
694 255, 0, 0, 255);
695 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
696 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
697
698 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
699 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
700}
701
702template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700703void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700704 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800705 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700706 settings.physicalDisplay = fullscreenRect();
707 // Here logical space is 2x2
708 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700709 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700710
Vladimir Marko21092702021-10-12 12:43:47 +0000711 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700712
713 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800714 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700715 Rect rectOne(0, 0, 1, 1);
716 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800717 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700718 layerOne.alpha = 1.0f;
719
720 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800721 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700722 Rect rectTwo(0, 1, 1, 2);
723 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800724 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700725 layerTwo.alpha = 1.0f;
726
727 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800728 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700729 Rect rectThree(1, 0, 2, 1);
730 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800731 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700732 layerThree.alpha = 1.0f;
733
Vladimir Marko21092702021-10-12 12:43:47 +0000734 layers.push_back(&layerOne);
735 layers.push_back(&layerTwo);
736 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700737
Alec Mouric0aae732021-01-12 13:32:18 -0800738 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700739}
740
741template <typename SourceVariant>
742void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700743 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700744 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
745 255);
746 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
747 DEFAULT_DISPLAY_HEIGHT / 2),
748 0, 0, 255, 255);
749 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
750 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
751 0, 0, 0, 0);
752 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
753 DEFAULT_DISPLAY_HEIGHT),
754 0, 255, 0, 255);
755}
756
757template <typename SourceVariant>
758void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700759 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700760 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
761 255);
762 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
763 DEFAULT_DISPLAY_HEIGHT / 2),
764 255, 0, 0, 255);
765 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
766 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
767 0, 0, 255, 255);
768 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
769 DEFAULT_DISPLAY_HEIGHT),
770 0, 0, 0, 0);
771}
772
773template <typename SourceVariant>
774void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700775 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700776 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
777 0);
778 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
779 DEFAULT_DISPLAY_HEIGHT / 2),
780 0, 255, 0, 255);
781 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
782 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
783 255, 0, 0, 255);
784 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
785 DEFAULT_DISPLAY_HEIGHT),
786 0, 0, 255, 255);
787}
788
789template <typename SourceVariant>
790void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700791 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700792 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
793 255);
794 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
795 DEFAULT_DISPLAY_HEIGHT / 2),
796 0, 0, 0, 0);
797 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
798 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
799 0, 255, 0, 255);
800 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
801 DEFAULT_DISPLAY_HEIGHT),
802 255, 0, 0, 255);
803}
804
805template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800806void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700807 renderengine::DisplaySettings settings;
808 settings.physicalDisplay = fullscreenRect();
809 // Here logical space is 2x2
810 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800811 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700812
Vladimir Marko21092702021-10-12 12:43:47 +0000813 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700814
815 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800816 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700817 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
818 // Translate one pixel diagonally
819 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 -0800820 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700821 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
822 layer.alpha = 1.0f;
823
Vladimir Marko21092702021-10-12 12:43:47 +0000824 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700825
Alec Mouric0aae732021-01-12 13:32:18 -0800826 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800827}
Alec Mouri1089aed2018-10-25 21:33:57 -0700828
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800829template <typename SourceVariant>
830void RenderEngineTest::fillBufferLayerTransform() {
831 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700832 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
833 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
834 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
835 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
836 255, 0, 0, 255);
837}
838
839template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800840void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700841 renderengine::DisplaySettings settings;
842 settings.physicalDisplay = fullscreenRect();
843 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800844 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700845
Vladimir Marko21092702021-10-12 12:43:47 +0000846 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700847
848 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800849 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700850 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800851 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700852 layer.alpha = 1.0f;
853
854 // construct a fake color matrix
855 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800856 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700857 // set red channel to red + green
858 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
859
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800860 layer.alpha = 1.0f;
861 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
862
Vladimir Marko21092702021-10-12 12:43:47 +0000863 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700864
Alec Mouric0aae732021-01-12 13:32:18 -0800865 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800866}
Alec Mouri1089aed2018-10-25 21:33:57 -0700867
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800868template <typename SourceVariant>
869void RenderEngineTest::fillBufferColorTransform() {
870 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800871 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
872}
873
874template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800875void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
876 renderengine::DisplaySettings settings;
877 settings.physicalDisplay = fullscreenRect();
878 settings.clip = Rect(1, 1);
879
Vladimir Marko21092702021-10-12 12:43:47 +0000880 std::vector<const renderengine::LayerSettings*> layers;
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800881
882 renderengine::LayerSettings layer;
883 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
884 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
885 layer.alpha = 0;
886
887 // construct a fake color matrix
888 // simple inverse color
889 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
890
891 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
892
Vladimir Marko21092702021-10-12 12:43:47 +0000893 layers.push_back(&layer);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800894
Alec Mouric0aae732021-01-12 13:32:18 -0800895 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800896}
897
898template <typename SourceVariant>
899void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
900 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
901 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
902}
903
904template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800905void RenderEngineTest::fillRedBufferWithRoundedCorners() {
906 renderengine::DisplaySettings settings;
907 settings.physicalDisplay = fullscreenRect();
908 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800909 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800910
Vladimir Marko21092702021-10-12 12:43:47 +0000911 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800912
913 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800914 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800915 layer.geometry.boundaries = fullscreenRect().toFloatRect();
916 layer.geometry.roundedCornersRadius = 5.0f;
917 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
918 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
919 layer.alpha = 1.0f;
920
Vladimir Marko21092702021-10-12 12:43:47 +0000921 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800922
Alec Mouric0aae732021-01-12 13:32:18 -0800923 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800924}
925
926template <typename SourceVariant>
927void RenderEngineTest::fillBufferWithRoundedCorners() {
928 fillRedBufferWithRoundedCorners<SourceVariant>();
929 // Corners should be ignored...
930 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
931 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
932 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
933 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
934 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
935 0, 0, 0, 0);
936 // ...And the non-rounded portion should be red.
937 // Other pixels may be anti-aliased, so let's not check those.
938 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
939 255);
940}
941
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000942template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800943void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800944 auto blurRadius = 50;
945 auto center = DEFAULT_DISPLAY_WIDTH / 2;
946
947 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800948 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800949 settings.physicalDisplay = fullscreenRect();
950 settings.clip = fullscreenRect();
951
Vladimir Marko21092702021-10-12 12:43:47 +0000952 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800953
954 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800955 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800956 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
957 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
958 backgroundLayer.alpha = 1.0f;
Vladimir Marko21092702021-10-12 12:43:47 +0000959 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800960
961 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800962 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800963 leftLayer.geometry.boundaries =
964 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
965 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
966 leftLayer.alpha = 1.0f;
Vladimir Marko21092702021-10-12 12:43:47 +0000967 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800968
969 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800970 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800971 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
972 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500973 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800974 blurLayer.alpha = 0;
Vladimir Marko21092702021-10-12 12:43:47 +0000975 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800976
Alec Mouric0aae732021-01-12 13:32:18 -0800977 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800978
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500979 // solid color
980 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
981
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500982 if (mRE->supportsBackgroundBlur()) {
983 // blurred color (downsampling should result in the center color being close to 128)
984 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
Nathaniel Nifong53494f32021-04-30 14:05:39 -0400985 50 /* tolerance */);
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500986 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800987}
988
989template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700990void RenderEngineTest::fillSmallLayerAndBlurBackground() {
991 auto blurRadius = 50;
992 renderengine::DisplaySettings settings;
993 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
994 settings.physicalDisplay = fullscreenRect();
995 settings.clip = fullscreenRect();
996
Vladimir Marko21092702021-10-12 12:43:47 +0000997 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourie8489fd2021-04-29 16:08:56 -0700998
999 renderengine::LayerSettings backgroundLayer;
1000 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1001 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1002 SourceVariant::fillColor(backgroundLayer, 1.0f, 0.0f, 0.0f, this);
1003 backgroundLayer.alpha = 1.0f;
Vladimir Marko21092702021-10-12 12:43:47 +00001004 layers.push_back(&backgroundLayer);
Alec Mourie8489fd2021-04-29 16:08:56 -07001005
1006 renderengine::LayerSettings blurLayer;
1007 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1008 blurLayer.geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f);
1009 blurLayer.backgroundBlurRadius = blurRadius;
1010 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
1011 blurLayer.alpha = 0;
Vladimir Marko21092702021-10-12 12:43:47 +00001012 layers.push_back(&blurLayer);
Alec Mourie8489fd2021-04-29 16:08:56 -07001013
1014 invokeDraw(settings, layers);
1015
1016 // Give a generous tolerance - the blur rectangle is very small and this test is
1017 // mainly concerned with ensuring that there's no device failure.
1018 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 255, 0, 0, 255,
1019 40 /* tolerance */);
1020}
1021
1022template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001023void RenderEngineTest::overlayCorners() {
1024 renderengine::DisplaySettings settings;
1025 settings.physicalDisplay = fullscreenRect();
1026 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001027 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001028
Vladimir Marko21092702021-10-12 12:43:47 +00001029 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001030
1031 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001032 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001033 layerOne.geometry.boundaries =
1034 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
1035 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
1036 layerOne.alpha = 0.2;
1037
Vladimir Marko21092702021-10-12 12:43:47 +00001038 layersFirst.push_back(&layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -08001039 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001040 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
1041 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1042 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1043 0, 0, 0, 0);
1044
Vladimir Marko21092702021-10-12 12:43:47 +00001045 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001046 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001047 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001048 layerTwo.geometry.boundaries =
1049 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1050 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1051 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1052 layerTwo.alpha = 1.0f;
1053
Vladimir Marko21092702021-10-12 12:43:47 +00001054 layersSecond.push_back(&layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001055 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001056
1057 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1058 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1059 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1060 0, 255, 0, 255);
1061}
1062
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001063void RenderEngineTest::fillRedBufferTextureTransform() {
1064 renderengine::DisplaySettings settings;
1065 settings.physicalDisplay = fullscreenRect();
1066 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001067 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001068
Vladimir Marko21092702021-10-12 12:43:47 +00001069 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001070
1071 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001072 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001073 // Here will allocate a checker board texture, but transform texture
1074 // coordinates so that only the upper left is applied.
Alec Mouria90a5702021-04-16 16:36:21 +00001075 const auto buf = allocateSourceBuffer(2, 2);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001076 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001077 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001078 this->mTexNames.push_back(texName);
1079
1080 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001081 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1082 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001083 // Red top left, Green top right, Blue bottom left, Black bottom right
1084 pixels[0] = 255;
1085 pixels[1] = 0;
1086 pixels[2] = 0;
1087 pixels[3] = 255;
1088 pixels[4] = 0;
1089 pixels[5] = 255;
1090 pixels[6] = 0;
1091 pixels[7] = 255;
1092 pixels[8] = 0;
1093 pixels[9] = 0;
1094 pixels[10] = 255;
1095 pixels[11] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001096 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001097
1098 layer.source.buffer.buffer = buf;
1099 layer.source.buffer.textureName = texName;
1100 // Transform coordinates to only be inside the red quadrant.
1101 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
1102 layer.alpha = 1.0f;
1103 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1104
Vladimir Marko21092702021-10-12 12:43:47 +00001105 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001106
Alec Mouric0aae732021-01-12 13:32:18 -08001107 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001108}
1109
1110void RenderEngineTest::fillBufferTextureTransform() {
1111 fillRedBufferTextureTransform();
1112 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1113}
1114
1115void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1116 renderengine::DisplaySettings settings;
1117 settings.physicalDisplay = fullscreenRect();
1118 // Here logical space is 1x1
1119 settings.clip = Rect(1, 1);
1120
Vladimir Marko21092702021-10-12 12:43:47 +00001121 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001122
1123 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001124 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001125 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001126 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001127 this->mTexNames.push_back(texName);
1128
1129 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001130 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1131 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001132 pixels[0] = 255;
1133 pixels[1] = 0;
1134 pixels[2] = 0;
1135 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001136 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001137
1138 layer.source.buffer.buffer = buf;
1139 layer.source.buffer.textureName = texName;
1140 layer.source.buffer.usePremultipliedAlpha = true;
1141 layer.alpha = 0.5f;
1142 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1143
Vladimir Marko21092702021-10-12 12:43:47 +00001144 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001145
Alec Mouric0aae732021-01-12 13:32:18 -08001146 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001147}
1148
1149void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1150 fillRedBufferWithPremultiplyAlpha();
1151 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1152}
1153
1154void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1155 renderengine::DisplaySettings settings;
1156 settings.physicalDisplay = fullscreenRect();
1157 // Here logical space is 1x1
1158 settings.clip = Rect(1, 1);
1159
Vladimir Marko21092702021-10-12 12:43:47 +00001160 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001161
1162 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001163 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001164 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001165 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001166 this->mTexNames.push_back(texName);
1167
1168 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001169 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1170 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001171 pixels[0] = 255;
1172 pixels[1] = 0;
1173 pixels[2] = 0;
1174 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001175 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001176
1177 layer.source.buffer.buffer = buf;
1178 layer.source.buffer.textureName = texName;
1179 layer.source.buffer.usePremultipliedAlpha = false;
1180 layer.alpha = 0.5f;
1181 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1182
Vladimir Marko21092702021-10-12 12:43:47 +00001183 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001184
Alec Mouric0aae732021-01-12 13:32:18 -08001185 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001186}
1187
1188void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1189 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001190 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001191}
1192
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001193template <typename SourceVariant>
1194void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1195 const renderengine::ShadowSettings& shadow,
1196 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1197 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001198 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001199 settings.physicalDisplay = fullscreenRect();
1200 settings.clip = fullscreenRect();
1201
Vladimir Marko21092702021-10-12 12:43:47 +00001202 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001203
1204 // add background layer
1205 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001206 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001207 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1208 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1209 backgroundColor.b / 255.0f, this);
1210 bgLayer.alpha = backgroundColor.a / 255.0f;
Vladimir Marko21092702021-10-12 12:43:47 +00001211 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001212
1213 // add shadow layer
1214 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001215 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001216 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1217 shadowLayer.alpha = castingLayer.alpha;
1218 shadowLayer.shadow = shadow;
Vladimir Marko21092702021-10-12 12:43:47 +00001219 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001220
1221 // add layer casting the shadow
1222 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001223 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001224 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1225 casterColor.b / 255.0f, this);
Vladimir Marko21092702021-10-12 12:43:47 +00001226 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001227
Alec Mouric0aae732021-01-12 13:32:18 -08001228 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001229}
1230
Alec Mouribd17b3b2020-12-17 11:08:30 -08001231void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1232 const renderengine::ShadowSettings& shadow,
1233 const ubyte4& backgroundColor) {
1234 renderengine::DisplaySettings settings;
1235 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1236 settings.physicalDisplay = fullscreenRect();
1237 settings.clip = fullscreenRect();
1238
Vladimir Marko21092702021-10-12 12:43:47 +00001239 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001240
1241 // add background layer
1242 renderengine::LayerSettings bgLayer;
1243 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1244 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1245 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1246 backgroundColor.b / 255.0f, this);
1247 bgLayer.alpha = backgroundColor.a / 255.0f;
Vladimir Marko21092702021-10-12 12:43:47 +00001248 layers.push_back(&bgLayer);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001249
1250 // add shadow layer
1251 renderengine::LayerSettings shadowLayer;
1252 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1253 shadowLayer.geometry.boundaries = castingBounds;
Derek Sollenbergerc31985e2021-05-18 16:38:17 -04001254 shadowLayer.skipContentDraw = true;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001255 shadowLayer.alpha = 1.0f;
1256 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1257 shadowLayer.shadow = shadow;
Vladimir Marko21092702021-10-12 12:43:47 +00001258 layers.push_back(&shadowLayer);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001259
Alec Mouric0aae732021-01-12 13:32:18 -08001260 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001261}
1262
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001263INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001264 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001265 std::make_shared<GLESCMRenderEngineFactory>(),
1266 std::make_shared<SkiaGLESRenderEngineFactory>(),
1267 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001268
1269TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001270 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001271 drawEmptyLayers();
1272}
1273
Ana Krulec07b98df2021-01-07 14:38:40 -08001274TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
Alec Mouria90a5702021-04-16 16:36:21 +00001275 initializeRenderEngine();
Ana Krulec07b98df2021-01-07 14:38:40 -08001276
1277 renderengine::DisplaySettings settings;
1278 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1279 settings.physicalDisplay = fullscreenRect();
1280 settings.clip = fullscreenRect();
1281
1282 // 255, 255, 255, 255 is full opaque white.
1283 const ubyte4 backgroundColor(255.f, 255.f, 255.f, 255.f);
1284 // Create layer with given color.
1285 renderengine::LayerSettings bgLayer;
1286 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1287 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1288 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1289 backgroundColor.b / 255.0f);
1290 bgLayer.alpha = backgroundColor.a / 255.0f;
1291 // Transform the red color.
1292 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1293
Vladimir Marko21092702021-10-12 12:43:47 +00001294 std::vector<const renderengine::LayerSettings*> layers;
1295 layers.push_back(&bgLayer);
Ana Krulec07b98df2021-01-07 14:38:40 -08001296
Alec Mouric0aae732021-01-12 13:32:18 -08001297 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001298
1299 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001300 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001301 backgroundColor.a);
1302}
1303
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001304TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001305 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001306
Alec Mourid43ccab2019-03-13 12:23:45 -07001307 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001308 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vladimir Marko21092702021-10-12 12:43:47 +00001309 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001310 renderengine::LayerSettings layer;
1311 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1312 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vladimir Marko21092702021-10-12 12:43:47 +00001313 layers.push_back(&layer);
Sally Qi4cabdd02021-08-05 16:45:57 -07001314 std::future<renderengine::RenderEngineResult> result =
1315 mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd());
Alec Mourid43ccab2019-03-13 12:23:45 -07001316
Sally Qi4cabdd02021-08-05 16:45:57 -07001317 ASSERT_TRUE(result.valid());
Derek Sollenbergerec411212021-08-25 10:54:47 -04001318 auto [status, fence] = result.get();
Alec Mourid43ccab2019-03-13 12:23:45 -07001319 ASSERT_EQ(BAD_VALUE, status);
Derek Sollenbergerec411212021-08-25 10:54:47 -04001320 ASSERT_FALSE(fence.ok());
Alec Mourid43ccab2019-03-13 12:23:45 -07001321}
1322
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001323TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1324 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001325
1326 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1327 // GLES-specific test
1328 return;
1329 }
1330
1331 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001332
Alec Mourife0d72b2019-03-21 14:05:56 -07001333 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001334 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001335 settings.physicalDisplay = fullscreenRect();
1336 settings.clip = fullscreenRect();
1337
Vladimir Marko21092702021-10-12 12:43:47 +00001338 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001339 renderengine::LayerSettings layer;
1340 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1341 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1342 layer.alpha = 1.0;
Vladimir Marko21092702021-10-12 12:43:47 +00001343 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001344
Sally Qi4cabdd02021-08-05 16:45:57 -07001345 std::future<renderengine::RenderEngineResult> result =
1346 mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd());
1347 ASSERT_TRUE(result.valid());
Derek Sollenbergerec411212021-08-25 10:54:47 -04001348 auto [status, fence] = result.get();
1349
Alec Mourife0d72b2019-03-21 14:05:56 -07001350 ASSERT_EQ(NO_ERROR, status);
Derek Sollenbergerec411212021-08-25 10:54:47 -04001351 if (fence.ok()) {
1352 sync_wait(fence.get(), -1);
1353 }
1354
Alec Mouria90a5702021-04-16 16:36:21 +00001355 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001356 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1357}
1358
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001359TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001360 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001361 fillRedBuffer<ColorSourceVariant>();
1362}
1363
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001364TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001365 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001366 fillGreenBuffer<ColorSourceVariant>();
1367}
1368
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001369TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001370 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001371 fillBlueBuffer<ColorSourceVariant>();
1372}
1373
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001374TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001375 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001376 fillRedTransparentBuffer<ColorSourceVariant>();
1377}
1378
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001379TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001380 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001381 fillBufferPhysicalOffset<ColorSourceVariant>();
1382}
1383
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001384TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001385 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001386 fillBufferCheckersRotate0<ColorSourceVariant>();
1387}
1388
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001389TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001390 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001391 fillBufferCheckersRotate90<ColorSourceVariant>();
1392}
1393
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001394TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001395 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001396 fillBufferCheckersRotate180<ColorSourceVariant>();
1397}
1398
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001399TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001400 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001401 fillBufferCheckersRotate270<ColorSourceVariant>();
1402}
1403
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001404TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001405 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001406 fillBufferLayerTransform<ColorSourceVariant>();
1407}
1408
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001409TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001410 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001411 fillBufferColorTransform<ColorSourceVariant>();
1412}
1413
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001414TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001415 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001416 fillBufferWithRoundedCorners<ColorSourceVariant>();
1417}
1418
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001419TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001420 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001421 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1422}
1423
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001424TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001425 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001426 fillBufferAndBlurBackground<ColorSourceVariant>();
1427}
1428
Alec Mourie8489fd2021-04-29 16:08:56 -07001429TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1430 initializeRenderEngine();
1431 fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1432}
1433
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001434TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001435 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001436 overlayCorners<ColorSourceVariant>();
1437}
1438
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001439TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001440 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001441 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1442}
1443
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001444TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001445 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001446 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1447}
1448
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001449TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001450 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001451 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1452}
1453
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001454TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001455 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001456 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1457}
1458
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001459TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001460 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001461 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1462}
1463
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001464TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001465 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001466 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1467}
1468
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001469TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001470 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001471 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1472}
1473
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001474TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001475 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001476 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1477}
1478
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001479TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001480 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001481 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1482}
1483
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001484TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001485 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001486 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1487}
1488
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001489TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001490 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001491 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1492}
1493
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001494TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001495 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001496 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1497}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001498
Alec Mouric0aae732021-01-12 13:32:18 -08001499TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1500 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001501 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1502}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001503
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001504TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001505 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001506 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1507}
1508
Alec Mourie8489fd2021-04-29 16:08:56 -07001509TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1510 initializeRenderEngine();
1511 fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1512}
1513
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001514TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001515 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001516 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1517}
1518
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001519TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001520 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001521 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1522}
1523
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001524TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001525 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001526 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1527}
1528
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001529TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001530 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001531 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1532}
1533
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001534TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001535 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001536 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1537}
1538
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001539TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001540 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001541 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1542}
1543
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001544TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001545 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001546 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1547}
1548
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001549TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001550 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001551 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1552}
1553
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001554TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001555 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001556 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1557}
1558
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001559TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001560 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001561 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1562}
1563
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001564TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001565 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001566 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1567}
1568
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001569TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001570 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001571 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1572}
1573
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001574TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001575 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001576 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1577}
1578
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001579TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001580 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001581 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1582}
1583
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001584TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001585 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001586 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1587}
1588
Alec Mourie8489fd2021-04-29 16:08:56 -07001589TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
1590 initializeRenderEngine();
1591 fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1592}
1593
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001594TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001595 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001596 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1597}
1598
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001599TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08001600 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001601 fillBufferTextureTransform();
1602}
1603
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001604TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001605 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001606 fillBufferWithPremultiplyAlpha();
1607}
1608
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001609TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001610 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001611 fillBufferWithoutPremultiplyAlpha();
1612}
1613
Alec Mouribd17b3b2020-12-17 11:08:30 -08001614TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001615 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08001616
1617 const ubyte4 backgroundColor(255, 255, 255, 255);
1618 const float shadowLength = 5.0f;
1619 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1620 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1621 renderengine::ShadowSettings settings =
1622 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1623 false /* casterIsTranslucent */);
1624
1625 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1626 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1627}
1628
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001629TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08001630 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001631
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001632 const ubyte4 casterColor(255, 0, 0, 255);
1633 const ubyte4 backgroundColor(255, 255, 255, 255);
1634 const float shadowLength = 5.0f;
1635 Rect casterBounds(1, 1);
1636 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1637 renderengine::LayerSettings castingLayer;
1638 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1639 castingLayer.alpha = 1.0f;
1640 renderengine::ShadowSettings settings =
1641 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1642 false /* casterIsTranslucent */);
1643
1644 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1645 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1646}
1647
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001648TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001649 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001650
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001651 const ubyte4 casterColor(255, 0, 0, 255);
1652 const ubyte4 backgroundColor(255, 255, 255, 255);
1653 const float shadowLength = 5.0f;
1654 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1655 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1656 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001657 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001658 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1659 castingLayer.alpha = 1.0f;
1660 renderengine::ShadowSettings settings =
1661 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1662 false /* casterIsTranslucent */);
1663
1664 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1665 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1666}
1667
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001668TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001669 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001670
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001671 const ubyte4 casterColor(255, 0, 0, 255);
1672 const ubyte4 backgroundColor(255, 255, 255, 255);
1673 const float shadowLength = 5.0f;
1674 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1675 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1676 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001677 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001678 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1679 castingLayer.alpha = 1.0f;
1680 renderengine::ShadowSettings settings =
1681 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1682 false /* casterIsTranslucent */);
1683
1684 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1685 backgroundColor);
1686 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1687}
1688
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001689TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08001690 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001691
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001692 const ubyte4 casterColor(255, 0, 0, 255);
1693 const ubyte4 backgroundColor(255, 255, 255, 255);
1694 const float shadowLength = 5.0f;
1695 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1696 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1697 renderengine::LayerSettings castingLayer;
1698 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1699 castingLayer.geometry.roundedCornersRadius = 3.0f;
1700 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1701 castingLayer.alpha = 1.0f;
1702 renderengine::ShadowSettings settings =
1703 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1704 false /* casterIsTranslucent */);
1705
1706 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1707 backgroundColor);
1708 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1709}
1710
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001711TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001712 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001713
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001714 const ubyte4 casterColor(255, 0, 0, 255);
1715 const ubyte4 backgroundColor(255, 255, 255, 255);
1716 const float shadowLength = 5.0f;
1717 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1718 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1719 renderengine::LayerSettings castingLayer;
1720 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1721 castingLayer.alpha = 0.5f;
1722 renderengine::ShadowSettings settings =
1723 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1724 true /* casterIsTranslucent */);
1725
1726 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1727 backgroundColor);
1728
1729 // verify only the background since the shadow will draw behind the caster
1730 const float shadowInset = settings.length * -1.0f;
1731 const Rect casterWithShadow =
1732 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1733 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1734 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1735 backgroundColor.a);
1736}
1737
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001738TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
Alec Mouric0aae732021-01-12 13:32:18 -08001739 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001740
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001741 renderengine::DisplaySettings settings;
1742 settings.physicalDisplay = fullscreenRect();
1743 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001744 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001745
Vladimir Marko21092702021-10-12 12:43:47 +00001746 std::vector<const renderengine::LayerSettings*> layers;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001747 renderengine::LayerSettings layer;
1748 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1749 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1750 layer.alpha = 1.0;
Vladimir Marko21092702021-10-12 12:43:47 +00001751 layers.push_back(&layer);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001752
Sally Qi4cabdd02021-08-05 16:45:57 -07001753 std::future<renderengine::RenderEngineResult> resultOne =
1754 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd());
1755 ASSERT_TRUE(resultOne.valid());
1756 auto [statusOne, fenceOne] = resultOne.get();
1757 ASSERT_EQ(NO_ERROR, statusOne);
1758
1759 std::future<renderengine::RenderEngineResult> resultTwo =
1760 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne));
1761 ASSERT_TRUE(resultTwo.valid());
1762 auto [statusTwo, fenceTwo] = resultTwo.get();
1763 ASSERT_EQ(NO_ERROR, statusTwo);
Derek Sollenbergerec411212021-08-25 10:54:47 -04001764 if (fenceTwo.ok()) {
1765 sync_wait(fenceTwo.get(), -1);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001766 }
Derek Sollenbergerec411212021-08-25 10:54:47 -04001767
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001768 // Only cleanup the first time.
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04001769 EXPECT_FALSE(mRE->canSkipPostRenderCleanup());
1770 mRE->cleanupPostRender();
1771 EXPECT_TRUE(mRE->canSkipPostRenderCleanup());
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001772}
1773
Ana Krulecf9a15d92020-12-11 08:35:00 -08001774TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08001775 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08001776
1777 renderengine::DisplaySettings settings;
1778 settings.physicalDisplay = fullscreenRect();
1779 settings.clip = fullscreenRect();
1780 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1781
Vladimir Marko21092702021-10-12 12:43:47 +00001782 std::vector<const renderengine::LayerSettings*> layers;
Ana Krulecf9a15d92020-12-11 08:35:00 -08001783
1784 renderengine::LayerSettings redLayer;
1785 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1786 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1787 redLayer.geometry.roundedCornersRadius = 5.0f;
1788 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1789 // Red background.
1790 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1791 redLayer.alpha = 1.0f;
1792
Vladimir Marko21092702021-10-12 12:43:47 +00001793 layers.push_back(&redLayer);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001794
1795 // Green layer with 1/3 size.
1796 renderengine::LayerSettings greenLayer;
1797 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1798 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1799 greenLayer.geometry.roundedCornersRadius = 5.0f;
1800 // Bottom right corner is not going to be rounded.
1801 greenLayer.geometry.roundedCornersCrop =
1802 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
1803 DEFAULT_DISPLAY_HEIGHT)
1804 .toFloatRect();
1805 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1806 greenLayer.alpha = 1.0f;
1807
Vladimir Marko21092702021-10-12 12:43:47 +00001808 layers.push_back(&greenLayer);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001809
Alec Mouric0aae732021-01-12 13:32:18 -08001810 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001811
1812 // Corners should be ignored...
1813 // Screen size: width is 128, height is 256.
1814 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1815 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1816 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1817 // Bottom right corner is kept out of the clipping, and it's green.
1818 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1819 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1820 0, 255, 0, 255);
1821}
1822
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04001823TEST_P(RenderEngineTest, testRoundedCornersParentCrop) {
1824 initializeRenderEngine();
1825
1826 renderengine::DisplaySettings settings;
1827 settings.physicalDisplay = fullscreenRect();
1828 settings.clip = fullscreenRect();
1829 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1830
Vladimir Marko21092702021-10-12 12:43:47 +00001831 std::vector<const renderengine::LayerSettings*> layers;
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04001832
1833 renderengine::LayerSettings redLayer;
1834 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1835 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1836 redLayer.geometry.roundedCornersRadius = 5.0f;
1837 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1838 // Red background.
1839 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1840 redLayer.alpha = 1.0f;
1841
Vladimir Marko21092702021-10-12 12:43:47 +00001842 layers.push_back(&redLayer);
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04001843
1844 // Green layer with 1/2 size with parent crop rect.
1845 renderengine::LayerSettings greenLayer = redLayer;
1846 greenLayer.geometry.boundaries =
1847 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2);
1848 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1849
Vladimir Marko21092702021-10-12 12:43:47 +00001850 layers.push_back(&greenLayer);
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04001851
1852 invokeDraw(settings, layers);
1853
1854 // Due to roundedCornersRadius, the corners are untouched.
1855 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
1856 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
1857 expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1858 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1859
1860 // top middle should be green and the bottom middle red
1861 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 0), 0, 255, 0, 255);
1862 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 255);
1863
1864 // the bottom edge of the green layer should not be rounded
1865 expectBufferColor(Point(0, (DEFAULT_DISPLAY_HEIGHT / 2) - 1), 0, 255, 0, 255);
1866}
1867
Derek Sollenberger547d0a62021-07-27 14:09:17 -04001868TEST_P(RenderEngineTest, testRoundedCornersParentCropSmallBounds) {
1869 initializeRenderEngine();
1870
1871 renderengine::DisplaySettings settings;
1872 settings.physicalDisplay = fullscreenRect();
1873 settings.clip = fullscreenRect();
1874 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1875
Vladimir Marko21092702021-10-12 12:43:47 +00001876 std::vector<const renderengine::LayerSettings*> layers;
Derek Sollenberger547d0a62021-07-27 14:09:17 -04001877
1878 renderengine::LayerSettings redLayer;
1879 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1880 redLayer.geometry.boundaries = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 32);
1881 redLayer.geometry.roundedCornersRadius = 64;
1882 redLayer.geometry.roundedCornersCrop = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 128);
1883 // Red background.
1884 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1885 redLayer.alpha = 1.0f;
1886
Vladimir Marko21092702021-10-12 12:43:47 +00001887 layers.push_back(&redLayer);
Derek Sollenberger547d0a62021-07-27 14:09:17 -04001888 invokeDraw(settings, layers);
1889
1890 // Due to roundedCornersRadius, the top corners are untouched.
1891 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
1892 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
1893
1894 // ensure that the entire height of the red layer was clipped by the rounded corners crop.
1895 expectBufferColor(Point(0, 31), 0, 0, 0, 0);
1896 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 31), 0, 0, 0, 0);
1897
1898 // the bottom middle should be red
1899 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 31), 255, 0, 0, 255);
1900}
1901
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001902TEST_P(RenderEngineTest, testClear) {
1903 initializeRenderEngine();
1904
1905 const auto rect = fullscreenRect();
1906 const renderengine::DisplaySettings display{
1907 .physicalDisplay = rect,
1908 .clip = rect,
1909 };
1910
1911 const renderengine::LayerSettings redLayer{
1912 .geometry.boundaries = rect.toFloatRect(),
1913 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1914 .alpha = 1.0f,
1915 };
1916
1917 // This mimics prepareClearClientComposition. This layer should overwrite
1918 // the redLayer, so that the buffer is transparent, rather than red.
1919 const renderengine::LayerSettings clearLayer{
1920 .geometry.boundaries = rect.toFloatRect(),
1921 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
1922 .alpha = 0.0f,
1923 .disableBlending = true,
1924 };
1925
Vladimir Marko21092702021-10-12 12:43:47 +00001926 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &clearLayer};
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001927 invokeDraw(display, layers);
1928 expectBufferColor(rect, 0, 0, 0, 0);
1929}
1930
1931TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
1932 initializeRenderEngine();
1933
1934 const auto rect = Rect(0, 0, 1, 1);
1935 const renderengine::DisplaySettings display{
1936 .physicalDisplay = rect,
1937 .clip = rect,
1938 };
1939
1940 const renderengine::LayerSettings redLayer{
1941 .geometry.boundaries = rect.toFloatRect(),
1942 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1943 .alpha = 1.0f,
1944 };
1945
1946 // The next layer will overwrite redLayer with a GraphicBuffer that is green
1947 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00001948 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001949 {
1950 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001951 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1952 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001953 pixels[0] = 0;
1954 pixels[1] = 255;
1955 pixels[2] = 0;
1956 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001957 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001958 }
1959
1960 const renderengine::LayerSettings greenLayer{
1961 .geometry.boundaries = rect.toFloatRect(),
1962 .source =
1963 renderengine::PixelSource{
1964 .buffer =
1965 renderengine::Buffer{
1966 .buffer = buf,
1967 .usePremultipliedAlpha = true,
1968 },
1969 },
1970 .alpha = 0.5f,
1971 .disableBlending = true,
1972 };
1973
Vladimir Marko21092702021-10-12 12:43:47 +00001974 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &greenLayer};
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001975 invokeDraw(display, layers);
1976 expectBufferColor(rect, 0, 128, 0, 128);
1977}
1978
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04001979TEST_P(RenderEngineTest, test_isOpaque) {
1980 initializeRenderEngine();
1981
1982 const auto rect = Rect(0, 0, 1, 1);
1983 const renderengine::DisplaySettings display{
1984 .physicalDisplay = rect,
1985 .clip = rect,
1986 .outputDataspace = ui::Dataspace::DISPLAY_P3,
1987 };
1988
1989 // Create an unpremul buffer that is green with no alpha. Using isOpaque
1990 // should make the green show.
1991 const auto buf = allocateSourceBuffer(1, 1);
1992 {
1993 uint8_t* pixels;
1994 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1995 reinterpret_cast<void**>(&pixels));
1996 pixels[0] = 0;
1997 pixels[1] = 255;
1998 pixels[2] = 0;
1999 pixels[3] = 0;
2000 buf->getBuffer()->unlock();
2001 }
2002
2003 const renderengine::LayerSettings greenLayer{
2004 .geometry.boundaries = rect.toFloatRect(),
2005 .source =
2006 renderengine::PixelSource{
2007 .buffer =
2008 renderengine::Buffer{
2009 .buffer = buf,
2010 // Although the pixels are not
2011 // premultiplied in practice, this
2012 // matches the input we see.
2013 .usePremultipliedAlpha = true,
2014 .isOpaque = true,
2015 },
2016 },
2017 .alpha = 1.0f,
2018 };
2019
Vladimir Marko21092702021-10-12 12:43:47 +00002020 std::vector<const renderengine::LayerSettings*> layers{&greenLayer};
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04002021 invokeDraw(display, layers);
2022
2023 if (GetParam()->useColorManagement()) {
2024 expectBufferColor(rect, 117, 251, 76, 255);
2025 } else {
2026 expectBufferColor(rect, 0, 255, 0, 255);
2027 }
2028}
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04002029} // namespace renderengine
Alec Mouri6e57f682018-09-29 20:45:08 -07002030} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08002031
2032// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002033#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"