blob: 33053a0a612e9edfa3bd40651309be88946789ad [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
Alec Mourid43ccab2019-03-13 12:23:45 -0700420 void invokeDraw(renderengine::DisplaySettings settings,
Alec Mouric0aae732021-01-12 13:32:18 -0800421 std::vector<const renderengine::LayerSettings*> layers) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700422 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800423 status_t status =
Alec Mouric0aae732021-01-12 13:32:18 -0800424 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri1089aed2018-10-25 21:33:57 -0700425
426 int fd = fence.release();
427 if (fd >= 0) {
428 sync_wait(fd, -1);
429 close(fd);
430 }
431
432 ASSERT_EQ(NO_ERROR, status);
Alec Mouric0aae732021-01-12 13:32:18 -0800433 if (layers.size() > 0 && mGLESRE != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000434 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700435 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700436 }
437
Alec Mourid43ccab2019-03-13 12:23:45 -0700438 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700439 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800440 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800441 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700442 }
443
Alec Mouri1089aed2018-10-25 21:33:57 -0700444 template <typename SourceVariant>
445 void fillBuffer(half r, half g, half b, half a);
446
447 template <typename SourceVariant>
448 void fillRedBuffer();
449
450 template <typename SourceVariant>
451 void fillGreenBuffer();
452
453 template <typename SourceVariant>
454 void fillBlueBuffer();
455
456 template <typename SourceVariant>
457 void fillRedTransparentBuffer();
458
459 template <typename SourceVariant>
460 void fillRedOffsetBuffer();
461
462 template <typename SourceVariant>
463 void fillBufferPhysicalOffset();
464
465 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700466 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700467
468 template <typename SourceVariant>
469 void fillBufferCheckersRotate0();
470
471 template <typename SourceVariant>
472 void fillBufferCheckersRotate90();
473
474 template <typename SourceVariant>
475 void fillBufferCheckersRotate180();
476
477 template <typename SourceVariant>
478 void fillBufferCheckersRotate270();
479
480 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800481 void fillBufferWithLayerTransform();
482
483 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700484 void fillBufferLayerTransform();
485
486 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800487 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800488
489 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700490 void fillBufferColorTransform();
491
Alec Mouri7c94edb2018-12-03 21:23:26 -0800492 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800493 void fillBufferWithColorTransformZeroLayerAlpha();
494
495 template <typename SourceVariant>
496 void fillBufferColorTransformZeroLayerAlpha();
497
498 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800499 void fillRedBufferWithRoundedCorners();
500
501 template <typename SourceVariant>
502 void fillBufferWithRoundedCorners();
503
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000504 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800505 void fillBufferAndBlurBackground();
506
507 template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700508 void fillSmallLayerAndBlurBackground();
509
510 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000511 void overlayCorners();
512
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800513 void fillRedBufferTextureTransform();
514
515 void fillBufferTextureTransform();
516
517 void fillRedBufferWithPremultiplyAlpha();
518
519 void fillBufferWithPremultiplyAlpha();
520
521 void fillRedBufferWithoutPremultiplyAlpha();
522
523 void fillBufferWithoutPremultiplyAlpha();
524
Alec Mouriac335532018-11-12 15:01:33 -0800525 void fillGreenColorBufferThenClearRegion();
526
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800527 template <typename SourceVariant>
528 void drawShadow(const renderengine::LayerSettings& castingLayer,
529 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
530 const ubyte4& backgroundColor);
531
Alec Mouribd17b3b2020-12-17 11:08:30 -0800532 void drawShadowWithoutCaster(const FloatRect& castingBounds,
533 const renderengine::ShadowSettings& shadow,
534 const ubyte4& backgroundColor);
535
Alec Mouric0aae732021-01-12 13:32:18 -0800536 void initializeRenderEngine();
537
538 std::unique_ptr<renderengine::RenderEngine> mRE;
Alec Mouria90a5702021-04-16 16:36:21 +0000539 std::shared_ptr<renderengine::ExternalTexture> mBuffer;
Alec Mouric0aae732021-01-12 13:32:18 -0800540 // GLESRenderEngine for testing GLES-specific behavior.
541 // Owened by mRE, but this is downcasted.
542 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800543
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800544 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700545};
546
Alec Mouric0aae732021-01-12 13:32:18 -0800547void RenderEngineTest::initializeRenderEngine() {
548 const auto& renderEngineFactory = GetParam();
549 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
550 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
551 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
552 // every time.
553 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
554 renderEngineFactory->createGLESRenderEngine();
555 mGLESRE = renderEngine.get();
556 mRE = std::move(renderEngine);
557 } else {
558 mRE = renderEngineFactory->createRenderEngine();
559 }
Alec Mouria90a5702021-04-16 16:36:21 +0000560 mBuffer = allocateDefaultBuffer();
Alec Mouric0aae732021-01-12 13:32:18 -0800561}
562
Alec Mouri1089aed2018-10-25 21:33:57 -0700563struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800564 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800565 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700566 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800567 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700568 }
569};
570
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800571struct RelaxOpaqueBufferVariant {
572 static void setOpaqueBit(renderengine::LayerSettings& layer) {
573 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800574 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800575 }
576
577 static uint8_t getAlphaChannel() { return 255; }
578};
579
580struct ForceOpaqueBufferVariant {
581 static void setOpaqueBit(renderengine::LayerSettings& layer) {
582 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800583 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800584 }
585
586 static uint8_t getAlphaChannel() {
587 // The isOpaque bit will override the alpha channel, so this should be
588 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800589 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800590 }
591};
592
593template <typename OpaquenessVariant>
594struct BufferSourceVariant {
595 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800596 RenderEngineTest* fixture) {
Alec Mouria90a5702021-04-16 16:36:21 +0000597 const auto buf = fixture->allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800598 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800599 fixture->mRE->genTextures(1, &texName);
600 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800601
602 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000603 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
604 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800605
Alec Mouria90a5702021-04-16 16:36:21 +0000606 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
607 uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
608 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800609 iter[0] = uint8_t(r * 255);
610 iter[1] = uint8_t(g * 255);
611 iter[2] = uint8_t(b * 255);
612 iter[3] = OpaquenessVariant::getAlphaChannel();
613 iter += 4;
614 }
615 }
616
Alec Mouria90a5702021-04-16 16:36:21 +0000617 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800618
619 layer.source.buffer.buffer = buf;
620 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800621 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800622 OpaquenessVariant::setOpaqueBit(layer);
623 }
624};
625
Alec Mouri1089aed2018-10-25 21:33:57 -0700626template <typename SourceVariant>
627void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
628 renderengine::DisplaySettings settings;
629 settings.physicalDisplay = fullscreenRect();
630 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800631 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700632
Vishnu Nair9b079a22020-01-21 14:36:08 -0800633 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700634
635 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800636 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700637 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800638 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700639 layer.alpha = a;
640
Vishnu Nair9b079a22020-01-21 14:36:08 -0800641 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700642
Alec Mouric0aae732021-01-12 13:32:18 -0800643 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700644}
645
646template <typename SourceVariant>
647void RenderEngineTest::fillRedBuffer() {
648 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
649 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
650}
651
652template <typename SourceVariant>
653void RenderEngineTest::fillGreenBuffer() {
654 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
655 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
656}
657
658template <typename SourceVariant>
659void RenderEngineTest::fillBlueBuffer() {
660 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
661 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
662}
663
664template <typename SourceVariant>
665void RenderEngineTest::fillRedTransparentBuffer() {
666 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
667 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
668}
669
670template <typename SourceVariant>
671void RenderEngineTest::fillRedOffsetBuffer() {
672 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800673 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700674 settings.physicalDisplay = offsetRect();
675 settings.clip = offsetRectAtZero();
676
Vishnu Nair9b079a22020-01-21 14:36:08 -0800677 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700678
679 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800680 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700681 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800682 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700683 layer.alpha = 1.0f;
684
Vishnu Nair9b079a22020-01-21 14:36:08 -0800685 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800686 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700687}
688
689template <typename SourceVariant>
690void RenderEngineTest::fillBufferPhysicalOffset() {
691 fillRedOffsetBuffer<SourceVariant>();
692
693 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
694 DEFAULT_DISPLAY_HEIGHT),
695 255, 0, 0, 255);
696 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
697 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
698
699 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
700 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
701}
702
703template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700704void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700705 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800706 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700707 settings.physicalDisplay = fullscreenRect();
708 // Here logical space is 2x2
709 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700710 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700711
Vishnu Nair9b079a22020-01-21 14:36:08 -0800712 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700713
714 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800715 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700716 Rect rectOne(0, 0, 1, 1);
717 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800718 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700719 layerOne.alpha = 1.0f;
720
721 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800722 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700723 Rect rectTwo(0, 1, 1, 2);
724 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800725 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700726 layerTwo.alpha = 1.0f;
727
728 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800729 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700730 Rect rectThree(1, 0, 2, 1);
731 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800732 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700733 layerThree.alpha = 1.0f;
734
Vishnu Nair9b079a22020-01-21 14:36:08 -0800735 layers.push_back(&layerOne);
736 layers.push_back(&layerTwo);
737 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700738
Alec Mouric0aae732021-01-12 13:32:18 -0800739 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700740}
741
742template <typename SourceVariant>
743void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700744 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700745 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
746 255);
747 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
748 DEFAULT_DISPLAY_HEIGHT / 2),
749 0, 0, 255, 255);
750 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
751 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
752 0, 0, 0, 0);
753 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
754 DEFAULT_DISPLAY_HEIGHT),
755 0, 255, 0, 255);
756}
757
758template <typename SourceVariant>
759void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700760 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700761 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
762 255);
763 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
764 DEFAULT_DISPLAY_HEIGHT / 2),
765 255, 0, 0, 255);
766 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
767 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
768 0, 0, 255, 255);
769 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
770 DEFAULT_DISPLAY_HEIGHT),
771 0, 0, 0, 0);
772}
773
774template <typename SourceVariant>
775void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700776 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700777 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
778 0);
779 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
780 DEFAULT_DISPLAY_HEIGHT / 2),
781 0, 255, 0, 255);
782 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
783 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
784 255, 0, 0, 255);
785 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
786 DEFAULT_DISPLAY_HEIGHT),
787 0, 0, 255, 255);
788}
789
790template <typename SourceVariant>
791void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700792 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700793 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
794 255);
795 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
796 DEFAULT_DISPLAY_HEIGHT / 2),
797 0, 0, 0, 0);
798 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
799 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
800 0, 255, 0, 255);
801 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
802 DEFAULT_DISPLAY_HEIGHT),
803 255, 0, 0, 255);
804}
805
806template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800807void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700808 renderengine::DisplaySettings settings;
809 settings.physicalDisplay = fullscreenRect();
810 // Here logical space is 2x2
811 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800812 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700813
Vishnu Nair9b079a22020-01-21 14:36:08 -0800814 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700815
816 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800817 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700818 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
819 // Translate one pixel diagonally
820 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 -0800821 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700822 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
823 layer.alpha = 1.0f;
824
Vishnu Nair9b079a22020-01-21 14:36:08 -0800825 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700826
Alec Mouric0aae732021-01-12 13:32:18 -0800827 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800828}
Alec Mouri1089aed2018-10-25 21:33:57 -0700829
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800830template <typename SourceVariant>
831void RenderEngineTest::fillBufferLayerTransform() {
832 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700833 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
834 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
835 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
836 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
837 255, 0, 0, 255);
838}
839
840template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800841void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700842 renderengine::DisplaySettings settings;
843 settings.physicalDisplay = fullscreenRect();
844 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800845 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700846
Vishnu Nair9b079a22020-01-21 14:36:08 -0800847 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700848
849 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800850 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700851 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800852 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700853 layer.alpha = 1.0f;
854
855 // construct a fake color matrix
856 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800857 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700858 // set red channel to red + green
859 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
860
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800861 layer.alpha = 1.0f;
862 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
863
Vishnu Nair9b079a22020-01-21 14:36:08 -0800864 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700865
Alec Mouric0aae732021-01-12 13:32:18 -0800866 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800867}
Alec Mouri1089aed2018-10-25 21:33:57 -0700868
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800869template <typename SourceVariant>
870void RenderEngineTest::fillBufferColorTransform() {
871 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800872 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
873}
874
875template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800876void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
877 renderengine::DisplaySettings settings;
878 settings.physicalDisplay = fullscreenRect();
879 settings.clip = Rect(1, 1);
880
881 std::vector<const renderengine::LayerSettings*> layers;
882
883 renderengine::LayerSettings layer;
884 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
885 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
886 layer.alpha = 0;
887
888 // construct a fake color matrix
889 // simple inverse color
890 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
891
892 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
893
894 layers.push_back(&layer);
895
Alec Mouric0aae732021-01-12 13:32:18 -0800896 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800897}
898
899template <typename SourceVariant>
900void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
901 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
902 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
903}
904
905template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800906void RenderEngineTest::fillRedBufferWithRoundedCorners() {
907 renderengine::DisplaySettings settings;
908 settings.physicalDisplay = fullscreenRect();
909 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800910 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800911
Vishnu Nair9b079a22020-01-21 14:36:08 -0800912 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800913
914 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800915 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800916 layer.geometry.boundaries = fullscreenRect().toFloatRect();
917 layer.geometry.roundedCornersRadius = 5.0f;
918 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
919 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
920 layer.alpha = 1.0f;
921
Vishnu Nair9b079a22020-01-21 14:36:08 -0800922 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800923
Alec Mouric0aae732021-01-12 13:32:18 -0800924 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800925}
926
927template <typename SourceVariant>
928void RenderEngineTest::fillBufferWithRoundedCorners() {
929 fillRedBufferWithRoundedCorners<SourceVariant>();
930 // Corners should be ignored...
931 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
932 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
933 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
934 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
935 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
936 0, 0, 0, 0);
937 // ...And the non-rounded portion should be red.
938 // Other pixels may be anti-aliased, so let's not check those.
939 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
940 255);
941}
942
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000943template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800944void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800945 auto blurRadius = 50;
946 auto center = DEFAULT_DISPLAY_WIDTH / 2;
947
948 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800949 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800950 settings.physicalDisplay = fullscreenRect();
951 settings.clip = fullscreenRect();
952
Vishnu Nair9b079a22020-01-21 14:36:08 -0800953 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800954
955 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800956 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800957 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
958 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
959 backgroundLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800960 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800961
962 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800963 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800964 leftLayer.geometry.boundaries =
965 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
966 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
967 leftLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800968 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800969
970 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800971 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800972 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
973 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500974 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800975 blurLayer.alpha = 0;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800976 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800977
Alec Mouric0aae732021-01-12 13:32:18 -0800978 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800979
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500980 // solid color
981 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
982
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500983 if (mRE->supportsBackgroundBlur()) {
984 // blurred color (downsampling should result in the center color being close to 128)
985 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
Nathaniel Nifong53494f32021-04-30 14:05:39 -0400986 50 /* tolerance */);
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500987 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800988}
989
990template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700991void RenderEngineTest::fillSmallLayerAndBlurBackground() {
992 auto blurRadius = 50;
993 renderengine::DisplaySettings settings;
994 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
995 settings.physicalDisplay = fullscreenRect();
996 settings.clip = fullscreenRect();
997
998 std::vector<const renderengine::LayerSettings*> layers;
999
1000 renderengine::LayerSettings backgroundLayer;
1001 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1002 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1003 SourceVariant::fillColor(backgroundLayer, 1.0f, 0.0f, 0.0f, this);
1004 backgroundLayer.alpha = 1.0f;
1005 layers.push_back(&backgroundLayer);
1006
1007 renderengine::LayerSettings blurLayer;
1008 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1009 blurLayer.geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f);
1010 blurLayer.backgroundBlurRadius = blurRadius;
1011 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
1012 blurLayer.alpha = 0;
1013 layers.push_back(&blurLayer);
1014
1015 invokeDraw(settings, layers);
1016
1017 // Give a generous tolerance - the blur rectangle is very small and this test is
1018 // mainly concerned with ensuring that there's no device failure.
1019 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 255, 0, 0, 255,
1020 40 /* tolerance */);
1021}
1022
1023template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001024void RenderEngineTest::overlayCorners() {
1025 renderengine::DisplaySettings settings;
1026 settings.physicalDisplay = fullscreenRect();
1027 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001028 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001029
Vishnu Nair9b079a22020-01-21 14:36:08 -08001030 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001031
1032 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001033 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001034 layerOne.geometry.boundaries =
1035 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
1036 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
1037 layerOne.alpha = 0.2;
1038
Vishnu Nair9b079a22020-01-21 14:36:08 -08001039 layersFirst.push_back(&layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -08001040 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001041 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
1042 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1043 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1044 0, 0, 0, 0);
1045
Vishnu Nair9b079a22020-01-21 14:36:08 -08001046 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001047 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001048 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001049 layerTwo.geometry.boundaries =
1050 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1051 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1052 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1053 layerTwo.alpha = 1.0f;
1054
Vishnu Nair9b079a22020-01-21 14:36:08 -08001055 layersSecond.push_back(&layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001056 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001057
1058 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1059 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1060 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1061 0, 255, 0, 255);
1062}
1063
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001064void RenderEngineTest::fillRedBufferTextureTransform() {
1065 renderengine::DisplaySettings settings;
1066 settings.physicalDisplay = fullscreenRect();
1067 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001068 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001069
Vishnu Nair9b079a22020-01-21 14:36:08 -08001070 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001071
1072 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001073 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001074 // Here will allocate a checker board texture, but transform texture
1075 // coordinates so that only the upper left is applied.
Alec Mouria90a5702021-04-16 16:36:21 +00001076 const auto buf = allocateSourceBuffer(2, 2);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001077 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001078 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001079 this->mTexNames.push_back(texName);
1080
1081 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001082 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1083 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001084 // Red top left, Green top right, Blue bottom left, Black bottom right
1085 pixels[0] = 255;
1086 pixels[1] = 0;
1087 pixels[2] = 0;
1088 pixels[3] = 255;
1089 pixels[4] = 0;
1090 pixels[5] = 255;
1091 pixels[6] = 0;
1092 pixels[7] = 255;
1093 pixels[8] = 0;
1094 pixels[9] = 0;
1095 pixels[10] = 255;
1096 pixels[11] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001097 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001098
1099 layer.source.buffer.buffer = buf;
1100 layer.source.buffer.textureName = texName;
1101 // Transform coordinates to only be inside the red quadrant.
1102 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
1103 layer.alpha = 1.0f;
1104 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1105
Vishnu Nair9b079a22020-01-21 14:36:08 -08001106 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001107
Alec Mouric0aae732021-01-12 13:32:18 -08001108 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001109}
1110
1111void RenderEngineTest::fillBufferTextureTransform() {
1112 fillRedBufferTextureTransform();
1113 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1114}
1115
1116void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1117 renderengine::DisplaySettings settings;
1118 settings.physicalDisplay = fullscreenRect();
1119 // Here logical space is 1x1
1120 settings.clip = Rect(1, 1);
1121
Vishnu Nair9b079a22020-01-21 14:36:08 -08001122 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001123
1124 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001125 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001126 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001127 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001128 this->mTexNames.push_back(texName);
1129
1130 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001131 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1132 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001133 pixels[0] = 255;
1134 pixels[1] = 0;
1135 pixels[2] = 0;
1136 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001137 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001138
1139 layer.source.buffer.buffer = buf;
1140 layer.source.buffer.textureName = texName;
1141 layer.source.buffer.usePremultipliedAlpha = true;
1142 layer.alpha = 0.5f;
1143 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1144
Vishnu Nair9b079a22020-01-21 14:36:08 -08001145 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001146
Alec Mouric0aae732021-01-12 13:32:18 -08001147 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001148}
1149
1150void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1151 fillRedBufferWithPremultiplyAlpha();
1152 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1153}
1154
1155void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1156 renderengine::DisplaySettings settings;
1157 settings.physicalDisplay = fullscreenRect();
1158 // Here logical space is 1x1
1159 settings.clip = Rect(1, 1);
1160
Vishnu Nair9b079a22020-01-21 14:36:08 -08001161 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001162
1163 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001164 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001165 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001166 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001167 this->mTexNames.push_back(texName);
1168
1169 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001170 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1171 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001172 pixels[0] = 255;
1173 pixels[1] = 0;
1174 pixels[2] = 0;
1175 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001176 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001177
1178 layer.source.buffer.buffer = buf;
1179 layer.source.buffer.textureName = texName;
1180 layer.source.buffer.usePremultipliedAlpha = false;
1181 layer.alpha = 0.5f;
1182 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1183
Vishnu Nair9b079a22020-01-21 14:36:08 -08001184 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001185
Alec Mouric0aae732021-01-12 13:32:18 -08001186 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001187}
1188
1189void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1190 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001191 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001192}
1193
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001194template <typename SourceVariant>
1195void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1196 const renderengine::ShadowSettings& shadow,
1197 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1198 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001199 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001200 settings.physicalDisplay = fullscreenRect();
1201 settings.clip = fullscreenRect();
1202
Vishnu Nair9b079a22020-01-21 14:36:08 -08001203 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001204
1205 // add background layer
1206 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001207 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001208 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1209 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1210 backgroundColor.b / 255.0f, this);
1211 bgLayer.alpha = backgroundColor.a / 255.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001212 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001213
1214 // add shadow layer
1215 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001216 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001217 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1218 shadowLayer.alpha = castingLayer.alpha;
1219 shadowLayer.shadow = shadow;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001220 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001221
1222 // add layer casting the shadow
1223 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001224 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001225 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1226 casterColor.b / 255.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001227 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001228
Alec Mouric0aae732021-01-12 13:32:18 -08001229 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001230}
1231
Alec Mouribd17b3b2020-12-17 11:08:30 -08001232void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1233 const renderengine::ShadowSettings& shadow,
1234 const ubyte4& backgroundColor) {
1235 renderengine::DisplaySettings settings;
1236 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1237 settings.physicalDisplay = fullscreenRect();
1238 settings.clip = fullscreenRect();
1239
1240 std::vector<const renderengine::LayerSettings*> layers;
1241
1242 // add background layer
1243 renderengine::LayerSettings bgLayer;
1244 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1245 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1246 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1247 backgroundColor.b / 255.0f, this);
1248 bgLayer.alpha = backgroundColor.a / 255.0f;
1249 layers.push_back(&bgLayer);
1250
1251 // add shadow layer
1252 renderengine::LayerSettings shadowLayer;
1253 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1254 shadowLayer.geometry.boundaries = castingBounds;
Derek Sollenbergerc31985e2021-05-18 16:38:17 -04001255 shadowLayer.skipContentDraw = true;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001256 shadowLayer.alpha = 1.0f;
1257 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1258 shadowLayer.shadow = shadow;
1259 layers.push_back(&shadowLayer);
1260
Alec Mouric0aae732021-01-12 13:32:18 -08001261 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001262}
1263
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001264INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001265 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001266 std::make_shared<GLESCMRenderEngineFactory>(),
1267 std::make_shared<SkiaGLESRenderEngineFactory>(),
1268 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001269
1270TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001271 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001272 drawEmptyLayers();
1273}
1274
Ana Krulec07b98df2021-01-07 14:38:40 -08001275TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
Alec Mouria90a5702021-04-16 16:36:21 +00001276 initializeRenderEngine();
Ana Krulec07b98df2021-01-07 14:38:40 -08001277
1278 renderengine::DisplaySettings settings;
1279 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1280 settings.physicalDisplay = fullscreenRect();
1281 settings.clip = fullscreenRect();
1282
1283 // 255, 255, 255, 255 is full opaque white.
1284 const ubyte4 backgroundColor(255.f, 255.f, 255.f, 255.f);
1285 // Create layer with given color.
1286 renderengine::LayerSettings bgLayer;
1287 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1288 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1289 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1290 backgroundColor.b / 255.0f);
1291 bgLayer.alpha = backgroundColor.a / 255.0f;
1292 // Transform the red color.
1293 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1294
1295 std::vector<const renderengine::LayerSettings*> layers;
1296 layers.push_back(&bgLayer);
1297
Alec Mouric0aae732021-01-12 13:32:18 -08001298 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001299
1300 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001301 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001302 backgroundColor.a);
1303}
1304
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001305TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001306 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001307
Alec Mourid43ccab2019-03-13 12:23:45 -07001308 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001309 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001310 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001311 renderengine::LayerSettings layer;
1312 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1313 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001314 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001315 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001316 status_t status = mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence);
Alec Mourid43ccab2019-03-13 12:23:45 -07001317
1318 ASSERT_EQ(BAD_VALUE, status);
1319}
1320
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001321TEST_P(RenderEngineTest, drawLayers_nullOutputFence) {
Alec Mouric0aae732021-01-12 13:32:18 -08001322 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001323
Alec Mourid43ccab2019-03-13 12:23:45 -07001324 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001325 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001326 settings.physicalDisplay = fullscreenRect();
1327 settings.clip = fullscreenRect();
1328
Vishnu Nair9b079a22020-01-21 14:36:08 -08001329 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001330 renderengine::LayerSettings layer;
1331 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1332 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1333 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001334 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001335
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001336 status_t status = mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), nullptr);
Alec Mourid43ccab2019-03-13 12:23:45 -07001337 ASSERT_EQ(NO_ERROR, status);
1338 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1339}
1340
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001341TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1342 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001343
1344 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1345 // GLES-specific test
1346 return;
1347 }
1348
1349 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001350
Alec Mourife0d72b2019-03-21 14:05:56 -07001351 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001352 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001353 settings.physicalDisplay = fullscreenRect();
1354 settings.clip = fullscreenRect();
1355
Vishnu Nair9b079a22020-01-21 14:36:08 -08001356 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001357 renderengine::LayerSettings layer;
1358 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1359 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1360 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001361 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001362
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001363 status_t status = mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd(), nullptr);
Alec Mourife0d72b2019-03-21 14:05:56 -07001364 ASSERT_EQ(NO_ERROR, status);
Alec Mouria90a5702021-04-16 16:36:21 +00001365 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001366 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1367}
1368
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001369TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001370 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001371 fillRedBuffer<ColorSourceVariant>();
1372}
1373
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001374TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001375 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001376 fillGreenBuffer<ColorSourceVariant>();
1377}
1378
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001379TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001380 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001381 fillBlueBuffer<ColorSourceVariant>();
1382}
1383
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001384TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001385 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001386 fillRedTransparentBuffer<ColorSourceVariant>();
1387}
1388
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001389TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001390 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001391 fillBufferPhysicalOffset<ColorSourceVariant>();
1392}
1393
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001394TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001395 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001396 fillBufferCheckersRotate0<ColorSourceVariant>();
1397}
1398
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001399TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001400 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001401 fillBufferCheckersRotate90<ColorSourceVariant>();
1402}
1403
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001404TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001405 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001406 fillBufferCheckersRotate180<ColorSourceVariant>();
1407}
1408
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001409TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001410 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001411 fillBufferCheckersRotate270<ColorSourceVariant>();
1412}
1413
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001414TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001415 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001416 fillBufferLayerTransform<ColorSourceVariant>();
1417}
1418
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001419TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001420 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001421 fillBufferColorTransform<ColorSourceVariant>();
1422}
1423
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001424TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001425 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001426 fillBufferWithRoundedCorners<ColorSourceVariant>();
1427}
1428
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001429TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001430 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001431 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1432}
1433
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001434TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001435 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001436 fillBufferAndBlurBackground<ColorSourceVariant>();
1437}
1438
Alec Mourie8489fd2021-04-29 16:08:56 -07001439TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1440 initializeRenderEngine();
1441 fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1442}
1443
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001444TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001445 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001446 overlayCorners<ColorSourceVariant>();
1447}
1448
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001449TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001450 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001451 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1452}
1453
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001454TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001455 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001456 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1457}
1458
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001459TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001460 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001461 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1462}
1463
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001464TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001465 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001466 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1467}
1468
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001469TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001470 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001471 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1472}
1473
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001474TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001475 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001476 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1477}
1478
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001479TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001480 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001481 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1482}
1483
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001484TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001485 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001486 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1487}
1488
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001489TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001490 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001491 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1492}
1493
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001494TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001495 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001496 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1497}
1498
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001499TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001500 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001501 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1502}
1503
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001504TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001505 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001506 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1507}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001508
Alec Mouric0aae732021-01-12 13:32:18 -08001509TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1510 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001511 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1512}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001513
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001514TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001515 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001516 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1517}
1518
Alec Mourie8489fd2021-04-29 16:08:56 -07001519TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1520 initializeRenderEngine();
1521 fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1522}
1523
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001524TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001525 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001526 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1527}
1528
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001529TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001530 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001531 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1532}
1533
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001534TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001535 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001536 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1537}
1538
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001539TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001540 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001541 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1542}
1543
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001544TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001545 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001546 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1547}
1548
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001549TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001550 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001551 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1552}
1553
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001554TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001555 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001556 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1557}
1558
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001559TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001560 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001561 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1562}
1563
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001564TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001565 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001566 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1567}
1568
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001569TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001570 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001571 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1572}
1573
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001574TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001575 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001576 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1577}
1578
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001579TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001580 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001581 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1582}
1583
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001584TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001585 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001586 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1587}
1588
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001589TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001590 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001591 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1592}
1593
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001594TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001595 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001596 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1597}
1598
Alec Mourie8489fd2021-04-29 16:08:56 -07001599TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
1600 initializeRenderEngine();
1601 fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1602}
1603
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001604TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001605 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001606 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1607}
1608
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001609TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08001610 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001611 fillBufferTextureTransform();
1612}
1613
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001614TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001615 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001616 fillBufferWithPremultiplyAlpha();
1617}
1618
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001619TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001620 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001621 fillBufferWithoutPremultiplyAlpha();
1622}
1623
Alec Mouribd17b3b2020-12-17 11:08:30 -08001624TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001625 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08001626
1627 const ubyte4 backgroundColor(255, 255, 255, 255);
1628 const float shadowLength = 5.0f;
1629 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1630 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1631 renderengine::ShadowSettings settings =
1632 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1633 false /* casterIsTranslucent */);
1634
1635 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1636 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1637}
1638
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001639TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08001640 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001641
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001642 const ubyte4 casterColor(255, 0, 0, 255);
1643 const ubyte4 backgroundColor(255, 255, 255, 255);
1644 const float shadowLength = 5.0f;
1645 Rect casterBounds(1, 1);
1646 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1647 renderengine::LayerSettings castingLayer;
1648 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1649 castingLayer.alpha = 1.0f;
1650 renderengine::ShadowSettings settings =
1651 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1652 false /* casterIsTranslucent */);
1653
1654 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1655 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1656}
1657
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001658TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001659 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001660
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001661 const ubyte4 casterColor(255, 0, 0, 255);
1662 const ubyte4 backgroundColor(255, 255, 255, 255);
1663 const float shadowLength = 5.0f;
1664 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1665 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1666 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001667 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001668 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1669 castingLayer.alpha = 1.0f;
1670 renderengine::ShadowSettings settings =
1671 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1672 false /* casterIsTranslucent */);
1673
1674 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1675 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1676}
1677
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001678TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001679 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001680
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001681 const ubyte4 casterColor(255, 0, 0, 255);
1682 const ubyte4 backgroundColor(255, 255, 255, 255);
1683 const float shadowLength = 5.0f;
1684 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1685 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1686 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001687 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001688 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1689 castingLayer.alpha = 1.0f;
1690 renderengine::ShadowSettings settings =
1691 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1692 false /* casterIsTranslucent */);
1693
1694 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1695 backgroundColor);
1696 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1697}
1698
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001699TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08001700 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001701
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001702 const ubyte4 casterColor(255, 0, 0, 255);
1703 const ubyte4 backgroundColor(255, 255, 255, 255);
1704 const float shadowLength = 5.0f;
1705 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1706 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1707 renderengine::LayerSettings castingLayer;
1708 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1709 castingLayer.geometry.roundedCornersRadius = 3.0f;
1710 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1711 castingLayer.alpha = 1.0f;
1712 renderengine::ShadowSettings settings =
1713 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1714 false /* casterIsTranslucent */);
1715
1716 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1717 backgroundColor);
1718 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1719}
1720
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001721TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001722 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001723
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001724 const ubyte4 casterColor(255, 0, 0, 255);
1725 const ubyte4 backgroundColor(255, 255, 255, 255);
1726 const float shadowLength = 5.0f;
1727 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1728 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1729 renderengine::LayerSettings castingLayer;
1730 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1731 castingLayer.alpha = 0.5f;
1732 renderengine::ShadowSettings settings =
1733 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1734 true /* casterIsTranslucent */);
1735
1736 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1737 backgroundColor);
1738
1739 // verify only the background since the shadow will draw behind the caster
1740 const float shadowInset = settings.length * -1.0f;
1741 const Rect casterWithShadow =
1742 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1743 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1744 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1745 backgroundColor.a);
1746}
1747
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001748TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
Alec Mouric0aae732021-01-12 13:32:18 -08001749 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001750
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001751 renderengine::DisplaySettings settings;
1752 settings.physicalDisplay = fullscreenRect();
1753 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001754 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001755
1756 std::vector<const renderengine::LayerSettings*> layers;
1757 renderengine::LayerSettings layer;
1758 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1759 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1760 layer.alpha = 1.0;
1761 layers.push_back(&layer);
1762
1763 base::unique_fd fenceOne;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001764 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fenceOne);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001765 base::unique_fd fenceTwo;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001766 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne), &fenceTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001767
1768 const int fd = fenceTwo.get();
1769 if (fd >= 0) {
1770 sync_wait(fd, -1);
1771 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001772 // Only cleanup the first time.
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04001773 EXPECT_FALSE(mRE->canSkipPostRenderCleanup());
1774 mRE->cleanupPostRender();
1775 EXPECT_TRUE(mRE->canSkipPostRenderCleanup());
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001776}
1777
Ana Krulecf9a15d92020-12-11 08:35:00 -08001778TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08001779 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08001780
1781 renderengine::DisplaySettings settings;
1782 settings.physicalDisplay = fullscreenRect();
1783 settings.clip = fullscreenRect();
1784 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1785
1786 std::vector<const renderengine::LayerSettings*> layers;
1787
1788 renderengine::LayerSettings redLayer;
1789 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1790 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1791 redLayer.geometry.roundedCornersRadius = 5.0f;
1792 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1793 // Red background.
1794 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1795 redLayer.alpha = 1.0f;
1796
1797 layers.push_back(&redLayer);
1798
1799 // Green layer with 1/3 size.
1800 renderengine::LayerSettings greenLayer;
1801 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1802 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1803 greenLayer.geometry.roundedCornersRadius = 5.0f;
1804 // Bottom right corner is not going to be rounded.
1805 greenLayer.geometry.roundedCornersCrop =
1806 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
1807 DEFAULT_DISPLAY_HEIGHT)
1808 .toFloatRect();
1809 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1810 greenLayer.alpha = 1.0f;
1811
1812 layers.push_back(&greenLayer);
1813
Alec Mouric0aae732021-01-12 13:32:18 -08001814 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001815
1816 // Corners should be ignored...
1817 // Screen size: width is 128, height is 256.
1818 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1819 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1820 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1821 // Bottom right corner is kept out of the clipping, and it's green.
1822 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1823 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1824 0, 255, 0, 255);
1825}
1826
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04001827TEST_P(RenderEngineTest, testRoundedCornersParentCrop) {
1828 initializeRenderEngine();
1829
1830 renderengine::DisplaySettings settings;
1831 settings.physicalDisplay = fullscreenRect();
1832 settings.clip = fullscreenRect();
1833 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1834
1835 std::vector<const renderengine::LayerSettings*> layers;
1836
1837 renderengine::LayerSettings redLayer;
1838 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1839 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1840 redLayer.geometry.roundedCornersRadius = 5.0f;
1841 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1842 // Red background.
1843 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1844 redLayer.alpha = 1.0f;
1845
1846 layers.push_back(&redLayer);
1847
1848 // Green layer with 1/2 size with parent crop rect.
1849 renderengine::LayerSettings greenLayer = redLayer;
1850 greenLayer.geometry.boundaries =
1851 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2);
1852 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1853
1854 layers.push_back(&greenLayer);
1855
1856 invokeDraw(settings, layers);
1857
1858 // Due to roundedCornersRadius, the corners are untouched.
1859 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
1860 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
1861 expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1862 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1863
1864 // top middle should be green and the bottom middle red
1865 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 0), 0, 255, 0, 255);
1866 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 255);
1867
1868 // the bottom edge of the green layer should not be rounded
1869 expectBufferColor(Point(0, (DEFAULT_DISPLAY_HEIGHT / 2) - 1), 0, 255, 0, 255);
1870}
1871
Derek Sollenberger547d0a62021-07-27 14:09:17 -04001872TEST_P(RenderEngineTest, testRoundedCornersParentCropSmallBounds) {
1873 initializeRenderEngine();
1874
1875 renderengine::DisplaySettings settings;
1876 settings.physicalDisplay = fullscreenRect();
1877 settings.clip = fullscreenRect();
1878 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1879
1880 std::vector<const renderengine::LayerSettings*> layers;
1881
1882 renderengine::LayerSettings redLayer;
1883 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1884 redLayer.geometry.boundaries = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 32);
1885 redLayer.geometry.roundedCornersRadius = 64;
1886 redLayer.geometry.roundedCornersCrop = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 128);
1887 // Red background.
1888 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1889 redLayer.alpha = 1.0f;
1890
1891 layers.push_back(&redLayer);
1892 invokeDraw(settings, layers);
1893
1894 // Due to roundedCornersRadius, the top corners are untouched.
1895 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
1896 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
1897
1898 // ensure that the entire height of the red layer was clipped by the rounded corners crop.
1899 expectBufferColor(Point(0, 31), 0, 0, 0, 0);
1900 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 31), 0, 0, 0, 0);
1901
1902 // the bottom middle should be red
1903 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 31), 255, 0, 0, 255);
1904}
1905
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001906TEST_P(RenderEngineTest, testClear) {
1907 initializeRenderEngine();
1908
1909 const auto rect = fullscreenRect();
1910 const renderengine::DisplaySettings display{
1911 .physicalDisplay = rect,
1912 .clip = rect,
1913 };
1914
1915 const renderengine::LayerSettings redLayer{
1916 .geometry.boundaries = rect.toFloatRect(),
1917 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1918 .alpha = 1.0f,
1919 };
1920
1921 // This mimics prepareClearClientComposition. This layer should overwrite
1922 // the redLayer, so that the buffer is transparent, rather than red.
1923 const renderengine::LayerSettings clearLayer{
1924 .geometry.boundaries = rect.toFloatRect(),
1925 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
1926 .alpha = 0.0f,
1927 .disableBlending = true,
1928 };
1929
1930 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &clearLayer};
1931 invokeDraw(display, layers);
1932 expectBufferColor(rect, 0, 0, 0, 0);
1933}
1934
1935TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
1936 initializeRenderEngine();
1937
1938 const auto rect = Rect(0, 0, 1, 1);
1939 const renderengine::DisplaySettings display{
1940 .physicalDisplay = rect,
1941 .clip = rect,
1942 };
1943
1944 const renderengine::LayerSettings redLayer{
1945 .geometry.boundaries = rect.toFloatRect(),
1946 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1947 .alpha = 1.0f,
1948 };
1949
1950 // The next layer will overwrite redLayer with a GraphicBuffer that is green
1951 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00001952 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001953 {
1954 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001955 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1956 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001957 pixels[0] = 0;
1958 pixels[1] = 255;
1959 pixels[2] = 0;
1960 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001961 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001962 }
1963
1964 const renderengine::LayerSettings greenLayer{
1965 .geometry.boundaries = rect.toFloatRect(),
1966 .source =
1967 renderengine::PixelSource{
1968 .buffer =
1969 renderengine::Buffer{
1970 .buffer = buf,
1971 .usePremultipliedAlpha = true,
1972 },
1973 },
1974 .alpha = 0.5f,
1975 .disableBlending = true,
1976 };
1977
1978 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &greenLayer};
1979 invokeDraw(display, layers);
1980 expectBufferColor(rect, 0, 128, 0, 128);
1981}
1982
Leon Scroggins IIIc4e0cbd2021-05-25 10:25:20 -04001983TEST_P(RenderEngineTest, test_isOpaque) {
1984 initializeRenderEngine();
1985
1986 const auto rect = Rect(0, 0, 1, 1);
1987 const renderengine::DisplaySettings display{
1988 .physicalDisplay = rect,
1989 .clip = rect,
1990 .outputDataspace = ui::Dataspace::DISPLAY_P3,
1991 };
1992
1993 // Create an unpremul buffer that is green with no alpha. Using isOpaque
1994 // should make the green show.
1995 const auto buf = allocateSourceBuffer(1, 1);
1996 {
1997 uint8_t* pixels;
1998 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1999 reinterpret_cast<void**>(&pixels));
2000 pixels[0] = 0;
2001 pixels[1] = 255;
2002 pixels[2] = 0;
2003 pixels[3] = 0;
2004 buf->getBuffer()->unlock();
2005 }
2006
2007 const renderengine::LayerSettings greenLayer{
2008 .geometry.boundaries = rect.toFloatRect(),
2009 .source =
2010 renderengine::PixelSource{
2011 .buffer =
2012 renderengine::Buffer{
2013 .buffer = buf,
2014 // Although the pixels are not
2015 // premultiplied in practice, this
2016 // matches the input we see.
2017 .usePremultipliedAlpha = true,
2018 .isOpaque = true,
2019 },
2020 },
2021 .alpha = 1.0f,
2022 };
2023
2024 std::vector<const renderengine::LayerSettings*> layers{&greenLayer};
2025 invokeDraw(display, layers);
2026
2027 if (GetParam()->useColorManagement()) {
2028 expectBufferColor(rect, 117, 251, 76, 255);
2029 } else {
2030 expectBufferColor(rect, 0, 255, 0, 255);
2031 }
2032}
Derek Sollenbergerd3f60652021-06-11 15:34:36 -04002033} // namespace renderengine
Alec Mouri6e57f682018-09-29 20:45:08 -07002034} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08002035
2036// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002037#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"