blob: 3dcbf0847f3f3d4859ef4455a052ad0f12af9285 [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"
23
Alec Mouri16a99402019-07-29 16:37:30 -070024#include <chrono>
25#include <condition_variable>
Vishnu Nair16efdbf2019-12-10 11:55:42 -080026#include <fstream>
Alec Mouri6e57f682018-09-29 20:45:08 -070027
Lucas Dupin19c8f0e2019-11-25 17:55:44 -080028#include <cutils/properties.h>
Ana Krulec9bc9dc62020-02-26 12:16:40 -080029#include <gtest/gtest.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070030#include <renderengine/RenderEngine.h>
Alec Mouri1089aed2018-10-25 21:33:57 -070031#include <sync/sync.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070032#include <ui/PixelFormat.h>
Alec Mourid43ccab2019-03-13 12:23:45 -070033#include "../gl/GLESRenderEngine.h"
Ana Krulec9bc9dc62020-02-26 12:16:40 -080034#include "../threaded/RenderEngineThreaded.h"
Alec Mouri6e57f682018-09-29 20:45:08 -070035
Alec Mouri1089aed2018-10-25 21:33:57 -070036constexpr int DEFAULT_DISPLAY_WIDTH = 128;
37constexpr int DEFAULT_DISPLAY_HEIGHT = 256;
38constexpr int DEFAULT_DISPLAY_OFFSET = 64;
Vishnu Nair16efdbf2019-12-10 11:55:42 -080039constexpr bool WRITE_BUFFER_TO_FILE_ON_FAILURE = false;
Alec Mouri1089aed2018-10-25 21:33:57 -070040
Alec Mouri6e57f682018-09-29 20:45:08 -070041namespace android {
42
Ana Krulec82ba2ec2020-11-21 13:33:20 -080043class RenderEngineFactory {
44public:
45 virtual ~RenderEngineFactory() = default;
46
47 virtual std::string name() = 0;
48 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createRenderEngine() = 0;
49};
50
51class GLESRenderEngineFactory : public RenderEngineFactory {
52public:
53 std::string name() override { return "GLESRenderEngineFactory"; }
54
55 std::unique_ptr<renderengine::gl::GLESRenderEngine> createRenderEngine() override {
KaiChieh Chuang436fc192020-09-07 13:48:42 +080056 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -070057 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -080058 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
59 .setImageCacheSize(1)
60 .setUseColorManagerment(false)
61 .setEnableProtectedContext(false)
62 .setPrecacheToneMapperShaderOnly(false)
63 .setSupportsBackgroundBlur(true)
64 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
65 .setRenderEngineType(renderengine::RenderEngine::RenderEngineType::GLES)
KaiChieh Chuang436fc192020-09-07 13:48:42 +080066 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -080067 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -070068 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080069};
Alec Mourid43ccab2019-03-13 12:23:45 -070070
Ana Krulec82ba2ec2020-11-21 13:33:20 -080071class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
72public:
Alec Mouri0d5e1eb2018-11-10 20:40:12 -080073 static sp<GraphicBuffer> allocateDefaultBuffer() {
Alec Mouri1089aed2018-10-25 21:33:57 -070074 return new GraphicBuffer(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT,
75 HAL_PIXEL_FORMAT_RGBA_8888, 1,
Alec Mouri0d5e1eb2018-11-10 20:40:12 -080076 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
77 GRALLOC_USAGE_HW_RENDER,
Alec Mouri1089aed2018-10-25 21:33:57 -070078 "output");
Alec Mouri6e57f682018-09-29 20:45:08 -070079 }
80
Alec Mouri0d5e1eb2018-11-10 20:40:12 -080081 // Allocates a 1x1 buffer to fill with a solid color
82 static sp<GraphicBuffer> allocateSourceBuffer(uint32_t width, uint32_t height) {
83 return new GraphicBuffer(width, height, HAL_PIXEL_FORMAT_RGBA_8888, 1,
84 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
85 GRALLOC_USAGE_HW_TEXTURE,
86 "input");
87 }
88
Ana Krulec82ba2ec2020-11-21 13:33:20 -080089 RenderEngineTest() {
90 const ::testing::TestInfo* const test_info =
91 ::testing::UnitTest::GetInstance()->current_test_info();
92 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
93 mBuffer = allocateDefaultBuffer();
94 }
Alec Mouri1089aed2018-10-25 21:33:57 -070095
Alec Mouri0d5e1eb2018-11-10 20:40:12 -080096 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -080097 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
98 writeBufferToFile("/data/texture_out_");
99 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800100 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800101 mRE->deleteTextures(1, &texName);
102 EXPECT_FALSE(mRE->isTextureNameKnownForTesting(texName));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800103 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800104 const ::testing::TestInfo* const test_info =
105 ::testing::UnitTest::GetInstance()->current_test_info();
106 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800107 }
108
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800109 void writeBufferToFile(const char* basename) {
110 std::string filename(basename);
111 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
112 filename.append(".ppm");
113 std::ofstream file(filename.c_str(), std::ios::binary);
114 if (!file.is_open()) {
115 ALOGE("Unable to open file: %s", filename.c_str());
116 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
117 "surfaceflinger to write debug images");
118 return;
119 }
120
Alec Mouri1089aed2018-10-25 21:33:57 -0700121 uint8_t* pixels;
122 mBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
123 reinterpret_cast<void**>(&pixels));
124
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800125 file << "P6\n";
126 file << mBuffer->getWidth() << "\n";
127 file << mBuffer->getHeight() << "\n";
128 file << 255 << "\n";
129
130 std::vector<uint8_t> outBuffer(mBuffer->getWidth() * mBuffer->getHeight() * 3);
131 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
132
133 for (int32_t j = 0; j < mBuffer->getHeight(); j++) {
134 const uint8_t* src = pixels + (mBuffer->getStride() * j) * 4;
135 for (int32_t i = 0; i < mBuffer->getWidth(); i++) {
136 // Only copy R, G and B components
137 outPtr[0] = src[0];
138 outPtr[1] = src[1];
139 outPtr[2] = src[2];
140 outPtr += 3;
141
142 src += 4;
143 }
144 }
145 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
146 mBuffer->unlock();
147 }
148
149 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
150 size_t c;
151 Rect const* rect = region.getArray(&c);
152 for (size_t i = 0; i < c; i++, rect++) {
153 expectBufferColor(*rect, r, g, b, a);
154 }
155 }
156
157 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
158 uint8_t tolerance = 0) {
159 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
160 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
161 uint8_t tmp = a >= b ? a - b : b - a;
162 return tmp <= tolerance;
163 };
164 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700165 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800166
167 expectBufferColor(rect, r, g, b, a, colorCompare);
168 }
169
170 void expectBufferColor(const Rect& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
171 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
172 uint8_t* pixels;
173 mBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
174 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700175 int32_t maxFails = 10;
176 int32_t fails = 0;
177 for (int32_t j = 0; j < region.getHeight(); j++) {
178 const uint8_t* src =
179 pixels + (mBuffer->getStride() * (region.top + j) + region.left) * 4;
180 for (int32_t i = 0; i < region.getWidth(); i++) {
181 const uint8_t expected[4] = {r, g, b, a};
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800182 bool equal = colorCompare(src, expected);
Alec Mouri1089aed2018-10-25 21:33:57 -0700183 EXPECT_TRUE(equal)
184 << "pixel @ (" << region.left + i << ", " << region.top + j << "): "
185 << "expected (" << static_cast<uint32_t>(r) << ", "
186 << static_cast<uint32_t>(g) << ", " << static_cast<uint32_t>(b) << ", "
187 << static_cast<uint32_t>(a) << "), "
188 << "got (" << static_cast<uint32_t>(src[0]) << ", "
189 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
190 << ", " << static_cast<uint32_t>(src[3]) << ")";
191 src += 4;
192 if (!equal && ++fails >= maxFails) {
193 break;
194 }
195 }
196 if (fails >= maxFails) {
197 break;
198 }
199 }
200 mBuffer->unlock();
201 }
202
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800203 void expectAlpha(const Rect& rect, uint8_t a) {
204 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
205 return colorA[3] == colorB[3];
206 };
207 expectBufferColor(rect, 0.0f /* r */, 0.0f /*g */, 0.0f /* b */, a, colorCompare);
208 }
209
210 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
211 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
212 const ubyte4& backgroundColor) {
213 const Rect casterRect(castingLayer.geometry.boundaries);
214 Region casterRegion = Region(casterRect);
215 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
216 if (casterCornerRadius > 0.0f) {
217 // ignore the corners if a corner radius is set
218 Rect cornerRect(casterCornerRadius, casterCornerRadius);
219 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
220 casterRegion.subtractSelf(
221 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
222 casterRegion.subtractSelf(
223 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
224 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
225 casterRect.bottom - casterCornerRadius));
226 }
227
228 const float shadowInset = shadow.length * -1.0f;
229 const Rect casterWithShadow =
230 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
231 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
232 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
233
234 // verify casting layer
235 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
236
237 // verify shadows by testing just the alpha since its difficult to validate the shadow color
238 size_t c;
239 Rect const* r = shadowRegion.getArray(&c);
240 for (size_t i = 0; i < c; i++, r++) {
241 expectAlpha(*r, 255);
242 }
243
244 // verify background
245 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
246 backgroundColor.a);
247 }
248
249 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
250 bool casterIsTranslucent) {
251 renderengine::ShadowSettings shadow;
252 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
253 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
254 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
255 shadow.lightRadius = 0.0f;
256 shadow.length = shadowLength;
257 shadow.casterIsTranslucent = casterIsTranslucent;
258 return shadow;
259 }
260
Alec Mouri1089aed2018-10-25 21:33:57 -0700261 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
262
263 static Rect offsetRect() {
264 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
265 DEFAULT_DISPLAY_HEIGHT);
266 }
267
268 static Rect offsetRectAtZero() {
269 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
270 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
271 }
272
Alec Mourid43ccab2019-03-13 12:23:45 -0700273 void invokeDraw(renderengine::DisplaySettings settings,
Vishnu Nair9b079a22020-01-21 14:36:08 -0800274 std::vector<const renderengine::LayerSettings*> layers,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800275 sp<GraphicBuffer> buffer) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700276 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800277 status_t status =
278 mRE->drawLayers(settings, layers, buffer, true, base::unique_fd(), &fence);
279 mCurrentBuffer = buffer;
Alec Mouri1089aed2018-10-25 21:33:57 -0700280
281 int fd = fence.release();
282 if (fd >= 0) {
283 sync_wait(fd, -1);
284 close(fd);
285 }
286
287 ASSERT_EQ(NO_ERROR, status);
Alec Mourid43ccab2019-03-13 12:23:45 -0700288 if (layers.size() > 0) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800289 ASSERT_TRUE(mRE->isFramebufferImageCachedForTesting(buffer->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700290 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700291 }
292
Alec Mourid43ccab2019-03-13 12:23:45 -0700293 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700294 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800295 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri6e57f682018-09-29 20:45:08 -0700296 // Meaningless buffer since we don't do any drawing
297 sp<GraphicBuffer> buffer = new GraphicBuffer();
Alec Mouri1089aed2018-10-25 21:33:57 -0700298 invokeDraw(settings, layers, buffer);
Alec Mouri6e57f682018-09-29 20:45:08 -0700299 }
300
Alec Mouri1089aed2018-10-25 21:33:57 -0700301 template <typename SourceVariant>
302 void fillBuffer(half r, half g, half b, half a);
303
304 template <typename SourceVariant>
305 void fillRedBuffer();
306
307 template <typename SourceVariant>
308 void fillGreenBuffer();
309
310 template <typename SourceVariant>
311 void fillBlueBuffer();
312
313 template <typename SourceVariant>
314 void fillRedTransparentBuffer();
315
316 template <typename SourceVariant>
317 void fillRedOffsetBuffer();
318
319 template <typename SourceVariant>
320 void fillBufferPhysicalOffset();
321
322 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700323 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700324
325 template <typename SourceVariant>
326 void fillBufferCheckersRotate0();
327
328 template <typename SourceVariant>
329 void fillBufferCheckersRotate90();
330
331 template <typename SourceVariant>
332 void fillBufferCheckersRotate180();
333
334 template <typename SourceVariant>
335 void fillBufferCheckersRotate270();
336
337 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800338 void fillBufferWithLayerTransform();
339
340 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700341 void fillBufferLayerTransform();
342
343 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800344 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800345
346 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700347 void fillBufferColorTransform();
348
Alec Mouri7c94edb2018-12-03 21:23:26 -0800349 template <typename SourceVariant>
350 void fillRedBufferWithRoundedCorners();
351
352 template <typename SourceVariant>
353 void fillBufferWithRoundedCorners();
354
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000355 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800356 void fillBufferAndBlurBackground();
357
358 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000359 void overlayCorners();
360
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800361 void fillRedBufferTextureTransform();
362
363 void fillBufferTextureTransform();
364
365 void fillRedBufferWithPremultiplyAlpha();
366
367 void fillBufferWithPremultiplyAlpha();
368
369 void fillRedBufferWithoutPremultiplyAlpha();
370
371 void fillBufferWithoutPremultiplyAlpha();
372
Alec Mouriac335532018-11-12 15:01:33 -0800373 void fillGreenColorBufferThenClearRegion();
374
375 void clearLeftRegion();
376
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000377 void clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -0800378
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800379 template <typename SourceVariant>
380 void drawShadow(const renderengine::LayerSettings& castingLayer,
381 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
382 const ubyte4& backgroundColor);
383
Alec Mourid43ccab2019-03-13 12:23:45 -0700384 // Keep around the same renderengine object to save on initialization time.
385 // For now, exercise the GL backend directly so that some caching specifics
386 // can be tested without changing the interface.
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800387 std::unique_ptr<renderengine::gl::GLESRenderEngine> mRE;
388
Alec Mourid43ccab2019-03-13 12:23:45 -0700389 // Dumb hack to avoid NPE in the EGL driver: the GraphicBuffer needs to
390 // be freed *after* RenderEngine is destroyed, so that the EGL image is
391 // destroyed first.
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800392 sp<GraphicBuffer> mCurrentBuffer;
Alec Mouri1089aed2018-10-25 21:33:57 -0700393
394 sp<GraphicBuffer> mBuffer;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800395
396 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700397};
398
Alec Mouri1089aed2018-10-25 21:33:57 -0700399struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800400 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800401 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700402 layer.source.solidColor = half3(r, g, b);
403 }
404};
405
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800406struct RelaxOpaqueBufferVariant {
407 static void setOpaqueBit(renderengine::LayerSettings& layer) {
408 layer.source.buffer.isOpaque = false;
409 }
410
411 static uint8_t getAlphaChannel() { return 255; }
412};
413
414struct ForceOpaqueBufferVariant {
415 static void setOpaqueBit(renderengine::LayerSettings& layer) {
416 layer.source.buffer.isOpaque = true;
417 }
418
419 static uint8_t getAlphaChannel() {
420 // The isOpaque bit will override the alpha channel, so this should be
421 // arbitrary.
422 return 10;
423 }
424};
425
426template <typename OpaquenessVariant>
427struct BufferSourceVariant {
428 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800429 RenderEngineTest* fixture) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800430 sp<GraphicBuffer> buf = RenderEngineTest::allocateSourceBuffer(1, 1);
431 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800432 fixture->mRE->genTextures(1, &texName);
433 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800434
435 uint8_t* pixels;
436 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
437 reinterpret_cast<void**>(&pixels));
438
439 for (int32_t j = 0; j < buf->getHeight(); j++) {
440 uint8_t* iter = pixels + (buf->getStride() * j) * 4;
441 for (int32_t i = 0; i < buf->getWidth(); i++) {
442 iter[0] = uint8_t(r * 255);
443 iter[1] = uint8_t(g * 255);
444 iter[2] = uint8_t(b * 255);
445 iter[3] = OpaquenessVariant::getAlphaChannel();
446 iter += 4;
447 }
448 }
449
450 buf->unlock();
451
452 layer.source.buffer.buffer = buf;
453 layer.source.buffer.textureName = texName;
454 OpaquenessVariant::setOpaqueBit(layer);
455 }
456};
457
Alec Mouri1089aed2018-10-25 21:33:57 -0700458template <typename SourceVariant>
459void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
460 renderengine::DisplaySettings settings;
461 settings.physicalDisplay = fullscreenRect();
462 settings.clip = fullscreenRect();
463
Vishnu Nair9b079a22020-01-21 14:36:08 -0800464 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700465
466 renderengine::LayerSettings layer;
467 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800468 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700469 layer.alpha = a;
470
Vishnu Nair9b079a22020-01-21 14:36:08 -0800471 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700472
473 invokeDraw(settings, layers, mBuffer);
474}
475
476template <typename SourceVariant>
477void RenderEngineTest::fillRedBuffer() {
478 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
479 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
480}
481
482template <typename SourceVariant>
483void RenderEngineTest::fillGreenBuffer() {
484 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
485 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
486}
487
488template <typename SourceVariant>
489void RenderEngineTest::fillBlueBuffer() {
490 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
491 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
492}
493
494template <typename SourceVariant>
495void RenderEngineTest::fillRedTransparentBuffer() {
496 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
497 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
498}
499
500template <typename SourceVariant>
501void RenderEngineTest::fillRedOffsetBuffer() {
502 renderengine::DisplaySettings settings;
503 settings.physicalDisplay = offsetRect();
504 settings.clip = offsetRectAtZero();
505
Vishnu Nair9b079a22020-01-21 14:36:08 -0800506 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700507
508 renderengine::LayerSettings layer;
509 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800510 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700511 layer.alpha = 1.0f;
512
Vishnu Nair9b079a22020-01-21 14:36:08 -0800513 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700514 invokeDraw(settings, layers, mBuffer);
515}
516
517template <typename SourceVariant>
518void RenderEngineTest::fillBufferPhysicalOffset() {
519 fillRedOffsetBuffer<SourceVariant>();
520
521 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
522 DEFAULT_DISPLAY_HEIGHT),
523 255, 0, 0, 255);
524 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
525 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
526
527 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
528 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
529}
530
531template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700532void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700533 renderengine::DisplaySettings settings;
534 settings.physicalDisplay = fullscreenRect();
535 // Here logical space is 2x2
536 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700537 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700538
Vishnu Nair9b079a22020-01-21 14:36:08 -0800539 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700540
541 renderengine::LayerSettings layerOne;
542 Rect rectOne(0, 0, 1, 1);
543 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800544 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700545 layerOne.alpha = 1.0f;
546
547 renderengine::LayerSettings layerTwo;
548 Rect rectTwo(0, 1, 1, 2);
549 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800550 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700551 layerTwo.alpha = 1.0f;
552
553 renderengine::LayerSettings layerThree;
554 Rect rectThree(1, 0, 2, 1);
555 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800556 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700557 layerThree.alpha = 1.0f;
558
Vishnu Nair9b079a22020-01-21 14:36:08 -0800559 layers.push_back(&layerOne);
560 layers.push_back(&layerTwo);
561 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700562
563 invokeDraw(settings, layers, mBuffer);
564}
565
566template <typename SourceVariant>
567void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700568 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700569 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
570 255);
571 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
572 DEFAULT_DISPLAY_HEIGHT / 2),
573 0, 0, 255, 255);
574 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
575 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
576 0, 0, 0, 0);
577 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
578 DEFAULT_DISPLAY_HEIGHT),
579 0, 255, 0, 255);
580}
581
582template <typename SourceVariant>
583void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700584 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700585 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
586 255);
587 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
588 DEFAULT_DISPLAY_HEIGHT / 2),
589 255, 0, 0, 255);
590 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
591 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
592 0, 0, 255, 255);
593 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
594 DEFAULT_DISPLAY_HEIGHT),
595 0, 0, 0, 0);
596}
597
598template <typename SourceVariant>
599void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700600 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700601 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
602 0);
603 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
604 DEFAULT_DISPLAY_HEIGHT / 2),
605 0, 255, 0, 255);
606 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
607 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
608 255, 0, 0, 255);
609 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
610 DEFAULT_DISPLAY_HEIGHT),
611 0, 0, 255, 255);
612}
613
614template <typename SourceVariant>
615void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700616 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700617 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
618 255);
619 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
620 DEFAULT_DISPLAY_HEIGHT / 2),
621 0, 0, 0, 0);
622 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
623 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
624 0, 255, 0, 255);
625 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
626 DEFAULT_DISPLAY_HEIGHT),
627 255, 0, 0, 255);
628}
629
630template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800631void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700632 renderengine::DisplaySettings settings;
633 settings.physicalDisplay = fullscreenRect();
634 // Here logical space is 2x2
635 settings.clip = Rect(2, 2);
636
Vishnu Nair9b079a22020-01-21 14:36:08 -0800637 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700638
639 renderengine::LayerSettings layer;
640 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
641 // Translate one pixel diagonally
642 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 -0800643 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700644 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
645 layer.alpha = 1.0f;
646
Vishnu Nair9b079a22020-01-21 14:36:08 -0800647 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700648
649 invokeDraw(settings, layers, mBuffer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800650}
Alec Mouri1089aed2018-10-25 21:33:57 -0700651
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800652template <typename SourceVariant>
653void RenderEngineTest::fillBufferLayerTransform() {
654 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700655 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
656 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
657 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
658 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
659 255, 0, 0, 255);
660}
661
662template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800663void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700664 renderengine::DisplaySettings settings;
665 settings.physicalDisplay = fullscreenRect();
666 settings.clip = Rect(1, 1);
667
Vishnu Nair9b079a22020-01-21 14:36:08 -0800668 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700669
670 renderengine::LayerSettings layer;
671 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800672 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700673 layer.alpha = 1.0f;
674
675 // construct a fake color matrix
676 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800677 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700678 // set red channel to red + green
679 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
680
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800681 layer.alpha = 1.0f;
682 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
683
Vishnu Nair9b079a22020-01-21 14:36:08 -0800684 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700685
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800686 invokeDraw(settings, layers, mBuffer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800687}
Alec Mouri1089aed2018-10-25 21:33:57 -0700688
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800689template <typename SourceVariant>
690void RenderEngineTest::fillBufferColorTransform() {
691 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800692 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
693}
694
695template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800696void RenderEngineTest::fillRedBufferWithRoundedCorners() {
697 renderengine::DisplaySettings settings;
698 settings.physicalDisplay = fullscreenRect();
699 settings.clip = fullscreenRect();
700
Vishnu Nair9b079a22020-01-21 14:36:08 -0800701 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800702
703 renderengine::LayerSettings layer;
704 layer.geometry.boundaries = fullscreenRect().toFloatRect();
705 layer.geometry.roundedCornersRadius = 5.0f;
706 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
707 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
708 layer.alpha = 1.0f;
709
Vishnu Nair9b079a22020-01-21 14:36:08 -0800710 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800711
712 invokeDraw(settings, layers, mBuffer);
713}
714
715template <typename SourceVariant>
716void RenderEngineTest::fillBufferWithRoundedCorners() {
717 fillRedBufferWithRoundedCorners<SourceVariant>();
718 // Corners should be ignored...
719 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
720 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
721 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
722 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
723 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
724 0, 0, 0, 0);
725 // ...And the non-rounded portion should be red.
726 // Other pixels may be anti-aliased, so let's not check those.
727 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
728 255);
729}
730
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000731template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800732void RenderEngineTest::fillBufferAndBlurBackground() {
733 char value[PROPERTY_VALUE_MAX];
734 property_get("ro.surface_flinger.supports_background_blur", value, "0");
735 if (!atoi(value)) {
736 // This device doesn't support blurs, no-op.
737 return;
738 }
739
740 auto blurRadius = 50;
741 auto center = DEFAULT_DISPLAY_WIDTH / 2;
742
743 renderengine::DisplaySettings settings;
744 settings.physicalDisplay = fullscreenRect();
745 settings.clip = fullscreenRect();
746
Vishnu Nair9b079a22020-01-21 14:36:08 -0800747 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800748
749 renderengine::LayerSettings backgroundLayer;
750 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
751 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
752 backgroundLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800753 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800754
755 renderengine::LayerSettings leftLayer;
756 leftLayer.geometry.boundaries =
757 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
758 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
759 leftLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800760 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800761
762 renderengine::LayerSettings blurLayer;
763 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
764 blurLayer.backgroundBlurRadius = blurRadius;
765 blurLayer.alpha = 0;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800766 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800767
768 invokeDraw(settings, layers, mBuffer);
769
770 expectBufferColor(Rect(center - 1, center - 5, center, center + 5), 150, 150, 0, 255,
771 50 /* tolerance */);
772 expectBufferColor(Rect(center, center - 5, center + 1, center + 5), 150, 150, 0, 255,
773 50 /* tolerance */);
774}
775
776template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000777void RenderEngineTest::overlayCorners() {
778 renderengine::DisplaySettings settings;
779 settings.physicalDisplay = fullscreenRect();
780 settings.clip = fullscreenRect();
781
Vishnu Nair9b079a22020-01-21 14:36:08 -0800782 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000783
784 renderengine::LayerSettings layerOne;
785 layerOne.geometry.boundaries =
786 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
787 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
788 layerOne.alpha = 0.2;
789
Vishnu Nair9b079a22020-01-21 14:36:08 -0800790 layersFirst.push_back(&layerOne);
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000791 invokeDraw(settings, layersFirst, mBuffer);
792 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
793 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
794 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
795 0, 0, 0, 0);
796
Vishnu Nair9b079a22020-01-21 14:36:08 -0800797 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000798 renderengine::LayerSettings layerTwo;
799 layerTwo.geometry.boundaries =
800 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
801 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
802 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
803 layerTwo.alpha = 1.0f;
804
Vishnu Nair9b079a22020-01-21 14:36:08 -0800805 layersSecond.push_back(&layerTwo);
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000806 invokeDraw(settings, layersSecond, mBuffer);
807
808 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
809 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
810 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
811 0, 255, 0, 255);
812}
813
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800814void RenderEngineTest::fillRedBufferTextureTransform() {
815 renderengine::DisplaySettings settings;
816 settings.physicalDisplay = fullscreenRect();
817 settings.clip = Rect(1, 1);
818
Vishnu Nair9b079a22020-01-21 14:36:08 -0800819 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800820
821 renderengine::LayerSettings layer;
822 // Here will allocate a checker board texture, but transform texture
823 // coordinates so that only the upper left is applied.
824 sp<GraphicBuffer> buf = allocateSourceBuffer(2, 2);
825 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800826 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800827 this->mTexNames.push_back(texName);
828
829 uint8_t* pixels;
830 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
831 reinterpret_cast<void**>(&pixels));
832 // Red top left, Green top right, Blue bottom left, Black bottom right
833 pixels[0] = 255;
834 pixels[1] = 0;
835 pixels[2] = 0;
836 pixels[3] = 255;
837 pixels[4] = 0;
838 pixels[5] = 255;
839 pixels[6] = 0;
840 pixels[7] = 255;
841 pixels[8] = 0;
842 pixels[9] = 0;
843 pixels[10] = 255;
844 pixels[11] = 255;
845 buf->unlock();
846
847 layer.source.buffer.buffer = buf;
848 layer.source.buffer.textureName = texName;
849 // Transform coordinates to only be inside the red quadrant.
850 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
851 layer.alpha = 1.0f;
852 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
853
Vishnu Nair9b079a22020-01-21 14:36:08 -0800854 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800855
856 invokeDraw(settings, layers, mBuffer);
857}
858
859void RenderEngineTest::fillBufferTextureTransform() {
860 fillRedBufferTextureTransform();
861 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
862}
863
864void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
865 renderengine::DisplaySettings settings;
866 settings.physicalDisplay = fullscreenRect();
867 // Here logical space is 1x1
868 settings.clip = Rect(1, 1);
869
Vishnu Nair9b079a22020-01-21 14:36:08 -0800870 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800871
872 renderengine::LayerSettings layer;
873 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
874 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800875 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800876 this->mTexNames.push_back(texName);
877
878 uint8_t* pixels;
879 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
880 reinterpret_cast<void**>(&pixels));
881 pixels[0] = 255;
882 pixels[1] = 0;
883 pixels[2] = 0;
884 pixels[3] = 255;
885 buf->unlock();
886
887 layer.source.buffer.buffer = buf;
888 layer.source.buffer.textureName = texName;
889 layer.source.buffer.usePremultipliedAlpha = true;
890 layer.alpha = 0.5f;
891 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
892
Vishnu Nair9b079a22020-01-21 14:36:08 -0800893 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800894
895 invokeDraw(settings, layers, mBuffer);
896}
897
898void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
899 fillRedBufferWithPremultiplyAlpha();
900 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
901}
902
903void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
904 renderengine::DisplaySettings settings;
905 settings.physicalDisplay = fullscreenRect();
906 // Here logical space is 1x1
907 settings.clip = Rect(1, 1);
908
Vishnu Nair9b079a22020-01-21 14:36:08 -0800909 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800910
911 renderengine::LayerSettings layer;
912 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
913 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800914 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800915 this->mTexNames.push_back(texName);
916
917 uint8_t* pixels;
918 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
919 reinterpret_cast<void**>(&pixels));
920 pixels[0] = 255;
921 pixels[1] = 0;
922 pixels[2] = 0;
923 pixels[3] = 255;
924 buf->unlock();
925
926 layer.source.buffer.buffer = buf;
927 layer.source.buffer.textureName = texName;
928 layer.source.buffer.usePremultipliedAlpha = false;
929 layer.alpha = 0.5f;
930 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
931
Vishnu Nair9b079a22020-01-21 14:36:08 -0800932 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800933
934 invokeDraw(settings, layers, mBuffer);
935}
936
937void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
938 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +0800939 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800940}
941
Alec Mouriac335532018-11-12 15:01:33 -0800942void RenderEngineTest::clearLeftRegion() {
943 renderengine::DisplaySettings settings;
944 settings.physicalDisplay = fullscreenRect();
945 // Here logical space is 4x4
946 settings.clip = Rect(4, 4);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700947 settings.clearRegion = Region(Rect(2, 4));
Vishnu Nair9b079a22020-01-21 14:36:08 -0800948 std::vector<const renderengine::LayerSettings*> layers;
Peiyong Lind8460c82020-07-28 16:04:22 -0700949 // fake layer, without bounds should not render anything
Alec Mouriac335532018-11-12 15:01:33 -0800950 renderengine::LayerSettings layer;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800951 layers.push_back(&layer);
Alec Mouriac335532018-11-12 15:01:33 -0800952 invokeDraw(settings, layers, mBuffer);
953}
954
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000955void RenderEngineTest::clearRegion() {
Alec Mouriac335532018-11-12 15:01:33 -0800956 // Reuse mBuffer
957 clearLeftRegion();
958 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 255);
959 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
960 DEFAULT_DISPLAY_HEIGHT),
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000961 0, 0, 0, 0);
Alec Mouriac335532018-11-12 15:01:33 -0800962}
963
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800964template <typename SourceVariant>
965void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
966 const renderengine::ShadowSettings& shadow,
967 const ubyte4& casterColor, const ubyte4& backgroundColor) {
968 renderengine::DisplaySettings settings;
969 settings.physicalDisplay = fullscreenRect();
970 settings.clip = fullscreenRect();
971
Vishnu Nair9b079a22020-01-21 14:36:08 -0800972 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800973
974 // add background layer
975 renderengine::LayerSettings bgLayer;
976 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
977 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
978 backgroundColor.b / 255.0f, this);
979 bgLayer.alpha = backgroundColor.a / 255.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800980 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800981
982 // add shadow layer
983 renderengine::LayerSettings shadowLayer;
984 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
985 shadowLayer.alpha = castingLayer.alpha;
986 shadowLayer.shadow = shadow;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800987 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800988
989 // add layer casting the shadow
990 renderengine::LayerSettings layer = castingLayer;
991 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
992 casterColor.b / 255.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -0800993 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800994
995 invokeDraw(settings, layers, mBuffer);
996}
997
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800998INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
999 testing::Values(std::make_shared<GLESRenderEngineFactory>()));
1000
1001TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
1002 const auto& renderEngineFactory = GetParam();
1003 mRE = renderEngineFactory->createRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001004 drawEmptyLayers();
1005}
1006
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001007TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
1008 const auto& renderEngineFactory = GetParam();
1009 mRE = renderEngineFactory->createRenderEngine();
1010
Alec Mourid43ccab2019-03-13 12:23:45 -07001011 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001012 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001013 renderengine::LayerSettings layer;
1014 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1015 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001016 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001017 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001018 status_t status = mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence);
Alec Mourid43ccab2019-03-13 12:23:45 -07001019
1020 ASSERT_EQ(BAD_VALUE, status);
1021}
1022
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001023TEST_P(RenderEngineTest, drawLayers_nullOutputFence) {
1024 const auto& renderEngineFactory = GetParam();
1025 mRE = renderEngineFactory->createRenderEngine();
1026
Alec Mourid43ccab2019-03-13 12:23:45 -07001027 renderengine::DisplaySettings settings;
1028 settings.physicalDisplay = fullscreenRect();
1029 settings.clip = fullscreenRect();
1030
Vishnu Nair9b079a22020-01-21 14:36:08 -08001031 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001032 renderengine::LayerSettings layer;
1033 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1034 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1035 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001036 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001037
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001038 status_t status = mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), nullptr);
1039 mCurrentBuffer = mBuffer;
Alec Mourid43ccab2019-03-13 12:23:45 -07001040 ASSERT_EQ(NO_ERROR, status);
1041 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1042}
1043
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001044TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1045 const auto& renderEngineFactory = GetParam();
1046 mRE = renderEngineFactory->createRenderEngine();
1047
Alec Mourife0d72b2019-03-21 14:05:56 -07001048 renderengine::DisplaySettings settings;
1049 settings.physicalDisplay = fullscreenRect();
1050 settings.clip = fullscreenRect();
1051
Vishnu Nair9b079a22020-01-21 14:36:08 -08001052 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001053 renderengine::LayerSettings layer;
1054 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1055 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1056 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001057 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001058
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001059 status_t status = mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd(), nullptr);
1060 mCurrentBuffer = mBuffer;
Alec Mourife0d72b2019-03-21 14:05:56 -07001061 ASSERT_EQ(NO_ERROR, status);
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001062 ASSERT_FALSE(mRE->isFramebufferImageCachedForTesting(mBuffer->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001063 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1064}
1065
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001066TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
1067 const auto& renderEngineFactory = GetParam();
1068 mRE = renderEngineFactory->createRenderEngine();
1069
Alec Mouri1089aed2018-10-25 21:33:57 -07001070 fillRedBuffer<ColorSourceVariant>();
1071}
1072
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001073TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
1074 const auto& renderEngineFactory = GetParam();
1075 mRE = renderEngineFactory->createRenderEngine();
1076
Alec Mouri1089aed2018-10-25 21:33:57 -07001077 fillGreenBuffer<ColorSourceVariant>();
1078}
1079
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001080TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
1081 const auto& renderEngineFactory = GetParam();
1082 mRE = renderEngineFactory->createRenderEngine();
1083
Alec Mouri1089aed2018-10-25 21:33:57 -07001084 fillBlueBuffer<ColorSourceVariant>();
1085}
1086
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001087TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
1088 const auto& renderEngineFactory = GetParam();
1089 mRE = renderEngineFactory->createRenderEngine();
1090
Alec Mouri1089aed2018-10-25 21:33:57 -07001091 fillRedTransparentBuffer<ColorSourceVariant>();
1092}
1093
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001094TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
1095 const auto& renderEngineFactory = GetParam();
1096 mRE = renderEngineFactory->createRenderEngine();
1097
Alec Mouri1089aed2018-10-25 21:33:57 -07001098 fillBufferPhysicalOffset<ColorSourceVariant>();
1099}
1100
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001101TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
1102 const auto& renderEngineFactory = GetParam();
1103 mRE = renderEngineFactory->createRenderEngine();
1104
Alec Mouri1089aed2018-10-25 21:33:57 -07001105 fillBufferCheckersRotate0<ColorSourceVariant>();
1106}
1107
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001108TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
1109 const auto& renderEngineFactory = GetParam();
1110 mRE = renderEngineFactory->createRenderEngine();
1111
Alec Mouri1089aed2018-10-25 21:33:57 -07001112 fillBufferCheckersRotate90<ColorSourceVariant>();
1113}
1114
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001115TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
1116 const auto& renderEngineFactory = GetParam();
1117 mRE = renderEngineFactory->createRenderEngine();
1118
Alec Mouri1089aed2018-10-25 21:33:57 -07001119 fillBufferCheckersRotate180<ColorSourceVariant>();
1120}
1121
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001122TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
1123 const auto& renderEngineFactory = GetParam();
1124 mRE = renderEngineFactory->createRenderEngine();
1125
Alec Mouri1089aed2018-10-25 21:33:57 -07001126 fillBufferCheckersRotate270<ColorSourceVariant>();
1127}
1128
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001129TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
1130 const auto& renderEngineFactory = GetParam();
1131 mRE = renderEngineFactory->createRenderEngine();
1132
Alec Mouri1089aed2018-10-25 21:33:57 -07001133 fillBufferLayerTransform<ColorSourceVariant>();
1134}
1135
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001136TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
1137 const auto& renderEngineFactory = GetParam();
1138 mRE = renderEngineFactory->createRenderEngine();
1139
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001140 fillBufferColorTransform<ColorSourceVariant>();
1141}
1142
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001143TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
1144 const auto& renderEngineFactory = GetParam();
1145 mRE = renderEngineFactory->createRenderEngine();
Alec Mouri6e57f682018-09-29 20:45:08 -07001146
Alec Mouri7c94edb2018-12-03 21:23:26 -08001147 fillBufferWithRoundedCorners<ColorSourceVariant>();
1148}
1149
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001150TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
1151 const auto& renderEngineFactory = GetParam();
1152 mRE = renderEngineFactory->createRenderEngine();
1153
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001154 fillBufferAndBlurBackground<ColorSourceVariant>();
1155}
1156
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001157TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
1158 const auto& renderEngineFactory = GetParam();
1159 mRE = renderEngineFactory->createRenderEngine();
1160
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001161 overlayCorners<ColorSourceVariant>();
1162}
1163
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001164TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
1165 const auto& renderEngineFactory = GetParam();
1166 mRE = renderEngineFactory->createRenderEngine();
1167
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001168 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1169}
1170
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001171TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
1172 const auto& renderEngineFactory = GetParam();
1173 mRE = renderEngineFactory->createRenderEngine();
1174
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001175 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1176}
1177
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001178TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
1179 const auto& renderEngineFactory = GetParam();
1180 mRE = renderEngineFactory->createRenderEngine();
1181
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001182 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1183}
1184
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001185TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
1186 const auto& renderEngineFactory = GetParam();
1187 mRE = renderEngineFactory->createRenderEngine();
1188
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001189 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1190}
1191
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001192TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
1193 const auto& renderEngineFactory = GetParam();
1194 mRE = renderEngineFactory->createRenderEngine();
1195
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001196 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1197}
1198
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001199TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
1200 const auto& renderEngineFactory = GetParam();
1201 mRE = renderEngineFactory->createRenderEngine();
1202
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001203 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1204}
1205
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001206TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
1207 const auto& renderEngineFactory = GetParam();
1208 mRE = renderEngineFactory->createRenderEngine();
1209
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001210 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1211}
1212
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001213TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
1214 const auto& renderEngineFactory = GetParam();
1215 mRE = renderEngineFactory->createRenderEngine();
1216
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001217 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1218}
1219
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001220TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
1221 const auto& renderEngineFactory = GetParam();
1222 mRE = renderEngineFactory->createRenderEngine();
1223
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001224 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1225}
1226
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001227TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
1228 const auto& renderEngineFactory = GetParam();
1229 mRE = renderEngineFactory->createRenderEngine();
1230
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001231 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1232}
1233
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001234TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
1235 const auto& renderEngineFactory = GetParam();
1236 mRE = renderEngineFactory->createRenderEngine();
1237
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001238 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1239}
1240
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001241TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
1242 const auto& renderEngineFactory = GetParam();
1243 mRE = renderEngineFactory->createRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001244
Alec Mouri7c94edb2018-12-03 21:23:26 -08001245 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1246}
1247
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001248TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
1249 const auto& renderEngineFactory = GetParam();
1250 mRE = renderEngineFactory->createRenderEngine();
1251
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001252 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1253}
1254
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001255TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
1256 const auto& renderEngineFactory = GetParam();
1257 mRE = renderEngineFactory->createRenderEngine();
1258
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001259 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1260}
1261
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001262TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
1263 const auto& renderEngineFactory = GetParam();
1264 mRE = renderEngineFactory->createRenderEngine();
1265
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001266 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1267}
1268
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001269TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
1270 const auto& renderEngineFactory = GetParam();
1271 mRE = renderEngineFactory->createRenderEngine();
1272
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001273 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1274}
1275
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001276TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
1277 const auto& renderEngineFactory = GetParam();
1278 mRE = renderEngineFactory->createRenderEngine();
1279
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001280 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1281}
1282
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001283TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
1284 const auto& renderEngineFactory = GetParam();
1285 mRE = renderEngineFactory->createRenderEngine();
1286
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001287 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1288}
1289
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001290TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
1291 const auto& renderEngineFactory = GetParam();
1292 mRE = renderEngineFactory->createRenderEngine();
1293
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001294 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1295}
1296
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001297TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
1298 const auto& renderEngineFactory = GetParam();
1299 mRE = renderEngineFactory->createRenderEngine();
1300
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001301 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1302}
1303
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001304TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
1305 const auto& renderEngineFactory = GetParam();
1306 mRE = renderEngineFactory->createRenderEngine();
1307
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001308 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1309}
1310
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001311TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
1312 const auto& renderEngineFactory = GetParam();
1313 mRE = renderEngineFactory->createRenderEngine();
1314
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001315 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1316}
1317
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001318TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
1319 const auto& renderEngineFactory = GetParam();
1320 mRE = renderEngineFactory->createRenderEngine();
1321
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001322 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1323}
1324
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001325TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
1326 const auto& renderEngineFactory = GetParam();
1327 mRE = renderEngineFactory->createRenderEngine();
1328
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001329 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1330}
1331
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001332TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
1333 const auto& renderEngineFactory = GetParam();
1334 mRE = renderEngineFactory->createRenderEngine();
1335
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001336 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1337}
1338
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001339TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
1340 const auto& renderEngineFactory = GetParam();
1341 mRE = renderEngineFactory->createRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001342
Alec Mouri7c94edb2018-12-03 21:23:26 -08001343 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1344}
1345
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001346TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
1347 const auto& renderEngineFactory = GetParam();
1348 mRE = renderEngineFactory->createRenderEngine();
1349
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001350 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1351}
1352
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001353TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
1354 const auto& renderEngineFactory = GetParam();
1355 mRE = renderEngineFactory->createRenderEngine();
1356
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001357 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1358}
1359
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001360TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
1361 const auto& renderEngineFactory = GetParam();
1362 mRE = renderEngineFactory->createRenderEngine();
1363
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001364 fillBufferTextureTransform();
1365}
1366
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001367TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
1368 const auto& renderEngineFactory = GetParam();
1369 mRE = renderEngineFactory->createRenderEngine();
1370
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001371 fillBufferWithPremultiplyAlpha();
1372}
1373
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001374TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
1375 const auto& renderEngineFactory = GetParam();
1376 mRE = renderEngineFactory->createRenderEngine();
1377
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001378 fillBufferWithoutPremultiplyAlpha();
1379}
1380
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001381TEST_P(RenderEngineTest, drawLayers_clearRegion) {
1382 const auto& renderEngineFactory = GetParam();
1383 mRE = renderEngineFactory->createRenderEngine();
1384
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001385 clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -08001386}
1387
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001388TEST_P(RenderEngineTest, drawLayers_fillsBufferAndCachesImages) {
1389 const auto& renderEngineFactory = GetParam();
1390 mRE = renderEngineFactory->createRenderEngine();
1391
Alec Mourid43ccab2019-03-13 12:23:45 -07001392 renderengine::DisplaySettings settings;
1393 settings.physicalDisplay = fullscreenRect();
1394 settings.clip = fullscreenRect();
1395
Vishnu Nair9b079a22020-01-21 14:36:08 -08001396 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001397
1398 renderengine::LayerSettings layer;
1399 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1400 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1401
Vishnu Nair9b079a22020-01-21 14:36:08 -08001402 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001403 invokeDraw(settings, layers, mBuffer);
1404 uint64_t bufferId = layer.source.buffer.buffer->getId();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001405 EXPECT_TRUE(mRE->isImageCachedForTesting(bufferId));
Alec Mouri16a99402019-07-29 16:37:30 -07001406 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001407 mRE->unbindExternalTextureBufferForTesting(bufferId);
Alec Mouri16a99402019-07-29 16:37:30 -07001408 std::lock_guard<std::mutex> lock(barrier->mutex);
1409 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1410 [&]() REQUIRES(barrier->mutex) {
1411 return barrier->isOpen;
1412 }));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001413 EXPECT_FALSE(mRE->isImageCachedForTesting(bufferId));
Alec Mouri16a99402019-07-29 16:37:30 -07001414 EXPECT_EQ(NO_ERROR, barrier->result);
Alec Mourid43ccab2019-03-13 12:23:45 -07001415}
1416
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001417TEST_P(RenderEngineTest, cacheExternalBuffer_withNullBuffer) {
1418 const auto& renderEngineFactory = GetParam();
1419 mRE = renderEngineFactory->createRenderEngine();
1420
Alec Mouri16a99402019-07-29 16:37:30 -07001421 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001422 mRE->cacheExternalTextureBufferForTesting(nullptr);
Alec Mouri16a99402019-07-29 16:37:30 -07001423 std::lock_guard<std::mutex> lock(barrier->mutex);
1424 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1425 [&]() REQUIRES(barrier->mutex) {
1426 return barrier->isOpen;
1427 }));
1428 EXPECT_TRUE(barrier->isOpen);
1429 EXPECT_EQ(BAD_VALUE, barrier->result);
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001430}
1431
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001432TEST_P(RenderEngineTest, cacheExternalBuffer_cachesImages) {
1433 const auto& renderEngineFactory = GetParam();
1434 mRE = renderEngineFactory->createRenderEngine();
1435
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001436 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
1437 uint64_t bufferId = buf->getId();
Alec Mouri16a99402019-07-29 16:37:30 -07001438 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001439 mRE->cacheExternalTextureBufferForTesting(buf);
Alec Mouri16a99402019-07-29 16:37:30 -07001440 {
1441 std::lock_guard<std::mutex> lock(barrier->mutex);
1442 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1443 [&]() REQUIRES(barrier->mutex) {
1444 return barrier->isOpen;
1445 }));
1446 EXPECT_EQ(NO_ERROR, barrier->result);
1447 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001448 EXPECT_TRUE(mRE->isImageCachedForTesting(bufferId));
1449 barrier = mRE->unbindExternalTextureBufferForTesting(bufferId);
Alec Mouri16a99402019-07-29 16:37:30 -07001450 {
1451 std::lock_guard<std::mutex> lock(barrier->mutex);
1452 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1453 [&]() REQUIRES(barrier->mutex) {
1454 return barrier->isOpen;
1455 }));
1456 EXPECT_EQ(NO_ERROR, barrier->result);
1457 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001458 EXPECT_FALSE(mRE->isImageCachedForTesting(bufferId));
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001459}
1460
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001461TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
1462 const auto& renderEngineFactory = GetParam();
1463 mRE = renderEngineFactory->createRenderEngine();
1464
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001465 const ubyte4 casterColor(255, 0, 0, 255);
1466 const ubyte4 backgroundColor(255, 255, 255, 255);
1467 const float shadowLength = 5.0f;
1468 Rect casterBounds(1, 1);
1469 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1470 renderengine::LayerSettings castingLayer;
1471 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1472 castingLayer.alpha = 1.0f;
1473 renderengine::ShadowSettings settings =
1474 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1475 false /* casterIsTranslucent */);
1476
1477 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1478 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1479}
1480
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001481TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
1482 const auto& renderEngineFactory = GetParam();
1483 mRE = renderEngineFactory->createRenderEngine();
1484
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001485 const ubyte4 casterColor(255, 0, 0, 255);
1486 const ubyte4 backgroundColor(255, 255, 255, 255);
1487 const float shadowLength = 5.0f;
1488 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1489 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1490 renderengine::LayerSettings castingLayer;
1491 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1492 castingLayer.alpha = 1.0f;
1493 renderengine::ShadowSettings settings =
1494 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1495 false /* casterIsTranslucent */);
1496
1497 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1498 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1499}
1500
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001501TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
1502 const auto& renderEngineFactory = GetParam();
1503 mRE = renderEngineFactory->createRenderEngine();
1504
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001505 const ubyte4 casterColor(255, 0, 0, 255);
1506 const ubyte4 backgroundColor(255, 255, 255, 255);
1507 const float shadowLength = 5.0f;
1508 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1509 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1510 renderengine::LayerSettings castingLayer;
1511 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1512 castingLayer.alpha = 1.0f;
1513 renderengine::ShadowSettings settings =
1514 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1515 false /* casterIsTranslucent */);
1516
1517 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1518 backgroundColor);
1519 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1520}
1521
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001522TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
1523 const auto& renderEngineFactory = GetParam();
1524 mRE = renderEngineFactory->createRenderEngine();
1525
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001526 const ubyte4 casterColor(255, 0, 0, 255);
1527 const ubyte4 backgroundColor(255, 255, 255, 255);
1528 const float shadowLength = 5.0f;
1529 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1530 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1531 renderengine::LayerSettings castingLayer;
1532 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1533 castingLayer.geometry.roundedCornersRadius = 3.0f;
1534 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1535 castingLayer.alpha = 1.0f;
1536 renderengine::ShadowSettings settings =
1537 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1538 false /* casterIsTranslucent */);
1539
1540 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1541 backgroundColor);
1542 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1543}
1544
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001545TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
1546 const auto& renderEngineFactory = GetParam();
1547 mRE = renderEngineFactory->createRenderEngine();
1548
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001549 const ubyte4 casterColor(255, 0, 0, 255);
1550 const ubyte4 backgroundColor(255, 255, 255, 255);
1551 const float shadowLength = 5.0f;
1552 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1553 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1554 renderengine::LayerSettings castingLayer;
1555 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1556 castingLayer.alpha = 0.5f;
1557 renderengine::ShadowSettings settings =
1558 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1559 true /* casterIsTranslucent */);
1560
1561 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1562 backgroundColor);
1563
1564 // verify only the background since the shadow will draw behind the caster
1565 const float shadowInset = settings.length * -1.0f;
1566 const Rect casterWithShadow =
1567 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1568 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1569 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1570 backgroundColor.a);
1571}
1572
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001573TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
1574 const auto& renderEngineFactory = GetParam();
1575 mRE = renderEngineFactory->createRenderEngine();
1576
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001577 renderengine::DisplaySettings settings;
1578 settings.physicalDisplay = fullscreenRect();
1579 settings.clip = fullscreenRect();
1580
1581 std::vector<const renderengine::LayerSettings*> layers;
1582 renderengine::LayerSettings layer;
1583 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1584 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1585 layer.alpha = 1.0;
1586 layers.push_back(&layer);
1587
1588 base::unique_fd fenceOne;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001589 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fenceOne);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001590 base::unique_fd fenceTwo;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001591 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne), &fenceTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001592
1593 const int fd = fenceTwo.get();
1594 if (fd >= 0) {
1595 sync_wait(fd, -1);
1596 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001597 // Only cleanup the first time.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001598 EXPECT_TRUE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001599 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001600 EXPECT_FALSE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001601 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
1602}
1603
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001604TEST_P(RenderEngineTest, cleanupPostRender_whenCleaningAll_replacesTextureMemory) {
1605 const auto& renderEngineFactory = GetParam();
1606 mRE = renderEngineFactory->createRenderEngine();
1607
Alec Mouri368e1582020-08-13 10:14:29 -07001608 renderengine::DisplaySettings settings;
1609 settings.physicalDisplay = fullscreenRect();
1610 settings.clip = fullscreenRect();
1611
1612 std::vector<const renderengine::LayerSettings*> layers;
1613 renderengine::LayerSettings layer;
1614 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1615 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1616 layer.alpha = 1.0;
1617 layers.push_back(&layer);
1618
1619 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001620 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri368e1582020-08-13 10:14:29 -07001621
1622 const int fd = fence.get();
1623 if (fd >= 0) {
1624 sync_wait(fd, -1);
1625 }
1626
1627 uint64_t bufferId = layer.source.buffer.buffer->getId();
1628 uint32_t texName = layer.source.buffer.textureName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001629 EXPECT_TRUE(mRE->isImageCachedForTesting(bufferId));
1630 EXPECT_EQ(bufferId, mRE->getBufferIdForTextureNameForTesting(texName));
Alec Mouri368e1582020-08-13 10:14:29 -07001631
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001632 EXPECT_TRUE(mRE->cleanupPostRender(renderengine::RenderEngine::CleanupMode::CLEAN_ALL));
Alec Mouri368e1582020-08-13 10:14:29 -07001633
1634 // Now check that our view of memory is good.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001635 EXPECT_FALSE(mRE->isImageCachedForTesting(bufferId));
1636 EXPECT_EQ(std::nullopt, mRE->getBufferIdForTextureNameForTesting(bufferId));
1637 EXPECT_TRUE(mRE->isTextureNameKnownForTesting(texName));
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001638}
1639
Alec Mouri6e57f682018-09-29 20:45:08 -07001640} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08001641
1642// TODO(b/129481165): remove the #pragma below and fix conversion issues
1643#pragma clang diagnostic pop // ignored "-Wconversion"