blob: 1ca7a16fe09fb0a4073e0be540cc6445d88c0a67 [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 {
46
Ana Krulec82ba2ec2020-11-21 13:33:20 -080047class RenderEngineFactory {
48public:
49 virtual ~RenderEngineFactory() = default;
50
51 virtual std::string name() = 0;
Alec Mouric0aae732021-01-12 13:32:18 -080052 virtual renderengine::RenderEngine::RenderEngineType type() = 0;
53 virtual std::unique_ptr<renderengine::RenderEngine> createRenderEngine() = 0;
54 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
55 return nullptr;
56 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080057};
58
59class GLESRenderEngineFactory : public RenderEngineFactory {
60public:
61 std::string name() override { return "GLESRenderEngineFactory"; }
62
Alec Mouric0aae732021-01-12 13:32:18 -080063 renderengine::RenderEngine::RenderEngineType type() {
64 return renderengine::RenderEngine::RenderEngineType::GLES;
65 }
66
67 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
68 return createGLESRenderEngine();
69 }
70
71 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
KaiChieh Chuang436fc192020-09-07 13:48:42 +080072 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -070073 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -080074 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
75 .setImageCacheSize(1)
76 .setUseColorManagerment(false)
77 .setEnableProtectedContext(false)
78 .setPrecacheToneMapperShaderOnly(false)
79 .setSupportsBackgroundBlur(true)
80 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -080081 .setRenderEngineType(type())
KaiChieh Chuang436fc192020-09-07 13:48:42 +080082 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -080083 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -070084 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080085};
Alec Mourid43ccab2019-03-13 12:23:45 -070086
Ana Krulecaa2fe7f2020-11-24 15:06:36 -080087class GLESCMRenderEngineFactory : public RenderEngineFactory {
88public:
89 std::string name() override { return "GLESCMRenderEngineFactory"; }
90
Alec Mouric0aae732021-01-12 13:32:18 -080091 renderengine::RenderEngine::RenderEngineType type() {
92 return renderengine::RenderEngine::RenderEngineType::GLES;
93 }
94
95 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
96 return createGLESRenderEngine();
97 }
98
99 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() override {
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800100 renderengine::RenderEngineCreationArgs reCreationArgs =
101 renderengine::RenderEngineCreationArgs::Builder()
102 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
103 .setImageCacheSize(1)
104 .setEnableProtectedContext(false)
105 .setPrecacheToneMapperShaderOnly(false)
106 .setSupportsBackgroundBlur(true)
107 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800108 .setRenderEngineType(type())
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800109 .setUseColorManagerment(true)
110 .build();
111 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
112 }
113};
114
Alec Mouri0eab3e82020-12-08 18:10:27 -0800115class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
116public:
Alec Mouric0aae732021-01-12 13:32:18 -0800117 std::string name() override { return "SkiaGLRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800118
Alec Mouric0aae732021-01-12 13:32:18 -0800119 renderengine::RenderEngine::RenderEngineType type() {
120 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
121 }
122
123 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800124 renderengine::RenderEngineCreationArgs reCreationArgs =
125 renderengine::RenderEngineCreationArgs::Builder()
126 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
127 .setImageCacheSize(1)
128 .setEnableProtectedContext(false)
129 .setPrecacheToneMapperShaderOnly(false)
130 .setSupportsBackgroundBlur(true)
131 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800132 .setRenderEngineType(type())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800133 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800134 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800135 }
136};
137
138class SkiaGLESCMRenderEngineFactory : public RenderEngineFactory {
139public:
Alec Mouric0aae732021-01-12 13:32:18 -0800140 std::string name() override { return "SkiaGLCMRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800141
Alec Mouric0aae732021-01-12 13:32:18 -0800142 renderengine::RenderEngine::RenderEngineType type() {
143 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
144 }
145
146 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800147 renderengine::RenderEngineCreationArgs reCreationArgs =
148 renderengine::RenderEngineCreationArgs::Builder()
149 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
150 .setImageCacheSize(1)
151 .setEnableProtectedContext(false)
152 .setPrecacheToneMapperShaderOnly(false)
153 .setSupportsBackgroundBlur(true)
154 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800155 .setRenderEngineType(type())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800156 .setUseColorManagerment(true)
157 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800158 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800159 }
160};
161
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800162class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
163public:
Alec Mouria90a5702021-04-16 16:36:21 +0000164 std::shared_ptr<renderengine::ExternalTexture> allocateDefaultBuffer() {
165 return std::make_shared<
166 renderengine::
167 ExternalTexture>(new GraphicBuffer(DEFAULT_DISPLAY_WIDTH,
168 DEFAULT_DISPLAY_HEIGHT,
169 HAL_PIXEL_FORMAT_RGBA_8888, 1,
170 GRALLOC_USAGE_SW_READ_OFTEN |
171 GRALLOC_USAGE_SW_WRITE_OFTEN |
172 GRALLOC_USAGE_HW_RENDER |
173 GRALLOC_USAGE_HW_TEXTURE,
174 "output"),
175 *mRE,
176 renderengine::ExternalTexture::Usage::READABLE |
177 renderengine::ExternalTexture::Usage::WRITEABLE);
Alec Mouri6e57f682018-09-29 20:45:08 -0700178 }
179
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800180 // Allocates a 1x1 buffer to fill with a solid color
Alec Mouria90a5702021-04-16 16:36:21 +0000181 std::shared_ptr<renderengine::ExternalTexture> allocateSourceBuffer(uint32_t width,
182 uint32_t height) {
183 return std::make_shared<
184 renderengine::
185 ExternalTexture>(new GraphicBuffer(width, height,
186 HAL_PIXEL_FORMAT_RGBA_8888, 1,
187 GRALLOC_USAGE_SW_READ_OFTEN |
188 GRALLOC_USAGE_SW_WRITE_OFTEN |
189 GRALLOC_USAGE_HW_TEXTURE,
190 "input"),
191 *mRE,
192 renderengine::ExternalTexture::Usage::READABLE |
193 renderengine::ExternalTexture::Usage::WRITEABLE);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800194 }
195
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800196 RenderEngineTest() {
197 const ::testing::TestInfo* const test_info =
198 ::testing::UnitTest::GetInstance()->current_test_info();
199 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800200 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700201
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800202 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800203 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
204 writeBufferToFile("/data/texture_out_");
205 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800206 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800207 mRE->deleteTextures(1, &texName);
Alec Mouric0aae732021-01-12 13:32:18 -0800208 if (mGLESRE != nullptr) {
209 EXPECT_FALSE(mGLESRE->isTextureNameKnownForTesting(texName));
210 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800211 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800212 const ::testing::TestInfo* const test_info =
213 ::testing::UnitTest::GetInstance()->current_test_info();
214 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800215 }
216
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800217 void writeBufferToFile(const char* basename) {
218 std::string filename(basename);
219 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
220 filename.append(".ppm");
221 std::ofstream file(filename.c_str(), std::ios::binary);
222 if (!file.is_open()) {
223 ALOGE("Unable to open file: %s", filename.c_str());
224 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
225 "surfaceflinger to write debug images");
226 return;
227 }
228
Alec Mouri1089aed2018-10-25 21:33:57 -0700229 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000230 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
231 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700232
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800233 file << "P6\n";
Alec Mouria90a5702021-04-16 16:36:21 +0000234 file << mBuffer->getBuffer()->getWidth() << "\n";
235 file << mBuffer->getBuffer()->getHeight() << "\n";
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800236 file << 255 << "\n";
237
Alec Mouria90a5702021-04-16 16:36:21 +0000238 std::vector<uint8_t> outBuffer(mBuffer->getBuffer()->getWidth() *
239 mBuffer->getBuffer()->getHeight() * 3);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800240 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
241
Alec Mouria90a5702021-04-16 16:36:21 +0000242 for (int32_t j = 0; j < mBuffer->getBuffer()->getHeight(); j++) {
243 const uint8_t* src = pixels + (mBuffer->getBuffer()->getStride() * j) * 4;
244 for (int32_t i = 0; i < mBuffer->getBuffer()->getWidth(); i++) {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800245 // Only copy R, G and B components
246 outPtr[0] = src[0];
247 outPtr[1] = src[1];
248 outPtr[2] = src[2];
249 outPtr += 3;
250
251 src += 4;
252 }
253 }
254 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
Alec Mouria90a5702021-04-16 16:36:21 +0000255 mBuffer->getBuffer()->unlock();
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800256 }
257
258 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
259 size_t c;
260 Rect const* rect = region.getArray(&c);
261 for (size_t i = 0; i < c; i++, rect++) {
262 expectBufferColor(*rect, r, g, b, a);
263 }
264 }
265
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -0400266 void expectBufferColor(const Point& point, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
267 uint8_t tolerance = 0) {
268 expectBufferColor(Rect(point.x, point.y, point.x + 1, point.y + 1), r, g, b, a, tolerance);
269 }
270
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800271 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
272 uint8_t tolerance = 0) {
273 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
274 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
275 uint8_t tmp = a >= b ? a - b : b - a;
276 return tmp <= tolerance;
277 };
278 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700279 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800280
281 expectBufferColor(rect, r, g, b, a, colorCompare);
282 }
283
284 void expectBufferColor(const Rect& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
285 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
286 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000287 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
288 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700289 int32_t maxFails = 10;
290 int32_t fails = 0;
291 for (int32_t j = 0; j < region.getHeight(); j++) {
Alec Mouria90a5702021-04-16 16:36:21 +0000292 const uint8_t* src = pixels +
293 (mBuffer->getBuffer()->getStride() * (region.top + j) + region.left) * 4;
Alec Mouri1089aed2018-10-25 21:33:57 -0700294 for (int32_t i = 0; i < region.getWidth(); i++) {
295 const uint8_t expected[4] = {r, g, b, a};
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800296 bool equal = colorCompare(src, expected);
Alec Mouri1089aed2018-10-25 21:33:57 -0700297 EXPECT_TRUE(equal)
298 << "pixel @ (" << region.left + i << ", " << region.top + j << "): "
299 << "expected (" << static_cast<uint32_t>(r) << ", "
300 << static_cast<uint32_t>(g) << ", " << static_cast<uint32_t>(b) << ", "
301 << static_cast<uint32_t>(a) << "), "
302 << "got (" << static_cast<uint32_t>(src[0]) << ", "
303 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
304 << ", " << static_cast<uint32_t>(src[3]) << ")";
305 src += 4;
306 if (!equal && ++fails >= maxFails) {
307 break;
308 }
309 }
310 if (fails >= maxFails) {
311 break;
312 }
313 }
Alec Mouria90a5702021-04-16 16:36:21 +0000314 mBuffer->getBuffer()->unlock();
Alec Mouri1089aed2018-10-25 21:33:57 -0700315 }
316
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800317 void expectAlpha(const Rect& rect, uint8_t a) {
318 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
319 return colorA[3] == colorB[3];
320 };
321 expectBufferColor(rect, 0.0f /* r */, 0.0f /*g */, 0.0f /* b */, a, colorCompare);
322 }
323
324 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
325 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
326 const ubyte4& backgroundColor) {
327 const Rect casterRect(castingLayer.geometry.boundaries);
328 Region casterRegion = Region(casterRect);
329 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
330 if (casterCornerRadius > 0.0f) {
331 // ignore the corners if a corner radius is set
332 Rect cornerRect(casterCornerRadius, casterCornerRadius);
333 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
334 casterRegion.subtractSelf(
335 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
336 casterRegion.subtractSelf(
337 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
338 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
339 casterRect.bottom - casterCornerRadius));
340 }
341
342 const float shadowInset = shadow.length * -1.0f;
343 const Rect casterWithShadow =
344 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
345 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
346 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
347
348 // verify casting layer
349 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
350
351 // verify shadows by testing just the alpha since its difficult to validate the shadow color
352 size_t c;
353 Rect const* r = shadowRegion.getArray(&c);
354 for (size_t i = 0; i < c; i++, r++) {
355 expectAlpha(*r, 255);
356 }
357
358 // verify background
359 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
360 backgroundColor.a);
361 }
362
Alec Mouribd17b3b2020-12-17 11:08:30 -0800363 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
364 const renderengine::ShadowSettings& shadow,
365 const ubyte4& backgroundColor) {
366 const float shadowInset = shadow.length * -1.0f;
367 const Rect casterRect(casterBounds);
368 const Rect shadowRect =
369 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
370
371 const Region backgroundRegion =
372 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
373
374 expectAlpha(shadowRect, 255);
375 // (0, 0, 0) fill on the bounds of the layer should be ignored.
376 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
377
378 // verify background
379 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
380 backgroundColor.a);
381 }
382
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800383 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
384 bool casterIsTranslucent) {
385 renderengine::ShadowSettings shadow;
386 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
387 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
388 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
389 shadow.lightRadius = 0.0f;
390 shadow.length = shadowLength;
391 shadow.casterIsTranslucent = casterIsTranslucent;
392 return shadow;
393 }
394
Alec Mouri1089aed2018-10-25 21:33:57 -0700395 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
396
397 static Rect offsetRect() {
398 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
399 DEFAULT_DISPLAY_HEIGHT);
400 }
401
402 static Rect offsetRectAtZero() {
403 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
404 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
405 }
406
Alec Mourid43ccab2019-03-13 12:23:45 -0700407 void invokeDraw(renderengine::DisplaySettings settings,
Alec Mouric0aae732021-01-12 13:32:18 -0800408 std::vector<const renderengine::LayerSettings*> layers) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700409 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800410 status_t status =
Alec Mouric0aae732021-01-12 13:32:18 -0800411 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri1089aed2018-10-25 21:33:57 -0700412
413 int fd = fence.release();
414 if (fd >= 0) {
415 sync_wait(fd, -1);
416 close(fd);
417 }
418
419 ASSERT_EQ(NO_ERROR, status);
Alec Mouric0aae732021-01-12 13:32:18 -0800420 if (layers.size() > 0 && mGLESRE != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000421 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700422 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700423 }
424
Alec Mourid43ccab2019-03-13 12:23:45 -0700425 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700426 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800427 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800428 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700429 }
430
Alec Mouri1089aed2018-10-25 21:33:57 -0700431 template <typename SourceVariant>
432 void fillBuffer(half r, half g, half b, half a);
433
434 template <typename SourceVariant>
435 void fillRedBuffer();
436
437 template <typename SourceVariant>
438 void fillGreenBuffer();
439
440 template <typename SourceVariant>
441 void fillBlueBuffer();
442
443 template <typename SourceVariant>
444 void fillRedTransparentBuffer();
445
446 template <typename SourceVariant>
447 void fillRedOffsetBuffer();
448
449 template <typename SourceVariant>
450 void fillBufferPhysicalOffset();
451
452 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700453 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700454
455 template <typename SourceVariant>
456 void fillBufferCheckersRotate0();
457
458 template <typename SourceVariant>
459 void fillBufferCheckersRotate90();
460
461 template <typename SourceVariant>
462 void fillBufferCheckersRotate180();
463
464 template <typename SourceVariant>
465 void fillBufferCheckersRotate270();
466
467 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800468 void fillBufferWithLayerTransform();
469
470 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700471 void fillBufferLayerTransform();
472
473 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800474 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800475
476 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700477 void fillBufferColorTransform();
478
Alec Mouri7c94edb2018-12-03 21:23:26 -0800479 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800480 void fillBufferWithColorTransformZeroLayerAlpha();
481
482 template <typename SourceVariant>
483 void fillBufferColorTransformZeroLayerAlpha();
484
485 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800486 void fillRedBufferWithRoundedCorners();
487
488 template <typename SourceVariant>
489 void fillBufferWithRoundedCorners();
490
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000491 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800492 void fillBufferAndBlurBackground();
493
494 template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700495 void fillSmallLayerAndBlurBackground();
496
497 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000498 void overlayCorners();
499
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800500 void fillRedBufferTextureTransform();
501
502 void fillBufferTextureTransform();
503
504 void fillRedBufferWithPremultiplyAlpha();
505
506 void fillBufferWithPremultiplyAlpha();
507
508 void fillRedBufferWithoutPremultiplyAlpha();
509
510 void fillBufferWithoutPremultiplyAlpha();
511
Alec Mouriac335532018-11-12 15:01:33 -0800512 void fillGreenColorBufferThenClearRegion();
513
514 void clearLeftRegion();
515
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000516 void clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -0800517
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800518 template <typename SourceVariant>
519 void drawShadow(const renderengine::LayerSettings& castingLayer,
520 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
521 const ubyte4& backgroundColor);
522
Alec Mouribd17b3b2020-12-17 11:08:30 -0800523 void drawShadowWithoutCaster(const FloatRect& castingBounds,
524 const renderengine::ShadowSettings& shadow,
525 const ubyte4& backgroundColor);
526
Alec Mouric0aae732021-01-12 13:32:18 -0800527 void initializeRenderEngine();
528
529 std::unique_ptr<renderengine::RenderEngine> mRE;
Alec Mouria90a5702021-04-16 16:36:21 +0000530 std::shared_ptr<renderengine::ExternalTexture> mBuffer;
Alec Mouric0aae732021-01-12 13:32:18 -0800531 // GLESRenderEngine for testing GLES-specific behavior.
532 // Owened by mRE, but this is downcasted.
533 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800534
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800535 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700536};
537
Alec Mouric0aae732021-01-12 13:32:18 -0800538void RenderEngineTest::initializeRenderEngine() {
539 const auto& renderEngineFactory = GetParam();
540 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
541 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
542 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
543 // every time.
544 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
545 renderEngineFactory->createGLESRenderEngine();
546 mGLESRE = renderEngine.get();
547 mRE = std::move(renderEngine);
548 } else {
549 mRE = renderEngineFactory->createRenderEngine();
550 }
Alec Mouria90a5702021-04-16 16:36:21 +0000551 mBuffer = allocateDefaultBuffer();
Alec Mouric0aae732021-01-12 13:32:18 -0800552}
553
Alec Mouri1089aed2018-10-25 21:33:57 -0700554struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800555 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800556 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700557 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800558 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700559 }
560};
561
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800562struct RelaxOpaqueBufferVariant {
563 static void setOpaqueBit(renderengine::LayerSettings& layer) {
564 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800565 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800566 }
567
568 static uint8_t getAlphaChannel() { return 255; }
569};
570
571struct ForceOpaqueBufferVariant {
572 static void setOpaqueBit(renderengine::LayerSettings& layer) {
573 layer.source.buffer.isOpaque = true;
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() {
578 // The isOpaque bit will override the alpha channel, so this should be
579 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800580 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800581 }
582};
583
584template <typename OpaquenessVariant>
585struct BufferSourceVariant {
586 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800587 RenderEngineTest* fixture) {
Alec Mouria90a5702021-04-16 16:36:21 +0000588 const auto buf = fixture->allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800589 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800590 fixture->mRE->genTextures(1, &texName);
591 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800592
593 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000594 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
595 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800596
Alec Mouria90a5702021-04-16 16:36:21 +0000597 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
598 uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
599 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800600 iter[0] = uint8_t(r * 255);
601 iter[1] = uint8_t(g * 255);
602 iter[2] = uint8_t(b * 255);
603 iter[3] = OpaquenessVariant::getAlphaChannel();
604 iter += 4;
605 }
606 }
607
Alec Mouria90a5702021-04-16 16:36:21 +0000608 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800609
610 layer.source.buffer.buffer = buf;
611 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800612 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800613 OpaquenessVariant::setOpaqueBit(layer);
614 }
615};
616
Alec Mouri1089aed2018-10-25 21:33:57 -0700617template <typename SourceVariant>
618void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
619 renderengine::DisplaySettings settings;
620 settings.physicalDisplay = fullscreenRect();
621 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800622 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700623
Vishnu Nair9b079a22020-01-21 14:36:08 -0800624 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700625
626 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800627 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700628 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800629 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700630 layer.alpha = a;
631
Vishnu Nair9b079a22020-01-21 14:36:08 -0800632 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700633
Alec Mouric0aae732021-01-12 13:32:18 -0800634 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700635}
636
637template <typename SourceVariant>
638void RenderEngineTest::fillRedBuffer() {
639 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
640 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
641}
642
643template <typename SourceVariant>
644void RenderEngineTest::fillGreenBuffer() {
645 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
646 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
647}
648
649template <typename SourceVariant>
650void RenderEngineTest::fillBlueBuffer() {
651 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
652 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
653}
654
655template <typename SourceVariant>
656void RenderEngineTest::fillRedTransparentBuffer() {
657 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
658 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
659}
660
661template <typename SourceVariant>
662void RenderEngineTest::fillRedOffsetBuffer() {
663 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800664 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700665 settings.physicalDisplay = offsetRect();
666 settings.clip = offsetRectAtZero();
667
Vishnu Nair9b079a22020-01-21 14:36:08 -0800668 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700669
670 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800671 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700672 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800673 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700674 layer.alpha = 1.0f;
675
Vishnu Nair9b079a22020-01-21 14:36:08 -0800676 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800677 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700678}
679
680template <typename SourceVariant>
681void RenderEngineTest::fillBufferPhysicalOffset() {
682 fillRedOffsetBuffer<SourceVariant>();
683
684 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
685 DEFAULT_DISPLAY_HEIGHT),
686 255, 0, 0, 255);
687 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
688 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
689
690 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
691 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
692}
693
694template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700695void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700696 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800697 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700698 settings.physicalDisplay = fullscreenRect();
699 // Here logical space is 2x2
700 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700701 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700702
Vishnu Nair9b079a22020-01-21 14:36:08 -0800703 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700704
705 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800706 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700707 Rect rectOne(0, 0, 1, 1);
708 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800709 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700710 layerOne.alpha = 1.0f;
711
712 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800713 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700714 Rect rectTwo(0, 1, 1, 2);
715 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800716 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700717 layerTwo.alpha = 1.0f;
718
719 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800720 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700721 Rect rectThree(1, 0, 2, 1);
722 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800723 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700724 layerThree.alpha = 1.0f;
725
Vishnu Nair9b079a22020-01-21 14:36:08 -0800726 layers.push_back(&layerOne);
727 layers.push_back(&layerTwo);
728 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700729
Alec Mouric0aae732021-01-12 13:32:18 -0800730 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700731}
732
733template <typename SourceVariant>
734void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700735 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700736 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
737 255);
738 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
739 DEFAULT_DISPLAY_HEIGHT / 2),
740 0, 0, 255, 255);
741 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
742 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
743 0, 0, 0, 0);
744 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
745 DEFAULT_DISPLAY_HEIGHT),
746 0, 255, 0, 255);
747}
748
749template <typename SourceVariant>
750void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700751 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700752 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
753 255);
754 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
755 DEFAULT_DISPLAY_HEIGHT / 2),
756 255, 0, 0, 255);
757 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
758 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
759 0, 0, 255, 255);
760 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
761 DEFAULT_DISPLAY_HEIGHT),
762 0, 0, 0, 0);
763}
764
765template <typename SourceVariant>
766void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700767 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700768 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
769 0);
770 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
771 DEFAULT_DISPLAY_HEIGHT / 2),
772 0, 255, 0, 255);
773 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
774 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
775 255, 0, 0, 255);
776 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
777 DEFAULT_DISPLAY_HEIGHT),
778 0, 0, 255, 255);
779}
780
781template <typename SourceVariant>
782void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700783 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700784 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
785 255);
786 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
787 DEFAULT_DISPLAY_HEIGHT / 2),
788 0, 0, 0, 0);
789 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
790 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
791 0, 255, 0, 255);
792 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
793 DEFAULT_DISPLAY_HEIGHT),
794 255, 0, 0, 255);
795}
796
797template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800798void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700799 renderengine::DisplaySettings settings;
800 settings.physicalDisplay = fullscreenRect();
801 // Here logical space is 2x2
802 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800803 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700804
Vishnu Nair9b079a22020-01-21 14:36:08 -0800805 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700806
807 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800808 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700809 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
810 // Translate one pixel diagonally
811 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 -0800812 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700813 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
814 layer.alpha = 1.0f;
815
Vishnu Nair9b079a22020-01-21 14:36:08 -0800816 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700817
Alec Mouric0aae732021-01-12 13:32:18 -0800818 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800819}
Alec Mouri1089aed2018-10-25 21:33:57 -0700820
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800821template <typename SourceVariant>
822void RenderEngineTest::fillBufferLayerTransform() {
823 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700824 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
825 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
826 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
827 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
828 255, 0, 0, 255);
829}
830
831template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800832void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700833 renderengine::DisplaySettings settings;
834 settings.physicalDisplay = fullscreenRect();
835 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800836 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700837
Vishnu Nair9b079a22020-01-21 14:36:08 -0800838 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700839
840 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800841 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700842 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800843 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700844 layer.alpha = 1.0f;
845
846 // construct a fake color matrix
847 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800848 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700849 // set red channel to red + green
850 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
851
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800852 layer.alpha = 1.0f;
853 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
854
Vishnu Nair9b079a22020-01-21 14:36:08 -0800855 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700856
Alec Mouric0aae732021-01-12 13:32:18 -0800857 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800858}
Alec Mouri1089aed2018-10-25 21:33:57 -0700859
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800860template <typename SourceVariant>
861void RenderEngineTest::fillBufferColorTransform() {
862 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800863 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
864}
865
866template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800867void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
868 renderengine::DisplaySettings settings;
869 settings.physicalDisplay = fullscreenRect();
870 settings.clip = Rect(1, 1);
871
872 std::vector<const renderengine::LayerSettings*> layers;
873
874 renderengine::LayerSettings layer;
875 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
876 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
877 layer.alpha = 0;
878
879 // construct a fake color matrix
880 // simple inverse color
881 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
882
883 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
884
885 layers.push_back(&layer);
886
Alec Mouric0aae732021-01-12 13:32:18 -0800887 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800888}
889
890template <typename SourceVariant>
891void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
892 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
893 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
894}
895
896template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800897void RenderEngineTest::fillRedBufferWithRoundedCorners() {
898 renderengine::DisplaySettings settings;
899 settings.physicalDisplay = fullscreenRect();
900 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800901 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800902
Vishnu Nair9b079a22020-01-21 14:36:08 -0800903 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800904
905 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800906 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800907 layer.geometry.boundaries = fullscreenRect().toFloatRect();
908 layer.geometry.roundedCornersRadius = 5.0f;
909 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
910 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
911 layer.alpha = 1.0f;
912
Vishnu Nair9b079a22020-01-21 14:36:08 -0800913 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800914
Alec Mouric0aae732021-01-12 13:32:18 -0800915 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800916}
917
918template <typename SourceVariant>
919void RenderEngineTest::fillBufferWithRoundedCorners() {
920 fillRedBufferWithRoundedCorners<SourceVariant>();
921 // Corners should be ignored...
922 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
923 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
924 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
925 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
926 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
927 0, 0, 0, 0);
928 // ...And the non-rounded portion should be red.
929 // Other pixels may be anti-aliased, so let's not check those.
930 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
931 255);
932}
933
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000934template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800935void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800936 auto blurRadius = 50;
937 auto center = DEFAULT_DISPLAY_WIDTH / 2;
938
939 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800940 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800941 settings.physicalDisplay = fullscreenRect();
942 settings.clip = fullscreenRect();
943
Vishnu Nair9b079a22020-01-21 14:36:08 -0800944 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800945
946 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800947 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800948 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
949 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
950 backgroundLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800951 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800952
953 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800954 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800955 leftLayer.geometry.boundaries =
956 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
957 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
958 leftLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800959 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800960
961 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800962 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800963 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
964 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500965 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800966 blurLayer.alpha = 0;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800967 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800968
Alec Mouric0aae732021-01-12 13:32:18 -0800969 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800970
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500971 // solid color
972 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
973
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500974 if (mRE->supportsBackgroundBlur()) {
975 // blurred color (downsampling should result in the center color being close to 128)
976 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
Nathaniel Nifong53494f32021-04-30 14:05:39 -0400977 50 /* tolerance */);
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500978 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800979}
980
981template <typename SourceVariant>
Alec Mourie8489fd2021-04-29 16:08:56 -0700982void RenderEngineTest::fillSmallLayerAndBlurBackground() {
983 auto blurRadius = 50;
984 renderengine::DisplaySettings settings;
985 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
986 settings.physicalDisplay = fullscreenRect();
987 settings.clip = fullscreenRect();
988
989 std::vector<const renderengine::LayerSettings*> layers;
990
991 renderengine::LayerSettings backgroundLayer;
992 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
993 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
994 SourceVariant::fillColor(backgroundLayer, 1.0f, 0.0f, 0.0f, this);
995 backgroundLayer.alpha = 1.0f;
996 layers.push_back(&backgroundLayer);
997
998 renderengine::LayerSettings blurLayer;
999 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1000 blurLayer.geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f);
1001 blurLayer.backgroundBlurRadius = blurRadius;
1002 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
1003 blurLayer.alpha = 0;
1004 layers.push_back(&blurLayer);
1005
1006 invokeDraw(settings, layers);
1007
1008 // Give a generous tolerance - the blur rectangle is very small and this test is
1009 // mainly concerned with ensuring that there's no device failure.
1010 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 255, 0, 0, 255,
1011 40 /* tolerance */);
1012}
1013
1014template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001015void RenderEngineTest::overlayCorners() {
1016 renderengine::DisplaySettings settings;
1017 settings.physicalDisplay = fullscreenRect();
1018 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001019 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001020
Vishnu Nair9b079a22020-01-21 14:36:08 -08001021 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001022
1023 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001024 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001025 layerOne.geometry.boundaries =
1026 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
1027 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
1028 layerOne.alpha = 0.2;
1029
Vishnu Nair9b079a22020-01-21 14:36:08 -08001030 layersFirst.push_back(&layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -08001031 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001032 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
1033 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1034 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1035 0, 0, 0, 0);
1036
Vishnu Nair9b079a22020-01-21 14:36:08 -08001037 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001038 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001039 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001040 layerTwo.geometry.boundaries =
1041 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1042 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1043 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1044 layerTwo.alpha = 1.0f;
1045
Vishnu Nair9b079a22020-01-21 14:36:08 -08001046 layersSecond.push_back(&layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001047 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001048
1049 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1050 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1051 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1052 0, 255, 0, 255);
1053}
1054
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001055void RenderEngineTest::fillRedBufferTextureTransform() {
1056 renderengine::DisplaySettings settings;
1057 settings.physicalDisplay = fullscreenRect();
1058 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001059 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001060
Vishnu Nair9b079a22020-01-21 14:36:08 -08001061 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001062
1063 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001064 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001065 // Here will allocate a checker board texture, but transform texture
1066 // coordinates so that only the upper left is applied.
Alec Mouria90a5702021-04-16 16:36:21 +00001067 const auto buf = allocateSourceBuffer(2, 2);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001068 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001069 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001070 this->mTexNames.push_back(texName);
1071
1072 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001073 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1074 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001075 // Red top left, Green top right, Blue bottom left, Black bottom right
1076 pixels[0] = 255;
1077 pixels[1] = 0;
1078 pixels[2] = 0;
1079 pixels[3] = 255;
1080 pixels[4] = 0;
1081 pixels[5] = 255;
1082 pixels[6] = 0;
1083 pixels[7] = 255;
1084 pixels[8] = 0;
1085 pixels[9] = 0;
1086 pixels[10] = 255;
1087 pixels[11] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001088 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001089
1090 layer.source.buffer.buffer = buf;
1091 layer.source.buffer.textureName = texName;
1092 // Transform coordinates to only be inside the red quadrant.
1093 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
1094 layer.alpha = 1.0f;
1095 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1096
Vishnu Nair9b079a22020-01-21 14:36:08 -08001097 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001098
Alec Mouric0aae732021-01-12 13:32:18 -08001099 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001100}
1101
1102void RenderEngineTest::fillBufferTextureTransform() {
1103 fillRedBufferTextureTransform();
1104 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1105}
1106
1107void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1108 renderengine::DisplaySettings settings;
1109 settings.physicalDisplay = fullscreenRect();
1110 // Here logical space is 1x1
1111 settings.clip = Rect(1, 1);
1112
Vishnu Nair9b079a22020-01-21 14:36:08 -08001113 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001114
1115 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001116 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001117 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001118 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001119 this->mTexNames.push_back(texName);
1120
1121 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001122 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1123 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001124 pixels[0] = 255;
1125 pixels[1] = 0;
1126 pixels[2] = 0;
1127 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001128 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001129
1130 layer.source.buffer.buffer = buf;
1131 layer.source.buffer.textureName = texName;
1132 layer.source.buffer.usePremultipliedAlpha = true;
1133 layer.alpha = 0.5f;
1134 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1135
Vishnu Nair9b079a22020-01-21 14:36:08 -08001136 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001137
Alec Mouric0aae732021-01-12 13:32:18 -08001138 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001139}
1140
1141void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1142 fillRedBufferWithPremultiplyAlpha();
1143 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1144}
1145
1146void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1147 renderengine::DisplaySettings settings;
1148 settings.physicalDisplay = fullscreenRect();
1149 // Here logical space is 1x1
1150 settings.clip = Rect(1, 1);
1151
Vishnu Nair9b079a22020-01-21 14:36:08 -08001152 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001153
1154 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001155 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001156 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001157 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001158 this->mTexNames.push_back(texName);
1159
1160 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001161 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1162 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001163 pixels[0] = 255;
1164 pixels[1] = 0;
1165 pixels[2] = 0;
1166 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001167 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001168
1169 layer.source.buffer.buffer = buf;
1170 layer.source.buffer.textureName = texName;
1171 layer.source.buffer.usePremultipliedAlpha = false;
1172 layer.alpha = 0.5f;
1173 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1174
Vishnu Nair9b079a22020-01-21 14:36:08 -08001175 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001176
Alec Mouric0aae732021-01-12 13:32:18 -08001177 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001178}
1179
1180void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1181 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001182 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001183}
1184
Alec Mouriac335532018-11-12 15:01:33 -08001185void RenderEngineTest::clearLeftRegion() {
1186 renderengine::DisplaySettings settings;
1187 settings.physicalDisplay = fullscreenRect();
1188 // Here logical space is 4x4
1189 settings.clip = Rect(4, 4);
Alec Mouri5a6d8572020-03-23 23:56:15 -07001190 settings.clearRegion = Region(Rect(2, 4));
Vishnu Nair9b079a22020-01-21 14:36:08 -08001191 std::vector<const renderengine::LayerSettings*> layers;
Peiyong Lind8460c82020-07-28 16:04:22 -07001192 // fake layer, without bounds should not render anything
Alec Mouriac335532018-11-12 15:01:33 -08001193 renderengine::LayerSettings layer;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001194 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -08001195 invokeDraw(settings, layers);
Alec Mouriac335532018-11-12 15:01:33 -08001196}
1197
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001198void RenderEngineTest::clearRegion() {
Alec Mouriac335532018-11-12 15:01:33 -08001199 // Reuse mBuffer
1200 clearLeftRegion();
1201 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 255);
1202 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
1203 DEFAULT_DISPLAY_HEIGHT),
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001204 0, 0, 0, 0);
Alec Mouriac335532018-11-12 15:01:33 -08001205}
1206
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001207template <typename SourceVariant>
1208void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1209 const renderengine::ShadowSettings& shadow,
1210 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1211 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001212 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001213 settings.physicalDisplay = fullscreenRect();
1214 settings.clip = fullscreenRect();
1215
Vishnu Nair9b079a22020-01-21 14:36:08 -08001216 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001217
1218 // add background layer
1219 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001220 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001221 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1222 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1223 backgroundColor.b / 255.0f, this);
1224 bgLayer.alpha = backgroundColor.a / 255.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001225 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001226
1227 // add shadow layer
1228 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001229 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001230 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1231 shadowLayer.alpha = castingLayer.alpha;
1232 shadowLayer.shadow = shadow;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001233 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001234
1235 // add layer casting the shadow
1236 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001237 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001238 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1239 casterColor.b / 255.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001240 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001241
Alec Mouric0aae732021-01-12 13:32:18 -08001242 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001243}
1244
Alec Mouribd17b3b2020-12-17 11:08:30 -08001245void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1246 const renderengine::ShadowSettings& shadow,
1247 const ubyte4& backgroundColor) {
1248 renderengine::DisplaySettings settings;
1249 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1250 settings.physicalDisplay = fullscreenRect();
1251 settings.clip = fullscreenRect();
1252
1253 std::vector<const renderengine::LayerSettings*> layers;
1254
1255 // add background layer
1256 renderengine::LayerSettings bgLayer;
1257 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1258 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1259 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1260 backgroundColor.b / 255.0f, this);
1261 bgLayer.alpha = backgroundColor.a / 255.0f;
1262 layers.push_back(&bgLayer);
1263
1264 // add shadow layer
1265 renderengine::LayerSettings shadowLayer;
1266 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1267 shadowLayer.geometry.boundaries = castingBounds;
Derek Sollenbergerc31985e2021-05-18 16:38:17 -04001268 shadowLayer.skipContentDraw = true;
Alec Mouribd17b3b2020-12-17 11:08:30 -08001269 shadowLayer.alpha = 1.0f;
1270 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1271 shadowLayer.shadow = shadow;
1272 layers.push_back(&shadowLayer);
1273
Alec Mouric0aae732021-01-12 13:32:18 -08001274 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001275}
1276
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001277INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001278 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001279 std::make_shared<GLESCMRenderEngineFactory>(),
1280 std::make_shared<SkiaGLESRenderEngineFactory>(),
1281 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001282
1283TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001284 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001285 drawEmptyLayers();
1286}
1287
Ana Krulec07b98df2021-01-07 14:38:40 -08001288TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
Alec Mouria90a5702021-04-16 16:36:21 +00001289 initializeRenderEngine();
Ana Krulec07b98df2021-01-07 14:38:40 -08001290
1291 renderengine::DisplaySettings settings;
1292 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1293 settings.physicalDisplay = fullscreenRect();
1294 settings.clip = fullscreenRect();
1295
1296 // 255, 255, 255, 255 is full opaque white.
1297 const ubyte4 backgroundColor(255.f, 255.f, 255.f, 255.f);
1298 // Create layer with given color.
1299 renderengine::LayerSettings bgLayer;
1300 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1301 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1302 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1303 backgroundColor.b / 255.0f);
1304 bgLayer.alpha = backgroundColor.a / 255.0f;
1305 // Transform the red color.
1306 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1307
1308 std::vector<const renderengine::LayerSettings*> layers;
1309 layers.push_back(&bgLayer);
1310
Alec Mouric0aae732021-01-12 13:32:18 -08001311 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001312
1313 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001314 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001315 backgroundColor.a);
1316}
1317
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001318TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001319 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001320
Alec Mourid43ccab2019-03-13 12:23:45 -07001321 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001322 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001323 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001324 renderengine::LayerSettings layer;
1325 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1326 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001327 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001328 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001329 status_t status = mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence);
Alec Mourid43ccab2019-03-13 12:23:45 -07001330
1331 ASSERT_EQ(BAD_VALUE, status);
1332}
1333
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001334TEST_P(RenderEngineTest, drawLayers_nullOutputFence) {
Alec Mouric0aae732021-01-12 13:32:18 -08001335 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001336
Alec Mourid43ccab2019-03-13 12:23:45 -07001337 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001338 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001339 settings.physicalDisplay = fullscreenRect();
1340 settings.clip = fullscreenRect();
1341
Vishnu Nair9b079a22020-01-21 14:36:08 -08001342 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001343 renderengine::LayerSettings layer;
1344 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1345 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1346 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001347 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001348
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001349 status_t status = mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), nullptr);
Alec Mourid43ccab2019-03-13 12:23:45 -07001350 ASSERT_EQ(NO_ERROR, status);
1351 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1352}
1353
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001354TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1355 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001356
1357 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1358 // GLES-specific test
1359 return;
1360 }
1361
1362 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001363
Alec Mourife0d72b2019-03-21 14:05:56 -07001364 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001365 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001366 settings.physicalDisplay = fullscreenRect();
1367 settings.clip = fullscreenRect();
1368
Vishnu Nair9b079a22020-01-21 14:36:08 -08001369 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001370 renderengine::LayerSettings layer;
1371 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1372 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1373 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001374 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001375
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001376 status_t status = mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd(), nullptr);
Alec Mourife0d72b2019-03-21 14:05:56 -07001377 ASSERT_EQ(NO_ERROR, status);
Alec Mouria90a5702021-04-16 16:36:21 +00001378 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001379 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1380}
1381
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001382TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001383 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001384 fillRedBuffer<ColorSourceVariant>();
1385}
1386
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001387TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001388 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001389 fillGreenBuffer<ColorSourceVariant>();
1390}
1391
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001392TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001393 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001394 fillBlueBuffer<ColorSourceVariant>();
1395}
1396
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001397TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001398 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001399 fillRedTransparentBuffer<ColorSourceVariant>();
1400}
1401
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001402TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001403 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001404 fillBufferPhysicalOffset<ColorSourceVariant>();
1405}
1406
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001407TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001408 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001409 fillBufferCheckersRotate0<ColorSourceVariant>();
1410}
1411
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001412TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001413 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001414 fillBufferCheckersRotate90<ColorSourceVariant>();
1415}
1416
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001417TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001418 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001419 fillBufferCheckersRotate180<ColorSourceVariant>();
1420}
1421
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001422TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001423 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001424 fillBufferCheckersRotate270<ColorSourceVariant>();
1425}
1426
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001427TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001428 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001429 fillBufferLayerTransform<ColorSourceVariant>();
1430}
1431
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001432TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001433 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001434 fillBufferColorTransform<ColorSourceVariant>();
1435}
1436
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001437TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001438 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001439 fillBufferWithRoundedCorners<ColorSourceVariant>();
1440}
1441
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001442TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001443 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001444 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1445}
1446
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001447TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001448 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001449 fillBufferAndBlurBackground<ColorSourceVariant>();
1450}
1451
Alec Mourie8489fd2021-04-29 16:08:56 -07001452TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1453 initializeRenderEngine();
1454 fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1455}
1456
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001457TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001458 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001459 overlayCorners<ColorSourceVariant>();
1460}
1461
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001462TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001463 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001464 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1465}
1466
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001467TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001468 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001469 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1470}
1471
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001472TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001473 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001474 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1475}
1476
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001477TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001478 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001479 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1480}
1481
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001482TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001483 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001484 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1485}
1486
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001487TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001488 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001489 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1490}
1491
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001492TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001493 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001494 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1495}
1496
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001497TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001498 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001499 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1500}
1501
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001502TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001503 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001504 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1505}
1506
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001507TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001508 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001509 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1510}
1511
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001512TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001513 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001514 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1515}
1516
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001517TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001518 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001519 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1520}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001521
Alec Mouric0aae732021-01-12 13:32:18 -08001522TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1523 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001524 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1525}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001526
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001527TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001528 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001529 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1530}
1531
Alec Mourie8489fd2021-04-29 16:08:56 -07001532TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1533 initializeRenderEngine();
1534 fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1535}
1536
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001537TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001538 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001539 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1540}
1541
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001542TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001543 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001544 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1545}
1546
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001547TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001548 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001549 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1550}
1551
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001552TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001553 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001554 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1555}
1556
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001557TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001558 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001559 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1560}
1561
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001562TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001563 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001564 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1565}
1566
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001567TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001568 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001569 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1570}
1571
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001572TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001573 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001574 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1575}
1576
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001577TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001578 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001579 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1580}
1581
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001582TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001583 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001584 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1585}
1586
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001587TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001588 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001589 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1590}
1591
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001592TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001593 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001594 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1595}
1596
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001597TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001598 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001599 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1600}
1601
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001602TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001603 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001604 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1605}
1606
Nathaniel Nifong53494f32021-04-30 14:05:39 -04001607TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001608 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001609 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1610}
1611
Alec Mourie8489fd2021-04-29 16:08:56 -07001612TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
1613 initializeRenderEngine();
1614 fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1615}
1616
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001617TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001618 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001619 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1620}
1621
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001622TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08001623 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001624 fillBufferTextureTransform();
1625}
1626
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001627TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001628 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001629 fillBufferWithPremultiplyAlpha();
1630}
1631
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001632TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001633 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001634 fillBufferWithoutPremultiplyAlpha();
1635}
1636
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001637TEST_P(RenderEngineTest, drawLayers_clearRegion) {
Alec Mouric0aae732021-01-12 13:32:18 -08001638 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001639 clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -08001640}
1641
Alec Mouribd17b3b2020-12-17 11:08:30 -08001642TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001643 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08001644
1645 const ubyte4 backgroundColor(255, 255, 255, 255);
1646 const float shadowLength = 5.0f;
1647 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1648 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1649 renderengine::ShadowSettings settings =
1650 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1651 false /* casterIsTranslucent */);
1652
1653 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1654 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1655}
1656
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001657TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08001658 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001659
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001660 const ubyte4 casterColor(255, 0, 0, 255);
1661 const ubyte4 backgroundColor(255, 255, 255, 255);
1662 const float shadowLength = 5.0f;
1663 Rect casterBounds(1, 1);
1664 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1665 renderengine::LayerSettings castingLayer;
1666 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1667 castingLayer.alpha = 1.0f;
1668 renderengine::ShadowSettings settings =
1669 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1670 false /* casterIsTranslucent */);
1671
1672 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1673 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1674}
1675
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001676TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001677 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001678
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001679 const ubyte4 casterColor(255, 0, 0, 255);
1680 const ubyte4 backgroundColor(255, 255, 255, 255);
1681 const float shadowLength = 5.0f;
1682 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1683 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1684 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001685 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001686 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1687 castingLayer.alpha = 1.0f;
1688 renderengine::ShadowSettings settings =
1689 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1690 false /* casterIsTranslucent */);
1691
1692 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1693 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1694}
1695
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001696TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001697 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001698
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001699 const ubyte4 casterColor(255, 0, 0, 255);
1700 const ubyte4 backgroundColor(255, 255, 255, 255);
1701 const float shadowLength = 5.0f;
1702 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1703 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1704 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001705 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001706 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1707 castingLayer.alpha = 1.0f;
1708 renderengine::ShadowSettings settings =
1709 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1710 false /* casterIsTranslucent */);
1711
1712 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1713 backgroundColor);
1714 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1715}
1716
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001717TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08001718 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001719
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001720 const ubyte4 casterColor(255, 0, 0, 255);
1721 const ubyte4 backgroundColor(255, 255, 255, 255);
1722 const float shadowLength = 5.0f;
1723 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1724 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1725 renderengine::LayerSettings castingLayer;
1726 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1727 castingLayer.geometry.roundedCornersRadius = 3.0f;
1728 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1729 castingLayer.alpha = 1.0f;
1730 renderengine::ShadowSettings settings =
1731 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1732 false /* casterIsTranslucent */);
1733
1734 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1735 backgroundColor);
1736 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1737}
1738
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001739TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001740 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001741
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001742 const ubyte4 casterColor(255, 0, 0, 255);
1743 const ubyte4 backgroundColor(255, 255, 255, 255);
1744 const float shadowLength = 5.0f;
1745 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1746 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1747 renderengine::LayerSettings castingLayer;
1748 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1749 castingLayer.alpha = 0.5f;
1750 renderengine::ShadowSettings settings =
1751 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1752 true /* casterIsTranslucent */);
1753
1754 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1755 backgroundColor);
1756
1757 // verify only the background since the shadow will draw behind the caster
1758 const float shadowInset = settings.length * -1.0f;
1759 const Rect casterWithShadow =
1760 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1761 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1762 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1763 backgroundColor.a);
1764}
1765
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001766TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
1767 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001768
1769 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1770 // GLES-specific test
1771 return;
1772 }
1773
1774 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001775
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001776 renderengine::DisplaySettings settings;
1777 settings.physicalDisplay = fullscreenRect();
1778 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001779 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001780
1781 std::vector<const renderengine::LayerSettings*> layers;
1782 renderengine::LayerSettings layer;
1783 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1784 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1785 layer.alpha = 1.0;
1786 layers.push_back(&layer);
1787
1788 base::unique_fd fenceOne;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001789 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fenceOne);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001790 base::unique_fd fenceTwo;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001791 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne), &fenceTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001792
1793 const int fd = fenceTwo.get();
1794 if (fd >= 0) {
1795 sync_wait(fd, -1);
1796 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001797 // Only cleanup the first time.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001798 EXPECT_TRUE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001799 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001800 EXPECT_FALSE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001801 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
1802}
1803
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001804TEST_P(RenderEngineTest, cleanupPostRender_whenCleaningAll_replacesTextureMemory) {
1805 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001806
1807 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1808 // GLES-specific test
1809 return;
1810 }
1811
1812 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001813
Alec Mouri368e1582020-08-13 10:14:29 -07001814 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001815 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri368e1582020-08-13 10:14:29 -07001816 settings.physicalDisplay = fullscreenRect();
1817 settings.clip = fullscreenRect();
1818
1819 std::vector<const renderengine::LayerSettings*> layers;
1820 renderengine::LayerSettings layer;
1821 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1822 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1823 layer.alpha = 1.0;
1824 layers.push_back(&layer);
1825
1826 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001827 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri368e1582020-08-13 10:14:29 -07001828
1829 const int fd = fence.get();
1830 if (fd >= 0) {
1831 sync_wait(fd, -1);
1832 }
1833
Alec Mouria90a5702021-04-16 16:36:21 +00001834 uint64_t bufferId = layer.source.buffer.buffer->getBuffer()->getId();
Alec Mouri368e1582020-08-13 10:14:29 -07001835 uint32_t texName = layer.source.buffer.textureName;
Alec Mouric0aae732021-01-12 13:32:18 -08001836 EXPECT_TRUE(mGLESRE->isImageCachedForTesting(bufferId));
1837 EXPECT_EQ(bufferId, mGLESRE->getBufferIdForTextureNameForTesting(texName));
Alec Mouri368e1582020-08-13 10:14:29 -07001838
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001839 EXPECT_TRUE(mRE->cleanupPostRender(renderengine::RenderEngine::CleanupMode::CLEAN_ALL));
Alec Mouri368e1582020-08-13 10:14:29 -07001840
1841 // Now check that our view of memory is good.
Alec Mouric0aae732021-01-12 13:32:18 -08001842 EXPECT_FALSE(mGLESRE->isImageCachedForTesting(bufferId));
1843 EXPECT_EQ(std::nullopt, mGLESRE->getBufferIdForTextureNameForTesting(bufferId));
1844 EXPECT_TRUE(mGLESRE->isTextureNameKnownForTesting(texName));
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001845}
1846
Ana Krulecf9a15d92020-12-11 08:35:00 -08001847TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08001848 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08001849
1850 renderengine::DisplaySettings settings;
1851 settings.physicalDisplay = fullscreenRect();
1852 settings.clip = fullscreenRect();
1853 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1854
1855 std::vector<const renderengine::LayerSettings*> layers;
1856
1857 renderengine::LayerSettings redLayer;
1858 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1859 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1860 redLayer.geometry.roundedCornersRadius = 5.0f;
1861 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1862 // Red background.
1863 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1864 redLayer.alpha = 1.0f;
1865
1866 layers.push_back(&redLayer);
1867
1868 // Green layer with 1/3 size.
1869 renderengine::LayerSettings greenLayer;
1870 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1871 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1872 greenLayer.geometry.roundedCornersRadius = 5.0f;
1873 // Bottom right corner is not going to be rounded.
1874 greenLayer.geometry.roundedCornersCrop =
1875 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
1876 DEFAULT_DISPLAY_HEIGHT)
1877 .toFloatRect();
1878 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1879 greenLayer.alpha = 1.0f;
1880
1881 layers.push_back(&greenLayer);
1882
Alec Mouric0aae732021-01-12 13:32:18 -08001883 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001884
1885 // Corners should be ignored...
1886 // Screen size: width is 128, height is 256.
1887 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1888 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1889 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1890 // Bottom right corner is kept out of the clipping, and it's green.
1891 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1892 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1893 0, 255, 0, 255);
1894}
1895
Derek Sollenberger8e8b3bf2021-04-29 15:35:28 -04001896TEST_P(RenderEngineTest, testRoundedCornersParentCrop) {
1897 initializeRenderEngine();
1898
1899 renderengine::DisplaySettings settings;
1900 settings.physicalDisplay = fullscreenRect();
1901 settings.clip = fullscreenRect();
1902 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1903
1904 std::vector<const renderengine::LayerSettings*> layers;
1905
1906 renderengine::LayerSettings redLayer;
1907 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1908 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1909 redLayer.geometry.roundedCornersRadius = 5.0f;
1910 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1911 // Red background.
1912 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1913 redLayer.alpha = 1.0f;
1914
1915 layers.push_back(&redLayer);
1916
1917 // Green layer with 1/2 size with parent crop rect.
1918 renderengine::LayerSettings greenLayer = redLayer;
1919 greenLayer.geometry.boundaries =
1920 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2);
1921 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1922
1923 layers.push_back(&greenLayer);
1924
1925 invokeDraw(settings, layers);
1926
1927 // Due to roundedCornersRadius, the corners are untouched.
1928 expectBufferColor(Point(0, 0), 0, 0, 0, 0);
1929 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
1930 expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1931 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
1932
1933 // top middle should be green and the bottom middle red
1934 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 0), 0, 255, 0, 255);
1935 expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 255);
1936
1937 // the bottom edge of the green layer should not be rounded
1938 expectBufferColor(Point(0, (DEFAULT_DISPLAY_HEIGHT / 2) - 1), 0, 255, 0, 255);
1939}
1940
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001941TEST_P(RenderEngineTest, testClear) {
1942 initializeRenderEngine();
1943
1944 const auto rect = fullscreenRect();
1945 const renderengine::DisplaySettings display{
1946 .physicalDisplay = rect,
1947 .clip = rect,
1948 };
1949
1950 const renderengine::LayerSettings redLayer{
1951 .geometry.boundaries = rect.toFloatRect(),
1952 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1953 .alpha = 1.0f,
1954 };
1955
1956 // This mimics prepareClearClientComposition. This layer should overwrite
1957 // the redLayer, so that the buffer is transparent, rather than red.
1958 const renderengine::LayerSettings clearLayer{
1959 .geometry.boundaries = rect.toFloatRect(),
1960 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
1961 .alpha = 0.0f,
1962 .disableBlending = true,
1963 };
1964
1965 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &clearLayer};
1966 invokeDraw(display, layers);
1967 expectBufferColor(rect, 0, 0, 0, 0);
1968}
1969
1970TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
1971 initializeRenderEngine();
1972
1973 const auto rect = Rect(0, 0, 1, 1);
1974 const renderengine::DisplaySettings display{
1975 .physicalDisplay = rect,
1976 .clip = rect,
1977 };
1978
1979 const renderengine::LayerSettings redLayer{
1980 .geometry.boundaries = rect.toFloatRect(),
1981 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1982 .alpha = 1.0f,
1983 };
1984
1985 // The next layer will overwrite redLayer with a GraphicBuffer that is green
1986 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00001987 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001988 {
1989 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001990 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1991 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001992 pixels[0] = 0;
1993 pixels[1] = 255;
1994 pixels[2] = 0;
1995 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001996 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001997 }
1998
1999 const renderengine::LayerSettings greenLayer{
2000 .geometry.boundaries = rect.toFloatRect(),
2001 .source =
2002 renderengine::PixelSource{
2003 .buffer =
2004 renderengine::Buffer{
2005 .buffer = buf,
2006 .usePremultipliedAlpha = true,
2007 },
2008 },
2009 .alpha = 0.5f,
2010 .disableBlending = true,
2011 };
2012
2013 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &greenLayer};
2014 invokeDraw(display, layers);
2015 expectBufferColor(rect, 0, 128, 0, 128);
2016}
2017
Alec Mouri6e57f682018-09-29 20:45:08 -07002018} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08002019
2020// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01002021#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"