blob: 500a90b6ef00c75acdac572d90646f88eba17ea5 [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 Mouri6e57f682018-09-29 20:45:08 -070027#include <renderengine/RenderEngine.h>
Alec Mouri1089aed2018-10-25 21:33:57 -070028#include <sync/sync.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070029#include <ui/PixelFormat.h>
Alec Mouric0aae732021-01-12 13:32:18 -080030
31#include <chrono>
32#include <condition_variable>
33#include <fstream>
34
Alec Mourid43ccab2019-03-13 12:23:45 -070035#include "../gl/GLESRenderEngine.h"
Alec Mouric0aae732021-01-12 13:32:18 -080036#include "../skia/SkiaGLRenderEngine.h"
Ana Krulec9bc9dc62020-02-26 12:16:40 -080037#include "../threaded/RenderEngineThreaded.h"
Alec Mouri6e57f682018-09-29 20:45:08 -070038
Alec Mouri1089aed2018-10-25 21:33:57 -070039constexpr int DEFAULT_DISPLAY_WIDTH = 128;
40constexpr int DEFAULT_DISPLAY_HEIGHT = 256;
41constexpr int DEFAULT_DISPLAY_OFFSET = 64;
Vishnu Nair16efdbf2019-12-10 11:55:42 -080042constexpr bool WRITE_BUFFER_TO_FILE_ON_FAILURE = false;
Alec Mouri1089aed2018-10-25 21:33:57 -070043
Alec Mouri6e57f682018-09-29 20:45:08 -070044namespace android {
45
Ana Krulec82ba2ec2020-11-21 13:33:20 -080046class RenderEngineFactory {
47public:
48 virtual ~RenderEngineFactory() = default;
49
50 virtual std::string name() = 0;
Alec Mouric0aae732021-01-12 13:32:18 -080051 virtual renderengine::RenderEngine::RenderEngineType type() = 0;
52 virtual std::unique_ptr<renderengine::RenderEngine> createRenderEngine() = 0;
53 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
54 return nullptr;
55 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080056};
57
58class GLESRenderEngineFactory : public RenderEngineFactory {
59public:
60 std::string name() override { return "GLESRenderEngineFactory"; }
61
Alec Mouric0aae732021-01-12 13:32:18 -080062 renderengine::RenderEngine::RenderEngineType type() {
63 return renderengine::RenderEngine::RenderEngineType::GLES;
64 }
65
66 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
67 return createGLESRenderEngine();
68 }
69
70 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() {
KaiChieh Chuang436fc192020-09-07 13:48:42 +080071 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -070072 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -080073 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
74 .setImageCacheSize(1)
75 .setUseColorManagerment(false)
76 .setEnableProtectedContext(false)
77 .setPrecacheToneMapperShaderOnly(false)
78 .setSupportsBackgroundBlur(true)
79 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -080080 .setRenderEngineType(type())
KaiChieh Chuang436fc192020-09-07 13:48:42 +080081 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -080082 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -070083 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080084};
Alec Mourid43ccab2019-03-13 12:23:45 -070085
Ana Krulecaa2fe7f2020-11-24 15:06:36 -080086class GLESCMRenderEngineFactory : public RenderEngineFactory {
87public:
88 std::string name() override { return "GLESCMRenderEngineFactory"; }
89
Alec Mouric0aae732021-01-12 13:32:18 -080090 renderengine::RenderEngine::RenderEngineType type() {
91 return renderengine::RenderEngine::RenderEngineType::GLES;
92 }
93
94 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
95 return createGLESRenderEngine();
96 }
97
98 std::unique_ptr<renderengine::gl::GLESRenderEngine> createGLESRenderEngine() override {
Ana Krulecaa2fe7f2020-11-24 15:06:36 -080099 renderengine::RenderEngineCreationArgs reCreationArgs =
100 renderengine::RenderEngineCreationArgs::Builder()
101 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
102 .setImageCacheSize(1)
103 .setEnableProtectedContext(false)
104 .setPrecacheToneMapperShaderOnly(false)
105 .setSupportsBackgroundBlur(true)
106 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800107 .setRenderEngineType(type())
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800108 .setUseColorManagerment(true)
109 .build();
110 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
111 }
112};
113
Alec Mouri0eab3e82020-12-08 18:10:27 -0800114class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
115public:
Alec Mouric0aae732021-01-12 13:32:18 -0800116 std::string name() override { return "SkiaGLRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800117
Alec Mouric0aae732021-01-12 13:32:18 -0800118 renderengine::RenderEngine::RenderEngineType type() {
119 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
120 }
121
122 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800123 renderengine::RenderEngineCreationArgs reCreationArgs =
124 renderengine::RenderEngineCreationArgs::Builder()
125 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
126 .setImageCacheSize(1)
127 .setEnableProtectedContext(false)
128 .setPrecacheToneMapperShaderOnly(false)
129 .setSupportsBackgroundBlur(true)
130 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800131 .setRenderEngineType(type())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800132 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800133 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800134 }
135};
136
137class SkiaGLESCMRenderEngineFactory : public RenderEngineFactory {
138public:
Alec Mouric0aae732021-01-12 13:32:18 -0800139 std::string name() override { return "SkiaGLCMRenderEngineFactory"; }
Alec Mouri0eab3e82020-12-08 18:10:27 -0800140
Alec Mouric0aae732021-01-12 13:32:18 -0800141 renderengine::RenderEngine::RenderEngineType type() {
142 return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
143 }
144
145 std::unique_ptr<renderengine::RenderEngine> createRenderEngine() override {
Alec Mouri0eab3e82020-12-08 18:10:27 -0800146 renderengine::RenderEngineCreationArgs reCreationArgs =
147 renderengine::RenderEngineCreationArgs::Builder()
148 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
149 .setImageCacheSize(1)
150 .setEnableProtectedContext(false)
151 .setPrecacheToneMapperShaderOnly(false)
152 .setSupportsBackgroundBlur(true)
153 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
Alec Mouric0aae732021-01-12 13:32:18 -0800154 .setRenderEngineType(type())
Alec Mouri0eab3e82020-12-08 18:10:27 -0800155 .setUseColorManagerment(true)
156 .build();
Alec Mouric0aae732021-01-12 13:32:18 -0800157 return renderengine::skia::SkiaGLRenderEngine::create(reCreationArgs);
Alec Mouri0eab3e82020-12-08 18:10:27 -0800158 }
159};
160
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800161class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
162public:
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800163 static sp<GraphicBuffer> allocateDefaultBuffer() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700164 return new GraphicBuffer(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT,
165 HAL_PIXEL_FORMAT_RGBA_8888, 1,
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800166 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
Alec Mouric0aae732021-01-12 13:32:18 -0800167 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE,
Alec Mouri1089aed2018-10-25 21:33:57 -0700168 "output");
Alec Mouri6e57f682018-09-29 20:45:08 -0700169 }
170
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800171 // Allocates a 1x1 buffer to fill with a solid color
172 static sp<GraphicBuffer> allocateSourceBuffer(uint32_t width, uint32_t height) {
173 return new GraphicBuffer(width, height, HAL_PIXEL_FORMAT_RGBA_8888, 1,
174 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
175 GRALLOC_USAGE_HW_TEXTURE,
176 "input");
177 }
178
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800179 RenderEngineTest() {
180 const ::testing::TestInfo* const test_info =
181 ::testing::UnitTest::GetInstance()->current_test_info();
182 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
183 mBuffer = allocateDefaultBuffer();
184 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700185
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800186 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800187 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
188 writeBufferToFile("/data/texture_out_");
189 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800190 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800191 mRE->deleteTextures(1, &texName);
Alec Mouric0aae732021-01-12 13:32:18 -0800192 if (mGLESRE != nullptr) {
193 EXPECT_FALSE(mGLESRE->isTextureNameKnownForTesting(texName));
194 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800195 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800196 const ::testing::TestInfo* const test_info =
197 ::testing::UnitTest::GetInstance()->current_test_info();
198 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800199 }
200
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800201 void writeBufferToFile(const char* basename) {
202 std::string filename(basename);
203 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
204 filename.append(".ppm");
205 std::ofstream file(filename.c_str(), std::ios::binary);
206 if (!file.is_open()) {
207 ALOGE("Unable to open file: %s", filename.c_str());
208 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
209 "surfaceflinger to write debug images");
210 return;
211 }
212
Alec Mouri1089aed2018-10-25 21:33:57 -0700213 uint8_t* pixels;
214 mBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
215 reinterpret_cast<void**>(&pixels));
216
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800217 file << "P6\n";
218 file << mBuffer->getWidth() << "\n";
219 file << mBuffer->getHeight() << "\n";
220 file << 255 << "\n";
221
222 std::vector<uint8_t> outBuffer(mBuffer->getWidth() * mBuffer->getHeight() * 3);
223 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
224
225 for (int32_t j = 0; j < mBuffer->getHeight(); j++) {
226 const uint8_t* src = pixels + (mBuffer->getStride() * j) * 4;
227 for (int32_t i = 0; i < mBuffer->getWidth(); i++) {
228 // Only copy R, G and B components
229 outPtr[0] = src[0];
230 outPtr[1] = src[1];
231 outPtr[2] = src[2];
232 outPtr += 3;
233
234 src += 4;
235 }
236 }
237 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
238 mBuffer->unlock();
239 }
240
241 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
242 size_t c;
243 Rect const* rect = region.getArray(&c);
244 for (size_t i = 0; i < c; i++, rect++) {
245 expectBufferColor(*rect, r, g, b, a);
246 }
247 }
248
249 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
250 uint8_t tolerance = 0) {
251 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
252 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
253 uint8_t tmp = a >= b ? a - b : b - a;
254 return tmp <= tolerance;
255 };
256 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700257 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800258
259 expectBufferColor(rect, r, g, b, a, colorCompare);
260 }
261
262 void expectBufferColor(const Rect& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
263 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
264 uint8_t* pixels;
265 mBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
266 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700267 int32_t maxFails = 10;
268 int32_t fails = 0;
269 for (int32_t j = 0; j < region.getHeight(); j++) {
270 const uint8_t* src =
271 pixels + (mBuffer->getStride() * (region.top + j) + region.left) * 4;
272 for (int32_t i = 0; i < region.getWidth(); i++) {
273 const uint8_t expected[4] = {r, g, b, a};
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800274 bool equal = colorCompare(src, expected);
Alec Mouri1089aed2018-10-25 21:33:57 -0700275 EXPECT_TRUE(equal)
276 << "pixel @ (" << region.left + i << ", " << region.top + j << "): "
277 << "expected (" << static_cast<uint32_t>(r) << ", "
278 << static_cast<uint32_t>(g) << ", " << static_cast<uint32_t>(b) << ", "
279 << static_cast<uint32_t>(a) << "), "
280 << "got (" << static_cast<uint32_t>(src[0]) << ", "
281 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
282 << ", " << static_cast<uint32_t>(src[3]) << ")";
283 src += 4;
284 if (!equal && ++fails >= maxFails) {
285 break;
286 }
287 }
288 if (fails >= maxFails) {
289 break;
290 }
291 }
292 mBuffer->unlock();
293 }
294
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800295 void expectAlpha(const Rect& rect, uint8_t a) {
296 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
297 return colorA[3] == colorB[3];
298 };
299 expectBufferColor(rect, 0.0f /* r */, 0.0f /*g */, 0.0f /* b */, a, colorCompare);
300 }
301
302 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
303 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
304 const ubyte4& backgroundColor) {
305 const Rect casterRect(castingLayer.geometry.boundaries);
306 Region casterRegion = Region(casterRect);
307 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
308 if (casterCornerRadius > 0.0f) {
309 // ignore the corners if a corner radius is set
310 Rect cornerRect(casterCornerRadius, casterCornerRadius);
311 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
312 casterRegion.subtractSelf(
313 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
314 casterRegion.subtractSelf(
315 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
316 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
317 casterRect.bottom - casterCornerRadius));
318 }
319
320 const float shadowInset = shadow.length * -1.0f;
321 const Rect casterWithShadow =
322 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
323 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
324 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
325
326 // verify casting layer
327 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
328
329 // verify shadows by testing just the alpha since its difficult to validate the shadow color
330 size_t c;
331 Rect const* r = shadowRegion.getArray(&c);
332 for (size_t i = 0; i < c; i++, r++) {
333 expectAlpha(*r, 255);
334 }
335
336 // verify background
337 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
338 backgroundColor.a);
339 }
340
Alec Mouribd17b3b2020-12-17 11:08:30 -0800341 void expectShadowColorWithoutCaster(const FloatRect& casterBounds,
342 const renderengine::ShadowSettings& shadow,
343 const ubyte4& backgroundColor) {
344 const float shadowInset = shadow.length * -1.0f;
345 const Rect casterRect(casterBounds);
346 const Rect shadowRect =
347 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
348
349 const Region backgroundRegion =
350 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
351
352 expectAlpha(shadowRect, 255);
353 // (0, 0, 0) fill on the bounds of the layer should be ignored.
354 expectBufferColor(casterRect, 255, 255, 255, 255, 254);
355
356 // verify background
357 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
358 backgroundColor.a);
359 }
360
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800361 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
362 bool casterIsTranslucent) {
363 renderengine::ShadowSettings shadow;
364 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
365 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
366 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
367 shadow.lightRadius = 0.0f;
368 shadow.length = shadowLength;
369 shadow.casterIsTranslucent = casterIsTranslucent;
370 return shadow;
371 }
372
Alec Mouri1089aed2018-10-25 21:33:57 -0700373 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
374
375 static Rect offsetRect() {
376 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
377 DEFAULT_DISPLAY_HEIGHT);
378 }
379
380 static Rect offsetRectAtZero() {
381 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
382 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
383 }
384
Alec Mourid43ccab2019-03-13 12:23:45 -0700385 void invokeDraw(renderengine::DisplaySettings settings,
Alec Mouric0aae732021-01-12 13:32:18 -0800386 std::vector<const renderengine::LayerSettings*> layers) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700387 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800388 status_t status =
Alec Mouric0aae732021-01-12 13:32:18 -0800389 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
390 mCurrentBuffer = mBuffer;
Alec Mouri1089aed2018-10-25 21:33:57 -0700391
392 int fd = fence.release();
393 if (fd >= 0) {
394 sync_wait(fd, -1);
395 close(fd);
396 }
397
398 ASSERT_EQ(NO_ERROR, status);
Alec Mouric0aae732021-01-12 13:32:18 -0800399 if (layers.size() > 0 && mGLESRE != nullptr) {
400 ASSERT_TRUE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700401 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700402 }
403
Alec Mourid43ccab2019-03-13 12:23:45 -0700404 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700405 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800406 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouric0aae732021-01-12 13:32:18 -0800407 invokeDraw(settings, layers);
Alec Mouri6e57f682018-09-29 20:45:08 -0700408 }
409
Alec Mouri1089aed2018-10-25 21:33:57 -0700410 template <typename SourceVariant>
411 void fillBuffer(half r, half g, half b, half a);
412
413 template <typename SourceVariant>
414 void fillRedBuffer();
415
416 template <typename SourceVariant>
417 void fillGreenBuffer();
418
419 template <typename SourceVariant>
420 void fillBlueBuffer();
421
422 template <typename SourceVariant>
423 void fillRedTransparentBuffer();
424
425 template <typename SourceVariant>
426 void fillRedOffsetBuffer();
427
428 template <typename SourceVariant>
429 void fillBufferPhysicalOffset();
430
431 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700432 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700433
434 template <typename SourceVariant>
435 void fillBufferCheckersRotate0();
436
437 template <typename SourceVariant>
438 void fillBufferCheckersRotate90();
439
440 template <typename SourceVariant>
441 void fillBufferCheckersRotate180();
442
443 template <typename SourceVariant>
444 void fillBufferCheckersRotate270();
445
446 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800447 void fillBufferWithLayerTransform();
448
449 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700450 void fillBufferLayerTransform();
451
452 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800453 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800454
455 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700456 void fillBufferColorTransform();
457
Alec Mouri7c94edb2018-12-03 21:23:26 -0800458 template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800459 void fillBufferWithColorTransformZeroLayerAlpha();
460
461 template <typename SourceVariant>
462 void fillBufferColorTransformZeroLayerAlpha();
463
464 template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800465 void fillRedBufferWithRoundedCorners();
466
467 template <typename SourceVariant>
468 void fillBufferWithRoundedCorners();
469
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000470 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800471 void fillBufferAndBlurBackground();
472
473 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000474 void overlayCorners();
475
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800476 void fillRedBufferTextureTransform();
477
478 void fillBufferTextureTransform();
479
480 void fillRedBufferWithPremultiplyAlpha();
481
482 void fillBufferWithPremultiplyAlpha();
483
484 void fillRedBufferWithoutPremultiplyAlpha();
485
486 void fillBufferWithoutPremultiplyAlpha();
487
Alec Mouriac335532018-11-12 15:01:33 -0800488 void fillGreenColorBufferThenClearRegion();
489
490 void clearLeftRegion();
491
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000492 void clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -0800493
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800494 template <typename SourceVariant>
495 void drawShadow(const renderengine::LayerSettings& castingLayer,
496 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
497 const ubyte4& backgroundColor);
498
Alec Mouribd17b3b2020-12-17 11:08:30 -0800499 void drawShadowWithoutCaster(const FloatRect& castingBounds,
500 const renderengine::ShadowSettings& shadow,
501 const ubyte4& backgroundColor);
502
Alec Mouric0aae732021-01-12 13:32:18 -0800503 void initializeRenderEngine();
504
505 std::unique_ptr<renderengine::RenderEngine> mRE;
506 // GLESRenderEngine for testing GLES-specific behavior.
507 // Owened by mRE, but this is downcasted.
508 renderengine::gl::GLESRenderEngine* mGLESRE = nullptr;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800509
Alec Mourid43ccab2019-03-13 12:23:45 -0700510 // Dumb hack to avoid NPE in the EGL driver: the GraphicBuffer needs to
511 // be freed *after* RenderEngine is destroyed, so that the EGL image is
512 // destroyed first.
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800513 sp<GraphicBuffer> mCurrentBuffer;
Alec Mouri1089aed2018-10-25 21:33:57 -0700514
515 sp<GraphicBuffer> mBuffer;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800516
517 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700518};
519
Alec Mouric0aae732021-01-12 13:32:18 -0800520void RenderEngineTest::initializeRenderEngine() {
521 const auto& renderEngineFactory = GetParam();
522 if (renderEngineFactory->type() == renderengine::RenderEngine::RenderEngineType::GLES) {
523 // Only GLESRenderEngine exposes test-only methods. Provide a pointer to the
524 // GLESRenderEngine if we're using it so that we don't need to dynamic_cast
525 // every time.
526 std::unique_ptr<renderengine::gl::GLESRenderEngine> renderEngine =
527 renderEngineFactory->createGLESRenderEngine();
528 mGLESRE = renderEngine.get();
529 mRE = std::move(renderEngine);
530 } else {
531 mRE = renderEngineFactory->createRenderEngine();
532 }
533}
534
Alec Mouri1089aed2018-10-25 21:33:57 -0700535struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800536 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800537 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700538 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800539 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700540 }
541};
542
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800543struct RelaxOpaqueBufferVariant {
544 static void setOpaqueBit(renderengine::LayerSettings& layer) {
545 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800546 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800547 }
548
549 static uint8_t getAlphaChannel() { return 255; }
550};
551
552struct ForceOpaqueBufferVariant {
553 static void setOpaqueBit(renderengine::LayerSettings& layer) {
554 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800555 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800556 }
557
558 static uint8_t getAlphaChannel() {
559 // The isOpaque bit will override the alpha channel, so this should be
560 // arbitrary.
Alec Mouric0aae732021-01-12 13:32:18 -0800561 return 50;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800562 }
563};
564
565template <typename OpaquenessVariant>
566struct BufferSourceVariant {
567 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800568 RenderEngineTest* fixture) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800569 sp<GraphicBuffer> buf = RenderEngineTest::allocateSourceBuffer(1, 1);
570 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800571 fixture->mRE->genTextures(1, &texName);
572 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800573
574 uint8_t* pixels;
575 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
576 reinterpret_cast<void**>(&pixels));
577
578 for (int32_t j = 0; j < buf->getHeight(); j++) {
579 uint8_t* iter = pixels + (buf->getStride() * j) * 4;
580 for (int32_t i = 0; i < buf->getWidth(); i++) {
581 iter[0] = uint8_t(r * 255);
582 iter[1] = uint8_t(g * 255);
583 iter[2] = uint8_t(b * 255);
584 iter[3] = OpaquenessVariant::getAlphaChannel();
585 iter += 4;
586 }
587 }
588
589 buf->unlock();
590
591 layer.source.buffer.buffer = buf;
592 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800593 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800594 OpaquenessVariant::setOpaqueBit(layer);
595 }
596};
597
Alec Mouri1089aed2018-10-25 21:33:57 -0700598template <typename SourceVariant>
599void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
600 renderengine::DisplaySettings settings;
601 settings.physicalDisplay = fullscreenRect();
602 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800603 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700604
Vishnu Nair9b079a22020-01-21 14:36:08 -0800605 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700606
607 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800608 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700609 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800610 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700611 layer.alpha = a;
612
Vishnu Nair9b079a22020-01-21 14:36:08 -0800613 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700614
Alec Mouric0aae732021-01-12 13:32:18 -0800615 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700616}
617
618template <typename SourceVariant>
619void RenderEngineTest::fillRedBuffer() {
620 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
621 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
622}
623
624template <typename SourceVariant>
625void RenderEngineTest::fillGreenBuffer() {
626 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
627 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
628}
629
630template <typename SourceVariant>
631void RenderEngineTest::fillBlueBuffer() {
632 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
633 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
634}
635
636template <typename SourceVariant>
637void RenderEngineTest::fillRedTransparentBuffer() {
638 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
639 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
640}
641
642template <typename SourceVariant>
643void RenderEngineTest::fillRedOffsetBuffer() {
644 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800645 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700646 settings.physicalDisplay = offsetRect();
647 settings.clip = offsetRectAtZero();
648
Vishnu Nair9b079a22020-01-21 14:36:08 -0800649 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700650
651 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800652 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700653 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800654 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700655 layer.alpha = 1.0f;
656
Vishnu Nair9b079a22020-01-21 14:36:08 -0800657 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -0800658 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700659}
660
661template <typename SourceVariant>
662void RenderEngineTest::fillBufferPhysicalOffset() {
663 fillRedOffsetBuffer<SourceVariant>();
664
665 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
666 DEFAULT_DISPLAY_HEIGHT),
667 255, 0, 0, 255);
668 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
669 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
670
671 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
672 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
673}
674
675template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700676void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700677 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800678 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700679 settings.physicalDisplay = fullscreenRect();
680 // Here logical space is 2x2
681 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700682 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700683
Vishnu Nair9b079a22020-01-21 14:36:08 -0800684 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700685
686 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800687 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700688 Rect rectOne(0, 0, 1, 1);
689 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800690 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700691 layerOne.alpha = 1.0f;
692
693 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800694 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700695 Rect rectTwo(0, 1, 1, 2);
696 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800697 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700698 layerTwo.alpha = 1.0f;
699
700 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800701 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700702 Rect rectThree(1, 0, 2, 1);
703 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800704 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700705 layerThree.alpha = 1.0f;
706
Vishnu Nair9b079a22020-01-21 14:36:08 -0800707 layers.push_back(&layerOne);
708 layers.push_back(&layerTwo);
709 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700710
Alec Mouric0aae732021-01-12 13:32:18 -0800711 invokeDraw(settings, layers);
Alec Mouri1089aed2018-10-25 21:33:57 -0700712}
713
714template <typename SourceVariant>
715void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700716 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700717 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
718 255);
719 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
720 DEFAULT_DISPLAY_HEIGHT / 2),
721 0, 0, 255, 255);
722 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
723 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
724 0, 0, 0, 0);
725 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
726 DEFAULT_DISPLAY_HEIGHT),
727 0, 255, 0, 255);
728}
729
730template <typename SourceVariant>
731void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700732 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700733 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
734 255);
735 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
736 DEFAULT_DISPLAY_HEIGHT / 2),
737 255, 0, 0, 255);
738 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
739 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
740 0, 0, 255, 255);
741 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
742 DEFAULT_DISPLAY_HEIGHT),
743 0, 0, 0, 0);
744}
745
746template <typename SourceVariant>
747void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700748 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700749 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
750 0);
751 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
752 DEFAULT_DISPLAY_HEIGHT / 2),
753 0, 255, 0, 255);
754 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
755 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
756 255, 0, 0, 255);
757 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
758 DEFAULT_DISPLAY_HEIGHT),
759 0, 0, 255, 255);
760}
761
762template <typename SourceVariant>
763void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700764 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700765 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
766 255);
767 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
768 DEFAULT_DISPLAY_HEIGHT / 2),
769 0, 0, 0, 0);
770 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
771 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
772 0, 255, 0, 255);
773 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
774 DEFAULT_DISPLAY_HEIGHT),
775 255, 0, 0, 255);
776}
777
778template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800779void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700780 renderengine::DisplaySettings settings;
781 settings.physicalDisplay = fullscreenRect();
782 // Here logical space is 2x2
783 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800784 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700785
Vishnu Nair9b079a22020-01-21 14:36:08 -0800786 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700787
788 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800789 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700790 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
791 // Translate one pixel diagonally
792 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 -0800793 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700794 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
795 layer.alpha = 1.0f;
796
Vishnu Nair9b079a22020-01-21 14:36:08 -0800797 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700798
Alec Mouric0aae732021-01-12 13:32:18 -0800799 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800800}
Alec Mouri1089aed2018-10-25 21:33:57 -0700801
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800802template <typename SourceVariant>
803void RenderEngineTest::fillBufferLayerTransform() {
804 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700805 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
806 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
807 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
808 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
809 255, 0, 0, 255);
810}
811
812template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800813void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700814 renderengine::DisplaySettings settings;
815 settings.physicalDisplay = fullscreenRect();
816 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800817 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700818
Vishnu Nair9b079a22020-01-21 14:36:08 -0800819 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700820
821 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800822 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700823 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800824 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700825 layer.alpha = 1.0f;
826
827 // construct a fake color matrix
828 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800829 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700830 // set red channel to red + green
831 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
832
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800833 layer.alpha = 1.0f;
834 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
835
Vishnu Nair9b079a22020-01-21 14:36:08 -0800836 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700837
Alec Mouric0aae732021-01-12 13:32:18 -0800838 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800839}
Alec Mouri1089aed2018-10-25 21:33:57 -0700840
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800841template <typename SourceVariant>
842void RenderEngineTest::fillBufferColorTransform() {
843 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800844 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
845}
846
847template <typename SourceVariant>
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800848void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
849 renderengine::DisplaySettings settings;
850 settings.physicalDisplay = fullscreenRect();
851 settings.clip = Rect(1, 1);
852
853 std::vector<const renderengine::LayerSettings*> layers;
854
855 renderengine::LayerSettings layer;
856 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
857 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
858 layer.alpha = 0;
859
860 // construct a fake color matrix
861 // simple inverse color
862 settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
863
864 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
865
866 layers.push_back(&layer);
867
Alec Mouric0aae732021-01-12 13:32:18 -0800868 invokeDraw(settings, layers);
KaiChieh Chuangda2845c2020-12-14 16:49:38 +0800869}
870
871template <typename SourceVariant>
872void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
873 fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
874 expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
875}
876
877template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800878void RenderEngineTest::fillRedBufferWithRoundedCorners() {
879 renderengine::DisplaySettings settings;
880 settings.physicalDisplay = fullscreenRect();
881 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800882 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800883
Vishnu Nair9b079a22020-01-21 14:36:08 -0800884 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800885
886 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800887 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800888 layer.geometry.boundaries = fullscreenRect().toFloatRect();
889 layer.geometry.roundedCornersRadius = 5.0f;
890 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
891 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
892 layer.alpha = 1.0f;
893
Vishnu Nair9b079a22020-01-21 14:36:08 -0800894 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800895
Alec Mouric0aae732021-01-12 13:32:18 -0800896 invokeDraw(settings, layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800897}
898
899template <typename SourceVariant>
900void RenderEngineTest::fillBufferWithRoundedCorners() {
901 fillRedBufferWithRoundedCorners<SourceVariant>();
902 // Corners should be ignored...
903 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
904 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
905 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
906 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
907 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
908 0, 0, 0, 0);
909 // ...And the non-rounded portion should be red.
910 // Other pixels may be anti-aliased, so let's not check those.
911 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
912 255);
913}
914
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000915template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800916void RenderEngineTest::fillBufferAndBlurBackground() {
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800917 auto blurRadius = 50;
918 auto center = DEFAULT_DISPLAY_WIDTH / 2;
919
920 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800921 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800922 settings.physicalDisplay = fullscreenRect();
923 settings.clip = fullscreenRect();
924
Vishnu Nair9b079a22020-01-21 14:36:08 -0800925 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800926
927 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800928 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800929 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
930 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
931 backgroundLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800932 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800933
934 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800935 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800936 leftLayer.geometry.boundaries =
937 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
938 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
939 leftLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800940 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800941
942 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800943 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800944 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
945 blurLayer.backgroundBlurRadius = blurRadius;
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500946 SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800947 blurLayer.alpha = 0;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800948 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800949
Alec Mouric0aae732021-01-12 13:32:18 -0800950 invokeDraw(settings, layers);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800951
Derek Sollenbergerecb21462021-01-29 16:53:49 -0500952 // solid color
953 expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
954
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500955 if (mRE->supportsBackgroundBlur()) {
956 // blurred color (downsampling should result in the center color being close to 128)
957 expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
958 10 /* tolerance */);
959 }
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800960}
961
962template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000963void RenderEngineTest::overlayCorners() {
964 renderengine::DisplaySettings settings;
965 settings.physicalDisplay = fullscreenRect();
966 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800967 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000968
Vishnu Nair9b079a22020-01-21 14:36:08 -0800969 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000970
971 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800972 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000973 layerOne.geometry.boundaries =
974 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
975 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
976 layerOne.alpha = 0.2;
977
Vishnu Nair9b079a22020-01-21 14:36:08 -0800978 layersFirst.push_back(&layerOne);
Alec Mouric0aae732021-01-12 13:32:18 -0800979 invokeDraw(settings, layersFirst);
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000980 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
981 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
982 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
983 0, 0, 0, 0);
984
Vishnu Nair9b079a22020-01-21 14:36:08 -0800985 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000986 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800987 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000988 layerTwo.geometry.boundaries =
989 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
990 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
991 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
992 layerTwo.alpha = 1.0f;
993
Vishnu Nair9b079a22020-01-21 14:36:08 -0800994 layersSecond.push_back(&layerTwo);
Alec Mouric0aae732021-01-12 13:32:18 -0800995 invokeDraw(settings, layersSecond);
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000996
997 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
998 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
999 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1000 0, 255, 0, 255);
1001}
1002
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001003void RenderEngineTest::fillRedBufferTextureTransform() {
1004 renderengine::DisplaySettings settings;
1005 settings.physicalDisplay = fullscreenRect();
1006 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001007 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001008
Vishnu Nair9b079a22020-01-21 14:36:08 -08001009 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001010
1011 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001012 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001013 // Here will allocate a checker board texture, but transform texture
1014 // coordinates so that only the upper left is applied.
1015 sp<GraphicBuffer> buf = allocateSourceBuffer(2, 2);
1016 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001017 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001018 this->mTexNames.push_back(texName);
1019
1020 uint8_t* pixels;
1021 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1022 reinterpret_cast<void**>(&pixels));
1023 // Red top left, Green top right, Blue bottom left, Black bottom right
1024 pixels[0] = 255;
1025 pixels[1] = 0;
1026 pixels[2] = 0;
1027 pixels[3] = 255;
1028 pixels[4] = 0;
1029 pixels[5] = 255;
1030 pixels[6] = 0;
1031 pixels[7] = 255;
1032 pixels[8] = 0;
1033 pixels[9] = 0;
1034 pixels[10] = 255;
1035 pixels[11] = 255;
1036 buf->unlock();
1037
1038 layer.source.buffer.buffer = buf;
1039 layer.source.buffer.textureName = texName;
1040 // Transform coordinates to only be inside the red quadrant.
1041 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
1042 layer.alpha = 1.0f;
1043 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1044
Vishnu Nair9b079a22020-01-21 14:36:08 -08001045 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001046
Alec Mouric0aae732021-01-12 13:32:18 -08001047 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001048}
1049
1050void RenderEngineTest::fillBufferTextureTransform() {
1051 fillRedBufferTextureTransform();
1052 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1053}
1054
1055void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1056 renderengine::DisplaySettings settings;
1057 settings.physicalDisplay = fullscreenRect();
1058 // Here logical space is 1x1
1059 settings.clip = Rect(1, 1);
1060
Vishnu Nair9b079a22020-01-21 14:36:08 -08001061 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001062
1063 renderengine::LayerSettings layer;
1064 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
1065 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001066 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001067 this->mTexNames.push_back(texName);
1068
1069 uint8_t* pixels;
1070 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1071 reinterpret_cast<void**>(&pixels));
1072 pixels[0] = 255;
1073 pixels[1] = 0;
1074 pixels[2] = 0;
1075 pixels[3] = 255;
1076 buf->unlock();
1077
1078 layer.source.buffer.buffer = buf;
1079 layer.source.buffer.textureName = texName;
1080 layer.source.buffer.usePremultipliedAlpha = true;
1081 layer.alpha = 0.5f;
1082 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1083
Vishnu Nair9b079a22020-01-21 14:36:08 -08001084 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001085
Alec Mouric0aae732021-01-12 13:32:18 -08001086 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001087}
1088
1089void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1090 fillRedBufferWithPremultiplyAlpha();
1091 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
1092}
1093
1094void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1095 renderengine::DisplaySettings settings;
1096 settings.physicalDisplay = fullscreenRect();
1097 // Here logical space is 1x1
1098 settings.clip = Rect(1, 1);
1099
Vishnu Nair9b079a22020-01-21 14:36:08 -08001100 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001101
1102 renderengine::LayerSettings layer;
1103 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
1104 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001105 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001106 this->mTexNames.push_back(texName);
1107
1108 uint8_t* pixels;
1109 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1110 reinterpret_cast<void**>(&pixels));
1111 pixels[0] = 255;
1112 pixels[1] = 0;
1113 pixels[2] = 0;
1114 pixels[3] = 255;
1115 buf->unlock();
1116
1117 layer.source.buffer.buffer = buf;
1118 layer.source.buffer.textureName = texName;
1119 layer.source.buffer.usePremultipliedAlpha = false;
1120 layer.alpha = 0.5f;
1121 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1122
Vishnu Nair9b079a22020-01-21 14:36:08 -08001123 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001124
Alec Mouric0aae732021-01-12 13:32:18 -08001125 invokeDraw(settings, layers);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001126}
1127
1128void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1129 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +08001130 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001131}
1132
Alec Mouriac335532018-11-12 15:01:33 -08001133void RenderEngineTest::clearLeftRegion() {
1134 renderengine::DisplaySettings settings;
1135 settings.physicalDisplay = fullscreenRect();
1136 // Here logical space is 4x4
1137 settings.clip = Rect(4, 4);
Alec Mouri5a6d8572020-03-23 23:56:15 -07001138 settings.clearRegion = Region(Rect(2, 4));
Vishnu Nair9b079a22020-01-21 14:36:08 -08001139 std::vector<const renderengine::LayerSettings*> layers;
Peiyong Lind8460c82020-07-28 16:04:22 -07001140 // fake layer, without bounds should not render anything
Alec Mouriac335532018-11-12 15:01:33 -08001141 renderengine::LayerSettings layer;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001142 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -08001143 invokeDraw(settings, layers);
Alec Mouriac335532018-11-12 15:01:33 -08001144}
1145
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001146void RenderEngineTest::clearRegion() {
Alec Mouriac335532018-11-12 15:01:33 -08001147 // Reuse mBuffer
1148 clearLeftRegion();
1149 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 255);
1150 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
1151 DEFAULT_DISPLAY_HEIGHT),
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001152 0, 0, 0, 0);
Alec Mouriac335532018-11-12 15:01:33 -08001153}
1154
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001155template <typename SourceVariant>
1156void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1157 const renderengine::ShadowSettings& shadow,
1158 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1159 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001160 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001161 settings.physicalDisplay = fullscreenRect();
1162 settings.clip = fullscreenRect();
1163
Vishnu Nair9b079a22020-01-21 14:36:08 -08001164 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001165
1166 // add background layer
1167 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001168 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001169 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1170 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1171 backgroundColor.b / 255.0f, this);
1172 bgLayer.alpha = backgroundColor.a / 255.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001173 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001174
1175 // add shadow layer
1176 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001177 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001178 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1179 shadowLayer.alpha = castingLayer.alpha;
1180 shadowLayer.shadow = shadow;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001181 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001182
1183 // add layer casting the shadow
1184 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001185 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001186 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1187 casterColor.b / 255.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001188 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001189
Alec Mouric0aae732021-01-12 13:32:18 -08001190 invokeDraw(settings, layers);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001191}
1192
Alec Mouribd17b3b2020-12-17 11:08:30 -08001193void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1194 const renderengine::ShadowSettings& shadow,
1195 const ubyte4& backgroundColor) {
1196 renderengine::DisplaySettings settings;
1197 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1198 settings.physicalDisplay = fullscreenRect();
1199 settings.clip = fullscreenRect();
1200
1201 std::vector<const renderengine::LayerSettings*> layers;
1202
1203 // add background layer
1204 renderengine::LayerSettings bgLayer;
1205 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1206 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1207 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1208 backgroundColor.b / 255.0f, this);
1209 bgLayer.alpha = backgroundColor.a / 255.0f;
1210 layers.push_back(&bgLayer);
1211
1212 // add shadow layer
1213 renderengine::LayerSettings shadowLayer;
1214 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1215 shadowLayer.geometry.boundaries = castingBounds;
1216 shadowLayer.alpha = 1.0f;
1217 ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1218 shadowLayer.shadow = shadow;
1219 layers.push_back(&shadowLayer);
1220
Alec Mouric0aae732021-01-12 13:32:18 -08001221 invokeDraw(settings, layers);
Alec Mouribd17b3b2020-12-17 11:08:30 -08001222}
1223
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001224INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001225 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
Alec Mouri0eab3e82020-12-08 18:10:27 -08001226 std::make_shared<GLESCMRenderEngineFactory>(),
1227 std::make_shared<SkiaGLESRenderEngineFactory>(),
1228 std::make_shared<SkiaGLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001229
1230TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
Alec Mouric0aae732021-01-12 13:32:18 -08001231 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001232 drawEmptyLayers();
1233}
1234
Ana Krulec07b98df2021-01-07 14:38:40 -08001235TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
1236 const auto& renderEngineFactory = GetParam();
1237 mRE = renderEngineFactory->createRenderEngine();
1238
1239 renderengine::DisplaySettings settings;
1240 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1241 settings.physicalDisplay = fullscreenRect();
1242 settings.clip = fullscreenRect();
1243
1244 // 255, 255, 255, 255 is full opaque white.
1245 const ubyte4 backgroundColor(255.f, 255.f, 255.f, 255.f);
1246 // Create layer with given color.
1247 renderengine::LayerSettings bgLayer;
1248 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1249 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1250 bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1251 backgroundColor.b / 255.0f);
1252 bgLayer.alpha = backgroundColor.a / 255.0f;
1253 // Transform the red color.
1254 bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1255
1256 std::vector<const renderengine::LayerSettings*> layers;
1257 layers.push_back(&bgLayer);
1258
Alec Mouric0aae732021-01-12 13:32:18 -08001259 invokeDraw(settings, layers);
Ana Krulec07b98df2021-01-07 14:38:40 -08001260
1261 // Expect to see full opaque pixel (with inverted red from the transform).
Alec Mouric0aae732021-01-12 13:32:18 -08001262 expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
Ana Krulec07b98df2021-01-07 14:38:40 -08001263 backgroundColor.a);
1264}
1265
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001266TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001267 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001268
Alec Mourid43ccab2019-03-13 12:23:45 -07001269 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001270 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001271 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001272 renderengine::LayerSettings layer;
1273 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1274 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001275 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001276 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001277 status_t status = mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence);
Alec Mourid43ccab2019-03-13 12:23:45 -07001278
1279 ASSERT_EQ(BAD_VALUE, status);
1280}
1281
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001282TEST_P(RenderEngineTest, drawLayers_nullOutputFence) {
Alec Mouric0aae732021-01-12 13:32:18 -08001283 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001284
Alec Mourid43ccab2019-03-13 12:23:45 -07001285 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001286 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001287 settings.physicalDisplay = fullscreenRect();
1288 settings.clip = fullscreenRect();
1289
Vishnu Nair9b079a22020-01-21 14:36:08 -08001290 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001291 renderengine::LayerSettings layer;
1292 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1293 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1294 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001295 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001296
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001297 status_t status = mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), nullptr);
1298 mCurrentBuffer = mBuffer;
Alec Mourid43ccab2019-03-13 12:23:45 -07001299 ASSERT_EQ(NO_ERROR, status);
1300 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1301}
1302
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001303TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1304 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001305
1306 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1307 // GLES-specific test
1308 return;
1309 }
1310
1311 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001312
Alec Mourife0d72b2019-03-21 14:05:56 -07001313 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001314 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001315 settings.physicalDisplay = fullscreenRect();
1316 settings.clip = fullscreenRect();
1317
Vishnu Nair9b079a22020-01-21 14:36:08 -08001318 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001319 renderengine::LayerSettings layer;
1320 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1321 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1322 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001323 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001324
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001325 status_t status = mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd(), nullptr);
1326 mCurrentBuffer = mBuffer;
Alec Mourife0d72b2019-03-21 14:05:56 -07001327 ASSERT_EQ(NO_ERROR, status);
Alec Mouric0aae732021-01-12 13:32:18 -08001328 ASSERT_FALSE(mGLESRE->isFramebufferImageCachedForTesting(mBuffer->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001329 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1330}
1331
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001332TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001333 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001334 fillRedBuffer<ColorSourceVariant>();
1335}
1336
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001337TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001338 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001339 fillGreenBuffer<ColorSourceVariant>();
1340}
1341
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001342TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001343 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001344 fillBlueBuffer<ColorSourceVariant>();
1345}
1346
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001347TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001348 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001349 fillRedTransparentBuffer<ColorSourceVariant>();
1350}
1351
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001352TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001353 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001354 fillBufferPhysicalOffset<ColorSourceVariant>();
1355}
1356
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001357TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001358 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001359 fillBufferCheckersRotate0<ColorSourceVariant>();
1360}
1361
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001362TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001363 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001364 fillBufferCheckersRotate90<ColorSourceVariant>();
1365}
1366
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001367TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001368 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001369 fillBufferCheckersRotate180<ColorSourceVariant>();
1370}
1371
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001372TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001373 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001374 fillBufferCheckersRotate270<ColorSourceVariant>();
1375}
1376
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001377TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001378 initializeRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001379 fillBufferLayerTransform<ColorSourceVariant>();
1380}
1381
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001382TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001383 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001384 fillBufferColorTransform<ColorSourceVariant>();
1385}
1386
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001387TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001388 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001389 fillBufferWithRoundedCorners<ColorSourceVariant>();
1390}
1391
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001392TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001393 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001394 fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1395}
1396
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001397TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001398 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001399 fillBufferAndBlurBackground<ColorSourceVariant>();
1400}
1401
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001402TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001403 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001404 overlayCorners<ColorSourceVariant>();
1405}
1406
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001407TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001408 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001409 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1410}
1411
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001412TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001413 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001414 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1415}
1416
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001417TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001418 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001419 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1420}
1421
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001422TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001423 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001424 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1425}
1426
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001427TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001428 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001429 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1430}
1431
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001432TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001433 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001434 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1435}
1436
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001437TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001438 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001439 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1440}
1441
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001442TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001443 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001444 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1445}
1446
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001447TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001448 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001449 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1450}
1451
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001452TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001453 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001454 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1455}
1456
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001457TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001458 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001459 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1460}
1461
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001462TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001463 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001464 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1465}
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001466
Alec Mouric0aae732021-01-12 13:32:18 -08001467TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1468 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001469 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1470}
Alec Mouri7c94edb2018-12-03 21:23:26 -08001471
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001472TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001473 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001474 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1475}
1476
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001477TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001478 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001479 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1480}
1481
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001482TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001483 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001484 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1485}
1486
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001487TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001488 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001489 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1490}
1491
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001492TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001493 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001494 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1495}
1496
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001497TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001498 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001499 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1500}
1501
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001502TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001503 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001504 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1505}
1506
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001507TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001508 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001509 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1510}
1511
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001512TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001513 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001514 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1515}
1516
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001517TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001518 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001519 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1520}
1521
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001522TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001523 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001524 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1525}
1526
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001527TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001528 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001529 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1530}
1531
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001532TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001533 initializeRenderEngine();
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001534 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1535}
1536
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001537TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001538 initializeRenderEngine();
Alec Mouri7c94edb2018-12-03 21:23:26 -08001539 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1540}
1541
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001542TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001543 initializeRenderEngine();
KaiChieh Chuangda2845c2020-12-14 16:49:38 +08001544 fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1545}
1546
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001547TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001548 initializeRenderEngine();
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001549 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1550}
1551
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001552TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
Alec Mouric0aae732021-01-12 13:32:18 -08001553 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001554 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1555}
1556
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001557TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
Alec Mouric0aae732021-01-12 13:32:18 -08001558 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001559 fillBufferTextureTransform();
1560}
1561
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001562TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001563 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001564 fillBufferWithPremultiplyAlpha();
1565}
1566
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001567TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001568 initializeRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001569 fillBufferWithoutPremultiplyAlpha();
1570}
1571
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001572TEST_P(RenderEngineTest, drawLayers_clearRegion) {
Alec Mouric0aae732021-01-12 13:32:18 -08001573 initializeRenderEngine();
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001574 clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -08001575}
1576
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001577TEST_P(RenderEngineTest, drawLayers_fillsBufferAndCachesImages) {
1578 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001579
1580 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1581 // GLES-specific test
1582 return;
1583 }
1584
1585 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001586
Alec Mourid43ccab2019-03-13 12:23:45 -07001587 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001588 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001589 settings.physicalDisplay = fullscreenRect();
1590 settings.clip = fullscreenRect();
1591
Vishnu Nair9b079a22020-01-21 14:36:08 -08001592 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001593
1594 renderengine::LayerSettings layer;
1595 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1596 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1597
Vishnu Nair9b079a22020-01-21 14:36:08 -08001598 layers.push_back(&layer);
Alec Mouric0aae732021-01-12 13:32:18 -08001599 invokeDraw(settings, layers);
Alec Mourid43ccab2019-03-13 12:23:45 -07001600 uint64_t bufferId = layer.source.buffer.buffer->getId();
Alec Mouric0aae732021-01-12 13:32:18 -08001601 EXPECT_TRUE(mGLESRE->isImageCachedForTesting(bufferId));
Alec Mouri16a99402019-07-29 16:37:30 -07001602 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Alec Mouric0aae732021-01-12 13:32:18 -08001603 mGLESRE->unbindExternalTextureBufferForTesting(bufferId);
Alec Mouri16a99402019-07-29 16:37:30 -07001604 std::lock_guard<std::mutex> lock(barrier->mutex);
1605 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1606 [&]() REQUIRES(barrier->mutex) {
1607 return barrier->isOpen;
1608 }));
Alec Mouric0aae732021-01-12 13:32:18 -08001609 EXPECT_FALSE(mGLESRE->isImageCachedForTesting(bufferId));
Alec Mouri16a99402019-07-29 16:37:30 -07001610 EXPECT_EQ(NO_ERROR, barrier->result);
Alec Mourid43ccab2019-03-13 12:23:45 -07001611}
1612
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001613TEST_P(RenderEngineTest, cacheExternalBuffer_withNullBuffer) {
1614 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001615
1616 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1617 // GLES-specific test
1618 return;
1619 }
1620
1621 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001622
Alec Mouri16a99402019-07-29 16:37:30 -07001623 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Alec Mouric0aae732021-01-12 13:32:18 -08001624 mGLESRE->cacheExternalTextureBufferForTesting(nullptr);
Alec Mouri16a99402019-07-29 16:37:30 -07001625 std::lock_guard<std::mutex> lock(barrier->mutex);
1626 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1627 [&]() REQUIRES(barrier->mutex) {
1628 return barrier->isOpen;
1629 }));
1630 EXPECT_TRUE(barrier->isOpen);
1631 EXPECT_EQ(BAD_VALUE, barrier->result);
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001632}
1633
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001634TEST_P(RenderEngineTest, cacheExternalBuffer_cachesImages) {
1635 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001636
1637 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1638 // GLES-specific test
1639 return;
1640 }
1641
1642 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001643
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001644 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
1645 uint64_t bufferId = buf->getId();
Alec Mouri16a99402019-07-29 16:37:30 -07001646 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Alec Mouric0aae732021-01-12 13:32:18 -08001647 mGLESRE->cacheExternalTextureBufferForTesting(buf);
Alec Mouri16a99402019-07-29 16:37:30 -07001648 {
1649 std::lock_guard<std::mutex> lock(barrier->mutex);
1650 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1651 [&]() REQUIRES(barrier->mutex) {
1652 return barrier->isOpen;
1653 }));
1654 EXPECT_EQ(NO_ERROR, barrier->result);
1655 }
Alec Mouric0aae732021-01-12 13:32:18 -08001656 EXPECT_TRUE(mGLESRE->isImageCachedForTesting(bufferId));
1657 barrier = mGLESRE->unbindExternalTextureBufferForTesting(bufferId);
Alec Mouri16a99402019-07-29 16:37:30 -07001658 {
1659 std::lock_guard<std::mutex> lock(barrier->mutex);
1660 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1661 [&]() REQUIRES(barrier->mutex) {
1662 return barrier->isOpen;
1663 }));
1664 EXPECT_EQ(NO_ERROR, barrier->result);
1665 }
Alec Mouric0aae732021-01-12 13:32:18 -08001666 EXPECT_FALSE(mGLESRE->isImageCachedForTesting(bufferId));
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001667}
1668
Alec Mouribd17b3b2020-12-17 11:08:30 -08001669TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001670 initializeRenderEngine();
Alec Mouribd17b3b2020-12-17 11:08:30 -08001671
1672 const ubyte4 backgroundColor(255, 255, 255, 255);
1673 const float shadowLength = 5.0f;
1674 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1675 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1676 renderengine::ShadowSettings settings =
1677 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1678 false /* casterIsTranslucent */);
1679
1680 drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1681 expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
1682}
1683
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001684TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
Alec Mouric0aae732021-01-12 13:32:18 -08001685 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001686
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001687 const ubyte4 casterColor(255, 0, 0, 255);
1688 const ubyte4 backgroundColor(255, 255, 255, 255);
1689 const float shadowLength = 5.0f;
1690 Rect casterBounds(1, 1);
1691 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1692 renderengine::LayerSettings castingLayer;
1693 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1694 castingLayer.alpha = 1.0f;
1695 renderengine::ShadowSettings settings =
1696 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1697 false /* casterIsTranslucent */);
1698
1699 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1700 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1701}
1702
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001703TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001704 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001705
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001706 const ubyte4 casterColor(255, 0, 0, 255);
1707 const ubyte4 backgroundColor(255, 255, 255, 255);
1708 const float shadowLength = 5.0f;
1709 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1710 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1711 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001712 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001713 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1714 castingLayer.alpha = 1.0f;
1715 renderengine::ShadowSettings settings =
1716 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1717 false /* casterIsTranslucent */);
1718
1719 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1720 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1721}
1722
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001723TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
Alec Mouric0aae732021-01-12 13:32:18 -08001724 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001725
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001726 const ubyte4 casterColor(255, 0, 0, 255);
1727 const ubyte4 backgroundColor(255, 255, 255, 255);
1728 const float shadowLength = 5.0f;
1729 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1730 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1731 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001732 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001733 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1734 castingLayer.alpha = 1.0f;
1735 renderengine::ShadowSettings settings =
1736 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1737 false /* casterIsTranslucent */);
1738
1739 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1740 backgroundColor);
1741 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1742}
1743
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001744TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
Alec Mouric0aae732021-01-12 13:32:18 -08001745 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001746
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001747 const ubyte4 casterColor(255, 0, 0, 255);
1748 const ubyte4 backgroundColor(255, 255, 255, 255);
1749 const float shadowLength = 5.0f;
1750 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1751 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1752 renderengine::LayerSettings castingLayer;
1753 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1754 castingLayer.geometry.roundedCornersRadius = 3.0f;
1755 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1756 castingLayer.alpha = 1.0f;
1757 renderengine::ShadowSettings settings =
1758 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1759 false /* casterIsTranslucent */);
1760
1761 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1762 backgroundColor);
1763 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1764}
1765
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001766TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
Alec Mouric0aae732021-01-12 13:32:18 -08001767 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001768
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001769 const ubyte4 casterColor(255, 0, 0, 255);
1770 const ubyte4 backgroundColor(255, 255, 255, 255);
1771 const float shadowLength = 5.0f;
1772 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1773 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1774 renderengine::LayerSettings castingLayer;
1775 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1776 castingLayer.alpha = 0.5f;
1777 renderengine::ShadowSettings settings =
1778 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1779 true /* casterIsTranslucent */);
1780
1781 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1782 backgroundColor);
1783
1784 // verify only the background since the shadow will draw behind the caster
1785 const float shadowInset = settings.length * -1.0f;
1786 const Rect casterWithShadow =
1787 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1788 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1789 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1790 backgroundColor.a);
1791}
1792
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001793TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
1794 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001795
1796 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1797 // GLES-specific test
1798 return;
1799 }
1800
1801 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001802
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001803 renderengine::DisplaySettings settings;
1804 settings.physicalDisplay = fullscreenRect();
1805 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001806 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001807
1808 std::vector<const renderengine::LayerSettings*> layers;
1809 renderengine::LayerSettings layer;
1810 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1811 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1812 layer.alpha = 1.0;
1813 layers.push_back(&layer);
1814
1815 base::unique_fd fenceOne;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001816 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fenceOne);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001817 base::unique_fd fenceTwo;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001818 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne), &fenceTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001819
1820 const int fd = fenceTwo.get();
1821 if (fd >= 0) {
1822 sync_wait(fd, -1);
1823 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001824 // Only cleanup the first time.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001825 EXPECT_TRUE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001826 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001827 EXPECT_FALSE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001828 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
1829}
1830
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001831TEST_P(RenderEngineTest, cleanupPostRender_whenCleaningAll_replacesTextureMemory) {
1832 const auto& renderEngineFactory = GetParam();
Alec Mouric0aae732021-01-12 13:32:18 -08001833
1834 if (renderEngineFactory->type() != renderengine::RenderEngine::RenderEngineType::GLES) {
1835 // GLES-specific test
1836 return;
1837 }
1838
1839 initializeRenderEngine();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001840
Alec Mouri368e1582020-08-13 10:14:29 -07001841 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001842 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri368e1582020-08-13 10:14:29 -07001843 settings.physicalDisplay = fullscreenRect();
1844 settings.clip = fullscreenRect();
1845
1846 std::vector<const renderengine::LayerSettings*> layers;
1847 renderengine::LayerSettings layer;
1848 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1849 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1850 layer.alpha = 1.0;
1851 layers.push_back(&layer);
1852
1853 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001854 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri368e1582020-08-13 10:14:29 -07001855
1856 const int fd = fence.get();
1857 if (fd >= 0) {
1858 sync_wait(fd, -1);
1859 }
1860
1861 uint64_t bufferId = layer.source.buffer.buffer->getId();
1862 uint32_t texName = layer.source.buffer.textureName;
Alec Mouric0aae732021-01-12 13:32:18 -08001863 EXPECT_TRUE(mGLESRE->isImageCachedForTesting(bufferId));
1864 EXPECT_EQ(bufferId, mGLESRE->getBufferIdForTextureNameForTesting(texName));
Alec Mouri368e1582020-08-13 10:14:29 -07001865
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001866 EXPECT_TRUE(mRE->cleanupPostRender(renderengine::RenderEngine::CleanupMode::CLEAN_ALL));
Alec Mouri368e1582020-08-13 10:14:29 -07001867
1868 // Now check that our view of memory is good.
Alec Mouric0aae732021-01-12 13:32:18 -08001869 EXPECT_FALSE(mGLESRE->isImageCachedForTesting(bufferId));
1870 EXPECT_EQ(std::nullopt, mGLESRE->getBufferIdForTextureNameForTesting(bufferId));
1871 EXPECT_TRUE(mGLESRE->isTextureNameKnownForTesting(texName));
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001872}
1873
Ana Krulecf9a15d92020-12-11 08:35:00 -08001874TEST_P(RenderEngineTest, testRoundedCornersCrop) {
Alec Mouric0aae732021-01-12 13:32:18 -08001875 initializeRenderEngine();
Ana Krulecf9a15d92020-12-11 08:35:00 -08001876
1877 renderengine::DisplaySettings settings;
1878 settings.physicalDisplay = fullscreenRect();
1879 settings.clip = fullscreenRect();
1880 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1881
1882 std::vector<const renderengine::LayerSettings*> layers;
1883
1884 renderengine::LayerSettings redLayer;
1885 redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1886 redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1887 redLayer.geometry.roundedCornersRadius = 5.0f;
1888 redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1889 // Red background.
1890 redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
1891 redLayer.alpha = 1.0f;
1892
1893 layers.push_back(&redLayer);
1894
1895 // Green layer with 1/3 size.
1896 renderengine::LayerSettings greenLayer;
1897 greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1898 greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1899 greenLayer.geometry.roundedCornersRadius = 5.0f;
1900 // Bottom right corner is not going to be rounded.
1901 greenLayer.geometry.roundedCornersCrop =
1902 Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
1903 DEFAULT_DISPLAY_HEIGHT)
1904 .toFloatRect();
1905 greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
1906 greenLayer.alpha = 1.0f;
1907
1908 layers.push_back(&greenLayer);
1909
Alec Mouric0aae732021-01-12 13:32:18 -08001910 invokeDraw(settings, layers);
Ana Krulecf9a15d92020-12-11 08:35:00 -08001911
1912 // Corners should be ignored...
1913 // Screen size: width is 128, height is 256.
1914 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1915 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1916 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1917 // Bottom right corner is kept out of the clipping, and it's green.
1918 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1919 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1920 0, 255, 0, 255);
1921}
1922
Alec Mouri6e57f682018-09-29 20:45:08 -07001923} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08001924
1925// TODO(b/129481165): remove the #pragma below and fix conversion issues
Marin Shalamanovbed7fd32020-12-21 20:02:20 +01001926#pragma clang diagnostic pop // ignored "-Wconversion -Wextra"