blob: 34ef0a4f084a3135e807680bf0d9deb021de7412 [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
266 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
267 uint8_t tolerance = 0) {
268 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
269 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
270 uint8_t tmp = a >= b ? a - b : b - a;
271 return tmp <= tolerance;
272 };
273 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700274 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800275
276 expectBufferColor(rect, r, g, b, a, colorCompare);
277 }
278
279 void expectBufferColor(const Rect& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
280 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
281 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000282 mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
283 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700284 int32_t maxFails = 10;
285 int32_t fails = 0;
286 for (int32_t j = 0; j < region.getHeight(); j++) {
Alec Mouria90a5702021-04-16 16:36:21 +0000287 const uint8_t* src = pixels +
288 (mBuffer->getBuffer()->getStride() * (region.top + j) + region.left) * 4;
Alec Mouri1089aed2018-10-25 21:33:57 -0700289 for (int32_t i = 0; i < region.getWidth(); i++) {
290 const uint8_t expected[4] = {r, g, b, a};
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800291 bool equal = colorCompare(src, expected);
Alec Mouri1089aed2018-10-25 21:33:57 -0700292 EXPECT_TRUE(equal)
293 << "pixel @ (" << region.left + i << ", " << region.top + j << "): "
294 << "expected (" << static_cast<uint32_t>(r) << ", "
295 << static_cast<uint32_t>(g) << ", " << static_cast<uint32_t>(b) << ", "
296 << static_cast<uint32_t>(a) << "), "
297 << "got (" << static_cast<uint32_t>(src[0]) << ", "
298 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
299 << ", " << static_cast<uint32_t>(src[3]) << ")";
300 src += 4;
301 if (!equal && ++fails >= maxFails) {
302 break;
303 }
304 }
305 if (fails >= maxFails) {
306 break;
307 }
308 }
Alec Mouria90a5702021-04-16 16:36:21 +0000309 mBuffer->getBuffer()->unlock();
Alec Mouri1089aed2018-10-25 21:33:57 -0700310 }
311
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800312 void expectAlpha(const Rect& rect, uint8_t a) {
313 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
314 return colorA[3] == colorB[3];
315 };
316 expectBufferColor(rect, 0.0f /* r */, 0.0f /*g */, 0.0f /* b */, a, colorCompare);
317 }
318
319 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
320 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
321 const ubyte4& backgroundColor) {
322 const Rect casterRect(castingLayer.geometry.boundaries);
323 Region casterRegion = Region(casterRect);
324 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
325 if (casterCornerRadius > 0.0f) {
326 // ignore the corners if a corner radius is set
327 Rect cornerRect(casterCornerRadius, casterCornerRadius);
328 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
329 casterRegion.subtractSelf(
330 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
331 casterRegion.subtractSelf(
332 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
333 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
334 casterRect.bottom - casterCornerRadius));
335 }
336
337 const float shadowInset = shadow.length * -1.0f;
338 const Rect casterWithShadow =
339 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
340 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
341 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
342
343 // verify casting layer
344 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
345
346 // verify shadows by testing just the alpha since its difficult to validate the shadow color
347 size_t c;
348 Rect const* r = shadowRegion.getArray(&c);
349 for (size_t i = 0; i < c; i++, r++) {
350 expectAlpha(*r, 255);
351 }
352
353 // verify background
354 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
355 backgroundColor.a);
356 }
357
Alec Mouribd17b3b2020-12-17 11:08:30 -0800358 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
359 const renderengine::ShadowSettings& shadow,
360 const ubyte4& backgroundColor) {
361 const float shadowInset = shadow.length * -1.0f;
362 const Rect casterRect(casterBounds);
363 const Rect shadowRect =
364 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
365
366 const Region backgroundRegion =
367 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
368
369 expectAlpha(shadowRect, 255);
370 // (0, 0, 0) fill on the bounds of the layer should be ignored.
371 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
372
373 // verify background
374 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
375 backgroundColor.a);
376 }
377
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800378 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
379 bool casterIsTranslucent) {
380 renderengine::ShadowSettings shadow;
381 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
382 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
383 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
384 shadow.lightRadius = 0.0f;
385 shadow.length = shadowLength;
386 shadow.casterIsTranslucent = casterIsTranslucent;
387 return shadow;
388 }
389
Alec Mouri1089aed2018-10-25 21:33:57 -0700390 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
391
392 static Rect offsetRect() {
393 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
394 DEFAULT_DISPLAY_HEIGHT);
395 }
396
397 static Rect offsetRectAtZero() {
398 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
399 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
400 }
401
Alec Mourid43ccab2019-03-13 12:23:45 -0700402 void invokeDraw(renderengine::DisplaySettings settings,
Alec Mouric0aae732021-01-12 13:32:18 -0800403 std::vector<const renderengine::LayerSettings*> layers) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700404 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800405 status_t status =
Alec Mouric0aae732021-01-12 13:32:18 -0800406 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri1089aed2018-10-25 21:33:57 -0700407
408 int fd = fence.release();
409 if (fd >= 0) {
410 sync_wait(fd, -1);
411 close(fd);
412 }
413
414 ASSERT_EQ(NO_ERROR, status);
Alec Mouric0aae732021-01-12 13:32:18 -0800415 if (layers.size() > 0 && mGLESRE != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000416 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700417 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700418 }
419
Alec Mourid43ccab2019-03-13 12:23:45 -0700420 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700421 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800422 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800423 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700424 }
425
Alec Mouri1089aed2018-10-25 21:33:57 -0700426 template <typename SourceVariant>
427 void fillBuffer(half r, half g, half b, half a);
428
429 template <typename SourceVariant>
430 void fillRedBuffer();
431
432 template <typename SourceVariant>
433 void fillGreenBuffer();
434
435 template <typename SourceVariant>
436 void fillBlueBuffer();
437
438 template <typename SourceVariant>
439 void fillRedTransparentBuffer();
440
441 template <typename SourceVariant>
442 void fillRedOffsetBuffer();
443
444 template <typename SourceVariant>
445 void fillBufferPhysicalOffset();
446
447 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700448 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700449
450 template <typename SourceVariant>
451 void fillBufferCheckersRotate0();
452
453 template <typename SourceVariant>
454 void fillBufferCheckersRotate90();
455
456 template <typename SourceVariant>
457 void fillBufferCheckersRotate180();
458
459 template <typename SourceVariant>
460 void fillBufferCheckersRotate270();
461
462 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800463 void fillBufferWithLayerTransform();
464
465 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700466 void fillBufferLayerTransform();
467
468 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800469 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800470
471 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700472 void fillBufferColorTransform();
473
Alec Mouri7c94edb2018-12-03 21:23:26 -0800474 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800475 void fillBufferWithColorTransformZeroLayerAlpha();
476
477 template <typename SourceVariant>
478 void fillBufferColorTransformZeroLayerAlpha();
479
480 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800481 void fillRedBufferWithRoundedCorners();
482
483 template <typename SourceVariant>
484 void fillBufferWithRoundedCorners();
485
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000486 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800487 void fillBufferAndBlurBackground();
488
489 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000490 void overlayCorners();
491
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800492 void fillRedBufferTextureTransform();
493
494 void fillBufferTextureTransform();
495
496 void fillRedBufferWithPremultiplyAlpha();
497
498 void fillBufferWithPremultiplyAlpha();
499
500 void fillRedBufferWithoutPremultiplyAlpha();
501
502 void fillBufferWithoutPremultiplyAlpha();
503
Alec Mouriac335532018-11-12 15:01:33 -0800504 void fillGreenColorBufferThenClearRegion();
505
506 void clearLeftRegion();
507
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000508 void clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -0800509
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800510 template <typename SourceVariant>
511 void drawShadow(const renderengine::LayerSettings& castingLayer,
512 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
513 const ubyte4& backgroundColor);
514
Alec Mouribd17b3b2020-12-17 11:08:30 -0800515 void drawShadowWithoutCaster(const FloatRect& castingBounds,
516 const renderengine::ShadowSettings& shadow,
517 const ubyte4& backgroundColor);
518
Alec Mouric0aae732021-01-12 13:32:18 -0800519 void initializeRenderEngine();
520
521 std::unique_ptr<renderengine::RenderEngine> mRE;
Alec Mouria90a5702021-04-16 16:36:21 +0000522 std::shared_ptr<renderengine::ExternalTexture> mBuffer;
Alec Mouric0aae732021-01-12 13:32:18 -0800523 // GLESRenderEngine for testing GLES-specific behavior.
524 // Owened by mRE, but this is downcasted.
525 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800526
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800527 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700528};
529
Alec Mouric0aae732021-01-12 13:32:18 -0800530void RenderEngineTest::initializeRenderEngine() {
531 const auto& renderEngineFactory = GetParam();
532 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
533 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
534 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
535 // every time.
536 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
537 renderEngineFactory->createGLESRenderEngine();
538 mGLESRE = renderEngine.get();
539 mRE = std::move(renderEngine);
540 } else {
541 mRE = renderEngineFactory->createRenderEngine();
542 }
Alec Mouria90a5702021-04-16 16:36:21 +0000543 mBuffer = allocateDefaultBuffer();
Alec Mouric0aae732021-01-12 13:32:18 -0800544}
545
Alec Mouri1089aed2018-10-25 21:33:57 -0700546struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800547 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800548 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700549 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800550 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700551 }
552};
553
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800554struct RelaxOpaqueBufferVariant {
555 static void setOpaqueBit(renderengine::LayerSettings& layer) {
556 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800557 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800558 }
559
560 static uint8_t getAlphaChannel() { return 255; }
561};
562
563struct ForceOpaqueBufferVariant {
564 static void setOpaqueBit(renderengine::LayerSettings& layer) {
565 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800566 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800567 }
568
569 static uint8_t getAlphaChannel() {
570 // The isOpaque bit will override the alpha channel, so this should be
571 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800572 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800573 }
574};
575
576template <typename OpaquenessVariant>
577struct BufferSourceVariant {
578 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800579 RenderEngineTest* fixture) {
Alec Mouria90a5702021-04-16 16:36:21 +0000580 const auto buf = fixture->allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800581 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800582 fixture->mRE->genTextures(1, &texName);
583 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800584
585 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +0000586 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
587 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800588
Alec Mouria90a5702021-04-16 16:36:21 +0000589 for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
590 uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
591 for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800592 iter[0] = uint8_t(r * 255);
593 iter[1] = uint8_t(g * 255);
594 iter[2] = uint8_t(b * 255);
595 iter[3] = OpaquenessVariant::getAlphaChannel();
596 iter += 4;
597 }
598 }
599
Alec Mouria90a5702021-04-16 16:36:21 +0000600 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800601
602 layer.source.buffer.buffer = buf;
603 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800604 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800605 OpaquenessVariant::setOpaqueBit(layer);
606 }
607};
608
Alec Mouri1089aed2018-10-25 21:33:57 -0700609template <typename SourceVariant>
610void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
611 renderengine::DisplaySettings settings;
612 settings.physicalDisplay = fullscreenRect();
613 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800614 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700615
Vishnu Nair9b079a22020-01-21 14:36:08 -0800616 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700617
618 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800619 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700620 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800621 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700622 layer.alpha = a;
623
Vishnu Nair9b079a22020-01-21 14:36:08 -0800624 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700625
Alec Mouric0aae732021-01-12 13:32:18 -0800626 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700627}
628
629template <typename SourceVariant>
630void RenderEngineTest::fillRedBuffer() {
631 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
632 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
633}
634
635template <typename SourceVariant>
636void RenderEngineTest::fillGreenBuffer() {
637 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
638 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
639}
640
641template <typename SourceVariant>
642void RenderEngineTest::fillBlueBuffer() {
643 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
644 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
645}
646
647template <typename SourceVariant>
648void RenderEngineTest::fillRedTransparentBuffer() {
649 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
650 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
651}
652
653template <typename SourceVariant>
654void RenderEngineTest::fillRedOffsetBuffer() {
655 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800656 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700657 settings.physicalDisplay = offsetRect();
658 settings.clip = offsetRectAtZero();
659
Vishnu Nair9b079a22020-01-21 14:36:08 -0800660 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700661
662 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800663 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700664 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800665 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700666 layer.alpha = 1.0f;
667
Vishnu Nair9b079a22020-01-21 14:36:08 -0800668 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800669 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700670}
671
672template <typename SourceVariant>
673void RenderEngineTest::fillBufferPhysicalOffset() {
674 fillRedOffsetBuffer<SourceVariant>();
675
676 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
677 DEFAULT_DISPLAY_HEIGHT),
678 255, 0, 0, 255);
679 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
680 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
681
682 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
683 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
684}
685
686template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700687void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700688 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800689 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700690 settings.physicalDisplay = fullscreenRect();
691 // Here logical space is 2x2
692 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700693 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700694
Vishnu Nair9b079a22020-01-21 14:36:08 -0800695 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700696
697 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800698 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700699 Rect rectOne(0, 0, 1, 1);
700 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800701 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700702 layerOne.alpha = 1.0f;
703
704 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800705 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700706 Rect rectTwo(0, 1, 1, 2);
707 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800708 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700709 layerTwo.alpha = 1.0f;
710
711 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800712 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700713 Rect rectThree(1, 0, 2, 1);
714 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800715 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700716 layerThree.alpha = 1.0f;
717
Vishnu Nair9b079a22020-01-21 14:36:08 -0800718 layers.push_back(&layerOne);
719 layers.push_back(&layerTwo);
720 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700721
Alec Mouric0aae732021-01-12 13:32:18 -0800722 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700723}
724
725template <typename SourceVariant>
726void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700727 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700728 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
729 255);
730 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
731 DEFAULT_DISPLAY_HEIGHT / 2),
732 0, 0, 255, 255);
733 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
734 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
735 0, 0, 0, 0);
736 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
737 DEFAULT_DISPLAY_HEIGHT),
738 0, 255, 0, 255);
739}
740
741template <typename SourceVariant>
742void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700743 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700744 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
745 255);
746 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
747 DEFAULT_DISPLAY_HEIGHT / 2),
748 255, 0, 0, 255);
749 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
750 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
751 0, 0, 255, 255);
752 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
753 DEFAULT_DISPLAY_HEIGHT),
754 0, 0, 0, 0);
755}
756
757template <typename SourceVariant>
758void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700759 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700760 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
761 0);
762 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
763 DEFAULT_DISPLAY_HEIGHT / 2),
764 0, 255, 0, 255);
765 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
766 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
767 255, 0, 0, 255);
768 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
769 DEFAULT_DISPLAY_HEIGHT),
770 0, 0, 255, 255);
771}
772
773template <typename SourceVariant>
774void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700775 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700776 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
777 255);
778 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
779 DEFAULT_DISPLAY_HEIGHT / 2),
780 0, 0, 0, 0);
781 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
782 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
783 0, 255, 0, 255);
784 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
785 DEFAULT_DISPLAY_HEIGHT),
786 255, 0, 0, 255);
787}
788
789template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800790void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700791 renderengine::DisplaySettings settings;
792 settings.physicalDisplay = fullscreenRect();
793 // Here logical space is 2x2
794 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800795 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700796
Vishnu Nair9b079a22020-01-21 14:36:08 -0800797 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700798
799 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800800 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700801 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
802 // Translate one pixel diagonally
803 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 -0800804 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700805 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
806 layer.alpha = 1.0f;
807
Vishnu Nair9b079a22020-01-21 14:36:08 -0800808 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700809
Alec Mouric0aae732021-01-12 13:32:18 -0800810 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800811}
Alec Mouri1089aed2018-10-25 21:33:57 -0700812
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800813template <typename SourceVariant>
814void RenderEngineTest::fillBufferLayerTransform() {
815 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700816 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
817 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
818 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
819 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
820 255, 0, 0, 255);
821}
822
823template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800824void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700825 renderengine::DisplaySettings settings;
826 settings.physicalDisplay = fullscreenRect();
827 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800828 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700829
Vishnu Nair9b079a22020-01-21 14:36:08 -0800830 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700831
832 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800833 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700834 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800835 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700836 layer.alpha = 1.0f;
837
838 // construct a fake color matrix
839 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800840 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700841 // set red channel to red + green
842 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
843
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800844 layer.alpha = 1.0f;
845 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
846
Vishnu Nair9b079a22020-01-21 14:36:08 -0800847 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700848
Alec Mouric0aae732021-01-12 13:32:18 -0800849 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800850}
Alec Mouri1089aed2018-10-25 21:33:57 -0700851
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800852template <typename SourceVariant>
853void RenderEngineTest::fillBufferColorTransform() {
854 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800855 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
856}
857
858template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800859void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
860 renderengine::DisplaySettings settings;
861 settings.physicalDisplay = fullscreenRect();
862 settings.clip = Rect(1, 1);
863
864 std::vector<const renderengine::LayerSettings*> layers;
865
866 renderengine::LayerSettings layer;
867 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
868 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
869 layer.alpha = 0;
870
871 // construct a fake color matrix
872 // simple inverse color
873 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
874
875 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
876
877 layers.push_back(&layer);
878
Alec Mouric0aae732021-01-12 13:32:18 -0800879 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800880}
881
882template <typename SourceVariant>
883void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
884 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
885 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
886}
887
888template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800889void RenderEngineTest::fillRedBufferWithRoundedCorners() {
890 renderengine::DisplaySettings settings;
891 settings.physicalDisplay = fullscreenRect();
892 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800893 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800894
Vishnu Nair9b079a22020-01-21 14:36:08 -0800895 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800896
897 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800898 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800899 layer.geometry.boundaries = fullscreenRect().toFloatRect();
900 layer.geometry.roundedCornersRadius = 5.0f;
901 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
902 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
903 layer.alpha = 1.0f;
904
Vishnu Nair9b079a22020-01-21 14:36:08 -0800905 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800906
Alec Mouric0aae732021-01-12 13:32:18 -0800907 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800908}
909
910template <typename SourceVariant>
911void RenderEngineTest::fillBufferWithRoundedCorners() {
912 fillRedBufferWithRoundedCorners<SourceVariant>();
913 // Corners should be ignored...
914 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
915 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
916 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
917 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
918 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
919 0, 0, 0, 0);
920 // ...And the non-rounded portion should be red.
921 // Other pixels may be anti-aliased, so let's not check those.
922 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
923 255);
924}
925
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000926template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800927void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800928 auto blurRadius = 50;
929 auto center = DEFAULT_DISPLAY_WIDTH / 2;
930
931 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800932 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800933 settings.physicalDisplay = fullscreenRect();
934 settings.clip = fullscreenRect();
935
Vishnu Nair9b079a22020-01-21 14:36:08 -0800936 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800937
938 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800939 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800940 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
941 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
942 backgroundLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800943 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800944
945 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800946 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800947 leftLayer.geometry.boundaries =
948 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
949 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
950 leftLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800951 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800952
953 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800954 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800955 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
956 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500957 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800958 blurLayer.alpha = 0;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800959 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800960
Alec Mouric0aae732021-01-12 13:32:18 -0800961 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800962
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500963 // solid color
964 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
965
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500966 if (mRE->supportsBackgroundBlur()) {
967 // blurred color (downsampling should result in the center color being close to 128)
968 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
969 10 /* tolerance */);
970 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800971}
972
973template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000974void RenderEngineTest::overlayCorners() {
975 renderengine::DisplaySettings settings;
976 settings.physicalDisplay = fullscreenRect();
977 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800978 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000979
Vishnu Nair9b079a22020-01-21 14:36:08 -0800980 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000981
982 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800983 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000984 layerOne.geometry.boundaries =
985 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
986 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
987 layerOne.alpha = 0.2;
988
Vishnu Nair9b079a22020-01-21 14:36:08 -0800989 layersFirst.push_back(&layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -0800990 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000991 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
992 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
993 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
994 0, 0, 0, 0);
995
Vishnu Nair9b079a22020-01-21 14:36:08 -0800996 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000997 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800998 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000999 layerTwo.geometry.boundaries =
1000 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1001 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1002 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1003 layerTwo.alpha = 1.0f;
1004
Vishnu Nair9b079a22020-01-21 14:36:08 -08001005 layersSecond.push_back(&layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -08001006 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001007
1008 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1009 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1010 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1011 0, 255, 0, 255);
1012}
1013
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001014void RenderEngineTest::fillRedBufferTextureTransform() {
1015 renderengine::DisplaySettings settings;
1016 settings.physicalDisplay = fullscreenRect();
1017 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001018 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001019
Vishnu Nair9b079a22020-01-21 14:36:08 -08001020 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001021
1022 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001023 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001024 // Here will allocate a checker board texture, but transform texture
1025 // coordinates so that only the upper left is applied.
Alec Mouria90a5702021-04-16 16:36:21 +00001026 const auto buf = allocateSourceBuffer(2, 2);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001027 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001028 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001029 this->mTexNames.push_back(texName);
1030
1031 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001032 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1033 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001034 // Red top left, Green top right, Blue bottom left, Black bottom right
1035 pixels[0] = 255;
1036 pixels[1] = 0;
1037 pixels[2] = 0;
1038 pixels[3] = 255;
1039 pixels[4] = 0;
1040 pixels[5] = 255;
1041 pixels[6] = 0;
1042 pixels[7] = 255;
1043 pixels[8] = 0;
1044 pixels[9] = 0;
1045 pixels[10] = 255;
1046 pixels[11] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001047 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001048
1049 layer.source.buffer.buffer = buf;
1050 layer.source.buffer.textureName = texName;
1051 // Transform coordinates to only be inside the red quadrant.
1052 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
1053 layer.alpha = 1.0f;
1054 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1055
Vishnu Nair9b079a22020-01-21 14:36:08 -08001056 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001057
Alec Mouric0aae732021-01-12 13:32:18 -08001058 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001059}
1060
1061void RenderEngineTest::fillBufferTextureTransform() {
1062 fillRedBufferTextureTransform();
1063 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1064}
1065
1066void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1067 renderengine::DisplaySettings settings;
1068 settings.physicalDisplay = fullscreenRect();
1069 // Here logical space is 1x1
1070 settings.clip = Rect(1, 1);
1071
Vishnu Nair9b079a22020-01-21 14:36:08 -08001072 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001073
1074 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001075 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001076 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001077 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001078 this->mTexNames.push_back(texName);
1079
1080 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001081 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1082 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001083 pixels[0] = 255;
1084 pixels[1] = 0;
1085 pixels[2] = 0;
1086 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001087 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001088
1089 layer.source.buffer.buffer = buf;
1090 layer.source.buffer.textureName = texName;
1091 layer.source.buffer.usePremultipliedAlpha = true;
1092 layer.alpha = 0.5f;
1093 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1094
Vishnu Nair9b079a22020-01-21 14:36:08 -08001095 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001096
Alec Mouric0aae732021-01-12 13:32:18 -08001097 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001098}
1099
1100void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1101 fillRedBufferWithPremultiplyAlpha();
1102 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1103}
1104
1105void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1106 renderengine::DisplaySettings settings;
1107 settings.physicalDisplay = fullscreenRect();
1108 // Here logical space is 1x1
1109 settings.clip = Rect(1, 1);
1110
Vishnu Nair9b079a22020-01-21 14:36:08 -08001111 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001112
1113 renderengine::LayerSettings layer;
Alec Mouria90a5702021-04-16 16:36:21 +00001114 const auto buf = allocateSourceBuffer(1, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001115 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001116 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001117 this->mTexNames.push_back(texName);
1118
1119 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001120 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1121 reinterpret_cast<void**>(&pixels));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001122 pixels[0] = 255;
1123 pixels[1] = 0;
1124 pixels[2] = 0;
1125 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001126 buf->getBuffer()->unlock();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001127
1128 layer.source.buffer.buffer = buf;
1129 layer.source.buffer.textureName = texName;
1130 layer.source.buffer.usePremultipliedAlpha = false;
1131 layer.alpha = 0.5f;
1132 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1133
Vishnu Nair9b079a22020-01-21 14:36:08 -08001134 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001135
Alec Mouric0aae732021-01-12 13:32:18 -08001136 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001137}
1138
1139void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1140 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001141 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001142}
1143
Alec Mouriac335532018-11-12 15:01:33 -08001144void RenderEngineTest::clearLeftRegion() {
1145 renderengine::DisplaySettings settings;
1146 settings.physicalDisplay = fullscreenRect();
1147 // Here logical space is 4x4
1148 settings.clip = Rect(4, 4);
Alec Mouri5a6d8572020-03-23 23:56:15 -07001149 settings.clearRegion = Region(Rect(2, 4));
Vishnu Nair9b079a22020-01-21 14:36:08 -08001150 std::vector<const renderengine::LayerSettings*> layers;
Peiyong Lind8460c82020-07-28 16:04:22 -07001151 // fake layer, without bounds should not render anything
Alec Mouriac335532018-11-12 15:01:33 -08001152 renderengine::LayerSettings layer;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001153 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -08001154 invokeDraw(settings, layers);
Alec Mouriac335532018-11-12 15:01:33 -08001155}
1156
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001157void RenderEngineTest::clearRegion() {
Alec Mouriac335532018-11-12 15:01:33 -08001158 // Reuse mBuffer
1159 clearLeftRegion();
1160 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 255);
1161 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
1162 DEFAULT_DISPLAY_HEIGHT),
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001163 0, 0, 0, 0);
Alec Mouriac335532018-11-12 15:01:33 -08001164}
1165
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001166template <typename SourceVariant>
1167void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1168 const renderengine::ShadowSettings& shadow,
1169 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1170 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001171 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001172 settings.physicalDisplay = fullscreenRect();
1173 settings.clip = fullscreenRect();
1174
Vishnu Nair9b079a22020-01-21 14:36:08 -08001175 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001176
1177 // add background layer
1178 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001179 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001180 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1181 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1182 backgroundColor.b / 255.0f, this);
1183 bgLayer.alpha = backgroundColor.a / 255.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001184 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001185
1186 // add shadow layer
1187 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001188 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001189 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1190 shadowLayer.alpha = castingLayer.alpha;
1191 shadowLayer.shadow = shadow;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001192 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001193
1194 // add layer casting the shadow
1195 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001196 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001197 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1198 casterColor.b / 255.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001199 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001200
Alec Mouric0aae732021-01-12 13:32:18 -08001201 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001202}
1203
Alec Mouribd17b3b2020-12-17 11:08:30 -08001204void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1205 const renderengine::ShadowSettings& shadow,
1206 const ubyte4& backgroundColor) {
1207 renderengine::DisplaySettings settings;
1208 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1209 settings.physicalDisplay = fullscreenRect();
1210 settings.clip = fullscreenRect();
1211
1212 std::vector<const renderengine::LayerSettings*> layers;
1213
1214 // add background layer
1215 renderengine::LayerSettings bgLayer;
1216 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1217 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1218 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1219 backgroundColor.b / 255.0f, this);
1220 bgLayer.alpha = backgroundColor.a / 255.0f;
1221 layers.push_back(&bgLayer);
1222
1223 // add shadow layer
1224 renderengine::LayerSettings shadowLayer;
1225 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1226 shadowLayer.geometry.boundaries = castingBounds;
1227 shadowLayer.alpha = 1.0f;
1228 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1229 shadowLayer.shadow = shadow;
1230 layers.push_back(&shadowLayer);
1231
Alec Mouric0aae732021-01-12 13:32:18 -08001232 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001233}
1234
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001235INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001236 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001237 std::make_shared<GLESCMRenderEngineFactory>(),
1238 std::make_shared<SkiaGLESRenderEngineFactory>(),
1239 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001240
1241TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001242 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001243 drawEmptyLayers();
1244}
1245
Ana Krulec07b98df2021-01-07 14:38:40 -08001246TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
Alec Mouria90a5702021-04-16 16:36:21 +00001247 initializeRenderEngine();
Ana Krulec07b98df2021-01-07 14:38:40 -08001248
1249 renderengine::DisplaySettings settings;
1250 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1251 settings.physicalDisplay = fullscreenRect();
1252 settings.clip = fullscreenRect();
1253
1254 // 255, 255, 255, 255 is full opaque white.
1255 const ubyte4 backgroundColor(255.f, 255.f, 255.f, 255.f);
1256 // Create layer with given color.
1257 renderengine::LayerSettings bgLayer;
1258 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1259 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1260 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1261 backgroundColor.b / 255.0f);
1262 bgLayer.alpha = backgroundColor.a / 255.0f;
1263 // Transform the red color.
1264 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1265
1266 std::vector<const renderengine::LayerSettings*> layers;
1267 layers.push_back(&bgLayer);
1268
Alec Mouric0aae732021-01-12 13:32:18 -08001269 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001270
1271 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001272 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001273 backgroundColor.a);
1274}
1275
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001276TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001277 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001278
Alec Mourid43ccab2019-03-13 12:23:45 -07001279 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001280 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001281 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001282 renderengine::LayerSettings layer;
1283 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1284 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001285 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001286 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001287 status_t status = mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence);
Alec Mourid43ccab2019-03-13 12:23:45 -07001288
1289 ASSERT_EQ(BAD_VALUE, status);
1290}
1291
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001292TEST_P(RenderEngineTest, drawLayers_nullOutputFence) {
Alec Mouric0aae732021-01-12 13:32:18 -08001293 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001294
Alec Mourid43ccab2019-03-13 12:23:45 -07001295 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001296 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001297 settings.physicalDisplay = fullscreenRect();
1298 settings.clip = fullscreenRect();
1299
Vishnu Nair9b079a22020-01-21 14:36:08 -08001300 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001301 renderengine::LayerSettings layer;
1302 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1303 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1304 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001305 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001306
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001307 status_t status = mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), nullptr);
Alec Mourid43ccab2019-03-13 12:23:45 -07001308 ASSERT_EQ(NO_ERROR, status);
1309 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1310}
1311
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001312TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1313 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001314
1315 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1316 // GLES-specific test
1317 return;
1318 }
1319
1320 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001321
Alec Mourife0d72b2019-03-21 14:05:56 -07001322 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001323 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001324 settings.physicalDisplay = fullscreenRect();
1325 settings.clip = fullscreenRect();
1326
Vishnu Nair9b079a22020-01-21 14:36:08 -08001327 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001328 renderengine::LayerSettings layer;
1329 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1330 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1331 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001332 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001333
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001334 status_t status = mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd(), nullptr);
Alec Mourife0d72b2019-03-21 14:05:56 -07001335 ASSERT_EQ(NO_ERROR, status);
Alec Mouria90a5702021-04-16 16:36:21 +00001336 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getBuffer()->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001337 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1338}
1339
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001340TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001341 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001342 fillRedBuffer<ColorSourceVariant>();
1343}
1344
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001345TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001346 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001347 fillGreenBuffer<ColorSourceVariant>();
1348}
1349
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001350TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001351 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001352 fillBlueBuffer<ColorSourceVariant>();
1353}
1354
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001355TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001356 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001357 fillRedTransparentBuffer<ColorSourceVariant>();
1358}
1359
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001360TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001361 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001362 fillBufferPhysicalOffset<ColorSourceVariant>();
1363}
1364
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001365TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001366 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001367 fillBufferCheckersRotate0<ColorSourceVariant>();
1368}
1369
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001370TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001371 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001372 fillBufferCheckersRotate90<ColorSourceVariant>();
1373}
1374
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001375TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001376 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001377 fillBufferCheckersRotate180<ColorSourceVariant>();
1378}
1379
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001380TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001381 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001382 fillBufferCheckersRotate270<ColorSourceVariant>();
1383}
1384
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001385TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001386 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001387 fillBufferLayerTransform<ColorSourceVariant>();
1388}
1389
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001390TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001391 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001392 fillBufferColorTransform<ColorSourceVariant>();
1393}
1394
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001395TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001396 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001397 fillBufferWithRoundedCorners<ColorSourceVariant>();
1398}
1399
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001400TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001401 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001402 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1403}
1404
Alec Mourice438e72021-04-21 12:10:11 -07001405// TODO(b/186010146): reenable once swiftshader is happy with this test
1406TEST_P(RenderEngineTest, DISABLED_drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001407 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001408 fillBufferAndBlurBackground<ColorSourceVariant>();
1409}
1410
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001411TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001412 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001413 overlayCorners<ColorSourceVariant>();
1414}
1415
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001416TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001417 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001418 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1419}
1420
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001421TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001422 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001423 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1424}
1425
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001426TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001427 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001428 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1429}
1430
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001431TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001432 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001433 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1434}
1435
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001436TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001437 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001438 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1439}
1440
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001441TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001442 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001443 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1444}
1445
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001446TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001447 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001448 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1449}
1450
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001451TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001452 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001453 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1454}
1455
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001456TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001457 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001458 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1459}
1460
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001461TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001462 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001463 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1464}
1465
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001466TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001467 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001468 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1469}
1470
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001471TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001472 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001473 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1474}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001475
Alec Mouric0aae732021-01-12 13:32:18 -08001476TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1477 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001478 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1479}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001480
Alec Mourice438e72021-04-21 12:10:11 -07001481// TODO(b/186010146): reenable once swiftshader is happy with this test
1482TEST_P(RenderEngineTest, DISABLED_drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001483 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001484 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1485}
1486
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001487TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001488 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001489 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1490}
1491
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001492TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001493 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001494 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1495}
1496
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001497TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001498 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001499 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1500}
1501
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001502TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001503 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001504 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1505}
1506
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001507TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001508 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001509 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1510}
1511
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001512TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001513 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001514 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1515}
1516
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001517TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001518 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001519 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1520}
1521
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001522TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001523 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001524 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1525}
1526
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001527TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001528 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001529 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1530}
1531
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001532TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001533 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001534 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1535}
1536
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001537TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001538 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001539 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1540}
1541
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001542TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001543 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001544 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1545}
1546
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001547TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001548 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001549 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1550}
1551
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001552TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001553 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001554 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1555}
1556
Alec Mourice438e72021-04-21 12:10:11 -07001557// TODO(b/186010146): reenable once swiftshader is happy with this test
1558TEST_P(RenderEngineTest, DISABLED_drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001559 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001560 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1561}
1562
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001563TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001564 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001565 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1566}
1567
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001568TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08001569 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001570 fillBufferTextureTransform();
1571}
1572
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001573TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001574 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001575 fillBufferWithPremultiplyAlpha();
1576}
1577
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001578TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001579 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001580 fillBufferWithoutPremultiplyAlpha();
1581}
1582
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001583TEST_P(RenderEngineTest, drawLayers_clearRegion) {
Alec Mouric0aae732021-01-12 13:32:18 -08001584 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001585 clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -08001586}
1587
Alec Mouribd17b3b2020-12-17 11:08:30 -08001588TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001589 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08001590
1591 const ubyte4 backgroundColor(255, 255, 255, 255);
1592 const float shadowLength = 5.0f;
1593 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1594 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1595 renderengine::ShadowSettings settings =
1596 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1597 false /* casterIsTranslucent */);
1598
1599 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1600 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1601}
1602
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001603TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08001604 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001605
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001606 const ubyte4 casterColor(255, 0, 0, 255);
1607 const ubyte4 backgroundColor(255, 255, 255, 255);
1608 const float shadowLength = 5.0f;
1609 Rect casterBounds(1, 1);
1610 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1611 renderengine::LayerSettings castingLayer;
1612 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1613 castingLayer.alpha = 1.0f;
1614 renderengine::ShadowSettings settings =
1615 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1616 false /* casterIsTranslucent */);
1617
1618 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1619 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1620}
1621
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001622TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001623 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001624
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001625 const ubyte4 casterColor(255, 0, 0, 255);
1626 const ubyte4 backgroundColor(255, 255, 255, 255);
1627 const float shadowLength = 5.0f;
1628 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1629 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1630 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001631 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001632 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1633 castingLayer.alpha = 1.0f;
1634 renderengine::ShadowSettings settings =
1635 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1636 false /* casterIsTranslucent */);
1637
1638 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1639 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1640}
1641
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001642TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001643 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001644
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001645 const ubyte4 casterColor(255, 0, 0, 255);
1646 const ubyte4 backgroundColor(255, 255, 255, 255);
1647 const float shadowLength = 5.0f;
1648 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1649 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1650 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001651 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001652 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1653 castingLayer.alpha = 1.0f;
1654 renderengine::ShadowSettings settings =
1655 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1656 false /* casterIsTranslucent */);
1657
1658 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1659 backgroundColor);
1660 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1661}
1662
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001663TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08001664 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001665
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001666 const ubyte4 casterColor(255, 0, 0, 255);
1667 const ubyte4 backgroundColor(255, 255, 255, 255);
1668 const float shadowLength = 5.0f;
1669 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1670 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1671 renderengine::LayerSettings castingLayer;
1672 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1673 castingLayer.geometry.roundedCornersRadius = 3.0f;
1674 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1675 castingLayer.alpha = 1.0f;
1676 renderengine::ShadowSettings settings =
1677 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1678 false /* casterIsTranslucent */);
1679
1680 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1681 backgroundColor);
1682 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1683}
1684
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001685TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001686 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001687
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001688 const ubyte4 casterColor(255, 0, 0, 255);
1689 const ubyte4 backgroundColor(255, 255, 255, 255);
1690 const float shadowLength = 5.0f;
1691 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1692 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1693 renderengine::LayerSettings castingLayer;
1694 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1695 castingLayer.alpha = 0.5f;
1696 renderengine::ShadowSettings settings =
1697 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1698 true /* casterIsTranslucent */);
1699
1700 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1701 backgroundColor);
1702
1703 // verify only the background since the shadow will draw behind the caster
1704 const float shadowInset = settings.length * -1.0f;
1705 const Rect casterWithShadow =
1706 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1707 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1708 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1709 backgroundColor.a);
1710}
1711
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001712TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
1713 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001714
1715 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1716 // GLES-specific test
1717 return;
1718 }
1719
1720 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001721
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001722 renderengine::DisplaySettings settings;
1723 settings.physicalDisplay = fullscreenRect();
1724 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001725 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001726
1727 std::vector<const renderengine::LayerSettings*> layers;
1728 renderengine::LayerSettings layer;
1729 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1730 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1731 layer.alpha = 1.0;
1732 layers.push_back(&layer);
1733
1734 base::unique_fd fenceOne;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001735 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fenceOne);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001736 base::unique_fd fenceTwo;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001737 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne), &fenceTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001738
1739 const int fd = fenceTwo.get();
1740 if (fd >= 0) {
1741 sync_wait(fd, -1);
1742 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001743 // Only cleanup the first time.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001744 EXPECT_TRUE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001745 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001746 EXPECT_FALSE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001747 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
1748}
1749
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001750TEST_P(RenderEngineTest, cleanupPostRender_whenCleaningAll_replacesTextureMemory) {
1751 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001752
1753 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1754 // GLES-specific test
1755 return;
1756 }
1757
1758 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001759
Alec Mouri368e1582020-08-13 10:14:29 -07001760 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001761 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri368e1582020-08-13 10:14:29 -07001762 settings.physicalDisplay = fullscreenRect();
1763 settings.clip = fullscreenRect();
1764
1765 std::vector<const renderengine::LayerSettings*> layers;
1766 renderengine::LayerSettings layer;
1767 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1768 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1769 layer.alpha = 1.0;
1770 layers.push_back(&layer);
1771
1772 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001773 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri368e1582020-08-13 10:14:29 -07001774
1775 const int fd = fence.get();
1776 if (fd >= 0) {
1777 sync_wait(fd, -1);
1778 }
1779
Alec Mouria90a5702021-04-16 16:36:21 +00001780 uint64_t bufferId = layer.source.buffer.buffer->getBuffer()->getId();
Alec Mouri368e1582020-08-13 10:14:29 -07001781 uint32_t texName = layer.source.buffer.textureName;
Alec Mouric0aae732021-01-12 13:32:18 -08001782 EXPECT_TRUE(mGLESRE->isImageCachedForTesting(bufferId));
1783 EXPECT_EQ(bufferId, mGLESRE->getBufferIdForTextureNameForTesting(texName));
Alec Mouri368e1582020-08-13 10:14:29 -07001784
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001785 EXPECT_TRUE(mRE->cleanupPostRender(renderengine::RenderEngine::CleanupMode::CLEAN_ALL));
Alec Mouri368e1582020-08-13 10:14:29 -07001786
1787 // Now check that our view of memory is good.
Alec Mouric0aae732021-01-12 13:32:18 -08001788 EXPECT_FALSE(mGLESRE->isImageCachedForTesting(bufferId));
1789 EXPECT_EQ(std::nullopt, mGLESRE->getBufferIdForTextureNameForTesting(bufferId));
1790 EXPECT_TRUE(mGLESRE->isTextureNameKnownForTesting(texName));
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001791}
1792
Ana Krulecf9a15d92020-12-11 08:35:00 -08001793TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08001794 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08001795
1796 renderengine::DisplaySettings settings;
1797 settings.physicalDisplay = fullscreenRect();
1798 settings.clip = fullscreenRect();
1799 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1800
1801 std::vector<const renderengine::LayerSettings*> layers;
1802
1803 renderengine::LayerSettings redLayer;
1804 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1805 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1806 redLayer.geometry.roundedCornersRadius = 5.0f;
1807 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1808 // Red background.
1809 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1810 redLayer.alpha = 1.0f;
1811
1812 layers.push_back(&redLayer);
1813
1814 // Green layer with 1/3 size.
1815 renderengine::LayerSettings greenLayer;
1816 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1817 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1818 greenLayer.geometry.roundedCornersRadius = 5.0f;
1819 // Bottom right corner is not going to be rounded.
1820 greenLayer.geometry.roundedCornersCrop =
1821 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
1822 DEFAULT_DISPLAY_HEIGHT)
1823 .toFloatRect();
1824 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1825 greenLayer.alpha = 1.0f;
1826
1827 layers.push_back(&greenLayer);
1828
Alec Mouric0aae732021-01-12 13:32:18 -08001829 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001830
1831 // Corners should be ignored...
1832 // Screen size: width is 128, height is 256.
1833 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1834 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1835 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1836 // Bottom right corner is kept out of the clipping, and it's green.
1837 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1838 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1839 0, 255, 0, 255);
1840}
1841
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001842TEST_P(RenderEngineTest, testClear) {
1843 initializeRenderEngine();
1844
1845 const auto rect = fullscreenRect();
1846 const renderengine::DisplaySettings display{
1847 .physicalDisplay = rect,
1848 .clip = rect,
1849 };
1850
1851 const renderengine::LayerSettings redLayer{
1852 .geometry.boundaries = rect.toFloatRect(),
1853 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1854 .alpha = 1.0f,
1855 };
1856
1857 // This mimics prepareClearClientComposition. This layer should overwrite
1858 // the redLayer, so that the buffer is transparent, rather than red.
1859 const renderengine::LayerSettings clearLayer{
1860 .geometry.boundaries = rect.toFloatRect(),
1861 .source.solidColor = half3(0.0f, 0.0f, 0.0f),
1862 .alpha = 0.0f,
1863 .disableBlending = true,
1864 };
1865
1866 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &clearLayer};
1867 invokeDraw(display, layers);
1868 expectBufferColor(rect, 0, 0, 0, 0);
1869}
1870
1871TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
1872 initializeRenderEngine();
1873
1874 const auto rect = Rect(0, 0, 1, 1);
1875 const renderengine::DisplaySettings display{
1876 .physicalDisplay = rect,
1877 .clip = rect,
1878 };
1879
1880 const renderengine::LayerSettings redLayer{
1881 .geometry.boundaries = rect.toFloatRect(),
1882 .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1883 .alpha = 1.0f,
1884 };
1885
1886 // The next layer will overwrite redLayer with a GraphicBuffer that is green
1887 // applied with a translucent alpha.
Alec Mouria90a5702021-04-16 16:36:21 +00001888 const auto buf = allocateSourceBuffer(1, 1);
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001889 {
1890 uint8_t* pixels;
Alec Mouria90a5702021-04-16 16:36:21 +00001891 buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1892 reinterpret_cast<void**>(&pixels));
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001893 pixels[0] = 0;
1894 pixels[1] = 255;
1895 pixels[2] = 0;
1896 pixels[3] = 255;
Alec Mouria90a5702021-04-16 16:36:21 +00001897 buf->getBuffer()->unlock();
Leon Scroggins IIIcf3d95c2021-03-19 13:06:32 -04001898 }
1899
1900 const renderengine::LayerSettings greenLayer{
1901 .geometry.boundaries = rect.toFloatRect(),
1902 .source =
1903 renderengine::PixelSource{
1904 .buffer =
1905 renderengine::Buffer{
1906 .buffer = buf,
1907 .usePremultipliedAlpha = true,
1908 },
1909 },
1910 .alpha = 0.5f,
1911 .disableBlending = true,
1912 };
1913
1914 std::vector<const renderengine::LayerSettings*> layers{&redLayer, &greenLayer};
1915 invokeDraw(display, layers);
1916 expectBufferColor(rect, 0, 128, 0, 128);
1917}
1918
Alec Mouri6e57f682018-09-29 20:45:08 -07001919} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08001920
1921// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01001922#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"