xref: /aosp_15_r20/frameworks/native/libs/renderengine/tests/RenderEngineTest.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright 2018 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #undef LOG_TAG
18*38e8c45fSAndroid Build Coastguard Worker #define LOG_TAG "RenderEngineTest"
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker // TODO(b/129481165): remove the #pragma below and fix conversion issues
21*38e8c45fSAndroid Build Coastguard Worker #pragma clang diagnostic push
22*38e8c45fSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wconversion"
23*38e8c45fSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wextra"
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker #include <com_android_graphics_surfaceflinger_flags.h>
26*38e8c45fSAndroid Build Coastguard Worker #include <cutils/properties.h>
27*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
28*38e8c45fSAndroid Build Coastguard Worker #include <renderengine/ExternalTexture.h>
29*38e8c45fSAndroid Build Coastguard Worker #include <renderengine/RenderEngine.h>
30*38e8c45fSAndroid Build Coastguard Worker #include <renderengine/impl/ExternalTexture.h>
31*38e8c45fSAndroid Build Coastguard Worker #include <sync/sync.h>
32*38e8c45fSAndroid Build Coastguard Worker #include <system/graphics-base-v1.0.h>
33*38e8c45fSAndroid Build Coastguard Worker #include <tonemap/tonemap.h>
34*38e8c45fSAndroid Build Coastguard Worker #include <ui/ColorSpace.h>
35*38e8c45fSAndroid Build Coastguard Worker #include <ui/PixelFormat.h>
36*38e8c45fSAndroid Build Coastguard Worker 
37*38e8c45fSAndroid Build Coastguard Worker #include <algorithm>
38*38e8c45fSAndroid Build Coastguard Worker #include <chrono>
39*38e8c45fSAndroid Build Coastguard Worker #include <condition_variable>
40*38e8c45fSAndroid Build Coastguard Worker #include <filesystem>
41*38e8c45fSAndroid Build Coastguard Worker #include <fstream>
42*38e8c45fSAndroid Build Coastguard Worker #include <system_error>
43*38e8c45fSAndroid Build Coastguard Worker 
44*38e8c45fSAndroid Build Coastguard Worker #include "../skia/SkiaGLRenderEngine.h"
45*38e8c45fSAndroid Build Coastguard Worker #include "../skia/SkiaVkRenderEngine.h"
46*38e8c45fSAndroid Build Coastguard Worker #include "../threaded/RenderEngineThreaded.h"
47*38e8c45fSAndroid Build Coastguard Worker 
48*38e8c45fSAndroid Build Coastguard Worker // TODO: b/341728634 - Clean up conditional compilation.
49*38e8c45fSAndroid Build Coastguard Worker #if COM_ANDROID_GRAPHICS_SURFACEFLINGER_FLAGS(GRAPHITE_RENDERENGINE) || \
50*38e8c45fSAndroid Build Coastguard Worker         COM_ANDROID_GRAPHICS_SURFACEFLINGER_FLAGS(FORCE_COMPILE_GRAPHITE_RENDERENGINE)
51*38e8c45fSAndroid Build Coastguard Worker #define COMPILE_GRAPHITE_RENDERENGINE 1
52*38e8c45fSAndroid Build Coastguard Worker #else
53*38e8c45fSAndroid Build Coastguard Worker #define COMPILE_GRAPHITE_RENDERENGINE 0
54*38e8c45fSAndroid Build Coastguard Worker #endif
55*38e8c45fSAndroid Build Coastguard Worker 
56*38e8c45fSAndroid Build Coastguard Worker constexpr int DEFAULT_DISPLAY_WIDTH = 128;
57*38e8c45fSAndroid Build Coastguard Worker constexpr int DEFAULT_DISPLAY_HEIGHT = 256;
58*38e8c45fSAndroid Build Coastguard Worker constexpr int DEFAULT_DISPLAY_OFFSET = 64;
59*38e8c45fSAndroid Build Coastguard Worker constexpr bool WRITE_BUFFER_TO_FILE_ON_FAILURE = false;
60*38e8c45fSAndroid Build Coastguard Worker 
61*38e8c45fSAndroid Build Coastguard Worker namespace android {
62*38e8c45fSAndroid Build Coastguard Worker namespace renderengine {
63*38e8c45fSAndroid Build Coastguard Worker 
64*38e8c45fSAndroid Build Coastguard Worker namespace {
65*38e8c45fSAndroid Build Coastguard Worker 
EOTF_PQ(double channel)66*38e8c45fSAndroid Build Coastguard Worker double EOTF_PQ(double channel) {
67*38e8c45fSAndroid Build Coastguard Worker     float m1 = (2610.0 / 4096.0) / 4.0;
68*38e8c45fSAndroid Build Coastguard Worker     float m2 = (2523.0 / 4096.0) * 128.0;
69*38e8c45fSAndroid Build Coastguard Worker     float c1 = (3424.0 / 4096.0);
70*38e8c45fSAndroid Build Coastguard Worker     float c2 = (2413.0 / 4096.0) * 32.0;
71*38e8c45fSAndroid Build Coastguard Worker     float c3 = (2392.0 / 4096.0) * 32.0;
72*38e8c45fSAndroid Build Coastguard Worker 
73*38e8c45fSAndroid Build Coastguard Worker     float tmp = std::pow(std::clamp(channel, 0.0, 1.0), 1.0 / m2);
74*38e8c45fSAndroid Build Coastguard Worker     tmp = std::fmax(tmp - c1, 0.0) / (c2 - c3 * tmp);
75*38e8c45fSAndroid Build Coastguard Worker     return std::pow(tmp, 1.0 / m1);
76*38e8c45fSAndroid Build Coastguard Worker }
77*38e8c45fSAndroid Build Coastguard Worker 
EOTF_PQ(vec3 color)78*38e8c45fSAndroid Build Coastguard Worker vec3 EOTF_PQ(vec3 color) {
79*38e8c45fSAndroid Build Coastguard Worker     return vec3(EOTF_PQ(color.r), EOTF_PQ(color.g), EOTF_PQ(color.b));
80*38e8c45fSAndroid Build Coastguard Worker }
81*38e8c45fSAndroid Build Coastguard Worker 
EOTF_HLG(double channel)82*38e8c45fSAndroid Build Coastguard Worker double EOTF_HLG(double channel) {
83*38e8c45fSAndroid Build Coastguard Worker     const float a = 0.17883277;
84*38e8c45fSAndroid Build Coastguard Worker     const float b = 0.28466892;
85*38e8c45fSAndroid Build Coastguard Worker     const float c = 0.55991073;
86*38e8c45fSAndroid Build Coastguard Worker     return channel <= 0.5 ? channel * channel / 3.0 : (exp((channel - c) / a) + b) / 12.0;
87*38e8c45fSAndroid Build Coastguard Worker }
88*38e8c45fSAndroid Build Coastguard Worker 
EOTF_HLG(vec3 color)89*38e8c45fSAndroid Build Coastguard Worker vec3 EOTF_HLG(vec3 color) {
90*38e8c45fSAndroid Build Coastguard Worker     return vec3(EOTF_HLG(color.r), EOTF_HLG(color.g), EOTF_HLG(color.b));
91*38e8c45fSAndroid Build Coastguard Worker }
92*38e8c45fSAndroid Build Coastguard Worker 
OETF_sRGB(double channel)93*38e8c45fSAndroid Build Coastguard Worker double OETF_sRGB(double channel) {
94*38e8c45fSAndroid Build Coastguard Worker     return channel <= 0.0031308 ? channel * 12.92 : (pow(channel, 1.0 / 2.4) * 1.055) - 0.055;
95*38e8c45fSAndroid Build Coastguard Worker }
96*38e8c45fSAndroid Build Coastguard Worker 
sign(float in)97*38e8c45fSAndroid Build Coastguard Worker int sign(float in) {
98*38e8c45fSAndroid Build Coastguard Worker     return in >= 0.0 ? 1 : -1;
99*38e8c45fSAndroid Build Coastguard Worker }
100*38e8c45fSAndroid Build Coastguard Worker 
OETF_sRGB(vec3 linear)101*38e8c45fSAndroid Build Coastguard Worker vec3 OETF_sRGB(vec3 linear) {
102*38e8c45fSAndroid Build Coastguard Worker     return vec3(sign(linear.r) * OETF_sRGB(linear.r), sign(linear.g) * OETF_sRGB(linear.g),
103*38e8c45fSAndroid Build Coastguard Worker                 sign(linear.b) * OETF_sRGB(linear.b));
104*38e8c45fSAndroid Build Coastguard Worker }
105*38e8c45fSAndroid Build Coastguard Worker 
106*38e8c45fSAndroid Build Coastguard Worker // clang-format off
107*38e8c45fSAndroid Build Coastguard Worker // Converts red channels to green channels, and zeroes out an existing green channel.
108*38e8c45fSAndroid Build Coastguard Worker static const auto kRemoveGreenAndMoveRedToGreenMat4 = mat4(0, 1, 0, 0,
109*38e8c45fSAndroid Build Coastguard Worker                                                            0, 0, 0, 0,
110*38e8c45fSAndroid Build Coastguard Worker                                                            0, 0, 1, 0,
111*38e8c45fSAndroid Build Coastguard Worker                                                            0, 0, 0, 1);
112*38e8c45fSAndroid Build Coastguard Worker // clang-format on
113*38e8c45fSAndroid Build Coastguard Worker 
114*38e8c45fSAndroid Build Coastguard Worker } // namespace
115*38e8c45fSAndroid Build Coastguard Worker 
116*38e8c45fSAndroid Build Coastguard Worker class RenderEngineFactory {
117*38e8c45fSAndroid Build Coastguard Worker public:
118*38e8c45fSAndroid Build Coastguard Worker     virtual ~RenderEngineFactory() = default;
119*38e8c45fSAndroid Build Coastguard Worker 
120*38e8c45fSAndroid Build Coastguard Worker     virtual std::string name() = 0;
121*38e8c45fSAndroid Build Coastguard Worker     virtual renderengine::RenderEngine::GraphicsApi graphicsApi() = 0;
122*38e8c45fSAndroid Build Coastguard Worker     virtual renderengine::RenderEngine::SkiaBackend skiaBackend() = 0;
apiSupported()123*38e8c45fSAndroid Build Coastguard Worker     bool apiSupported() { return renderengine::RenderEngine::canSupport(graphicsApi()); }
createRenderEngine()124*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<renderengine::RenderEngine> createRenderEngine() {
125*38e8c45fSAndroid Build Coastguard Worker         renderengine::RenderEngineCreationArgs reCreationArgs =
126*38e8c45fSAndroid Build Coastguard Worker                 renderengine::RenderEngineCreationArgs::Builder()
127*38e8c45fSAndroid Build Coastguard Worker                         .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
128*38e8c45fSAndroid Build Coastguard Worker                         .setImageCacheSize(1)
129*38e8c45fSAndroid Build Coastguard Worker                         .setEnableProtectedContext(false)
130*38e8c45fSAndroid Build Coastguard Worker                         .setPrecacheToneMapperShaderOnly(false)
131*38e8c45fSAndroid Build Coastguard Worker                         .setBlurAlgorithm(renderengine::RenderEngine::BlurAlgorithm::KAWASE)
132*38e8c45fSAndroid Build Coastguard Worker                         .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
133*38e8c45fSAndroid Build Coastguard Worker                         .setThreaded(renderengine::RenderEngine::Threaded::NO)
134*38e8c45fSAndroid Build Coastguard Worker                         .setGraphicsApi(graphicsApi())
135*38e8c45fSAndroid Build Coastguard Worker                         .setSkiaBackend(skiaBackend())
136*38e8c45fSAndroid Build Coastguard Worker                         .build();
137*38e8c45fSAndroid Build Coastguard Worker         return renderengine::RenderEngine::create(reCreationArgs);
138*38e8c45fSAndroid Build Coastguard Worker     }
139*38e8c45fSAndroid Build Coastguard Worker };
140*38e8c45fSAndroid Build Coastguard Worker 
141*38e8c45fSAndroid Build Coastguard Worker class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
142*38e8c45fSAndroid Build Coastguard Worker public:
name()143*38e8c45fSAndroid Build Coastguard Worker     std::string name() override { return "SkiaGLRenderEngineFactory"; }
144*38e8c45fSAndroid Build Coastguard Worker 
graphicsApi()145*38e8c45fSAndroid Build Coastguard Worker     renderengine::RenderEngine::GraphicsApi graphicsApi() {
146*38e8c45fSAndroid Build Coastguard Worker         return renderengine::RenderEngine::GraphicsApi::GL;
147*38e8c45fSAndroid Build Coastguard Worker     }
148*38e8c45fSAndroid Build Coastguard Worker 
skiaBackend()149*38e8c45fSAndroid Build Coastguard Worker     renderengine::RenderEngine::SkiaBackend skiaBackend() override {
150*38e8c45fSAndroid Build Coastguard Worker         return renderengine::RenderEngine::SkiaBackend::GANESH;
151*38e8c45fSAndroid Build Coastguard Worker     }
152*38e8c45fSAndroid Build Coastguard Worker };
153*38e8c45fSAndroid Build Coastguard Worker 
154*38e8c45fSAndroid Build Coastguard Worker class GaneshVkRenderEngineFactory : public RenderEngineFactory {
155*38e8c45fSAndroid Build Coastguard Worker public:
name()156*38e8c45fSAndroid Build Coastguard Worker     std::string name() override { return "GaneshVkRenderEngineFactory"; }
157*38e8c45fSAndroid Build Coastguard Worker 
graphicsApi()158*38e8c45fSAndroid Build Coastguard Worker     renderengine::RenderEngine::GraphicsApi graphicsApi() override {
159*38e8c45fSAndroid Build Coastguard Worker         return renderengine::RenderEngine::GraphicsApi::VK;
160*38e8c45fSAndroid Build Coastguard Worker     }
161*38e8c45fSAndroid Build Coastguard Worker 
skiaBackend()162*38e8c45fSAndroid Build Coastguard Worker     renderengine::RenderEngine::SkiaBackend skiaBackend() override {
163*38e8c45fSAndroid Build Coastguard Worker         return renderengine::RenderEngine::SkiaBackend::GANESH;
164*38e8c45fSAndroid Build Coastguard Worker     }
165*38e8c45fSAndroid Build Coastguard Worker };
166*38e8c45fSAndroid Build Coastguard Worker 
167*38e8c45fSAndroid Build Coastguard Worker // TODO: b/341728634 - Clean up conditional compilation.
168*38e8c45fSAndroid Build Coastguard Worker #if COMPILE_GRAPHITE_RENDERENGINE
169*38e8c45fSAndroid Build Coastguard Worker class GraphiteVkRenderEngineFactory : public RenderEngineFactory {
170*38e8c45fSAndroid Build Coastguard Worker public:
name()171*38e8c45fSAndroid Build Coastguard Worker     std::string name() override { return "GraphiteVkRenderEngineFactory"; }
172*38e8c45fSAndroid Build Coastguard Worker 
graphicsApi()173*38e8c45fSAndroid Build Coastguard Worker     renderengine::RenderEngine::GraphicsApi graphicsApi() override {
174*38e8c45fSAndroid Build Coastguard Worker         return renderengine::RenderEngine::GraphicsApi::VK;
175*38e8c45fSAndroid Build Coastguard Worker     }
176*38e8c45fSAndroid Build Coastguard Worker 
skiaBackend()177*38e8c45fSAndroid Build Coastguard Worker     renderengine::RenderEngine::SkiaBackend skiaBackend() override {
178*38e8c45fSAndroid Build Coastguard Worker         return renderengine::RenderEngine::SkiaBackend::GRAPHITE;
179*38e8c45fSAndroid Build Coastguard Worker     }
180*38e8c45fSAndroid Build Coastguard Worker };
181*38e8c45fSAndroid Build Coastguard Worker #endif
182*38e8c45fSAndroid Build Coastguard Worker 
183*38e8c45fSAndroid Build Coastguard Worker class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
184*38e8c45fSAndroid Build Coastguard Worker public:
allocateDefaultBuffer()185*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<renderengine::ExternalTexture> allocateDefaultBuffer() {
186*38e8c45fSAndroid Build Coastguard Worker         return std::make_shared<
187*38e8c45fSAndroid Build Coastguard Worker                 renderengine::impl::
188*38e8c45fSAndroid Build Coastguard Worker                         ExternalTexture>(sp<GraphicBuffer>::
189*38e8c45fSAndroid Build Coastguard Worker                                                  make(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT,
190*38e8c45fSAndroid Build Coastguard Worker                                                       HAL_PIXEL_FORMAT_RGBA_8888, 1,
191*38e8c45fSAndroid Build Coastguard Worker                                                       GRALLOC_USAGE_SW_READ_OFTEN |
192*38e8c45fSAndroid Build Coastguard Worker                                                               GRALLOC_USAGE_SW_WRITE_OFTEN |
193*38e8c45fSAndroid Build Coastguard Worker                                                               GRALLOC_USAGE_HW_RENDER |
194*38e8c45fSAndroid Build Coastguard Worker                                                               GRALLOC_USAGE_HW_TEXTURE,
195*38e8c45fSAndroid Build Coastguard Worker                                                       "output"),
196*38e8c45fSAndroid Build Coastguard Worker                                          *mRE,
197*38e8c45fSAndroid Build Coastguard Worker                                          renderengine::impl::ExternalTexture::Usage::READABLE |
198*38e8c45fSAndroid Build Coastguard Worker                                                  renderengine::impl::ExternalTexture::Usage::
199*38e8c45fSAndroid Build Coastguard Worker                                                          WRITEABLE);
200*38e8c45fSAndroid Build Coastguard Worker     }
201*38e8c45fSAndroid Build Coastguard Worker 
202*38e8c45fSAndroid Build Coastguard Worker     // Allocates a 1x1 buffer to fill with a solid color
allocateSourceBuffer(uint32_t width,uint32_t height)203*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<renderengine::ExternalTexture> allocateSourceBuffer(uint32_t width,
204*38e8c45fSAndroid Build Coastguard Worker                                                                         uint32_t height) {
205*38e8c45fSAndroid Build Coastguard Worker         return std::make_shared<
206*38e8c45fSAndroid Build Coastguard Worker                 renderengine::impl::
207*38e8c45fSAndroid Build Coastguard Worker                         ExternalTexture>(sp<GraphicBuffer>::
208*38e8c45fSAndroid Build Coastguard Worker                                                  make(width, height, HAL_PIXEL_FORMAT_RGBA_8888, 1,
209*38e8c45fSAndroid Build Coastguard Worker                                                       GRALLOC_USAGE_SW_READ_OFTEN |
210*38e8c45fSAndroid Build Coastguard Worker                                                               GRALLOC_USAGE_SW_WRITE_OFTEN |
211*38e8c45fSAndroid Build Coastguard Worker                                                               GRALLOC_USAGE_HW_TEXTURE,
212*38e8c45fSAndroid Build Coastguard Worker                                                       "input"),
213*38e8c45fSAndroid Build Coastguard Worker                                          *mRE,
214*38e8c45fSAndroid Build Coastguard Worker                                          renderengine::impl::ExternalTexture::Usage::READABLE |
215*38e8c45fSAndroid Build Coastguard Worker                                                  renderengine::impl::ExternalTexture::Usage::
216*38e8c45fSAndroid Build Coastguard Worker                                                          WRITEABLE);
217*38e8c45fSAndroid Build Coastguard Worker     }
218*38e8c45fSAndroid Build Coastguard Worker 
allocateAndFillSourceBuffer(uint32_t width,uint32_t height,ubyte4 color)219*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<renderengine::ExternalTexture> allocateAndFillSourceBuffer(uint32_t width,
220*38e8c45fSAndroid Build Coastguard Worker                                                                                uint32_t height,
221*38e8c45fSAndroid Build Coastguard Worker                                                                                ubyte4 color) {
222*38e8c45fSAndroid Build Coastguard Worker         const auto buffer = allocateSourceBuffer(width, height);
223*38e8c45fSAndroid Build Coastguard Worker         uint8_t* pixels;
224*38e8c45fSAndroid Build Coastguard Worker         buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
225*38e8c45fSAndroid Build Coastguard Worker                                   reinterpret_cast<void**>(&pixels));
226*38e8c45fSAndroid Build Coastguard Worker         for (uint32_t j = 0; j < height; j++) {
227*38e8c45fSAndroid Build Coastguard Worker             uint8_t* dst = pixels + (buffer->getBuffer()->getStride() * j * 4);
228*38e8c45fSAndroid Build Coastguard Worker             for (uint32_t i = 0; i < width; i++) {
229*38e8c45fSAndroid Build Coastguard Worker                 dst[0] = color.r;
230*38e8c45fSAndroid Build Coastguard Worker                 dst[1] = color.g;
231*38e8c45fSAndroid Build Coastguard Worker                 dst[2] = color.b;
232*38e8c45fSAndroid Build Coastguard Worker                 dst[3] = color.a;
233*38e8c45fSAndroid Build Coastguard Worker                 dst += 4;
234*38e8c45fSAndroid Build Coastguard Worker             }
235*38e8c45fSAndroid Build Coastguard Worker         }
236*38e8c45fSAndroid Build Coastguard Worker         buffer->getBuffer()->unlock();
237*38e8c45fSAndroid Build Coastguard Worker         return buffer;
238*38e8c45fSAndroid Build Coastguard Worker     }
239*38e8c45fSAndroid Build Coastguard Worker 
allocateR8Buffer(int width,int height)240*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<renderengine::ExternalTexture> allocateR8Buffer(int width, int height) {
241*38e8c45fSAndroid Build Coastguard Worker         const auto kUsageFlags =
242*38e8c45fSAndroid Build Coastguard Worker                 static_cast<uint64_t>(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
243*38e8c45fSAndroid Build Coastguard Worker                                       GRALLOC_USAGE_HW_TEXTURE);
244*38e8c45fSAndroid Build Coastguard Worker         auto buffer =
245*38e8c45fSAndroid Build Coastguard Worker                 sp<GraphicBuffer>::make(static_cast<uint32_t>(width), static_cast<uint32_t>(height),
246*38e8c45fSAndroid Build Coastguard Worker                                         android::PIXEL_FORMAT_R_8, 1u, kUsageFlags, "r8");
247*38e8c45fSAndroid Build Coastguard Worker         if (buffer->initCheck() != 0) {
248*38e8c45fSAndroid Build Coastguard Worker             // Devices are not required to support R8.
249*38e8c45fSAndroid Build Coastguard Worker             return nullptr;
250*38e8c45fSAndroid Build Coastguard Worker         }
251*38e8c45fSAndroid Build Coastguard Worker         return std::make_shared<
252*38e8c45fSAndroid Build Coastguard Worker                 renderengine::impl::ExternalTexture>(std::move(buffer), *mRE,
253*38e8c45fSAndroid Build Coastguard Worker                                                      renderengine::impl::ExternalTexture::Usage::
254*38e8c45fSAndroid Build Coastguard Worker                                                              READABLE);
255*38e8c45fSAndroid Build Coastguard Worker     }
256*38e8c45fSAndroid Build Coastguard Worker 
RenderEngineTest()257*38e8c45fSAndroid Build Coastguard Worker     RenderEngineTest() {
258*38e8c45fSAndroid Build Coastguard Worker         const ::testing::TestInfo* const test_info =
259*38e8c45fSAndroid Build Coastguard Worker                 ::testing::UnitTest::GetInstance()->current_test_info();
260*38e8c45fSAndroid Build Coastguard Worker         ALOGI("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
261*38e8c45fSAndroid Build Coastguard Worker     }
262*38e8c45fSAndroid Build Coastguard Worker 
~RenderEngineTest()263*38e8c45fSAndroid Build Coastguard Worker     ~RenderEngineTest() {
264*38e8c45fSAndroid Build Coastguard Worker         if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
265*38e8c45fSAndroid Build Coastguard Worker             writeBufferToFile("/data/local/tmp/RenderEngineTest/");
266*38e8c45fSAndroid Build Coastguard Worker         }
267*38e8c45fSAndroid Build Coastguard Worker         const ::testing::TestInfo* const test_info =
268*38e8c45fSAndroid Build Coastguard Worker                 ::testing::UnitTest::GetInstance()->current_test_info();
269*38e8c45fSAndroid Build Coastguard Worker         ALOGI("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
270*38e8c45fSAndroid Build Coastguard Worker     }
271*38e8c45fSAndroid Build Coastguard Worker 
272*38e8c45fSAndroid Build Coastguard Worker     // If called during e.g.
273*38e8c45fSAndroid Build Coastguard Worker     // `PerRenderEngineType/RenderEngineTest#drawLayers_fillBufferCheckersRotate90_colorSource/0`
274*38e8c45fSAndroid Build Coastguard Worker     // with a directory of `/data/local/tmp/RenderEngineTest`, then mBuffer will be dumped to
275*38e8c45fSAndroid Build Coastguard Worker     // `/data/local/tmp/RenderEngineTest/drawLayers_fillBufferCheckersRotate90_colorSource-0.ppm`
276*38e8c45fSAndroid Build Coastguard Worker     //
277*38e8c45fSAndroid Build Coastguard Worker     // Note: if `directory` does not exist, then its full path will be recursively created with 777
278*38e8c45fSAndroid Build Coastguard Worker     // permissions. If `directory` already exists but does not grant the executing user write
279*38e8c45fSAndroid Build Coastguard Worker     // permissions, then saving the buffer will fail.
280*38e8c45fSAndroid Build Coastguard Worker     //
281*38e8c45fSAndroid Build Coastguard Worker     // Since this is test-only code, no security considerations are made.
writeBufferToFile(const filesystem::path & directory)282*38e8c45fSAndroid Build Coastguard Worker     void writeBufferToFile(const filesystem::path& directory) {
283*38e8c45fSAndroid Build Coastguard Worker         const auto currentTestInfo = ::testing::UnitTest::GetInstance()->current_test_info();
284*38e8c45fSAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL_IF(!currentTestInfo,
285*38e8c45fSAndroid Build Coastguard Worker                             "writeBufferToFile must be called during execution of a test");
286*38e8c45fSAndroid Build Coastguard Worker 
287*38e8c45fSAndroid Build Coastguard Worker         std::string fileName(currentTestInfo->name());
288*38e8c45fSAndroid Build Coastguard Worker         // Test names may include the RenderEngine variant separated by '/', which would separate
289*38e8c45fSAndroid Build Coastguard Worker         // the file name into a subdirectory if not corrected.
290*38e8c45fSAndroid Build Coastguard Worker         std::replace(fileName.begin(), fileName.end(), '/', '-');
291*38e8c45fSAndroid Build Coastguard Worker         fileName.append(".ppm");
292*38e8c45fSAndroid Build Coastguard Worker 
293*38e8c45fSAndroid Build Coastguard Worker         std::error_code err;
294*38e8c45fSAndroid Build Coastguard Worker         filesystem::create_directories(directory, err);
295*38e8c45fSAndroid Build Coastguard Worker         if (err.value()) {
296*38e8c45fSAndroid Build Coastguard Worker             ALOGE("Unable to create directory %s for writing %s (%d: %s)", directory.c_str(),
297*38e8c45fSAndroid Build Coastguard Worker                   fileName.c_str(), err.value(), err.message().c_str());
298*38e8c45fSAndroid Build Coastguard Worker             return;
299*38e8c45fSAndroid Build Coastguard Worker         }
300*38e8c45fSAndroid Build Coastguard Worker 
301*38e8c45fSAndroid Build Coastguard Worker         // Append operator ("/") ensures exactly one "/" directly before the argument.
302*38e8c45fSAndroid Build Coastguard Worker         const filesystem::path filePath = directory / fileName;
303*38e8c45fSAndroid Build Coastguard Worker         std::ofstream file(filePath.c_str(), std::ios::binary);
304*38e8c45fSAndroid Build Coastguard Worker         if (!file.is_open()) {
305*38e8c45fSAndroid Build Coastguard Worker             ALOGE("Unable to open file: %s", filePath.c_str());
306*38e8c45fSAndroid Build Coastguard Worker             ALOGE("You may need to do: \"adb shell setenforce 0\" to enable surfaceflinger to "
307*38e8c45fSAndroid Build Coastguard Worker                   "write debug images, or the %s directory might not give the executing user write "
308*38e8c45fSAndroid Build Coastguard Worker                   "permission",
309*38e8c45fSAndroid Build Coastguard Worker                   directory.c_str());
310*38e8c45fSAndroid Build Coastguard Worker             return;
311*38e8c45fSAndroid Build Coastguard Worker         }
312*38e8c45fSAndroid Build Coastguard Worker 
313*38e8c45fSAndroid Build Coastguard Worker         uint8_t* pixels;
314*38e8c45fSAndroid Build Coastguard Worker         mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
315*38e8c45fSAndroid Build Coastguard Worker                                    reinterpret_cast<void**>(&pixels));
316*38e8c45fSAndroid Build Coastguard Worker 
317*38e8c45fSAndroid Build Coastguard Worker         file << "P6\n";
318*38e8c45fSAndroid Build Coastguard Worker         file << mBuffer->getBuffer()->getWidth() << "\n";
319*38e8c45fSAndroid Build Coastguard Worker         file << mBuffer->getBuffer()->getHeight() << "\n";
320*38e8c45fSAndroid Build Coastguard Worker         file << 255 << "\n";
321*38e8c45fSAndroid Build Coastguard Worker 
322*38e8c45fSAndroid Build Coastguard Worker         std::vector<uint8_t> outBuffer(mBuffer->getBuffer()->getWidth() *
323*38e8c45fSAndroid Build Coastguard Worker                                        mBuffer->getBuffer()->getHeight() * 3);
324*38e8c45fSAndroid Build Coastguard Worker         auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
325*38e8c45fSAndroid Build Coastguard Worker 
326*38e8c45fSAndroid Build Coastguard Worker         for (int32_t j = 0; j < mBuffer->getBuffer()->getHeight(); j++) {
327*38e8c45fSAndroid Build Coastguard Worker             const uint8_t* src = pixels + (mBuffer->getBuffer()->getStride() * j) * 4;
328*38e8c45fSAndroid Build Coastguard Worker             for (int32_t i = 0; i < mBuffer->getBuffer()->getWidth(); i++) {
329*38e8c45fSAndroid Build Coastguard Worker                 // Only copy R, G and B components
330*38e8c45fSAndroid Build Coastguard Worker                 outPtr[0] = src[0];
331*38e8c45fSAndroid Build Coastguard Worker                 outPtr[1] = src[1];
332*38e8c45fSAndroid Build Coastguard Worker                 outPtr[2] = src[2];
333*38e8c45fSAndroid Build Coastguard Worker                 outPtr += 3;
334*38e8c45fSAndroid Build Coastguard Worker 
335*38e8c45fSAndroid Build Coastguard Worker                 src += 4;
336*38e8c45fSAndroid Build Coastguard Worker             }
337*38e8c45fSAndroid Build Coastguard Worker         }
338*38e8c45fSAndroid Build Coastguard Worker         file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
339*38e8c45fSAndroid Build Coastguard Worker         ALOGI("Image of incorrect output written to %s", filePath.c_str());
340*38e8c45fSAndroid Build Coastguard Worker         mBuffer->getBuffer()->unlock();
341*38e8c45fSAndroid Build Coastguard Worker     }
342*38e8c45fSAndroid Build Coastguard Worker 
expectBufferColor(const Region & region,uint8_t r,uint8_t g,uint8_t b,uint8_t a)343*38e8c45fSAndroid Build Coastguard Worker     void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
344*38e8c45fSAndroid Build Coastguard Worker         size_t c;
345*38e8c45fSAndroid Build Coastguard Worker         Rect const* rect = region.getArray(&c);
346*38e8c45fSAndroid Build Coastguard Worker         for (size_t i = 0; i < c; i++, rect++) {
347*38e8c45fSAndroid Build Coastguard Worker             expectBufferColor(*rect, r, g, b, a);
348*38e8c45fSAndroid Build Coastguard Worker         }
349*38e8c45fSAndroid Build Coastguard Worker     }
350*38e8c45fSAndroid Build Coastguard Worker 
expectBufferColor(const Point & point,uint8_t r,uint8_t g,uint8_t b,uint8_t a,uint8_t tolerance=0)351*38e8c45fSAndroid Build Coastguard Worker     void expectBufferColor(const Point& point, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
352*38e8c45fSAndroid Build Coastguard Worker                            uint8_t tolerance = 0) {
353*38e8c45fSAndroid Build Coastguard Worker         expectBufferColor(Rect(point.x, point.y, point.x + 1, point.y + 1), r, g, b, a, tolerance);
354*38e8c45fSAndroid Build Coastguard Worker     }
355*38e8c45fSAndroid Build Coastguard Worker 
expectBufferColor(const Rect & rect,uint8_t r,uint8_t g,uint8_t b,uint8_t a,uint8_t tolerance=0)356*38e8c45fSAndroid Build Coastguard Worker     void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
357*38e8c45fSAndroid Build Coastguard Worker                            uint8_t tolerance = 0) {
358*38e8c45fSAndroid Build Coastguard Worker         auto generator = [=](Point) { return ubyte4(r, g, b, a); };
359*38e8c45fSAndroid Build Coastguard Worker         expectBufferColor(rect, generator, tolerance);
360*38e8c45fSAndroid Build Coastguard Worker     }
361*38e8c45fSAndroid Build Coastguard Worker 
362*38e8c45fSAndroid Build Coastguard Worker     using ColorGenerator = std::function<ubyte4(Point location)>;
363*38e8c45fSAndroid Build Coastguard Worker 
expectBufferColor(const Rect & rect,ColorGenerator generator,uint8_t tolerance=0)364*38e8c45fSAndroid Build Coastguard Worker     void expectBufferColor(const Rect& rect, ColorGenerator generator, uint8_t tolerance = 0) {
365*38e8c45fSAndroid Build Coastguard Worker         auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
366*38e8c45fSAndroid Build Coastguard Worker             auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
367*38e8c45fSAndroid Build Coastguard Worker                 uint8_t tmp = a >= b ? a - b : b - a;
368*38e8c45fSAndroid Build Coastguard Worker                 return tmp <= tolerance;
369*38e8c45fSAndroid Build Coastguard Worker             };
370*38e8c45fSAndroid Build Coastguard Worker             return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
371*38e8c45fSAndroid Build Coastguard Worker         };
372*38e8c45fSAndroid Build Coastguard Worker 
373*38e8c45fSAndroid Build Coastguard Worker         expectBufferColor(rect, generator, colorCompare);
374*38e8c45fSAndroid Build Coastguard Worker     }
375*38e8c45fSAndroid Build Coastguard Worker 
expectBufferColor(const Rect & region,ColorGenerator generator,std::function<bool (const uint8_t * a,const uint8_t * b)> colorCompare)376*38e8c45fSAndroid Build Coastguard Worker     void expectBufferColor(const Rect& region, ColorGenerator generator,
377*38e8c45fSAndroid Build Coastguard Worker                            std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
378*38e8c45fSAndroid Build Coastguard Worker         uint8_t* pixels;
379*38e8c45fSAndroid Build Coastguard Worker         mBuffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
380*38e8c45fSAndroid Build Coastguard Worker                                    reinterpret_cast<void**>(&pixels));
381*38e8c45fSAndroid Build Coastguard Worker         int32_t maxFails = 10;
382*38e8c45fSAndroid Build Coastguard Worker         int32_t fails = 0;
383*38e8c45fSAndroid Build Coastguard Worker         for (int32_t j = 0; j < region.getHeight(); j++) {
384*38e8c45fSAndroid Build Coastguard Worker             const uint8_t* src = pixels +
385*38e8c45fSAndroid Build Coastguard Worker                     (mBuffer->getBuffer()->getStride() * (region.top + j) + region.left) * 4;
386*38e8c45fSAndroid Build Coastguard Worker             for (int32_t i = 0; i < region.getWidth(); i++) {
387*38e8c45fSAndroid Build Coastguard Worker                 const auto location = Point(region.left + i, region.top + j);
388*38e8c45fSAndroid Build Coastguard Worker                 const ubyte4 colors = generator(location);
389*38e8c45fSAndroid Build Coastguard Worker                 const uint8_t expected[4] = {colors.r, colors.g, colors.b, colors.a};
390*38e8c45fSAndroid Build Coastguard Worker                 bool colorMatches = colorCompare(src, expected);
391*38e8c45fSAndroid Build Coastguard Worker                 EXPECT_TRUE(colorMatches)
392*38e8c45fSAndroid Build Coastguard Worker                         << GetParam()->name().c_str() << ": "
393*38e8c45fSAndroid Build Coastguard Worker                         << "pixel @ (" << location.x << ", " << location.y << "): "
394*38e8c45fSAndroid Build Coastguard Worker                         << "expected (" << static_cast<uint32_t>(colors.r) << ", "
395*38e8c45fSAndroid Build Coastguard Worker                         << static_cast<uint32_t>(colors.g) << ", "
396*38e8c45fSAndroid Build Coastguard Worker                         << static_cast<uint32_t>(colors.b) << ", "
397*38e8c45fSAndroid Build Coastguard Worker                         << static_cast<uint32_t>(colors.a) << "), "
398*38e8c45fSAndroid Build Coastguard Worker                         << "got (" << static_cast<uint32_t>(src[0]) << ", "
399*38e8c45fSAndroid Build Coastguard Worker                         << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
400*38e8c45fSAndroid Build Coastguard Worker                         << ", " << static_cast<uint32_t>(src[3]) << ")";
401*38e8c45fSAndroid Build Coastguard Worker                 src += 4;
402*38e8c45fSAndroid Build Coastguard Worker                 if (!colorMatches && ++fails >= maxFails) {
403*38e8c45fSAndroid Build Coastguard Worker                     break;
404*38e8c45fSAndroid Build Coastguard Worker                 }
405*38e8c45fSAndroid Build Coastguard Worker             }
406*38e8c45fSAndroid Build Coastguard Worker             if (fails >= maxFails) {
407*38e8c45fSAndroid Build Coastguard Worker                 break;
408*38e8c45fSAndroid Build Coastguard Worker             }
409*38e8c45fSAndroid Build Coastguard Worker         }
410*38e8c45fSAndroid Build Coastguard Worker         mBuffer->getBuffer()->unlock();
411*38e8c45fSAndroid Build Coastguard Worker     }
412*38e8c45fSAndroid Build Coastguard Worker 
expectAlpha(const Rect & rect,uint8_t a)413*38e8c45fSAndroid Build Coastguard Worker     void expectAlpha(const Rect& rect, uint8_t a) {
414*38e8c45fSAndroid Build Coastguard Worker         auto generator = [=](Point) { return ubyte4(0, 0, 0, a); };
415*38e8c45fSAndroid Build Coastguard Worker         auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
416*38e8c45fSAndroid Build Coastguard Worker             return colorA[3] == colorB[3];
417*38e8c45fSAndroid Build Coastguard Worker         };
418*38e8c45fSAndroid Build Coastguard Worker         expectBufferColor(rect, generator, colorCompare);
419*38e8c45fSAndroid Build Coastguard Worker     }
420*38e8c45fSAndroid Build Coastguard Worker 
expectShadowColor(const renderengine::LayerSettings & castingLayer,const ShadowSettings & shadow,const ubyte4 & casterColor,const ubyte4 & backgroundColor)421*38e8c45fSAndroid Build Coastguard Worker     void expectShadowColor(const renderengine::LayerSettings& castingLayer,
422*38e8c45fSAndroid Build Coastguard Worker                            const ShadowSettings& shadow, const ubyte4& casterColor,
423*38e8c45fSAndroid Build Coastguard Worker                            const ubyte4& backgroundColor) {
424*38e8c45fSAndroid Build Coastguard Worker         const Rect casterRect(castingLayer.geometry.boundaries);
425*38e8c45fSAndroid Build Coastguard Worker         Region casterRegion = Region(casterRect);
426*38e8c45fSAndroid Build Coastguard Worker         const float casterCornerRadius = (castingLayer.geometry.roundedCornersRadius.x +
427*38e8c45fSAndroid Build Coastguard Worker                                           castingLayer.geometry.roundedCornersRadius.y) /
428*38e8c45fSAndroid Build Coastguard Worker                 2.0;
429*38e8c45fSAndroid Build Coastguard Worker         if (casterCornerRadius > 0.0f) {
430*38e8c45fSAndroid Build Coastguard Worker             // ignore the corners if a corner radius is set
431*38e8c45fSAndroid Build Coastguard Worker             Rect cornerRect(casterCornerRadius, casterCornerRadius);
432*38e8c45fSAndroid Build Coastguard Worker             casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
433*38e8c45fSAndroid Build Coastguard Worker             casterRegion.subtractSelf(
434*38e8c45fSAndroid Build Coastguard Worker                     cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
435*38e8c45fSAndroid Build Coastguard Worker             casterRegion.subtractSelf(
436*38e8c45fSAndroid Build Coastguard Worker                     cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
437*38e8c45fSAndroid Build Coastguard Worker             casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
438*38e8c45fSAndroid Build Coastguard Worker                                                           casterRect.bottom - casterCornerRadius));
439*38e8c45fSAndroid Build Coastguard Worker         }
440*38e8c45fSAndroid Build Coastguard Worker 
441*38e8c45fSAndroid Build Coastguard Worker         const float shadowInset = shadow.length * -1.0f;
442*38e8c45fSAndroid Build Coastguard Worker         const Rect casterWithShadow =
443*38e8c45fSAndroid Build Coastguard Worker                 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
444*38e8c45fSAndroid Build Coastguard Worker         const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
445*38e8c45fSAndroid Build Coastguard Worker         const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
446*38e8c45fSAndroid Build Coastguard Worker 
447*38e8c45fSAndroid Build Coastguard Worker         // verify casting layer
448*38e8c45fSAndroid Build Coastguard Worker         expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
449*38e8c45fSAndroid Build Coastguard Worker 
450*38e8c45fSAndroid Build Coastguard Worker         // verify shadows by testing just the alpha since its difficult to validate the shadow color
451*38e8c45fSAndroid Build Coastguard Worker         size_t c;
452*38e8c45fSAndroid Build Coastguard Worker         Rect const* r = shadowRegion.getArray(&c);
453*38e8c45fSAndroid Build Coastguard Worker         for (size_t i = 0; i < c; i++, r++) {
454*38e8c45fSAndroid Build Coastguard Worker             expectAlpha(*r, 255);
455*38e8c45fSAndroid Build Coastguard Worker         }
456*38e8c45fSAndroid Build Coastguard Worker 
457*38e8c45fSAndroid Build Coastguard Worker         // verify background
458*38e8c45fSAndroid Build Coastguard Worker         expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
459*38e8c45fSAndroid Build Coastguard Worker                           backgroundColor.a);
460*38e8c45fSAndroid Build Coastguard Worker     }
461*38e8c45fSAndroid Build Coastguard Worker 
expectShadowColorWithoutCaster(const FloatRect & casterBounds,const ShadowSettings & shadow,const ubyte4 & backgroundColor)462*38e8c45fSAndroid Build Coastguard Worker     void expectShadowColorWithoutCaster(const FloatRect& casterBounds, const ShadowSettings& shadow,
463*38e8c45fSAndroid Build Coastguard Worker                                         const ubyte4& backgroundColor) {
464*38e8c45fSAndroid Build Coastguard Worker         const float shadowInset = shadow.length * -1.0f;
465*38e8c45fSAndroid Build Coastguard Worker         const Rect casterRect(casterBounds);
466*38e8c45fSAndroid Build Coastguard Worker         const Rect shadowRect =
467*38e8c45fSAndroid Build Coastguard Worker                 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
468*38e8c45fSAndroid Build Coastguard Worker 
469*38e8c45fSAndroid Build Coastguard Worker         const Region backgroundRegion =
470*38e8c45fSAndroid Build Coastguard Worker                 Region(fullscreenRect()).subtractSelf(casterRect).subtractSelf(shadowRect);
471*38e8c45fSAndroid Build Coastguard Worker 
472*38e8c45fSAndroid Build Coastguard Worker         expectAlpha(shadowRect, 255);
473*38e8c45fSAndroid Build Coastguard Worker         // (0, 0, 0) fill on the bounds of the layer should be ignored.
474*38e8c45fSAndroid Build Coastguard Worker         expectBufferColor(casterRect, 255, 255, 255, 255, 254);
475*38e8c45fSAndroid Build Coastguard Worker 
476*38e8c45fSAndroid Build Coastguard Worker         // verify background
477*38e8c45fSAndroid Build Coastguard Worker         expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
478*38e8c45fSAndroid Build Coastguard Worker                           backgroundColor.a);
479*38e8c45fSAndroid Build Coastguard Worker     }
480*38e8c45fSAndroid Build Coastguard Worker 
getShadowSettings(const vec2 & casterPos,float shadowLength,bool casterIsTranslucent)481*38e8c45fSAndroid Build Coastguard Worker     static ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
482*38e8c45fSAndroid Build Coastguard Worker                                             bool casterIsTranslucent) {
483*38e8c45fSAndroid Build Coastguard Worker         ShadowSettings shadow;
484*38e8c45fSAndroid Build Coastguard Worker         shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
485*38e8c45fSAndroid Build Coastguard Worker         shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
486*38e8c45fSAndroid Build Coastguard Worker         shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
487*38e8c45fSAndroid Build Coastguard Worker         shadow.lightRadius = 0.0f;
488*38e8c45fSAndroid Build Coastguard Worker         shadow.length = shadowLength;
489*38e8c45fSAndroid Build Coastguard Worker         shadow.casterIsTranslucent = casterIsTranslucent;
490*38e8c45fSAndroid Build Coastguard Worker         return shadow;
491*38e8c45fSAndroid Build Coastguard Worker     }
492*38e8c45fSAndroid Build Coastguard Worker 
fullscreenRect()493*38e8c45fSAndroid Build Coastguard Worker     static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
494*38e8c45fSAndroid Build Coastguard Worker 
offsetRect()495*38e8c45fSAndroid Build Coastguard Worker     static Rect offsetRect() {
496*38e8c45fSAndroid Build Coastguard Worker         return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
497*38e8c45fSAndroid Build Coastguard Worker                     DEFAULT_DISPLAY_HEIGHT);
498*38e8c45fSAndroid Build Coastguard Worker     }
499*38e8c45fSAndroid Build Coastguard Worker 
offsetRectAtZero()500*38e8c45fSAndroid Build Coastguard Worker     static Rect offsetRectAtZero() {
501*38e8c45fSAndroid Build Coastguard Worker         return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
502*38e8c45fSAndroid Build Coastguard Worker                     DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
503*38e8c45fSAndroid Build Coastguard Worker     }
504*38e8c45fSAndroid Build Coastguard Worker 
invokeDraw(const renderengine::DisplaySettings & settings,const std::vector<renderengine::LayerSettings> & layers)505*38e8c45fSAndroid Build Coastguard Worker     void invokeDraw(const renderengine::DisplaySettings& settings,
506*38e8c45fSAndroid Build Coastguard Worker                     const std::vector<renderengine::LayerSettings>& layers) {
507*38e8c45fSAndroid Build Coastguard Worker         ftl::Future<FenceResult> future =
508*38e8c45fSAndroid Build Coastguard Worker                 mRE->drawLayers(settings, layers, mBuffer, base::unique_fd());
509*38e8c45fSAndroid Build Coastguard Worker         ASSERT_TRUE(future.valid());
510*38e8c45fSAndroid Build Coastguard Worker 
511*38e8c45fSAndroid Build Coastguard Worker         auto result = future.get();
512*38e8c45fSAndroid Build Coastguard Worker         ASSERT_TRUE(result.ok());
513*38e8c45fSAndroid Build Coastguard Worker 
514*38e8c45fSAndroid Build Coastguard Worker         auto fence = result.value();
515*38e8c45fSAndroid Build Coastguard Worker         fence->waitForever(LOG_TAG);
516*38e8c45fSAndroid Build Coastguard Worker     }
517*38e8c45fSAndroid Build Coastguard Worker 
drawEmptyLayers()518*38e8c45fSAndroid Build Coastguard Worker     void drawEmptyLayers() {
519*38e8c45fSAndroid Build Coastguard Worker         renderengine::DisplaySettings settings;
520*38e8c45fSAndroid Build Coastguard Worker         std::vector<renderengine::LayerSettings> layers;
521*38e8c45fSAndroid Build Coastguard Worker         invokeDraw(settings, layers);
522*38e8c45fSAndroid Build Coastguard Worker     }
523*38e8c45fSAndroid Build Coastguard Worker 
524*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
525*38e8c45fSAndroid Build Coastguard Worker     void fillBuffer(half r, half g, half b, half a);
526*38e8c45fSAndroid Build Coastguard Worker 
527*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
528*38e8c45fSAndroid Build Coastguard Worker     void fillRedBuffer();
529*38e8c45fSAndroid Build Coastguard Worker 
530*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
531*38e8c45fSAndroid Build Coastguard Worker     void fillGreenBuffer();
532*38e8c45fSAndroid Build Coastguard Worker 
533*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
534*38e8c45fSAndroid Build Coastguard Worker     void fillBlueBuffer();
535*38e8c45fSAndroid Build Coastguard Worker 
536*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
537*38e8c45fSAndroid Build Coastguard Worker     void fillRedTransparentBuffer();
538*38e8c45fSAndroid Build Coastguard Worker 
539*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
540*38e8c45fSAndroid Build Coastguard Worker     void fillRedOffsetBuffer();
541*38e8c45fSAndroid Build Coastguard Worker 
542*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
543*38e8c45fSAndroid Build Coastguard Worker     void fillBufferPhysicalOffset();
544*38e8c45fSAndroid Build Coastguard Worker 
545*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
546*38e8c45fSAndroid Build Coastguard Worker     void fillBufferCheckers(uint32_t rotation);
547*38e8c45fSAndroid Build Coastguard Worker 
548*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
549*38e8c45fSAndroid Build Coastguard Worker     void fillBufferCheckersRotate0();
550*38e8c45fSAndroid Build Coastguard Worker 
551*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
552*38e8c45fSAndroid Build Coastguard Worker     void fillBufferCheckersRotate90();
553*38e8c45fSAndroid Build Coastguard Worker 
554*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
555*38e8c45fSAndroid Build Coastguard Worker     void fillBufferCheckersRotate180();
556*38e8c45fSAndroid Build Coastguard Worker 
557*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
558*38e8c45fSAndroid Build Coastguard Worker     void fillBufferCheckersRotate270();
559*38e8c45fSAndroid Build Coastguard Worker 
560*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
561*38e8c45fSAndroid Build Coastguard Worker     void fillBufferWithLayerTransform();
562*38e8c45fSAndroid Build Coastguard Worker 
563*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
564*38e8c45fSAndroid Build Coastguard Worker     void fillBufferLayerTransform();
565*38e8c45fSAndroid Build Coastguard Worker 
566*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
567*38e8c45fSAndroid Build Coastguard Worker     void fillBufferWithColorTransform();
568*38e8c45fSAndroid Build Coastguard Worker 
569*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
570*38e8c45fSAndroid Build Coastguard Worker     void fillBufferColorTransform();
571*38e8c45fSAndroid Build Coastguard Worker 
572*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
573*38e8c45fSAndroid Build Coastguard Worker     void fillBufferWithColorTransformAndSourceDataspace(const ui::Dataspace sourceDataspace);
574*38e8c45fSAndroid Build Coastguard Worker 
575*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
576*38e8c45fSAndroid Build Coastguard Worker     void fillBufferColorTransformAndSourceDataspace();
577*38e8c45fSAndroid Build Coastguard Worker 
578*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
579*38e8c45fSAndroid Build Coastguard Worker     void fillBufferWithColorTransformAndOutputDataspace(const ui::Dataspace outputDataspace);
580*38e8c45fSAndroid Build Coastguard Worker 
581*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
582*38e8c45fSAndroid Build Coastguard Worker     void fillBufferColorTransformAndOutputDataspace();
583*38e8c45fSAndroid Build Coastguard Worker 
584*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
585*38e8c45fSAndroid Build Coastguard Worker     void fillBufferWithColorTransformZeroLayerAlpha();
586*38e8c45fSAndroid Build Coastguard Worker 
587*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
588*38e8c45fSAndroid Build Coastguard Worker     void fillBufferColorTransformZeroLayerAlpha();
589*38e8c45fSAndroid Build Coastguard Worker 
590*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
591*38e8c45fSAndroid Build Coastguard Worker     void fillRedBufferWithRoundedCorners();
592*38e8c45fSAndroid Build Coastguard Worker 
593*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
594*38e8c45fSAndroid Build Coastguard Worker     void fillBufferWithRoundedCorners();
595*38e8c45fSAndroid Build Coastguard Worker 
596*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
597*38e8c45fSAndroid Build Coastguard Worker     void fillBufferAndBlurBackground();
598*38e8c45fSAndroid Build Coastguard Worker 
599*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
600*38e8c45fSAndroid Build Coastguard Worker     void fillSmallLayerAndBlurBackground();
601*38e8c45fSAndroid Build Coastguard Worker 
602*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
603*38e8c45fSAndroid Build Coastguard Worker     void overlayCorners();
604*38e8c45fSAndroid Build Coastguard Worker 
605*38e8c45fSAndroid Build Coastguard Worker     void fillRedBufferTextureTransform();
606*38e8c45fSAndroid Build Coastguard Worker 
607*38e8c45fSAndroid Build Coastguard Worker     void fillBufferTextureTransform();
608*38e8c45fSAndroid Build Coastguard Worker 
609*38e8c45fSAndroid Build Coastguard Worker     void fillRedBufferWithPremultiplyAlpha();
610*38e8c45fSAndroid Build Coastguard Worker 
611*38e8c45fSAndroid Build Coastguard Worker     void fillBufferWithPremultiplyAlpha();
612*38e8c45fSAndroid Build Coastguard Worker 
613*38e8c45fSAndroid Build Coastguard Worker     void fillRedBufferWithoutPremultiplyAlpha();
614*38e8c45fSAndroid Build Coastguard Worker 
615*38e8c45fSAndroid Build Coastguard Worker     void fillBufferWithoutPremultiplyAlpha();
616*38e8c45fSAndroid Build Coastguard Worker 
617*38e8c45fSAndroid Build Coastguard Worker     void fillGreenColorBufferThenClearRegion();
618*38e8c45fSAndroid Build Coastguard Worker 
619*38e8c45fSAndroid Build Coastguard Worker     template <typename SourceVariant>
620*38e8c45fSAndroid Build Coastguard Worker     void drawShadow(const renderengine::LayerSettings& castingLayer, const ShadowSettings& shadow,
621*38e8c45fSAndroid Build Coastguard Worker                     const ubyte4& casterColor, const ubyte4& backgroundColor);
622*38e8c45fSAndroid Build Coastguard Worker 
623*38e8c45fSAndroid Build Coastguard Worker     void drawShadowWithoutCaster(const FloatRect& castingBounds, const ShadowSettings& shadow,
624*38e8c45fSAndroid Build Coastguard Worker                                  const ubyte4& backgroundColor);
625*38e8c45fSAndroid Build Coastguard Worker 
626*38e8c45fSAndroid Build Coastguard Worker     // Tonemaps grey values from sourceDataspace -> Display P3 and checks that GPU and CPU
627*38e8c45fSAndroid Build Coastguard Worker     // implementations are identical Also implicitly checks that the injected tonemap shader
628*38e8c45fSAndroid Build Coastguard Worker     // compiles
629*38e8c45fSAndroid Build Coastguard Worker     void tonemap(ui::Dataspace sourceDataspace, std::function<vec3(vec3)> eotf,
630*38e8c45fSAndroid Build Coastguard Worker                  std::function<vec3(vec3, float)> scaleOotf);
631*38e8c45fSAndroid Build Coastguard Worker 
632*38e8c45fSAndroid Build Coastguard Worker     void initializeRenderEngine();
633*38e8c45fSAndroid Build Coastguard Worker 
634*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<renderengine::RenderEngine> mRE;
635*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<renderengine::ExternalTexture> mBuffer;
636*38e8c45fSAndroid Build Coastguard Worker };
637*38e8c45fSAndroid Build Coastguard Worker 
initializeRenderEngine()638*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::initializeRenderEngine() {
639*38e8c45fSAndroid Build Coastguard Worker     const auto& renderEngineFactory = GetParam();
640*38e8c45fSAndroid Build Coastguard Worker     mRE = renderEngineFactory->createRenderEngine();
641*38e8c45fSAndroid Build Coastguard Worker     mBuffer = allocateDefaultBuffer();
642*38e8c45fSAndroid Build Coastguard Worker }
643*38e8c45fSAndroid Build Coastguard Worker 
644*38e8c45fSAndroid Build Coastguard Worker struct ColorSourceVariant {
fillColorandroid::renderengine::ColorSourceVariant645*38e8c45fSAndroid Build Coastguard Worker     static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
646*38e8c45fSAndroid Build Coastguard Worker                           RenderEngineTest* /*fixture*/) {
647*38e8c45fSAndroid Build Coastguard Worker         layer.source.solidColor = half3(r, g, b);
648*38e8c45fSAndroid Build Coastguard Worker         layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
649*38e8c45fSAndroid Build Coastguard Worker     }
650*38e8c45fSAndroid Build Coastguard Worker };
651*38e8c45fSAndroid Build Coastguard Worker 
652*38e8c45fSAndroid Build Coastguard Worker struct RelaxOpaqueBufferVariant {
setOpaqueBitandroid::renderengine::RelaxOpaqueBufferVariant653*38e8c45fSAndroid Build Coastguard Worker     static void setOpaqueBit(renderengine::LayerSettings& layer) {
654*38e8c45fSAndroid Build Coastguard Worker         layer.source.buffer.isOpaque = false;
655*38e8c45fSAndroid Build Coastguard Worker         layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
656*38e8c45fSAndroid Build Coastguard Worker     }
657*38e8c45fSAndroid Build Coastguard Worker 
getAlphaChannelandroid::renderengine::RelaxOpaqueBufferVariant658*38e8c45fSAndroid Build Coastguard Worker     static uint8_t getAlphaChannel() { return 255; }
659*38e8c45fSAndroid Build Coastguard Worker };
660*38e8c45fSAndroid Build Coastguard Worker 
661*38e8c45fSAndroid Build Coastguard Worker struct ForceOpaqueBufferVariant {
setOpaqueBitandroid::renderengine::ForceOpaqueBufferVariant662*38e8c45fSAndroid Build Coastguard Worker     static void setOpaqueBit(renderengine::LayerSettings& layer) {
663*38e8c45fSAndroid Build Coastguard Worker         layer.source.buffer.isOpaque = true;
664*38e8c45fSAndroid Build Coastguard Worker         layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
665*38e8c45fSAndroid Build Coastguard Worker     }
666*38e8c45fSAndroid Build Coastguard Worker 
getAlphaChannelandroid::renderengine::ForceOpaqueBufferVariant667*38e8c45fSAndroid Build Coastguard Worker     static uint8_t getAlphaChannel() {
668*38e8c45fSAndroid Build Coastguard Worker         // The isOpaque bit will override the alpha channel, so this should be
669*38e8c45fSAndroid Build Coastguard Worker         // arbitrary.
670*38e8c45fSAndroid Build Coastguard Worker         return 50;
671*38e8c45fSAndroid Build Coastguard Worker     }
672*38e8c45fSAndroid Build Coastguard Worker };
673*38e8c45fSAndroid Build Coastguard Worker 
674*38e8c45fSAndroid Build Coastguard Worker template <typename OpaquenessVariant>
675*38e8c45fSAndroid Build Coastguard Worker struct BufferSourceVariant {
fillColorandroid::renderengine::BufferSourceVariant676*38e8c45fSAndroid Build Coastguard Worker     static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
677*38e8c45fSAndroid Build Coastguard Worker                           RenderEngineTest* fixture) {
678*38e8c45fSAndroid Build Coastguard Worker         const auto buf = fixture->allocateSourceBuffer(1, 1);
679*38e8c45fSAndroid Build Coastguard Worker 
680*38e8c45fSAndroid Build Coastguard Worker         uint8_t* pixels;
681*38e8c45fSAndroid Build Coastguard Worker         buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
682*38e8c45fSAndroid Build Coastguard Worker                                reinterpret_cast<void**>(&pixels));
683*38e8c45fSAndroid Build Coastguard Worker 
684*38e8c45fSAndroid Build Coastguard Worker         for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
685*38e8c45fSAndroid Build Coastguard Worker             uint8_t* iter = pixels + (buf->getBuffer()->getStride() * j) * 4;
686*38e8c45fSAndroid Build Coastguard Worker             for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
687*38e8c45fSAndroid Build Coastguard Worker                 iter[0] = uint8_t(r * 255);
688*38e8c45fSAndroid Build Coastguard Worker                 iter[1] = uint8_t(g * 255);
689*38e8c45fSAndroid Build Coastguard Worker                 iter[2] = uint8_t(b * 255);
690*38e8c45fSAndroid Build Coastguard Worker                 iter[3] = OpaquenessVariant::getAlphaChannel();
691*38e8c45fSAndroid Build Coastguard Worker                 iter += 4;
692*38e8c45fSAndroid Build Coastguard Worker             }
693*38e8c45fSAndroid Build Coastguard Worker         }
694*38e8c45fSAndroid Build Coastguard Worker 
695*38e8c45fSAndroid Build Coastguard Worker         buf->getBuffer()->unlock();
696*38e8c45fSAndroid Build Coastguard Worker 
697*38e8c45fSAndroid Build Coastguard Worker         layer.source.buffer.buffer = buf;
698*38e8c45fSAndroid Build Coastguard Worker         layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
699*38e8c45fSAndroid Build Coastguard Worker         OpaquenessVariant::setOpaqueBit(layer);
700*38e8c45fSAndroid Build Coastguard Worker     }
701*38e8c45fSAndroid Build Coastguard Worker };
702*38e8c45fSAndroid Build Coastguard Worker 
703*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBuffer(half r,half g,half b,half a)704*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
705*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
706*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
707*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
708*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
709*38e8c45fSAndroid Build Coastguard Worker 
710*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
711*38e8c45fSAndroid Build Coastguard Worker 
712*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
713*38e8c45fSAndroid Build Coastguard Worker     layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
714*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = fullscreenRect().toFloatRect();
715*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layer, r, g, b, this);
716*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = a;
717*38e8c45fSAndroid Build Coastguard Worker 
718*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
719*38e8c45fSAndroid Build Coastguard Worker 
720*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
721*38e8c45fSAndroid Build Coastguard Worker }
722*38e8c45fSAndroid Build Coastguard Worker 
723*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillRedBuffer()724*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillRedBuffer() {
725*38e8c45fSAndroid Build Coastguard Worker     fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
726*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
727*38e8c45fSAndroid Build Coastguard Worker }
728*38e8c45fSAndroid Build Coastguard Worker 
729*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillGreenBuffer()730*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillGreenBuffer() {
731*38e8c45fSAndroid Build Coastguard Worker     fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
732*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
733*38e8c45fSAndroid Build Coastguard Worker }
734*38e8c45fSAndroid Build Coastguard Worker 
735*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBlueBuffer()736*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBlueBuffer() {
737*38e8c45fSAndroid Build Coastguard Worker     fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
738*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
739*38e8c45fSAndroid Build Coastguard Worker }
740*38e8c45fSAndroid Build Coastguard Worker 
741*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillRedTransparentBuffer()742*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillRedTransparentBuffer() {
743*38e8c45fSAndroid Build Coastguard Worker     fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
744*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
745*38e8c45fSAndroid Build Coastguard Worker }
746*38e8c45fSAndroid Build Coastguard Worker 
747*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillRedOffsetBuffer()748*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillRedOffsetBuffer() {
749*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
750*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
751*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = offsetRect();
752*38e8c45fSAndroid Build Coastguard Worker     settings.clip = offsetRectAtZero();
753*38e8c45fSAndroid Build Coastguard Worker 
754*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
755*38e8c45fSAndroid Build Coastguard Worker 
756*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
757*38e8c45fSAndroid Build Coastguard Worker     layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
758*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
759*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
760*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 1.0f;
761*38e8c45fSAndroid Build Coastguard Worker 
762*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
763*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
764*38e8c45fSAndroid Build Coastguard Worker }
765*38e8c45fSAndroid Build Coastguard Worker 
766*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferPhysicalOffset()767*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferPhysicalOffset() {
768*38e8c45fSAndroid Build Coastguard Worker     fillRedOffsetBuffer<SourceVariant>();
769*38e8c45fSAndroid Build Coastguard Worker 
770*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
771*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_HEIGHT),
772*38e8c45fSAndroid Build Coastguard Worker                       255, 0, 0, 255);
773*38e8c45fSAndroid Build Coastguard Worker     Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
774*38e8c45fSAndroid Build Coastguard Worker     Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
775*38e8c45fSAndroid Build Coastguard Worker 
776*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
777*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
778*38e8c45fSAndroid Build Coastguard Worker }
779*38e8c45fSAndroid Build Coastguard Worker 
780*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferCheckers(uint32_t orientationFlag)781*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
782*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
783*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
784*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
785*38e8c45fSAndroid Build Coastguard Worker     // Here logical space is 2x2
786*38e8c45fSAndroid Build Coastguard Worker     settings.clip = Rect(2, 2);
787*38e8c45fSAndroid Build Coastguard Worker     settings.orientation = orientationFlag;
788*38e8c45fSAndroid Build Coastguard Worker 
789*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
790*38e8c45fSAndroid Build Coastguard Worker 
791*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layerOne;
792*38e8c45fSAndroid Build Coastguard Worker     layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
793*38e8c45fSAndroid Build Coastguard Worker     Rect rectOne(0, 0, 1, 1);
794*38e8c45fSAndroid Build Coastguard Worker     layerOne.geometry.boundaries = rectOne.toFloatRect();
795*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
796*38e8c45fSAndroid Build Coastguard Worker     layerOne.alpha = 1.0f;
797*38e8c45fSAndroid Build Coastguard Worker 
798*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layerTwo;
799*38e8c45fSAndroid Build Coastguard Worker     layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
800*38e8c45fSAndroid Build Coastguard Worker     Rect rectTwo(0, 1, 1, 2);
801*38e8c45fSAndroid Build Coastguard Worker     layerTwo.geometry.boundaries = rectTwo.toFloatRect();
802*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
803*38e8c45fSAndroid Build Coastguard Worker     layerTwo.alpha = 1.0f;
804*38e8c45fSAndroid Build Coastguard Worker 
805*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layerThree;
806*38e8c45fSAndroid Build Coastguard Worker     layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
807*38e8c45fSAndroid Build Coastguard Worker     Rect rectThree(1, 0, 2, 1);
808*38e8c45fSAndroid Build Coastguard Worker     layerThree.geometry.boundaries = rectThree.toFloatRect();
809*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
810*38e8c45fSAndroid Build Coastguard Worker     layerThree.alpha = 1.0f;
811*38e8c45fSAndroid Build Coastguard Worker 
812*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layerOne);
813*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layerTwo);
814*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layerThree);
815*38e8c45fSAndroid Build Coastguard Worker 
816*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
817*38e8c45fSAndroid Build Coastguard Worker }
818*38e8c45fSAndroid Build Coastguard Worker 
819*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferCheckersRotate0()820*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferCheckersRotate0() {
821*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
822*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
823*38e8c45fSAndroid Build Coastguard Worker                       255);
824*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
825*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_HEIGHT / 2),
826*38e8c45fSAndroid Build Coastguard Worker                       0, 0, 255, 255);
827*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
828*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
829*38e8c45fSAndroid Build Coastguard Worker                       0, 0, 0, 0);
830*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
831*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_HEIGHT),
832*38e8c45fSAndroid Build Coastguard Worker                       0, 255, 0, 255);
833*38e8c45fSAndroid Build Coastguard Worker }
834*38e8c45fSAndroid Build Coastguard Worker 
835*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferCheckersRotate90()836*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferCheckersRotate90() {
837*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
838*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
839*38e8c45fSAndroid Build Coastguard Worker                       255);
840*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
841*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_HEIGHT / 2),
842*38e8c45fSAndroid Build Coastguard Worker                       255, 0, 0, 255);
843*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
844*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
845*38e8c45fSAndroid Build Coastguard Worker                       0, 0, 255, 255);
846*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
847*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_HEIGHT),
848*38e8c45fSAndroid Build Coastguard Worker                       0, 0, 0, 0);
849*38e8c45fSAndroid Build Coastguard Worker }
850*38e8c45fSAndroid Build Coastguard Worker 
851*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferCheckersRotate180()852*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferCheckersRotate180() {
853*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
854*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
855*38e8c45fSAndroid Build Coastguard Worker                       0);
856*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
857*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_HEIGHT / 2),
858*38e8c45fSAndroid Build Coastguard Worker                       0, 255, 0, 255);
859*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
860*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
861*38e8c45fSAndroid Build Coastguard Worker                       255, 0, 0, 255);
862*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
863*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_HEIGHT),
864*38e8c45fSAndroid Build Coastguard Worker                       0, 0, 255, 255);
865*38e8c45fSAndroid Build Coastguard Worker }
866*38e8c45fSAndroid Build Coastguard Worker 
867*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferCheckersRotate270()868*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferCheckersRotate270() {
869*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
870*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
871*38e8c45fSAndroid Build Coastguard Worker                       255);
872*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
873*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_HEIGHT / 2),
874*38e8c45fSAndroid Build Coastguard Worker                       0, 0, 0, 0);
875*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
876*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
877*38e8c45fSAndroid Build Coastguard Worker                       0, 255, 0, 255);
878*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
879*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_HEIGHT),
880*38e8c45fSAndroid Build Coastguard Worker                       255, 0, 0, 255);
881*38e8c45fSAndroid Build Coastguard Worker }
882*38e8c45fSAndroid Build Coastguard Worker 
883*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferWithLayerTransform()884*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferWithLayerTransform() {
885*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
886*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
887*38e8c45fSAndroid Build Coastguard Worker     // Here logical space is 2x2
888*38e8c45fSAndroid Build Coastguard Worker     settings.clip = Rect(2, 2);
889*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
890*38e8c45fSAndroid Build Coastguard Worker 
891*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
892*38e8c45fSAndroid Build Coastguard Worker 
893*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
894*38e8c45fSAndroid Build Coastguard Worker     layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
895*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = Rect(1, 1).toFloatRect();
896*38e8c45fSAndroid Build Coastguard Worker     // Translate one pixel diagonally
897*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.positionTransform = mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1);
898*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
899*38e8c45fSAndroid Build Coastguard Worker     layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
900*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 1.0f;
901*38e8c45fSAndroid Build Coastguard Worker 
902*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
903*38e8c45fSAndroid Build Coastguard Worker 
904*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
905*38e8c45fSAndroid Build Coastguard Worker }
906*38e8c45fSAndroid Build Coastguard Worker 
907*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferLayerTransform()908*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferLayerTransform() {
909*38e8c45fSAndroid Build Coastguard Worker     fillBufferWithLayerTransform<SourceVariant>();
910*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
911*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
912*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
913*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
914*38e8c45fSAndroid Build Coastguard Worker                       255, 0, 0, 255);
915*38e8c45fSAndroid Build Coastguard Worker }
916*38e8c45fSAndroid Build Coastguard Worker 
917*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferWithColorTransform()918*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferWithColorTransform() {
919*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
920*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
921*38e8c45fSAndroid Build Coastguard Worker     settings.clip = Rect(1, 1);
922*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
923*38e8c45fSAndroid Build Coastguard Worker 
924*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
925*38e8c45fSAndroid Build Coastguard Worker 
926*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
927*38e8c45fSAndroid Build Coastguard Worker     layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
928*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = Rect(1, 1).toFloatRect();
929*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
930*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 1.0f;
931*38e8c45fSAndroid Build Coastguard Worker 
932*38e8c45fSAndroid Build Coastguard Worker     // construct a fake color matrix
933*38e8c45fSAndroid Build Coastguard Worker     // annihilate green and blue channels
934*38e8c45fSAndroid Build Coastguard Worker     settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
935*38e8c45fSAndroid Build Coastguard Worker     // set red channel to red + green
936*38e8c45fSAndroid Build Coastguard Worker     layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
937*38e8c45fSAndroid Build Coastguard Worker 
938*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 1.0f;
939*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = Rect(1, 1).toFloatRect();
940*38e8c45fSAndroid Build Coastguard Worker 
941*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
942*38e8c45fSAndroid Build Coastguard Worker 
943*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
944*38e8c45fSAndroid Build Coastguard Worker }
945*38e8c45fSAndroid Build Coastguard Worker 
946*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferWithColorTransformAndSourceDataspace(const ui::Dataspace sourceDataspace)947*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferWithColorTransformAndSourceDataspace(
948*38e8c45fSAndroid Build Coastguard Worker         const ui::Dataspace sourceDataspace) {
949*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
950*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
951*38e8c45fSAndroid Build Coastguard Worker     settings.clip = Rect(1, 1);
952*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
953*38e8c45fSAndroid Build Coastguard Worker 
954*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
955*38e8c45fSAndroid Build Coastguard Worker 
956*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
957*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = Rect(1, 1).toFloatRect();
958*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
959*38e8c45fSAndroid Build Coastguard Worker     layer.sourceDataspace = sourceDataspace;
960*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 1.0f;
961*38e8c45fSAndroid Build Coastguard Worker 
962*38e8c45fSAndroid Build Coastguard Worker     // construct a fake color matrix
963*38e8c45fSAndroid Build Coastguard Worker     // annihilate green and blue channels
964*38e8c45fSAndroid Build Coastguard Worker     settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
965*38e8c45fSAndroid Build Coastguard Worker     // set red channel to red + green
966*38e8c45fSAndroid Build Coastguard Worker     layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
967*38e8c45fSAndroid Build Coastguard Worker 
968*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 1.0f;
969*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = Rect(1, 1).toFloatRect();
970*38e8c45fSAndroid Build Coastguard Worker 
971*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
972*38e8c45fSAndroid Build Coastguard Worker 
973*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
974*38e8c45fSAndroid Build Coastguard Worker }
975*38e8c45fSAndroid Build Coastguard Worker 
976*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferColorTransform()977*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferColorTransform() {
978*38e8c45fSAndroid Build Coastguard Worker     fillBufferWithColorTransform<SourceVariant>();
979*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
980*38e8c45fSAndroid Build Coastguard Worker }
981*38e8c45fSAndroid Build Coastguard Worker 
982*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferColorTransformAndSourceDataspace()983*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferColorTransformAndSourceDataspace() {
984*38e8c45fSAndroid Build Coastguard Worker     unordered_map<ui::Dataspace, ubyte4> dataspaceToColorMap;
985*38e8c45fSAndroid Build Coastguard Worker     dataspaceToColorMap[ui::Dataspace::V0_BT709] = {77, 0, 0, 255};
986*38e8c45fSAndroid Build Coastguard Worker     dataspaceToColorMap[ui::Dataspace::BT2020] = {101, 0, 0, 255};
987*38e8c45fSAndroid Build Coastguard Worker     dataspaceToColorMap[ui::Dataspace::ADOBE_RGB] = {75, 0, 0, 255};
988*38e8c45fSAndroid Build Coastguard Worker     ui::Dataspace customizedDataspace = static_cast<ui::Dataspace>(
989*38e8c45fSAndroid Build Coastguard Worker             ui::Dataspace::STANDARD_BT709 | ui::Dataspace::TRANSFER_GAMMA2_2 |
990*38e8c45fSAndroid Build Coastguard Worker             ui::Dataspace::RANGE_FULL);
991*38e8c45fSAndroid Build Coastguard Worker     dataspaceToColorMap[customizedDataspace] = {61, 0, 0, 255};
992*38e8c45fSAndroid Build Coastguard Worker     for (const auto& [sourceDataspace, color] : dataspaceToColorMap) {
993*38e8c45fSAndroid Build Coastguard Worker         fillBufferWithColorTransformAndSourceDataspace<SourceVariant>(sourceDataspace);
994*38e8c45fSAndroid Build Coastguard Worker         expectBufferColor(fullscreenRect(), color.r, color.g, color.b, color.a, 1);
995*38e8c45fSAndroid Build Coastguard Worker     }
996*38e8c45fSAndroid Build Coastguard Worker }
997*38e8c45fSAndroid Build Coastguard Worker 
998*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferWithColorTransformAndOutputDataspace(const ui::Dataspace outputDataspace)999*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferWithColorTransformAndOutputDataspace(
1000*38e8c45fSAndroid Build Coastguard Worker         const ui::Dataspace outputDataspace) {
1001*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1002*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
1003*38e8c45fSAndroid Build Coastguard Worker     settings.clip = Rect(1, 1);
1004*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = outputDataspace;
1005*38e8c45fSAndroid Build Coastguard Worker 
1006*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
1007*38e8c45fSAndroid Build Coastguard Worker 
1008*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
1009*38e8c45fSAndroid Build Coastguard Worker     layer.sourceDataspace = ui::Dataspace::V0_SCRGB_LINEAR;
1010*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1011*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
1012*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 1.0f;
1013*38e8c45fSAndroid Build Coastguard Worker 
1014*38e8c45fSAndroid Build Coastguard Worker     // construct a fake color matrix
1015*38e8c45fSAndroid Build Coastguard Worker     // annihilate green and blue channels
1016*38e8c45fSAndroid Build Coastguard Worker     settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
1017*38e8c45fSAndroid Build Coastguard Worker     // set red channel to red + green
1018*38e8c45fSAndroid Build Coastguard Worker     layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1019*38e8c45fSAndroid Build Coastguard Worker 
1020*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 1.0f;
1021*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1022*38e8c45fSAndroid Build Coastguard Worker 
1023*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
1024*38e8c45fSAndroid Build Coastguard Worker 
1025*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
1026*38e8c45fSAndroid Build Coastguard Worker }
1027*38e8c45fSAndroid Build Coastguard Worker 
1028*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferColorTransformAndOutputDataspace()1029*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferColorTransformAndOutputDataspace() {
1030*38e8c45fSAndroid Build Coastguard Worker     unordered_map<ui::Dataspace, ubyte4> dataspaceToColorMap;
1031*38e8c45fSAndroid Build Coastguard Worker     dataspaceToColorMap[ui::Dataspace::V0_BT709] = {198, 0, 0, 255};
1032*38e8c45fSAndroid Build Coastguard Worker     dataspaceToColorMap[ui::Dataspace::BT2020] = {187, 0, 0, 255};
1033*38e8c45fSAndroid Build Coastguard Worker     dataspaceToColorMap[ui::Dataspace::ADOBE_RGB] = {192, 0, 0, 255};
1034*38e8c45fSAndroid Build Coastguard Worker     ui::Dataspace customizedDataspace = static_cast<ui::Dataspace>(
1035*38e8c45fSAndroid Build Coastguard Worker             ui::Dataspace::STANDARD_BT709 | ui::Dataspace::TRANSFER_GAMMA2_6 |
1036*38e8c45fSAndroid Build Coastguard Worker             ui::Dataspace::RANGE_FULL);
1037*38e8c45fSAndroid Build Coastguard Worker     dataspaceToColorMap[customizedDataspace] = {205, 0, 0, 255};
1038*38e8c45fSAndroid Build Coastguard Worker     for (const auto& [outputDataspace, color] : dataspaceToColorMap) {
1039*38e8c45fSAndroid Build Coastguard Worker         fillBufferWithColorTransformAndOutputDataspace<SourceVariant>(outputDataspace);
1040*38e8c45fSAndroid Build Coastguard Worker         expectBufferColor(fullscreenRect(), color.r, color.g, color.b, color.a, 1);
1041*38e8c45fSAndroid Build Coastguard Worker     }
1042*38e8c45fSAndroid Build Coastguard Worker }
1043*38e8c45fSAndroid Build Coastguard Worker 
1044*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferWithColorTransformZeroLayerAlpha()1045*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferWithColorTransformZeroLayerAlpha() {
1046*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1047*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
1048*38e8c45fSAndroid Build Coastguard Worker     settings.clip = Rect(1, 1);
1049*38e8c45fSAndroid Build Coastguard Worker 
1050*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
1051*38e8c45fSAndroid Build Coastguard Worker 
1052*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
1053*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1054*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
1055*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 0;
1056*38e8c45fSAndroid Build Coastguard Worker 
1057*38e8c45fSAndroid Build Coastguard Worker     // construct a fake color matrix
1058*38e8c45fSAndroid Build Coastguard Worker     // simple inverse color
1059*38e8c45fSAndroid Build Coastguard Worker     settings.colorTransform = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 1, 1, 1, 1);
1060*38e8c45fSAndroid Build Coastguard Worker 
1061*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1062*38e8c45fSAndroid Build Coastguard Worker 
1063*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
1064*38e8c45fSAndroid Build Coastguard Worker 
1065*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
1066*38e8c45fSAndroid Build Coastguard Worker }
1067*38e8c45fSAndroid Build Coastguard Worker 
1068*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferColorTransformZeroLayerAlpha()1069*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferColorTransformZeroLayerAlpha() {
1070*38e8c45fSAndroid Build Coastguard Worker     fillBufferWithColorTransformZeroLayerAlpha<SourceVariant>();
1071*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
1072*38e8c45fSAndroid Build Coastguard Worker }
1073*38e8c45fSAndroid Build Coastguard Worker 
1074*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillRedBufferWithRoundedCorners()1075*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillRedBufferWithRoundedCorners() {
1076*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1077*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
1078*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
1079*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1080*38e8c45fSAndroid Build Coastguard Worker 
1081*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
1082*38e8c45fSAndroid Build Coastguard Worker 
1083*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
1084*38e8c45fSAndroid Build Coastguard Worker     layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1085*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = fullscreenRect().toFloatRect();
1086*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.roundedCornersRadius = {5.0f, 5.0f};
1087*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
1088*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1089*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 1.0f;
1090*38e8c45fSAndroid Build Coastguard Worker 
1091*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
1092*38e8c45fSAndroid Build Coastguard Worker 
1093*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
1094*38e8c45fSAndroid Build Coastguard Worker }
1095*38e8c45fSAndroid Build Coastguard Worker 
1096*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferWithRoundedCorners()1097*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferWithRoundedCorners() {
1098*38e8c45fSAndroid Build Coastguard Worker     fillRedBufferWithRoundedCorners<SourceVariant>();
1099*38e8c45fSAndroid Build Coastguard Worker     // Corners should be ignored...
1100*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
1101*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
1102*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
1103*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
1104*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1105*38e8c45fSAndroid Build Coastguard Worker                       0, 0, 0, 0);
1106*38e8c45fSAndroid Build Coastguard Worker     // ...And the non-rounded portion should be red.
1107*38e8c45fSAndroid Build Coastguard Worker     // Other pixels may be anti-aliased, so let's not check those.
1108*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
1109*38e8c45fSAndroid Build Coastguard Worker                       255);
1110*38e8c45fSAndroid Build Coastguard Worker }
1111*38e8c45fSAndroid Build Coastguard Worker 
1112*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillBufferAndBlurBackground()1113*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferAndBlurBackground() {
1114*38e8c45fSAndroid Build Coastguard Worker     auto blurRadius = 50;
1115*38e8c45fSAndroid Build Coastguard Worker     auto center = DEFAULT_DISPLAY_WIDTH / 2;
1116*38e8c45fSAndroid Build Coastguard Worker 
1117*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1118*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1119*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
1120*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
1121*38e8c45fSAndroid Build Coastguard Worker 
1122*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
1123*38e8c45fSAndroid Build Coastguard Worker 
1124*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings backgroundLayer;
1125*38e8c45fSAndroid Build Coastguard Worker     backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1126*38e8c45fSAndroid Build Coastguard Worker     backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1127*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
1128*38e8c45fSAndroid Build Coastguard Worker     backgroundLayer.alpha = 1.0f;
1129*38e8c45fSAndroid Build Coastguard Worker     layers.emplace_back(backgroundLayer);
1130*38e8c45fSAndroid Build Coastguard Worker 
1131*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings leftLayer;
1132*38e8c45fSAndroid Build Coastguard Worker     leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1133*38e8c45fSAndroid Build Coastguard Worker     leftLayer.geometry.boundaries =
1134*38e8c45fSAndroid Build Coastguard Worker             Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
1135*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
1136*38e8c45fSAndroid Build Coastguard Worker     leftLayer.alpha = 1.0f;
1137*38e8c45fSAndroid Build Coastguard Worker     layers.emplace_back(leftLayer);
1138*38e8c45fSAndroid Build Coastguard Worker 
1139*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings blurLayer;
1140*38e8c45fSAndroid Build Coastguard Worker     blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1141*38e8c45fSAndroid Build Coastguard Worker     blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1142*38e8c45fSAndroid Build Coastguard Worker     blurLayer.backgroundBlurRadius = blurRadius;
1143*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
1144*38e8c45fSAndroid Build Coastguard Worker     blurLayer.alpha = 0;
1145*38e8c45fSAndroid Build Coastguard Worker     layers.emplace_back(blurLayer);
1146*38e8c45fSAndroid Build Coastguard Worker 
1147*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
1148*38e8c45fSAndroid Build Coastguard Worker 
1149*38e8c45fSAndroid Build Coastguard Worker     // solid color
1150*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, 1, 1), 255, 0, 0, 255, 0 /* tolerance */);
1151*38e8c45fSAndroid Build Coastguard Worker 
1152*38e8c45fSAndroid Build Coastguard Worker     if (mRE->supportsBackgroundBlur()) {
1153*38e8c45fSAndroid Build Coastguard Worker         // blurred color (downsampling should result in the center color being close to 128)
1154*38e8c45fSAndroid Build Coastguard Worker         expectBufferColor(Rect(center - 1, center - 5, center + 1, center + 5), 128, 128, 0, 255,
1155*38e8c45fSAndroid Build Coastguard Worker                           50 /* tolerance */);
1156*38e8c45fSAndroid Build Coastguard Worker     }
1157*38e8c45fSAndroid Build Coastguard Worker }
1158*38e8c45fSAndroid Build Coastguard Worker 
1159*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
fillSmallLayerAndBlurBackground()1160*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillSmallLayerAndBlurBackground() {
1161*38e8c45fSAndroid Build Coastguard Worker     auto blurRadius = 50;
1162*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1163*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1164*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
1165*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
1166*38e8c45fSAndroid Build Coastguard Worker 
1167*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
1168*38e8c45fSAndroid Build Coastguard Worker 
1169*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings backgroundLayer;
1170*38e8c45fSAndroid Build Coastguard Worker     backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1171*38e8c45fSAndroid Build Coastguard Worker     backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1172*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(backgroundLayer, 1.0f, 0.0f, 0.0f, this);
1173*38e8c45fSAndroid Build Coastguard Worker     backgroundLayer.alpha = 1.0f;
1174*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(backgroundLayer);
1175*38e8c45fSAndroid Build Coastguard Worker 
1176*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings blurLayer;
1177*38e8c45fSAndroid Build Coastguard Worker     blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1178*38e8c45fSAndroid Build Coastguard Worker     blurLayer.geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f);
1179*38e8c45fSAndroid Build Coastguard Worker     blurLayer.backgroundBlurRadius = blurRadius;
1180*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(blurLayer, 0.0f, 0.0f, 1.0f, this);
1181*38e8c45fSAndroid Build Coastguard Worker     blurLayer.alpha = 0;
1182*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(blurLayer);
1183*38e8c45fSAndroid Build Coastguard Worker 
1184*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
1185*38e8c45fSAndroid Build Coastguard Worker 
1186*38e8c45fSAndroid Build Coastguard Worker     // Give a generous tolerance - the blur rectangle is very small and this test is
1187*38e8c45fSAndroid Build Coastguard Worker     // mainly concerned with ensuring that there's no device failure.
1188*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 255, 0, 0, 255,
1189*38e8c45fSAndroid Build Coastguard Worker                       40 /* tolerance */);
1190*38e8c45fSAndroid Build Coastguard Worker }
1191*38e8c45fSAndroid Build Coastguard Worker 
1192*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
overlayCorners()1193*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::overlayCorners() {
1194*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1195*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
1196*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
1197*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1198*38e8c45fSAndroid Build Coastguard Worker 
1199*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layersFirst;
1200*38e8c45fSAndroid Build Coastguard Worker 
1201*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layerOne;
1202*38e8c45fSAndroid Build Coastguard Worker     layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1203*38e8c45fSAndroid Build Coastguard Worker     layerOne.geometry.boundaries =
1204*38e8c45fSAndroid Build Coastguard Worker             FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
1205*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
1206*38e8c45fSAndroid Build Coastguard Worker     layerOne.alpha = 0.2;
1207*38e8c45fSAndroid Build Coastguard Worker 
1208*38e8c45fSAndroid Build Coastguard Worker     layersFirst.push_back(layerOne);
1209*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layersFirst);
1210*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
1211*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1212*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1213*38e8c45fSAndroid Build Coastguard Worker                       0, 0, 0, 0);
1214*38e8c45fSAndroid Build Coastguard Worker 
1215*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layersSecond;
1216*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layerTwo;
1217*38e8c45fSAndroid Build Coastguard Worker     layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1218*38e8c45fSAndroid Build Coastguard Worker     layerTwo.geometry.boundaries =
1219*38e8c45fSAndroid Build Coastguard Worker             FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
1220*38e8c45fSAndroid Build Coastguard Worker                       DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
1221*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
1222*38e8c45fSAndroid Build Coastguard Worker     layerTwo.alpha = 1.0f;
1223*38e8c45fSAndroid Build Coastguard Worker 
1224*38e8c45fSAndroid Build Coastguard Worker     layersSecond.push_back(layerTwo);
1225*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layersSecond);
1226*38e8c45fSAndroid Build Coastguard Worker 
1227*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
1228*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
1229*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
1230*38e8c45fSAndroid Build Coastguard Worker                       0, 255, 0, 255);
1231*38e8c45fSAndroid Build Coastguard Worker }
1232*38e8c45fSAndroid Build Coastguard Worker 
fillRedBufferTextureTransform()1233*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillRedBufferTextureTransform() {
1234*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1235*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
1236*38e8c45fSAndroid Build Coastguard Worker     settings.clip = Rect(1, 1);
1237*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1238*38e8c45fSAndroid Build Coastguard Worker 
1239*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
1240*38e8c45fSAndroid Build Coastguard Worker 
1241*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
1242*38e8c45fSAndroid Build Coastguard Worker     layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1243*38e8c45fSAndroid Build Coastguard Worker     // Here will allocate a checker board texture, but transform texture
1244*38e8c45fSAndroid Build Coastguard Worker     // coordinates so that only the upper left is applied.
1245*38e8c45fSAndroid Build Coastguard Worker     const auto buf = allocateSourceBuffer(2, 2);
1246*38e8c45fSAndroid Build Coastguard Worker 
1247*38e8c45fSAndroid Build Coastguard Worker     uint8_t* pixels;
1248*38e8c45fSAndroid Build Coastguard Worker     buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1249*38e8c45fSAndroid Build Coastguard Worker                            reinterpret_cast<void**>(&pixels));
1250*38e8c45fSAndroid Build Coastguard Worker     // Red top left, Green top right, Blue bottom left, Black bottom right
1251*38e8c45fSAndroid Build Coastguard Worker     pixels[0] = 255;
1252*38e8c45fSAndroid Build Coastguard Worker     pixels[1] = 0;
1253*38e8c45fSAndroid Build Coastguard Worker     pixels[2] = 0;
1254*38e8c45fSAndroid Build Coastguard Worker     pixels[3] = 255;
1255*38e8c45fSAndroid Build Coastguard Worker     pixels[4] = 0;
1256*38e8c45fSAndroid Build Coastguard Worker     pixels[5] = 255;
1257*38e8c45fSAndroid Build Coastguard Worker     pixels[6] = 0;
1258*38e8c45fSAndroid Build Coastguard Worker     pixels[7] = 255;
1259*38e8c45fSAndroid Build Coastguard Worker     pixels[8] = 0;
1260*38e8c45fSAndroid Build Coastguard Worker     pixels[9] = 0;
1261*38e8c45fSAndroid Build Coastguard Worker     pixels[10] = 255;
1262*38e8c45fSAndroid Build Coastguard Worker     pixels[11] = 255;
1263*38e8c45fSAndroid Build Coastguard Worker     buf->getBuffer()->unlock();
1264*38e8c45fSAndroid Build Coastguard Worker 
1265*38e8c45fSAndroid Build Coastguard Worker     layer.source.buffer.buffer = buf;
1266*38e8c45fSAndroid Build Coastguard Worker     // Transform coordinates to only be inside the red quadrant.
1267*38e8c45fSAndroid Build Coastguard Worker     layer.source.buffer.textureTransform = mat4::scale(vec4(0.2f, 0.2f, 1.f, 1.f));
1268*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 1.0f;
1269*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1270*38e8c45fSAndroid Build Coastguard Worker 
1271*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
1272*38e8c45fSAndroid Build Coastguard Worker 
1273*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
1274*38e8c45fSAndroid Build Coastguard Worker }
1275*38e8c45fSAndroid Build Coastguard Worker 
fillBufferTextureTransform()1276*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferTextureTransform() {
1277*38e8c45fSAndroid Build Coastguard Worker     fillRedBufferTextureTransform();
1278*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1279*38e8c45fSAndroid Build Coastguard Worker }
1280*38e8c45fSAndroid Build Coastguard Worker 
fillRedBufferWithPremultiplyAlpha()1281*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
1282*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1283*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
1284*38e8c45fSAndroid Build Coastguard Worker     // Here logical space is 1x1
1285*38e8c45fSAndroid Build Coastguard Worker     settings.clip = Rect(1, 1);
1286*38e8c45fSAndroid Build Coastguard Worker 
1287*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
1288*38e8c45fSAndroid Build Coastguard Worker 
1289*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
1290*38e8c45fSAndroid Build Coastguard Worker     const auto buf = allocateSourceBuffer(1, 1);
1291*38e8c45fSAndroid Build Coastguard Worker 
1292*38e8c45fSAndroid Build Coastguard Worker     uint8_t* pixels;
1293*38e8c45fSAndroid Build Coastguard Worker     buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1294*38e8c45fSAndroid Build Coastguard Worker                            reinterpret_cast<void**>(&pixels));
1295*38e8c45fSAndroid Build Coastguard Worker     pixels[0] = 255;
1296*38e8c45fSAndroid Build Coastguard Worker     pixels[1] = 0;
1297*38e8c45fSAndroid Build Coastguard Worker     pixels[2] = 0;
1298*38e8c45fSAndroid Build Coastguard Worker     pixels[3] = 255;
1299*38e8c45fSAndroid Build Coastguard Worker     buf->getBuffer()->unlock();
1300*38e8c45fSAndroid Build Coastguard Worker 
1301*38e8c45fSAndroid Build Coastguard Worker     layer.source.buffer.buffer = buf;
1302*38e8c45fSAndroid Build Coastguard Worker     layer.source.buffer.usePremultipliedAlpha = true;
1303*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 0.5f;
1304*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1305*38e8c45fSAndroid Build Coastguard Worker 
1306*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
1307*38e8c45fSAndroid Build Coastguard Worker 
1308*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
1309*38e8c45fSAndroid Build Coastguard Worker }
1310*38e8c45fSAndroid Build Coastguard Worker 
fillBufferWithPremultiplyAlpha()1311*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
1312*38e8c45fSAndroid Build Coastguard Worker     fillRedBufferWithPremultiplyAlpha();
1313*38e8c45fSAndroid Build Coastguard Worker     // Different backends and GPUs may round 255 * 0.5 = 127.5 differently, but
1314*38e8c45fSAndroid Build Coastguard Worker     // either 127 or 128 are acceptable. Checking both 127 and 128 with a
1315*38e8c45fSAndroid Build Coastguard Worker     // tolerance of 1 allows either 127 or 128 to pass, while preventing 126 or
1316*38e8c45fSAndroid Build Coastguard Worker     // 129 from erroneously passing.
1317*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(fullscreenRect(), 127, 0, 0, 127, 1);
1318*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
1319*38e8c45fSAndroid Build Coastguard Worker }
1320*38e8c45fSAndroid Build Coastguard Worker 
fillRedBufferWithoutPremultiplyAlpha()1321*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
1322*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1323*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
1324*38e8c45fSAndroid Build Coastguard Worker     // Here logical space is 1x1
1325*38e8c45fSAndroid Build Coastguard Worker     settings.clip = Rect(1, 1);
1326*38e8c45fSAndroid Build Coastguard Worker 
1327*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
1328*38e8c45fSAndroid Build Coastguard Worker 
1329*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
1330*38e8c45fSAndroid Build Coastguard Worker     const auto buf = allocateSourceBuffer(1, 1);
1331*38e8c45fSAndroid Build Coastguard Worker 
1332*38e8c45fSAndroid Build Coastguard Worker     uint8_t* pixels;
1333*38e8c45fSAndroid Build Coastguard Worker     buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1334*38e8c45fSAndroid Build Coastguard Worker                            reinterpret_cast<void**>(&pixels));
1335*38e8c45fSAndroid Build Coastguard Worker     pixels[0] = 255;
1336*38e8c45fSAndroid Build Coastguard Worker     pixels[1] = 0;
1337*38e8c45fSAndroid Build Coastguard Worker     pixels[2] = 0;
1338*38e8c45fSAndroid Build Coastguard Worker     pixels[3] = 255;
1339*38e8c45fSAndroid Build Coastguard Worker     buf->getBuffer()->unlock();
1340*38e8c45fSAndroid Build Coastguard Worker 
1341*38e8c45fSAndroid Build Coastguard Worker     layer.source.buffer.buffer = buf;
1342*38e8c45fSAndroid Build Coastguard Worker     layer.source.buffer.usePremultipliedAlpha = false;
1343*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 0.5f;
1344*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = Rect(1, 1).toFloatRect();
1345*38e8c45fSAndroid Build Coastguard Worker 
1346*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
1347*38e8c45fSAndroid Build Coastguard Worker 
1348*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
1349*38e8c45fSAndroid Build Coastguard Worker }
1350*38e8c45fSAndroid Build Coastguard Worker 
fillBufferWithoutPremultiplyAlpha()1351*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
1352*38e8c45fSAndroid Build Coastguard Worker     fillRedBufferWithoutPremultiplyAlpha();
1353*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
1354*38e8c45fSAndroid Build Coastguard Worker }
1355*38e8c45fSAndroid Build Coastguard Worker 
1356*38e8c45fSAndroid Build Coastguard Worker template <typename SourceVariant>
drawShadow(const renderengine::LayerSettings & castingLayer,const ShadowSettings & shadow,const ubyte4 & casterColor,const ubyte4 & backgroundColor)1357*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1358*38e8c45fSAndroid Build Coastguard Worker                                   const ShadowSettings& shadow, const ubyte4& casterColor,
1359*38e8c45fSAndroid Build Coastguard Worker                                   const ubyte4& backgroundColor) {
1360*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1361*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1362*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
1363*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
1364*38e8c45fSAndroid Build Coastguard Worker 
1365*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
1366*38e8c45fSAndroid Build Coastguard Worker 
1367*38e8c45fSAndroid Build Coastguard Worker     // add background layer
1368*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings bgLayer;
1369*38e8c45fSAndroid Build Coastguard Worker     bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1370*38e8c45fSAndroid Build Coastguard Worker     bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1371*38e8c45fSAndroid Build Coastguard Worker     ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1372*38e8c45fSAndroid Build Coastguard Worker                                   backgroundColor.b / 255.0f, this);
1373*38e8c45fSAndroid Build Coastguard Worker     bgLayer.alpha = backgroundColor.a / 255.0f;
1374*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(bgLayer);
1375*38e8c45fSAndroid Build Coastguard Worker 
1376*38e8c45fSAndroid Build Coastguard Worker     // add shadow layer
1377*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings shadowLayer;
1378*38e8c45fSAndroid Build Coastguard Worker     shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1379*38e8c45fSAndroid Build Coastguard Worker     shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1380*38e8c45fSAndroid Build Coastguard Worker     shadowLayer.alpha = castingLayer.alpha;
1381*38e8c45fSAndroid Build Coastguard Worker     shadowLayer.shadow = shadow;
1382*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(shadowLayer);
1383*38e8c45fSAndroid Build Coastguard Worker 
1384*38e8c45fSAndroid Build Coastguard Worker     // add layer casting the shadow
1385*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer = castingLayer;
1386*38e8c45fSAndroid Build Coastguard Worker     layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1387*38e8c45fSAndroid Build Coastguard Worker     SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1388*38e8c45fSAndroid Build Coastguard Worker                              casterColor.b / 255.0f, this);
1389*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
1390*38e8c45fSAndroid Build Coastguard Worker 
1391*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
1392*38e8c45fSAndroid Build Coastguard Worker }
1393*38e8c45fSAndroid Build Coastguard Worker 
drawShadowWithoutCaster(const FloatRect & castingBounds,const ShadowSettings & shadow,const ubyte4 & backgroundColor)1394*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::drawShadowWithoutCaster(const FloatRect& castingBounds,
1395*38e8c45fSAndroid Build Coastguard Worker                                                const ShadowSettings& shadow,
1396*38e8c45fSAndroid Build Coastguard Worker                                                const ubyte4& backgroundColor) {
1397*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1398*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1399*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
1400*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
1401*38e8c45fSAndroid Build Coastguard Worker 
1402*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
1403*38e8c45fSAndroid Build Coastguard Worker 
1404*38e8c45fSAndroid Build Coastguard Worker     // add background layer
1405*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings bgLayer;
1406*38e8c45fSAndroid Build Coastguard Worker     bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1407*38e8c45fSAndroid Build Coastguard Worker     bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1408*38e8c45fSAndroid Build Coastguard Worker     ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1409*38e8c45fSAndroid Build Coastguard Worker                                   backgroundColor.b / 255.0f, this);
1410*38e8c45fSAndroid Build Coastguard Worker     bgLayer.alpha = backgroundColor.a / 255.0f;
1411*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(bgLayer);
1412*38e8c45fSAndroid Build Coastguard Worker 
1413*38e8c45fSAndroid Build Coastguard Worker     // add shadow layer
1414*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings shadowLayer;
1415*38e8c45fSAndroid Build Coastguard Worker     shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1416*38e8c45fSAndroid Build Coastguard Worker     shadowLayer.geometry.boundaries = castingBounds;
1417*38e8c45fSAndroid Build Coastguard Worker     shadowLayer.skipContentDraw = true;
1418*38e8c45fSAndroid Build Coastguard Worker     shadowLayer.alpha = 1.0f;
1419*38e8c45fSAndroid Build Coastguard Worker     ColorSourceVariant::fillColor(shadowLayer, 0, 0, 0, this);
1420*38e8c45fSAndroid Build Coastguard Worker     shadowLayer.shadow = shadow;
1421*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(shadowLayer);
1422*38e8c45fSAndroid Build Coastguard Worker 
1423*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
1424*38e8c45fSAndroid Build Coastguard Worker }
1425*38e8c45fSAndroid Build Coastguard Worker 
tonemap(ui::Dataspace sourceDataspace,std::function<vec3 (vec3)> eotf,std::function<vec3 (vec3,float)> scaleOotf)1426*38e8c45fSAndroid Build Coastguard Worker void RenderEngineTest::tonemap(ui::Dataspace sourceDataspace, std::function<vec3(vec3)> eotf,
1427*38e8c45fSAndroid Build Coastguard Worker                                std::function<vec3(vec3, float)> scaleOotf) {
1428*38e8c45fSAndroid Build Coastguard Worker     constexpr int32_t kGreyLevels = 256;
1429*38e8c45fSAndroid Build Coastguard Worker 
1430*38e8c45fSAndroid Build Coastguard Worker     const auto rect = Rect(0, 0, kGreyLevels, 1);
1431*38e8c45fSAndroid Build Coastguard Worker 
1432*38e8c45fSAndroid Build Coastguard Worker     constexpr float kMaxLuminance = 750.f;
1433*38e8c45fSAndroid Build Coastguard Worker     constexpr float kCurrentLuminanceNits = 500.f;
1434*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
1435*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = rect,
1436*38e8c45fSAndroid Build Coastguard Worker             .clip = rect,
1437*38e8c45fSAndroid Build Coastguard Worker             .maxLuminance = kMaxLuminance,
1438*38e8c45fSAndroid Build Coastguard Worker             .currentLuminanceNits = kCurrentLuminanceNits,
1439*38e8c45fSAndroid Build Coastguard Worker             .outputDataspace = ui::Dataspace::DISPLAY_P3,
1440*38e8c45fSAndroid Build Coastguard Worker     };
1441*38e8c45fSAndroid Build Coastguard Worker 
1442*38e8c45fSAndroid Build Coastguard Worker     auto buf = std::make_shared<
1443*38e8c45fSAndroid Build Coastguard Worker             renderengine::impl::
1444*38e8c45fSAndroid Build Coastguard Worker                     ExternalTexture>(sp<GraphicBuffer>::make(kGreyLevels, 1,
1445*38e8c45fSAndroid Build Coastguard Worker                                                              HAL_PIXEL_FORMAT_RGBA_8888, 1,
1446*38e8c45fSAndroid Build Coastguard Worker                                                              GRALLOC_USAGE_SW_READ_OFTEN |
1447*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_SW_WRITE_OFTEN |
1448*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_HW_RENDER |
1449*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_HW_TEXTURE,
1450*38e8c45fSAndroid Build Coastguard Worker                                                              "input"),
1451*38e8c45fSAndroid Build Coastguard Worker                                      *mRE,
1452*38e8c45fSAndroid Build Coastguard Worker                                      renderengine::impl::ExternalTexture::Usage::READABLE |
1453*38e8c45fSAndroid Build Coastguard Worker                                              renderengine::impl::ExternalTexture::Usage::WRITEABLE);
1454*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(0, buf->getBuffer()->initCheck());
1455*38e8c45fSAndroid Build Coastguard Worker     {
1456*38e8c45fSAndroid Build Coastguard Worker         uint8_t* pixels;
1457*38e8c45fSAndroid Build Coastguard Worker         buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
1458*38e8c45fSAndroid Build Coastguard Worker                                reinterpret_cast<void**>(&pixels));
1459*38e8c45fSAndroid Build Coastguard Worker 
1460*38e8c45fSAndroid Build Coastguard Worker         uint8_t color = 0;
1461*38e8c45fSAndroid Build Coastguard Worker         for (int32_t j = 0; j < buf->getBuffer()->getHeight(); j++) {
1462*38e8c45fSAndroid Build Coastguard Worker             uint8_t* dest = pixels + (buf->getBuffer()->getStride() * j * 4);
1463*38e8c45fSAndroid Build Coastguard Worker             for (int32_t i = 0; i < buf->getBuffer()->getWidth(); i++) {
1464*38e8c45fSAndroid Build Coastguard Worker                 dest[0] = color;
1465*38e8c45fSAndroid Build Coastguard Worker                 dest[1] = color;
1466*38e8c45fSAndroid Build Coastguard Worker                 dest[2] = color;
1467*38e8c45fSAndroid Build Coastguard Worker                 dest[3] = 255;
1468*38e8c45fSAndroid Build Coastguard Worker                 color++;
1469*38e8c45fSAndroid Build Coastguard Worker                 dest += 4;
1470*38e8c45fSAndroid Build Coastguard Worker             }
1471*38e8c45fSAndroid Build Coastguard Worker         }
1472*38e8c45fSAndroid Build Coastguard Worker         buf->getBuffer()->unlock();
1473*38e8c45fSAndroid Build Coastguard Worker     }
1474*38e8c45fSAndroid Build Coastguard Worker 
1475*38e8c45fSAndroid Build Coastguard Worker     mBuffer = std::make_shared<
1476*38e8c45fSAndroid Build Coastguard Worker             renderengine::impl::
1477*38e8c45fSAndroid Build Coastguard Worker                     ExternalTexture>(sp<GraphicBuffer>::make(kGreyLevels, 1,
1478*38e8c45fSAndroid Build Coastguard Worker                                                              HAL_PIXEL_FORMAT_RGBA_8888, 1,
1479*38e8c45fSAndroid Build Coastguard Worker                                                              GRALLOC_USAGE_SW_READ_OFTEN |
1480*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_SW_WRITE_OFTEN |
1481*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_HW_RENDER |
1482*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_HW_TEXTURE,
1483*38e8c45fSAndroid Build Coastguard Worker                                                              "output"),
1484*38e8c45fSAndroid Build Coastguard Worker                                      *mRE,
1485*38e8c45fSAndroid Build Coastguard Worker                                      renderengine::impl::ExternalTexture::Usage::READABLE |
1486*38e8c45fSAndroid Build Coastguard Worker                                              renderengine::impl::ExternalTexture::Usage::WRITEABLE);
1487*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(0, mBuffer->getBuffer()->initCheck());
1488*38e8c45fSAndroid Build Coastguard Worker 
1489*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings layer{.geometry.boundaries = rect.toFloatRect(),
1490*38e8c45fSAndroid Build Coastguard Worker                                             .source =
1491*38e8c45fSAndroid Build Coastguard Worker                                                     renderengine::PixelSource{
1492*38e8c45fSAndroid Build Coastguard Worker                                                             .buffer =
1493*38e8c45fSAndroid Build Coastguard Worker                                                                     renderengine::Buffer{
1494*38e8c45fSAndroid Build Coastguard Worker                                                                             .buffer =
1495*38e8c45fSAndroid Build Coastguard Worker                                                                                     std::move(buf),
1496*38e8c45fSAndroid Build Coastguard Worker                                                                             .usePremultipliedAlpha =
1497*38e8c45fSAndroid Build Coastguard Worker                                                                                     true,
1498*38e8c45fSAndroid Build Coastguard Worker                                                                     },
1499*38e8c45fSAndroid Build Coastguard Worker                                                     },
1500*38e8c45fSAndroid Build Coastguard Worker                                             .alpha = 1.0f,
1501*38e8c45fSAndroid Build Coastguard Worker                                             .sourceDataspace = sourceDataspace};
1502*38e8c45fSAndroid Build Coastguard Worker 
1503*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{layer};
1504*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
1505*38e8c45fSAndroid Build Coastguard Worker 
1506*38e8c45fSAndroid Build Coastguard Worker     ColorSpace displayP3 = ColorSpace::DisplayP3();
1507*38e8c45fSAndroid Build Coastguard Worker     ColorSpace bt2020 = ColorSpace::BT2020();
1508*38e8c45fSAndroid Build Coastguard Worker 
1509*38e8c45fSAndroid Build Coastguard Worker     tonemap::Metadata metadata{.displayMaxLuminance = 750.0f};
1510*38e8c45fSAndroid Build Coastguard Worker 
1511*38e8c45fSAndroid Build Coastguard Worker     auto generator = [=](Point location) {
1512*38e8c45fSAndroid Build Coastguard Worker         const double normColor = static_cast<double>(location.x) / (kGreyLevels - 1);
1513*38e8c45fSAndroid Build Coastguard Worker         const vec3 rgb = vec3(normColor, normColor, normColor);
1514*38e8c45fSAndroid Build Coastguard Worker 
1515*38e8c45fSAndroid Build Coastguard Worker         const vec3 linearRGB = eotf(rgb);
1516*38e8c45fSAndroid Build Coastguard Worker 
1517*38e8c45fSAndroid Build Coastguard Worker         const vec3 xyz = bt2020.getRGBtoXYZ() * linearRGB;
1518*38e8c45fSAndroid Build Coastguard Worker 
1519*38e8c45fSAndroid Build Coastguard Worker         const vec3 scaledXYZ = scaleOotf(xyz, kCurrentLuminanceNits);
1520*38e8c45fSAndroid Build Coastguard Worker         const auto gains =
1521*38e8c45fSAndroid Build Coastguard Worker                 tonemap::getToneMapper()
1522*38e8c45fSAndroid Build Coastguard Worker                         ->lookupTonemapGain(static_cast<aidl::android::hardware::graphics::common::
1523*38e8c45fSAndroid Build Coastguard Worker                                                                 Dataspace>(sourceDataspace),
1524*38e8c45fSAndroid Build Coastguard Worker                                             static_cast<aidl::android::hardware::graphics::common::
1525*38e8c45fSAndroid Build Coastguard Worker                                                                 Dataspace>(
1526*38e8c45fSAndroid Build Coastguard Worker                                                     ui::Dataspace::DISPLAY_P3),
1527*38e8c45fSAndroid Build Coastguard Worker                                             {tonemap::
1528*38e8c45fSAndroid Build Coastguard Worker                                                      Color{.linearRGB =
1529*38e8c45fSAndroid Build Coastguard Worker                                                                    scaleOotf(linearRGB,
1530*38e8c45fSAndroid Build Coastguard Worker                                                                              kCurrentLuminanceNits),
1531*38e8c45fSAndroid Build Coastguard Worker                                                            .xyz = scaledXYZ}},
1532*38e8c45fSAndroid Build Coastguard Worker                                             metadata);
1533*38e8c45fSAndroid Build Coastguard Worker         EXPECT_EQ(1, gains.size());
1534*38e8c45fSAndroid Build Coastguard Worker         const double gain = gains.front();
1535*38e8c45fSAndroid Build Coastguard Worker         const vec3 normalizedXYZ = scaledXYZ * gain / metadata.displayMaxLuminance;
1536*38e8c45fSAndroid Build Coastguard Worker 
1537*38e8c45fSAndroid Build Coastguard Worker         const vec3 targetRGB = OETF_sRGB(displayP3.getXYZtoRGB() * normalizedXYZ) * 255;
1538*38e8c45fSAndroid Build Coastguard Worker         return ubyte4(static_cast<uint8_t>(targetRGB.r), static_cast<uint8_t>(targetRGB.g),
1539*38e8c45fSAndroid Build Coastguard Worker                       static_cast<uint8_t>(targetRGB.b), 255);
1540*38e8c45fSAndroid Build Coastguard Worker     };
1541*38e8c45fSAndroid Build Coastguard Worker 
1542*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(kGreyLevels, 1), generator, 2);
1543*38e8c45fSAndroid Build Coastguard Worker }
1544*38e8c45fSAndroid Build Coastguard Worker 
1545*38e8c45fSAndroid Build Coastguard Worker // TODO: b/341728634 - Clean up conditional compilation.
1546*38e8c45fSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
1547*38e8c45fSAndroid Build Coastguard Worker                          testing::Values(std::make_shared<SkiaGLESRenderEngineFactory>(),
1548*38e8c45fSAndroid Build Coastguard Worker                                          std::make_shared<GaneshVkRenderEngineFactory>()
1549*38e8c45fSAndroid Build Coastguard Worker #if COMPILE_GRAPHITE_RENDERENGINE
1550*38e8c45fSAndroid Build Coastguard Worker                                                  ,
1551*38e8c45fSAndroid Build Coastguard Worker                                          std::make_shared<GraphiteVkRenderEngineFactory>()
1552*38e8c45fSAndroid Build Coastguard Worker #endif
1553*38e8c45fSAndroid Build Coastguard Worker                                                  ));
1554*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_noLayersToDraw)1555*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
1556*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1557*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1558*38e8c45fSAndroid Build Coastguard Worker     }
1559*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1560*38e8c45fSAndroid Build Coastguard Worker     drawEmptyLayers();
1561*38e8c45fSAndroid Build Coastguard Worker }
1562*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillRedBufferAndEmptyBuffer)1563*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillRedBufferAndEmptyBuffer) {
1564*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1565*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1566*38e8c45fSAndroid Build Coastguard Worker     }
1567*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1568*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1569*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
1570*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
1571*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1572*38e8c45fSAndroid Build Coastguard Worker 
1573*38e8c45fSAndroid Build Coastguard Worker     // add a red layer
1574*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layerOne{
1575*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = fullscreenRect().toFloatRect(),
1576*38e8c45fSAndroid Build Coastguard Worker             .source.solidColor = half3(1.0f, 0.0f, 0.0f),
1577*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.f,
1578*38e8c45fSAndroid Build Coastguard Worker     };
1579*38e8c45fSAndroid Build Coastguard Worker 
1580*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layersFirst{layerOne};
1581*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layersFirst);
1582*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1583*38e8c45fSAndroid Build Coastguard Worker 
1584*38e8c45fSAndroid Build Coastguard Worker     // re-draw with an empty layer above it, and we get a transparent black one
1585*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layersSecond;
1586*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layersSecond);
1587*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(fullscreenRect(), 0, 0, 0, 0);
1588*38e8c45fSAndroid Build Coastguard Worker }
1589*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_withoutBuffers_withColorTransform)1590*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_withoutBuffers_withColorTransform) {
1591*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1592*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1593*38e8c45fSAndroid Build Coastguard Worker     }
1594*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1595*38e8c45fSAndroid Build Coastguard Worker 
1596*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1597*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1598*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
1599*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
1600*38e8c45fSAndroid Build Coastguard Worker 
1601*38e8c45fSAndroid Build Coastguard Worker     // 255, 255, 255, 255 is full opaque white.
1602*38e8c45fSAndroid Build Coastguard Worker     const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
1603*38e8c45fSAndroid Build Coastguard Worker                                  static_cast<uint8_t>(255), static_cast<uint8_t>(255));
1604*38e8c45fSAndroid Build Coastguard Worker     // Create layer with given color.
1605*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings bgLayer;
1606*38e8c45fSAndroid Build Coastguard Worker     bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1607*38e8c45fSAndroid Build Coastguard Worker     bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1608*38e8c45fSAndroid Build Coastguard Worker     bgLayer.source.solidColor = half3(backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1609*38e8c45fSAndroid Build Coastguard Worker                                       backgroundColor.b / 255.0f);
1610*38e8c45fSAndroid Build Coastguard Worker     bgLayer.alpha = backgroundColor.a / 255.0f;
1611*38e8c45fSAndroid Build Coastguard Worker     // Transform the red color.
1612*38e8c45fSAndroid Build Coastguard Worker     bgLayer.colorTransform = mat4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
1613*38e8c45fSAndroid Build Coastguard Worker 
1614*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
1615*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(bgLayer);
1616*38e8c45fSAndroid Build Coastguard Worker 
1617*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
1618*38e8c45fSAndroid Build Coastguard Worker 
1619*38e8c45fSAndroid Build Coastguard Worker     // Expect to see full opaque pixel (with inverted red from the transform).
1620*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, 10, 10), 0.f, backgroundColor.g, backgroundColor.b,
1621*38e8c45fSAndroid Build Coastguard Worker                       backgroundColor.a);
1622*38e8c45fSAndroid Build Coastguard Worker }
1623*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_nullOutputBuffer)1624*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
1625*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1626*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1627*38e8c45fSAndroid Build Coastguard Worker     }
1628*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1629*38e8c45fSAndroid Build Coastguard Worker 
1630*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
1631*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1632*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
1633*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
1634*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = fullscreenRect().toFloatRect();
1635*38e8c45fSAndroid Build Coastguard Worker     BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1636*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
1637*38e8c45fSAndroid Build Coastguard Worker     ftl::Future<FenceResult> future = mRE->drawLayers(settings, layers, nullptr, base::unique_fd());
1638*38e8c45fSAndroid Build Coastguard Worker 
1639*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(future.valid());
1640*38e8c45fSAndroid Build Coastguard Worker     auto result = future.get();
1641*38e8c45fSAndroid Build Coastguard Worker     ASSERT_FALSE(result.ok());
1642*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(BAD_VALUE, result.error());
1643*38e8c45fSAndroid Build Coastguard Worker }
1644*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillRedBuffer_colorSource)1645*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
1646*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1647*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1648*38e8c45fSAndroid Build Coastguard Worker     }
1649*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1650*38e8c45fSAndroid Build Coastguard Worker     fillRedBuffer<ColorSourceVariant>();
1651*38e8c45fSAndroid Build Coastguard Worker }
1652*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillGreenBuffer_colorSource)1653*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
1654*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1655*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1656*38e8c45fSAndroid Build Coastguard Worker     }
1657*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1658*38e8c45fSAndroid Build Coastguard Worker     fillGreenBuffer<ColorSourceVariant>();
1659*38e8c45fSAndroid Build Coastguard Worker }
1660*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBlueBuffer_colorSource)1661*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
1662*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1663*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1664*38e8c45fSAndroid Build Coastguard Worker     }
1665*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1666*38e8c45fSAndroid Build Coastguard Worker     fillBlueBuffer<ColorSourceVariant>();
1667*38e8c45fSAndroid Build Coastguard Worker }
1668*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillRedTransparentBuffer_colorSource)1669*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
1670*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1671*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1672*38e8c45fSAndroid Build Coastguard Worker     }
1673*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1674*38e8c45fSAndroid Build Coastguard Worker     fillRedTransparentBuffer<ColorSourceVariant>();
1675*38e8c45fSAndroid Build Coastguard Worker }
1676*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferPhysicalOffset_colorSource)1677*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
1678*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1679*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1680*38e8c45fSAndroid Build Coastguard Worker     }
1681*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1682*38e8c45fSAndroid Build Coastguard Worker     fillBufferPhysicalOffset<ColorSourceVariant>();
1683*38e8c45fSAndroid Build Coastguard Worker }
1684*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferCheckersRotate0_colorSource)1685*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
1686*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1687*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1688*38e8c45fSAndroid Build Coastguard Worker     }
1689*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1690*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckersRotate0<ColorSourceVariant>();
1691*38e8c45fSAndroid Build Coastguard Worker }
1692*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferCheckersRotate90_colorSource)1693*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
1694*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1695*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1696*38e8c45fSAndroid Build Coastguard Worker     }
1697*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1698*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckersRotate90<ColorSourceVariant>();
1699*38e8c45fSAndroid Build Coastguard Worker }
1700*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferCheckersRotate180_colorSource)1701*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
1702*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1703*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1704*38e8c45fSAndroid Build Coastguard Worker     }
1705*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1706*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckersRotate180<ColorSourceVariant>();
1707*38e8c45fSAndroid Build Coastguard Worker }
1708*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferCheckersRotate270_colorSource)1709*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
1710*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1711*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1712*38e8c45fSAndroid Build Coastguard Worker     }
1713*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1714*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckersRotate270<ColorSourceVariant>();
1715*38e8c45fSAndroid Build Coastguard Worker }
1716*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferLayerTransform_colorSource)1717*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
1718*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1719*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1720*38e8c45fSAndroid Build Coastguard Worker     }
1721*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1722*38e8c45fSAndroid Build Coastguard Worker     fillBufferLayerTransform<ColorSourceVariant>();
1723*38e8c45fSAndroid Build Coastguard Worker }
1724*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferColorTransform_colorSource)1725*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
1726*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1727*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1728*38e8c45fSAndroid Build Coastguard Worker     }
1729*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1730*38e8c45fSAndroid Build Coastguard Worker     fillBufferColorTransform<ColorSourceVariant>();
1731*38e8c45fSAndroid Build Coastguard Worker }
1732*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferColorTransform_sourceDataspace)1733*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_sourceDataspace) {
1734*38e8c45fSAndroid Build Coastguard Worker     const auto& renderEngineFactory = GetParam();
1735*38e8c45fSAndroid Build Coastguard Worker     // skip for non color management
1736*38e8c45fSAndroid Build Coastguard Worker     if (!renderEngineFactory->apiSupported()) {
1737*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1738*38e8c45fSAndroid Build Coastguard Worker     }
1739*38e8c45fSAndroid Build Coastguard Worker 
1740*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1741*38e8c45fSAndroid Build Coastguard Worker     fillBufferColorTransformAndSourceDataspace<ColorSourceVariant>();
1742*38e8c45fSAndroid Build Coastguard Worker }
1743*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferColorTransform_outputDataspace)1744*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_outputDataspace) {
1745*38e8c45fSAndroid Build Coastguard Worker     const auto& renderEngineFactory = GetParam();
1746*38e8c45fSAndroid Build Coastguard Worker     // skip for non color management
1747*38e8c45fSAndroid Build Coastguard Worker     if (!renderEngineFactory->apiSupported()) {
1748*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1749*38e8c45fSAndroid Build Coastguard Worker     }
1750*38e8c45fSAndroid Build Coastguard Worker 
1751*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1752*38e8c45fSAndroid Build Coastguard Worker     fillBufferColorTransformAndOutputDataspace<ColorSourceVariant>();
1753*38e8c45fSAndroid Build Coastguard Worker }
1754*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferRoundedCorners_colorSource)1755*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
1756*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1757*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1758*38e8c45fSAndroid Build Coastguard Worker     }
1759*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1760*38e8c45fSAndroid Build Coastguard Worker     fillBufferWithRoundedCorners<ColorSourceVariant>();
1761*38e8c45fSAndroid Build Coastguard Worker }
1762*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource)1763*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_colorSource) {
1764*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1765*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1766*38e8c45fSAndroid Build Coastguard Worker     }
1767*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1768*38e8c45fSAndroid Build Coastguard Worker     fillBufferColorTransformZeroLayerAlpha<ColorSourceVariant>();
1769*38e8c45fSAndroid Build Coastguard Worker }
1770*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferAndBlurBackground_colorSource)1771*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
1772*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1773*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1774*38e8c45fSAndroid Build Coastguard Worker     }
1775*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1776*38e8c45fSAndroid Build Coastguard Worker     fillBufferAndBlurBackground<ColorSourceVariant>();
1777*38e8c45fSAndroid Build Coastguard Worker }
1778*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillSmallLayerAndBlurBackground_colorSource)1779*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_colorSource) {
1780*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1781*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1782*38e8c45fSAndroid Build Coastguard Worker     }
1783*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1784*38e8c45fSAndroid Build Coastguard Worker     fillSmallLayerAndBlurBackground<ColorSourceVariant>();
1785*38e8c45fSAndroid Build Coastguard Worker }
1786*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_overlayCorners_colorSource)1787*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
1788*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1789*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1790*38e8c45fSAndroid Build Coastguard Worker     }
1791*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1792*38e8c45fSAndroid Build Coastguard Worker     overlayCorners<ColorSourceVariant>();
1793*38e8c45fSAndroid Build Coastguard Worker }
1794*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillRedBuffer_opaqueBufferSource)1795*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
1796*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1797*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1798*38e8c45fSAndroid Build Coastguard Worker     }
1799*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1800*38e8c45fSAndroid Build Coastguard Worker     fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1801*38e8c45fSAndroid Build Coastguard Worker }
1802*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillGreenBuffer_opaqueBufferSource)1803*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
1804*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1805*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1806*38e8c45fSAndroid Build Coastguard Worker     }
1807*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1808*38e8c45fSAndroid Build Coastguard Worker     fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1809*38e8c45fSAndroid Build Coastguard Worker }
1810*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBlueBuffer_opaqueBufferSource)1811*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
1812*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1813*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1814*38e8c45fSAndroid Build Coastguard Worker     }
1815*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1816*38e8c45fSAndroid Build Coastguard Worker     fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1817*38e8c45fSAndroid Build Coastguard Worker }
1818*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillRedTransparentBuffer_opaqueBufferSource)1819*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
1820*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1821*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1822*38e8c45fSAndroid Build Coastguard Worker     }
1823*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1824*38e8c45fSAndroid Build Coastguard Worker     fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1825*38e8c45fSAndroid Build Coastguard Worker }
1826*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferPhysicalOffset_opaqueBufferSource)1827*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
1828*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1829*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1830*38e8c45fSAndroid Build Coastguard Worker     }
1831*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1832*38e8c45fSAndroid Build Coastguard Worker     fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1833*38e8c45fSAndroid Build Coastguard Worker }
1834*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferCheckersRotate0_opaqueBufferSource)1835*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
1836*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1837*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1838*38e8c45fSAndroid Build Coastguard Worker     }
1839*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1840*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1841*38e8c45fSAndroid Build Coastguard Worker }
1842*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferCheckersRotate90_opaqueBufferSource)1843*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
1844*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1845*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1846*38e8c45fSAndroid Build Coastguard Worker     }
1847*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1848*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1849*38e8c45fSAndroid Build Coastguard Worker }
1850*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferCheckersRotate180_opaqueBufferSource)1851*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
1852*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1853*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1854*38e8c45fSAndroid Build Coastguard Worker     }
1855*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1856*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1857*38e8c45fSAndroid Build Coastguard Worker }
1858*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferCheckersRotate270_opaqueBufferSource)1859*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
1860*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1861*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1862*38e8c45fSAndroid Build Coastguard Worker     }
1863*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1864*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1865*38e8c45fSAndroid Build Coastguard Worker }
1866*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferLayerTransform_opaqueBufferSource)1867*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
1868*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1869*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1870*38e8c45fSAndroid Build Coastguard Worker     }
1871*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1872*38e8c45fSAndroid Build Coastguard Worker     fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1873*38e8c45fSAndroid Build Coastguard Worker }
1874*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferColorTransform_opaqueBufferSource)1875*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
1876*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1877*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1878*38e8c45fSAndroid Build Coastguard Worker     }
1879*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1880*38e8c45fSAndroid Build Coastguard Worker     fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1881*38e8c45fSAndroid Build Coastguard Worker }
1882*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferColorTransformAndSourceDataspace_opaqueBufferSource)1883*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndSourceDataspace_opaqueBufferSource) {
1884*38e8c45fSAndroid Build Coastguard Worker     const auto& renderEngineFactory = GetParam();
1885*38e8c45fSAndroid Build Coastguard Worker     // skip for non color management
1886*38e8c45fSAndroid Build Coastguard Worker     if (!renderEngineFactory->apiSupported()) {
1887*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1888*38e8c45fSAndroid Build Coastguard Worker     }
1889*38e8c45fSAndroid Build Coastguard Worker 
1890*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1891*38e8c45fSAndroid Build Coastguard Worker     fillBufferColorTransformAndSourceDataspace<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1892*38e8c45fSAndroid Build Coastguard Worker }
1893*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferColorTransformAndOutputDataspace_opaqueBufferSource)1894*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndOutputDataspace_opaqueBufferSource) {
1895*38e8c45fSAndroid Build Coastguard Worker     const auto& renderEngineFactory = GetParam();
1896*38e8c45fSAndroid Build Coastguard Worker     // skip for non color management
1897*38e8c45fSAndroid Build Coastguard Worker     if (!renderEngineFactory->apiSupported()) {
1898*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1899*38e8c45fSAndroid Build Coastguard Worker     }
1900*38e8c45fSAndroid Build Coastguard Worker 
1901*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1902*38e8c45fSAndroid Build Coastguard Worker     fillBufferColorTransformAndOutputDataspace<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1903*38e8c45fSAndroid Build Coastguard Worker }
1904*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferRoundedCorners_opaqueBufferSource)1905*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
1906*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1907*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1908*38e8c45fSAndroid Build Coastguard Worker     }
1909*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1910*38e8c45fSAndroid Build Coastguard Worker     fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1911*38e8c45fSAndroid Build Coastguard Worker }
1912*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource)1913*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_opaqueBufferSource) {
1914*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1915*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1916*38e8c45fSAndroid Build Coastguard Worker     }
1917*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1918*38e8c45fSAndroid Build Coastguard Worker     fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1919*38e8c45fSAndroid Build Coastguard Worker }
1920*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferAndBlurBackground_opaqueBufferSource)1921*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
1922*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1923*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1924*38e8c45fSAndroid Build Coastguard Worker     }
1925*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1926*38e8c45fSAndroid Build Coastguard Worker     fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1927*38e8c45fSAndroid Build Coastguard Worker }
1928*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource)1929*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_opaqueBufferSource) {
1930*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1931*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1932*38e8c45fSAndroid Build Coastguard Worker     }
1933*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1934*38e8c45fSAndroid Build Coastguard Worker     fillSmallLayerAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1935*38e8c45fSAndroid Build Coastguard Worker }
1936*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_overlayCorners_opaqueBufferSource)1937*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
1938*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1939*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1940*38e8c45fSAndroid Build Coastguard Worker     }
1941*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1942*38e8c45fSAndroid Build Coastguard Worker     overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1943*38e8c45fSAndroid Build Coastguard Worker }
1944*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillRedBuffer_bufferSource)1945*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
1946*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1947*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1948*38e8c45fSAndroid Build Coastguard Worker     }
1949*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1950*38e8c45fSAndroid Build Coastguard Worker     fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1951*38e8c45fSAndroid Build Coastguard Worker }
1952*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillGreenBuffer_bufferSource)1953*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
1954*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1955*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1956*38e8c45fSAndroid Build Coastguard Worker     }
1957*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1958*38e8c45fSAndroid Build Coastguard Worker     fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1959*38e8c45fSAndroid Build Coastguard Worker }
1960*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBlueBuffer_bufferSource)1961*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
1962*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1963*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1964*38e8c45fSAndroid Build Coastguard Worker     }
1965*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1966*38e8c45fSAndroid Build Coastguard Worker     fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1967*38e8c45fSAndroid Build Coastguard Worker }
1968*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillRedTransparentBuffer_bufferSource)1969*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
1970*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1971*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1972*38e8c45fSAndroid Build Coastguard Worker     }
1973*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1974*38e8c45fSAndroid Build Coastguard Worker     fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1975*38e8c45fSAndroid Build Coastguard Worker }
1976*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferPhysicalOffset_bufferSource)1977*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
1978*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1979*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1980*38e8c45fSAndroid Build Coastguard Worker     }
1981*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1982*38e8c45fSAndroid Build Coastguard Worker     fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1983*38e8c45fSAndroid Build Coastguard Worker }
1984*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferCheckersRotate0_bufferSource)1985*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
1986*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1987*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1988*38e8c45fSAndroid Build Coastguard Worker     }
1989*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1990*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1991*38e8c45fSAndroid Build Coastguard Worker }
1992*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferCheckersRotate90_bufferSource)1993*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
1994*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
1995*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
1996*38e8c45fSAndroid Build Coastguard Worker     }
1997*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
1998*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1999*38e8c45fSAndroid Build Coastguard Worker }
2000*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferCheckersRotate180_bufferSource)2001*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
2002*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2003*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2004*38e8c45fSAndroid Build Coastguard Worker     }
2005*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2006*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2007*38e8c45fSAndroid Build Coastguard Worker }
2008*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferCheckersRotate270_bufferSource)2009*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
2010*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2011*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2012*38e8c45fSAndroid Build Coastguard Worker     }
2013*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2014*38e8c45fSAndroid Build Coastguard Worker     fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2015*38e8c45fSAndroid Build Coastguard Worker }
2016*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferLayerTransform_bufferSource)2017*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
2018*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2019*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2020*38e8c45fSAndroid Build Coastguard Worker     }
2021*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2022*38e8c45fSAndroid Build Coastguard Worker     fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2023*38e8c45fSAndroid Build Coastguard Worker }
2024*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferColorTransform_bufferSource)2025*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
2026*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2027*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2028*38e8c45fSAndroid Build Coastguard Worker     }
2029*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2030*38e8c45fSAndroid Build Coastguard Worker     fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2031*38e8c45fSAndroid Build Coastguard Worker }
2032*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferColorTransformAndSourceDataspace_bufferSource)2033*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndSourceDataspace_bufferSource) {
2034*38e8c45fSAndroid Build Coastguard Worker     const auto& renderEngineFactory = GetParam();
2035*38e8c45fSAndroid Build Coastguard Worker     // skip for non color management
2036*38e8c45fSAndroid Build Coastguard Worker     if (!renderEngineFactory->apiSupported()) {
2037*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2038*38e8c45fSAndroid Build Coastguard Worker     }
2039*38e8c45fSAndroid Build Coastguard Worker 
2040*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2041*38e8c45fSAndroid Build Coastguard Worker     fillBufferColorTransformAndSourceDataspace<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2042*38e8c45fSAndroid Build Coastguard Worker }
2043*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferColorTransformAndOutputDataspace_bufferSource)2044*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformAndOutputDataspace_bufferSource) {
2045*38e8c45fSAndroid Build Coastguard Worker     const auto& renderEngineFactory = GetParam();
2046*38e8c45fSAndroid Build Coastguard Worker     // skip for non color management
2047*38e8c45fSAndroid Build Coastguard Worker     if (!renderEngineFactory->apiSupported()) {
2048*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2049*38e8c45fSAndroid Build Coastguard Worker     }
2050*38e8c45fSAndroid Build Coastguard Worker 
2051*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2052*38e8c45fSAndroid Build Coastguard Worker     fillBufferColorTransformAndOutputDataspace<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2053*38e8c45fSAndroid Build Coastguard Worker }
2054*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferRoundedCorners_bufferSource)2055*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
2056*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2057*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2058*38e8c45fSAndroid Build Coastguard Worker     }
2059*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2060*38e8c45fSAndroid Build Coastguard Worker     fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2061*38e8c45fSAndroid Build Coastguard Worker }
2062*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource)2063*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransformZeroLayerAlpha_bufferSource) {
2064*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2065*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2066*38e8c45fSAndroid Build Coastguard Worker     }
2067*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2068*38e8c45fSAndroid Build Coastguard Worker     fillBufferColorTransformZeroLayerAlpha<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2069*38e8c45fSAndroid Build Coastguard Worker }
2070*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferAndBlurBackground_bufferSource)2071*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
2072*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2073*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2074*38e8c45fSAndroid Build Coastguard Worker     }
2075*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2076*38e8c45fSAndroid Build Coastguard Worker     fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2077*38e8c45fSAndroid Build Coastguard Worker }
2078*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillSmallLayerAndBlurBackground_bufferSource)2079*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillSmallLayerAndBlurBackground_bufferSource) {
2080*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2081*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2082*38e8c45fSAndroid Build Coastguard Worker     }
2083*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2084*38e8c45fSAndroid Build Coastguard Worker     fillSmallLayerAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2085*38e8c45fSAndroid Build Coastguard Worker }
2086*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_overlayCorners_bufferSource)2087*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
2088*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2089*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2090*38e8c45fSAndroid Build Coastguard Worker     }
2091*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2092*38e8c45fSAndroid Build Coastguard Worker     overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
2093*38e8c45fSAndroid Build Coastguard Worker }
2094*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBufferTextureTransform)2095*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
2096*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2097*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2098*38e8c45fSAndroid Build Coastguard Worker     }
2099*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2100*38e8c45fSAndroid Build Coastguard Worker     fillBufferTextureTransform();
2101*38e8c45fSAndroid Build Coastguard Worker }
2102*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBuffer_premultipliesAlpha)2103*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
2104*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2105*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2106*38e8c45fSAndroid Build Coastguard Worker     }
2107*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2108*38e8c45fSAndroid Build Coastguard Worker     fillBufferWithPremultiplyAlpha();
2109*38e8c45fSAndroid Build Coastguard Worker }
2110*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillBuffer_withoutPremultiplyingAlpha)2111*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
2112*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2113*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2114*38e8c45fSAndroid Build Coastguard Worker     }
2115*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2116*38e8c45fSAndroid Build Coastguard Worker     fillBufferWithoutPremultiplyAlpha();
2117*38e8c45fSAndroid Build Coastguard Worker }
2118*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillShadow_castsWithoutCasterLayer)2119*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillShadow_castsWithoutCasterLayer) {
2120*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2121*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2122*38e8c45fSAndroid Build Coastguard Worker     }
2123*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2124*38e8c45fSAndroid Build Coastguard Worker 
2125*38e8c45fSAndroid Build Coastguard Worker     const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2126*38e8c45fSAndroid Build Coastguard Worker                                  static_cast<uint8_t>(255), static_cast<uint8_t>(255));
2127*38e8c45fSAndroid Build Coastguard Worker     const float shadowLength = 5.0f;
2128*38e8c45fSAndroid Build Coastguard Worker     Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2129*38e8c45fSAndroid Build Coastguard Worker     casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2130*38e8c45fSAndroid Build Coastguard Worker     ShadowSettings settings = getShadowSettings(vec2(casterBounds.left, casterBounds.top),
2131*38e8c45fSAndroid Build Coastguard Worker                                                 shadowLength, false /* casterIsTranslucent */);
2132*38e8c45fSAndroid Build Coastguard Worker 
2133*38e8c45fSAndroid Build Coastguard Worker     drawShadowWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
2134*38e8c45fSAndroid Build Coastguard Worker     expectShadowColorWithoutCaster(casterBounds.toFloatRect(), settings, backgroundColor);
2135*38e8c45fSAndroid Build Coastguard Worker }
2136*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillShadow_casterLayerMinSize)2137*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
2138*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2139*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2140*38e8c45fSAndroid Build Coastguard Worker     }
2141*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2142*38e8c45fSAndroid Build Coastguard Worker 
2143*38e8c45fSAndroid Build Coastguard Worker     const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2144*38e8c45fSAndroid Build Coastguard Worker                              static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2145*38e8c45fSAndroid Build Coastguard Worker     const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2146*38e8c45fSAndroid Build Coastguard Worker                                  static_cast<uint8_t>(255), static_cast<uint8_t>(255));
2147*38e8c45fSAndroid Build Coastguard Worker     const float shadowLength = 5.0f;
2148*38e8c45fSAndroid Build Coastguard Worker     Rect casterBounds(1, 1);
2149*38e8c45fSAndroid Build Coastguard Worker     casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2150*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings castingLayer;
2151*38e8c45fSAndroid Build Coastguard Worker     castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2152*38e8c45fSAndroid Build Coastguard Worker     castingLayer.alpha = 1.0f;
2153*38e8c45fSAndroid Build Coastguard Worker     ShadowSettings settings = getShadowSettings(vec2(casterBounds.left, casterBounds.top),
2154*38e8c45fSAndroid Build Coastguard Worker                                                 shadowLength, false /* casterIsTranslucent */);
2155*38e8c45fSAndroid Build Coastguard Worker 
2156*38e8c45fSAndroid Build Coastguard Worker     drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
2157*38e8c45fSAndroid Build Coastguard Worker     expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2158*38e8c45fSAndroid Build Coastguard Worker }
2159*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillShadow_casterColorLayer)2160*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
2161*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2162*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2163*38e8c45fSAndroid Build Coastguard Worker     }
2164*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2165*38e8c45fSAndroid Build Coastguard Worker 
2166*38e8c45fSAndroid Build Coastguard Worker     const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2167*38e8c45fSAndroid Build Coastguard Worker                              static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2168*38e8c45fSAndroid Build Coastguard Worker     const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2169*38e8c45fSAndroid Build Coastguard Worker                                  static_cast<uint8_t>(255), static_cast<uint8_t>(255));
2170*38e8c45fSAndroid Build Coastguard Worker     const float shadowLength = 5.0f;
2171*38e8c45fSAndroid Build Coastguard Worker     Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2172*38e8c45fSAndroid Build Coastguard Worker     casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2173*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings castingLayer;
2174*38e8c45fSAndroid Build Coastguard Worker     castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2175*38e8c45fSAndroid Build Coastguard Worker     castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2176*38e8c45fSAndroid Build Coastguard Worker     castingLayer.alpha = 1.0f;
2177*38e8c45fSAndroid Build Coastguard Worker     ShadowSettings settings = getShadowSettings(vec2(casterBounds.left, casterBounds.top),
2178*38e8c45fSAndroid Build Coastguard Worker                                                 shadowLength, false /* casterIsTranslucent */);
2179*38e8c45fSAndroid Build Coastguard Worker 
2180*38e8c45fSAndroid Build Coastguard Worker     drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
2181*38e8c45fSAndroid Build Coastguard Worker     expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2182*38e8c45fSAndroid Build Coastguard Worker }
2183*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillShadow_casterOpaqueBufferLayer)2184*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
2185*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2186*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2187*38e8c45fSAndroid Build Coastguard Worker     }
2188*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2189*38e8c45fSAndroid Build Coastguard Worker 
2190*38e8c45fSAndroid Build Coastguard Worker     const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2191*38e8c45fSAndroid Build Coastguard Worker                              static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2192*38e8c45fSAndroid Build Coastguard Worker     const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2193*38e8c45fSAndroid Build Coastguard Worker                                  static_cast<uint8_t>(255), static_cast<uint8_t>(255));
2194*38e8c45fSAndroid Build Coastguard Worker     const float shadowLength = 5.0f;
2195*38e8c45fSAndroid Build Coastguard Worker     Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2196*38e8c45fSAndroid Build Coastguard Worker     casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2197*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings castingLayer;
2198*38e8c45fSAndroid Build Coastguard Worker     castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2199*38e8c45fSAndroid Build Coastguard Worker     castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2200*38e8c45fSAndroid Build Coastguard Worker     castingLayer.alpha = 1.0f;
2201*38e8c45fSAndroid Build Coastguard Worker     ShadowSettings settings = getShadowSettings(vec2(casterBounds.left, casterBounds.top),
2202*38e8c45fSAndroid Build Coastguard Worker                                                 shadowLength, false /* casterIsTranslucent */);
2203*38e8c45fSAndroid Build Coastguard Worker 
2204*38e8c45fSAndroid Build Coastguard Worker     drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
2205*38e8c45fSAndroid Build Coastguard Worker                                                               backgroundColor);
2206*38e8c45fSAndroid Build Coastguard Worker     expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2207*38e8c45fSAndroid Build Coastguard Worker }
2208*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillShadow_casterWithRoundedCorner)2209*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
2210*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2211*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2212*38e8c45fSAndroid Build Coastguard Worker     }
2213*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2214*38e8c45fSAndroid Build Coastguard Worker 
2215*38e8c45fSAndroid Build Coastguard Worker     const ubyte4 casterColor(static_cast<uint8_t>(255), static_cast<uint8_t>(0),
2216*38e8c45fSAndroid Build Coastguard Worker                              static_cast<uint8_t>(0), static_cast<uint8_t>(255));
2217*38e8c45fSAndroid Build Coastguard Worker     const ubyte4 backgroundColor(static_cast<uint8_t>(255), static_cast<uint8_t>(255),
2218*38e8c45fSAndroid Build Coastguard Worker                                  static_cast<uint8_t>(255), static_cast<uint8_t>(255));
2219*38e8c45fSAndroid Build Coastguard Worker     const float shadowLength = 5.0f;
2220*38e8c45fSAndroid Build Coastguard Worker     Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2221*38e8c45fSAndroid Build Coastguard Worker     casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2222*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings castingLayer;
2223*38e8c45fSAndroid Build Coastguard Worker     castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2224*38e8c45fSAndroid Build Coastguard Worker     castingLayer.geometry.roundedCornersRadius = {3.0f, 3.0f};
2225*38e8c45fSAndroid Build Coastguard Worker     castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
2226*38e8c45fSAndroid Build Coastguard Worker     castingLayer.alpha = 1.0f;
2227*38e8c45fSAndroid Build Coastguard Worker     ShadowSettings settings = getShadowSettings(vec2(casterBounds.left, casterBounds.top),
2228*38e8c45fSAndroid Build Coastguard Worker                                                 shadowLength, false /* casterIsTranslucent */);
2229*38e8c45fSAndroid Build Coastguard Worker 
2230*38e8c45fSAndroid Build Coastguard Worker     drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
2231*38e8c45fSAndroid Build Coastguard Worker                                                               backgroundColor);
2232*38e8c45fSAndroid Build Coastguard Worker     expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
2233*38e8c45fSAndroid Build Coastguard Worker }
2234*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,drawLayers_fillShadow_translucentCasterWithAlpha)2235*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
2236*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2237*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2238*38e8c45fSAndroid Build Coastguard Worker     }
2239*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2240*38e8c45fSAndroid Build Coastguard Worker 
2241*38e8c45fSAndroid Build Coastguard Worker     const ubyte4 casterColor(255, 0, 0, 255);
2242*38e8c45fSAndroid Build Coastguard Worker     const ubyte4 backgroundColor(255, 255, 255, 255);
2243*38e8c45fSAndroid Build Coastguard Worker     const float shadowLength = 5.0f;
2244*38e8c45fSAndroid Build Coastguard Worker     Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
2245*38e8c45fSAndroid Build Coastguard Worker     casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
2246*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings castingLayer;
2247*38e8c45fSAndroid Build Coastguard Worker     castingLayer.geometry.boundaries = casterBounds.toFloatRect();
2248*38e8c45fSAndroid Build Coastguard Worker     castingLayer.alpha = 0.5f;
2249*38e8c45fSAndroid Build Coastguard Worker     ShadowSettings settings = getShadowSettings(vec2(casterBounds.left, casterBounds.top),
2250*38e8c45fSAndroid Build Coastguard Worker                                                 shadowLength, true /* casterIsTranslucent */);
2251*38e8c45fSAndroid Build Coastguard Worker 
2252*38e8c45fSAndroid Build Coastguard Worker     drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
2253*38e8c45fSAndroid Build Coastguard Worker                                                               backgroundColor);
2254*38e8c45fSAndroid Build Coastguard Worker 
2255*38e8c45fSAndroid Build Coastguard Worker     // verify only the background since the shadow will draw behind the caster
2256*38e8c45fSAndroid Build Coastguard Worker     const float shadowInset = settings.length * -1.0f;
2257*38e8c45fSAndroid Build Coastguard Worker     const Rect casterWithShadow =
2258*38e8c45fSAndroid Build Coastguard Worker             Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
2259*38e8c45fSAndroid Build Coastguard Worker     const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
2260*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
2261*38e8c45fSAndroid Build Coastguard Worker                       backgroundColor.a);
2262*38e8c45fSAndroid Build Coastguard Worker }
2263*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,cleanupPostRender_cleansUpOnce)2264*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
2265*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2266*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2267*38e8c45fSAndroid Build Coastguard Worker     }
2268*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2269*38e8c45fSAndroid Build Coastguard Worker 
2270*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
2271*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
2272*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
2273*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2274*38e8c45fSAndroid Build Coastguard Worker 
2275*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
2276*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
2277*38e8c45fSAndroid Build Coastguard Worker     layer.geometry.boundaries = fullscreenRect().toFloatRect();
2278*38e8c45fSAndroid Build Coastguard Worker     BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
2279*38e8c45fSAndroid Build Coastguard Worker     layer.alpha = 1.0;
2280*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(layer);
2281*38e8c45fSAndroid Build Coastguard Worker 
2282*38e8c45fSAndroid Build Coastguard Worker     ftl::Future<FenceResult> futureOne =
2283*38e8c45fSAndroid Build Coastguard Worker             mRE->drawLayers(settings, layers, mBuffer, base::unique_fd());
2284*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(futureOne.valid());
2285*38e8c45fSAndroid Build Coastguard Worker     auto resultOne = futureOne.get();
2286*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(resultOne.ok());
2287*38e8c45fSAndroid Build Coastguard Worker     auto fenceOne = resultOne.value();
2288*38e8c45fSAndroid Build Coastguard Worker 
2289*38e8c45fSAndroid Build Coastguard Worker     ftl::Future<FenceResult> futureTwo =
2290*38e8c45fSAndroid Build Coastguard Worker             mRE->drawLayers(settings, layers, mBuffer, base::unique_fd(fenceOne->dup()));
2291*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(futureTwo.valid());
2292*38e8c45fSAndroid Build Coastguard Worker     auto resultTwo = futureTwo.get();
2293*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(resultTwo.ok());
2294*38e8c45fSAndroid Build Coastguard Worker     auto fenceTwo = resultTwo.value();
2295*38e8c45fSAndroid Build Coastguard Worker     fenceTwo->waitForever(LOG_TAG);
2296*38e8c45fSAndroid Build Coastguard Worker 
2297*38e8c45fSAndroid Build Coastguard Worker     // Only cleanup the first time.
2298*38e8c45fSAndroid Build Coastguard Worker     if (mRE->canSkipPostRenderCleanup()) {
2299*38e8c45fSAndroid Build Coastguard Worker         // Skia's Vk backend may keep the texture alive beyond drawLayersInternal, so
2300*38e8c45fSAndroid Build Coastguard Worker         // it never gets added to the cleanup list. In those cases, we can skip.
2301*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(GetParam()->graphicsApi() == renderengine::RenderEngine::GraphicsApi::VK);
2302*38e8c45fSAndroid Build Coastguard Worker     } else {
2303*38e8c45fSAndroid Build Coastguard Worker         mRE->cleanupPostRender();
2304*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(mRE->canSkipPostRenderCleanup());
2305*38e8c45fSAndroid Build Coastguard Worker     }
2306*38e8c45fSAndroid Build Coastguard Worker }
2307*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,testRoundedCornersCrop)2308*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, testRoundedCornersCrop) {
2309*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2310*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2311*38e8c45fSAndroid Build Coastguard Worker     }
2312*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2313*38e8c45fSAndroid Build Coastguard Worker 
2314*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
2315*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
2316*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
2317*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2318*38e8c45fSAndroid Build Coastguard Worker 
2319*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
2320*38e8c45fSAndroid Build Coastguard Worker 
2321*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings redLayer;
2322*38e8c45fSAndroid Build Coastguard Worker     redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2323*38e8c45fSAndroid Build Coastguard Worker     redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2324*38e8c45fSAndroid Build Coastguard Worker     redLayer.geometry.roundedCornersRadius = {5.0f, 5.0f};
2325*38e8c45fSAndroid Build Coastguard Worker 
2326*38e8c45fSAndroid Build Coastguard Worker     redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
2327*38e8c45fSAndroid Build Coastguard Worker     // Red background.
2328*38e8c45fSAndroid Build Coastguard Worker     redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2329*38e8c45fSAndroid Build Coastguard Worker     redLayer.alpha = 1.0f;
2330*38e8c45fSAndroid Build Coastguard Worker 
2331*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(redLayer);
2332*38e8c45fSAndroid Build Coastguard Worker 
2333*38e8c45fSAndroid Build Coastguard Worker     // Green layer with 1/3 size.
2334*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings greenLayer;
2335*38e8c45fSAndroid Build Coastguard Worker     greenLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2336*38e8c45fSAndroid Build Coastguard Worker     greenLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2337*38e8c45fSAndroid Build Coastguard Worker     greenLayer.geometry.roundedCornersRadius = {5.0f, 5.0f};
2338*38e8c45fSAndroid Build Coastguard Worker     // Bottom right corner is not going to be rounded.
2339*38e8c45fSAndroid Build Coastguard Worker     greenLayer.geometry.roundedCornersCrop =
2340*38e8c45fSAndroid Build Coastguard Worker             Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3, DEFAULT_DISPLAY_HEIGHT,
2341*38e8c45fSAndroid Build Coastguard Worker                  DEFAULT_DISPLAY_HEIGHT)
2342*38e8c45fSAndroid Build Coastguard Worker                     .toFloatRect();
2343*38e8c45fSAndroid Build Coastguard Worker     greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
2344*38e8c45fSAndroid Build Coastguard Worker     greenLayer.alpha = 1.0f;
2345*38e8c45fSAndroid Build Coastguard Worker 
2346*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(greenLayer);
2347*38e8c45fSAndroid Build Coastguard Worker 
2348*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
2349*38e8c45fSAndroid Build Coastguard Worker 
2350*38e8c45fSAndroid Build Coastguard Worker     // Corners should be ignored...
2351*38e8c45fSAndroid Build Coastguard Worker     // Screen size: width is 128, height is 256.
2352*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
2353*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
2354*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
2355*38e8c45fSAndroid Build Coastguard Worker     // Bottom right corner is kept out of the clipping, and it's green.
2356*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
2357*38e8c45fSAndroid Build Coastguard Worker                            DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
2358*38e8c45fSAndroid Build Coastguard Worker                       0, 255, 0, 255);
2359*38e8c45fSAndroid Build Coastguard Worker }
2360*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,testRoundedCornersParentCrop)2361*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, testRoundedCornersParentCrop) {
2362*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2363*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2364*38e8c45fSAndroid Build Coastguard Worker     }
2365*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2366*38e8c45fSAndroid Build Coastguard Worker 
2367*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
2368*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
2369*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
2370*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2371*38e8c45fSAndroid Build Coastguard Worker 
2372*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
2373*38e8c45fSAndroid Build Coastguard Worker 
2374*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings redLayer;
2375*38e8c45fSAndroid Build Coastguard Worker     redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2376*38e8c45fSAndroid Build Coastguard Worker     redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2377*38e8c45fSAndroid Build Coastguard Worker     redLayer.geometry.roundedCornersRadius = {5.0f, 5.0f};
2378*38e8c45fSAndroid Build Coastguard Worker     redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
2379*38e8c45fSAndroid Build Coastguard Worker     // Red background.
2380*38e8c45fSAndroid Build Coastguard Worker     redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2381*38e8c45fSAndroid Build Coastguard Worker     redLayer.alpha = 1.0f;
2382*38e8c45fSAndroid Build Coastguard Worker 
2383*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(redLayer);
2384*38e8c45fSAndroid Build Coastguard Worker 
2385*38e8c45fSAndroid Build Coastguard Worker     // Green layer with 1/2 size with parent crop rect.
2386*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings greenLayer = redLayer;
2387*38e8c45fSAndroid Build Coastguard Worker     greenLayer.geometry.boundaries =
2388*38e8c45fSAndroid Build Coastguard Worker             FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2);
2389*38e8c45fSAndroid Build Coastguard Worker     greenLayer.source.solidColor = half3(0.0f, 1.0f, 0.0f);
2390*38e8c45fSAndroid Build Coastguard Worker 
2391*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(greenLayer);
2392*38e8c45fSAndroid Build Coastguard Worker 
2393*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
2394*38e8c45fSAndroid Build Coastguard Worker 
2395*38e8c45fSAndroid Build Coastguard Worker     // Due to roundedCornersRadius, the corners are untouched.
2396*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(0, 0), 0, 0, 0, 0);
2397*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
2398*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
2399*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
2400*38e8c45fSAndroid Build Coastguard Worker 
2401*38e8c45fSAndroid Build Coastguard Worker     // top middle should be green and the bottom middle red
2402*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 0), 0, 255, 0, 255);
2403*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 255);
2404*38e8c45fSAndroid Build Coastguard Worker 
2405*38e8c45fSAndroid Build Coastguard Worker     // the bottom edge of the green layer should not be rounded
2406*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(0, (DEFAULT_DISPLAY_HEIGHT / 2) - 1), 0, 255, 0, 255);
2407*38e8c45fSAndroid Build Coastguard Worker }
2408*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,testRoundedCornersParentCropSmallBounds)2409*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, testRoundedCornersParentCropSmallBounds) {
2410*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2411*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2412*38e8c45fSAndroid Build Coastguard Worker     }
2413*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2414*38e8c45fSAndroid Build Coastguard Worker 
2415*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
2416*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
2417*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
2418*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2419*38e8c45fSAndroid Build Coastguard Worker 
2420*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
2421*38e8c45fSAndroid Build Coastguard Worker 
2422*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings redLayer;
2423*38e8c45fSAndroid Build Coastguard Worker     redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2424*38e8c45fSAndroid Build Coastguard Worker     redLayer.geometry.boundaries = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 32);
2425*38e8c45fSAndroid Build Coastguard Worker     redLayer.geometry.roundedCornersRadius = {64.0f, 64.0f};
2426*38e8c45fSAndroid Build Coastguard Worker     redLayer.geometry.roundedCornersCrop = FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH, 128);
2427*38e8c45fSAndroid Build Coastguard Worker     // Red background.
2428*38e8c45fSAndroid Build Coastguard Worker     redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2429*38e8c45fSAndroid Build Coastguard Worker     redLayer.alpha = 1.0f;
2430*38e8c45fSAndroid Build Coastguard Worker 
2431*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(redLayer);
2432*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
2433*38e8c45fSAndroid Build Coastguard Worker 
2434*38e8c45fSAndroid Build Coastguard Worker     // Due to roundedCornersRadius, the top corners are untouched.
2435*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(0, 0), 0, 0, 0, 0);
2436*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
2437*38e8c45fSAndroid Build Coastguard Worker 
2438*38e8c45fSAndroid Build Coastguard Worker     // ensure that the entire height of the red layer was clipped by the rounded corners crop.
2439*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(0, 31), 0, 0, 0, 0);
2440*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 31), 0, 0, 0, 0);
2441*38e8c45fSAndroid Build Coastguard Worker 
2442*38e8c45fSAndroid Build Coastguard Worker     // the bottom middle should be red
2443*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, 31), 255, 0, 0, 255);
2444*38e8c45fSAndroid Build Coastguard Worker }
2445*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,testRoundedCornersXY)2446*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, testRoundedCornersXY) {
2447*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2448*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2449*38e8c45fSAndroid Build Coastguard Worker     }
2450*38e8c45fSAndroid Build Coastguard Worker 
2451*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2452*38e8c45fSAndroid Build Coastguard Worker 
2453*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
2454*38e8c45fSAndroid Build Coastguard Worker     settings.physicalDisplay = fullscreenRect();
2455*38e8c45fSAndroid Build Coastguard Worker     settings.clip = fullscreenRect();
2456*38e8c45fSAndroid Build Coastguard Worker     settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2457*38e8c45fSAndroid Build Coastguard Worker 
2458*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
2459*38e8c45fSAndroid Build Coastguard Worker 
2460*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings redLayer;
2461*38e8c45fSAndroid Build Coastguard Worker     redLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
2462*38e8c45fSAndroid Build Coastguard Worker     redLayer.geometry.boundaries = fullscreenRect().toFloatRect();
2463*38e8c45fSAndroid Build Coastguard Worker     redLayer.geometry.roundedCornersRadius = {5.0f, 20.0f};
2464*38e8c45fSAndroid Build Coastguard Worker     redLayer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
2465*38e8c45fSAndroid Build Coastguard Worker     // Red background.
2466*38e8c45fSAndroid Build Coastguard Worker     redLayer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
2467*38e8c45fSAndroid Build Coastguard Worker     redLayer.alpha = 1.0f;
2468*38e8c45fSAndroid Build Coastguard Worker 
2469*38e8c45fSAndroid Build Coastguard Worker     layers.push_back(redLayer);
2470*38e8c45fSAndroid Build Coastguard Worker 
2471*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(settings, layers);
2472*38e8c45fSAndroid Build Coastguard Worker 
2473*38e8c45fSAndroid Build Coastguard Worker     // Due to roundedCornersRadius, the corners are untouched.
2474*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(0, 0), 0, 0, 0, 0);
2475*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 0), 0, 0, 0, 0);
2476*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
2477*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1), 0, 0, 0, 0);
2478*38e8c45fSAndroid Build Coastguard Worker 
2479*38e8c45fSAndroid Build Coastguard Worker     // Y-axis draws a larger radius, check that its untouched as well
2480*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(0, DEFAULT_DISPLAY_HEIGHT - 5), 0, 0, 0, 0);
2481*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 5), 0, 0, 0, 0);
2482*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH - 1, 5), 0, 0, 0, 0);
2483*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(0, 5), 0, 0, 0, 0);
2484*38e8c45fSAndroid Build Coastguard Worker 
2485*38e8c45fSAndroid Build Coastguard Worker     //  middle should be red
2486*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Point(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 255);
2487*38e8c45fSAndroid Build Coastguard Worker }
2488*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,testClear)2489*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, testClear) {
2490*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2491*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2492*38e8c45fSAndroid Build Coastguard Worker     }
2493*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2494*38e8c45fSAndroid Build Coastguard Worker 
2495*38e8c45fSAndroid Build Coastguard Worker     const auto rect = fullscreenRect();
2496*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
2497*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = rect,
2498*38e8c45fSAndroid Build Coastguard Worker             .clip = rect,
2499*38e8c45fSAndroid Build Coastguard Worker     };
2500*38e8c45fSAndroid Build Coastguard Worker 
2501*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings redLayer{
2502*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
2503*38e8c45fSAndroid Build Coastguard Worker             .source.solidColor = half3(1.0f, 0.0f, 0.0f),
2504*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2505*38e8c45fSAndroid Build Coastguard Worker     };
2506*38e8c45fSAndroid Build Coastguard Worker 
2507*38e8c45fSAndroid Build Coastguard Worker     // This mimics prepareClearClientComposition. This layer should overwrite
2508*38e8c45fSAndroid Build Coastguard Worker     // the redLayer, so that the buffer is transparent, rather than red.
2509*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings clearLayer{
2510*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
2511*38e8c45fSAndroid Build Coastguard Worker             .source.solidColor = half3(0.0f, 0.0f, 0.0f),
2512*38e8c45fSAndroid Build Coastguard Worker             .alpha = 0.0f,
2513*38e8c45fSAndroid Build Coastguard Worker             .disableBlending = true,
2514*38e8c45fSAndroid Build Coastguard Worker     };
2515*38e8c45fSAndroid Build Coastguard Worker 
2516*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{redLayer, clearLayer};
2517*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
2518*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(rect, 0, 0, 0, 0);
2519*38e8c45fSAndroid Build Coastguard Worker }
2520*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,testDisableBlendingBuffer)2521*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, testDisableBlendingBuffer) {
2522*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2523*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2524*38e8c45fSAndroid Build Coastguard Worker     }
2525*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2526*38e8c45fSAndroid Build Coastguard Worker 
2527*38e8c45fSAndroid Build Coastguard Worker     const auto rect = Rect(0, 0, 1, 1);
2528*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
2529*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = rect,
2530*38e8c45fSAndroid Build Coastguard Worker             .clip = rect,
2531*38e8c45fSAndroid Build Coastguard Worker     };
2532*38e8c45fSAndroid Build Coastguard Worker 
2533*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings redLayer{
2534*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
2535*38e8c45fSAndroid Build Coastguard Worker             .source.solidColor = half3(1.0f, 0.0f, 0.0f),
2536*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2537*38e8c45fSAndroid Build Coastguard Worker     };
2538*38e8c45fSAndroid Build Coastguard Worker 
2539*38e8c45fSAndroid Build Coastguard Worker     // The next layer will overwrite redLayer with a GraphicBuffer that is green
2540*38e8c45fSAndroid Build Coastguard Worker     // applied with a translucent alpha.
2541*38e8c45fSAndroid Build Coastguard Worker     const auto buf = allocateSourceBuffer(1, 1);
2542*38e8c45fSAndroid Build Coastguard Worker     {
2543*38e8c45fSAndroid Build Coastguard Worker         uint8_t* pixels;
2544*38e8c45fSAndroid Build Coastguard Worker         buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2545*38e8c45fSAndroid Build Coastguard Worker                                reinterpret_cast<void**>(&pixels));
2546*38e8c45fSAndroid Build Coastguard Worker         pixels[0] = 0;
2547*38e8c45fSAndroid Build Coastguard Worker         pixels[1] = 255;
2548*38e8c45fSAndroid Build Coastguard Worker         pixels[2] = 0;
2549*38e8c45fSAndroid Build Coastguard Worker         pixels[3] = 255;
2550*38e8c45fSAndroid Build Coastguard Worker         buf->getBuffer()->unlock();
2551*38e8c45fSAndroid Build Coastguard Worker     }
2552*38e8c45fSAndroid Build Coastguard Worker 
2553*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings greenLayer{
2554*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
2555*38e8c45fSAndroid Build Coastguard Worker             .source =
2556*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2557*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2558*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2559*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = buf,
2560*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2561*38e8c45fSAndroid Build Coastguard Worker                                     },
2562*38e8c45fSAndroid Build Coastguard Worker                     },
2563*38e8c45fSAndroid Build Coastguard Worker             .alpha = 0.5f,
2564*38e8c45fSAndroid Build Coastguard Worker             .disableBlending = true,
2565*38e8c45fSAndroid Build Coastguard Worker     };
2566*38e8c45fSAndroid Build Coastguard Worker 
2567*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{redLayer, greenLayer};
2568*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
2569*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(rect, 0, 128, 0, 128);
2570*38e8c45fSAndroid Build Coastguard Worker }
2571*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,testDimming)2572*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, testDimming) {
2573*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2574*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2575*38e8c45fSAndroid Build Coastguard Worker     }
2576*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2577*38e8c45fSAndroid Build Coastguard Worker 
2578*38e8c45fSAndroid Build Coastguard Worker     const ui::Dataspace dataspace = ui::Dataspace::V0_SRGB_LINEAR;
2579*38e8c45fSAndroid Build Coastguard Worker 
2580*38e8c45fSAndroid Build Coastguard Worker     const auto displayRect = Rect(3, 1);
2581*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
2582*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = displayRect,
2583*38e8c45fSAndroid Build Coastguard Worker             .clip = displayRect,
2584*38e8c45fSAndroid Build Coastguard Worker             .outputDataspace = dataspace,
2585*38e8c45fSAndroid Build Coastguard Worker             .targetLuminanceNits = 1000.f,
2586*38e8c45fSAndroid Build Coastguard Worker     };
2587*38e8c45fSAndroid Build Coastguard Worker 
2588*38e8c45fSAndroid Build Coastguard Worker     const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2589*38e8c45fSAndroid Build Coastguard Worker     const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2590*38e8c45fSAndroid Build Coastguard Worker     const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255));
2591*38e8c45fSAndroid Build Coastguard Worker 
2592*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings greenLayer{
2593*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2594*38e8c45fSAndroid Build Coastguard Worker             .source =
2595*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2596*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2597*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2598*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = greenBuffer,
2599*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2600*38e8c45fSAndroid Build Coastguard Worker                                     },
2601*38e8c45fSAndroid Build Coastguard Worker                     },
2602*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2603*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = dataspace,
2604*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = 200.f,
2605*38e8c45fSAndroid Build Coastguard Worker     };
2606*38e8c45fSAndroid Build Coastguard Worker 
2607*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings blueLayer{
2608*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2609*38e8c45fSAndroid Build Coastguard Worker             .source =
2610*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2611*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2612*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2613*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = blueBuffer,
2614*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2615*38e8c45fSAndroid Build Coastguard Worker                                     },
2616*38e8c45fSAndroid Build Coastguard Worker                     },
2617*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2618*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = dataspace,
2619*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = 1000.f / 51.f,
2620*38e8c45fSAndroid Build Coastguard Worker     };
2621*38e8c45fSAndroid Build Coastguard Worker 
2622*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings redLayer{
2623*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = FloatRect(2.f, 0.f, 3.f, 1.f),
2624*38e8c45fSAndroid Build Coastguard Worker             .source =
2625*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2626*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2627*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2628*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = redBuffer,
2629*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2630*38e8c45fSAndroid Build Coastguard Worker                                     },
2631*38e8c45fSAndroid Build Coastguard Worker                     },
2632*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2633*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = dataspace,
2634*38e8c45fSAndroid Build Coastguard Worker             // When the white point is not set for a layer, just ignore it and treat it as the same
2635*38e8c45fSAndroid Build Coastguard Worker             // as the max layer
2636*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = -1.f,
2637*38e8c45fSAndroid Build Coastguard Worker     };
2638*38e8c45fSAndroid Build Coastguard Worker 
2639*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{greenLayer, blueLayer, redLayer};
2640*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
2641*38e8c45fSAndroid Build Coastguard Worker 
2642*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(1, 1), 0, 51, 0, 255, 1);
2643*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(1, 0, 2, 1), 0, 0, 5, 255, 1);
2644*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(2, 0, 3, 1), 51, 0, 0, 255, 1);
2645*38e8c45fSAndroid Build Coastguard Worker }
2646*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,testDimming_inGammaSpace)2647*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, testDimming_inGammaSpace) {
2648*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2649*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2650*38e8c45fSAndroid Build Coastguard Worker     }
2651*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2652*38e8c45fSAndroid Build Coastguard Worker 
2653*38e8c45fSAndroid Build Coastguard Worker     const ui::Dataspace dataspace = static_cast<ui::Dataspace>(ui::Dataspace::STANDARD_BT709 |
2654*38e8c45fSAndroid Build Coastguard Worker                                                                ui::Dataspace::TRANSFER_GAMMA2_2 |
2655*38e8c45fSAndroid Build Coastguard Worker                                                                ui::Dataspace::RANGE_FULL);
2656*38e8c45fSAndroid Build Coastguard Worker 
2657*38e8c45fSAndroid Build Coastguard Worker     const auto displayRect = Rect(3, 1);
2658*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
2659*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = displayRect,
2660*38e8c45fSAndroid Build Coastguard Worker             .clip = displayRect,
2661*38e8c45fSAndroid Build Coastguard Worker             .outputDataspace = dataspace,
2662*38e8c45fSAndroid Build Coastguard Worker             .targetLuminanceNits = 1000.f,
2663*38e8c45fSAndroid Build Coastguard Worker             .dimmingStage = aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF,
2664*38e8c45fSAndroid Build Coastguard Worker     };
2665*38e8c45fSAndroid Build Coastguard Worker 
2666*38e8c45fSAndroid Build Coastguard Worker     const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2667*38e8c45fSAndroid Build Coastguard Worker     const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2668*38e8c45fSAndroid Build Coastguard Worker     const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255));
2669*38e8c45fSAndroid Build Coastguard Worker 
2670*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings greenLayer{
2671*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2672*38e8c45fSAndroid Build Coastguard Worker             .source =
2673*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2674*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2675*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2676*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = greenBuffer,
2677*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2678*38e8c45fSAndroid Build Coastguard Worker                                     },
2679*38e8c45fSAndroid Build Coastguard Worker                     },
2680*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2681*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = dataspace,
2682*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = 200.f,
2683*38e8c45fSAndroid Build Coastguard Worker     };
2684*38e8c45fSAndroid Build Coastguard Worker 
2685*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings blueLayer{
2686*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2687*38e8c45fSAndroid Build Coastguard Worker             .source =
2688*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2689*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2690*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2691*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = blueBuffer,
2692*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2693*38e8c45fSAndroid Build Coastguard Worker                                     },
2694*38e8c45fSAndroid Build Coastguard Worker                     },
2695*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2696*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = dataspace,
2697*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = 1000.f / 51.f,
2698*38e8c45fSAndroid Build Coastguard Worker     };
2699*38e8c45fSAndroid Build Coastguard Worker 
2700*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings redLayer{
2701*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = FloatRect(2.f, 0.f, 3.f, 1.f),
2702*38e8c45fSAndroid Build Coastguard Worker             .source =
2703*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2704*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2705*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2706*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = redBuffer,
2707*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2708*38e8c45fSAndroid Build Coastguard Worker                                     },
2709*38e8c45fSAndroid Build Coastguard Worker                     },
2710*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2711*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = dataspace,
2712*38e8c45fSAndroid Build Coastguard Worker             // When the white point is not set for a layer, just ignore it and treat it as the same
2713*38e8c45fSAndroid Build Coastguard Worker             // as the max layer
2714*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = -1.f,
2715*38e8c45fSAndroid Build Coastguard Worker     };
2716*38e8c45fSAndroid Build Coastguard Worker 
2717*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{greenLayer, blueLayer, redLayer};
2718*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
2719*38e8c45fSAndroid Build Coastguard Worker 
2720*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(1, 1), 0, 122, 0, 255, 1);
2721*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(1, 0, 2, 1), 0, 0, 42, 255, 1);
2722*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(2, 0, 3, 1), 122, 0, 0, 255, 1);
2723*38e8c45fSAndroid Build Coastguard Worker }
2724*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,testDimming_inGammaSpace_withDisplayColorTransform)2725*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, testDimming_inGammaSpace_withDisplayColorTransform) {
2726*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2727*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2728*38e8c45fSAndroid Build Coastguard Worker     }
2729*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2730*38e8c45fSAndroid Build Coastguard Worker 
2731*38e8c45fSAndroid Build Coastguard Worker     const ui::Dataspace dataspace = static_cast<ui::Dataspace>(ui::Dataspace::STANDARD_BT709 |
2732*38e8c45fSAndroid Build Coastguard Worker                                                                ui::Dataspace::TRANSFER_GAMMA2_2 |
2733*38e8c45fSAndroid Build Coastguard Worker                                                                ui::Dataspace::RANGE_FULL);
2734*38e8c45fSAndroid Build Coastguard Worker 
2735*38e8c45fSAndroid Build Coastguard Worker     const auto displayRect = Rect(3, 1);
2736*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
2737*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = displayRect,
2738*38e8c45fSAndroid Build Coastguard Worker             .clip = displayRect,
2739*38e8c45fSAndroid Build Coastguard Worker             .outputDataspace = dataspace,
2740*38e8c45fSAndroid Build Coastguard Worker             .colorTransform = kRemoveGreenAndMoveRedToGreenMat4,
2741*38e8c45fSAndroid Build Coastguard Worker             .targetLuminanceNits = 1000.f,
2742*38e8c45fSAndroid Build Coastguard Worker             .dimmingStage = aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF,
2743*38e8c45fSAndroid Build Coastguard Worker     };
2744*38e8c45fSAndroid Build Coastguard Worker 
2745*38e8c45fSAndroid Build Coastguard Worker     const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2746*38e8c45fSAndroid Build Coastguard Worker     const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2747*38e8c45fSAndroid Build Coastguard Worker     const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255));
2748*38e8c45fSAndroid Build Coastguard Worker 
2749*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings greenLayer{
2750*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2751*38e8c45fSAndroid Build Coastguard Worker             .source =
2752*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2753*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2754*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2755*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = greenBuffer,
2756*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2757*38e8c45fSAndroid Build Coastguard Worker                                     },
2758*38e8c45fSAndroid Build Coastguard Worker                     },
2759*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2760*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = dataspace,
2761*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = 200.f,
2762*38e8c45fSAndroid Build Coastguard Worker     };
2763*38e8c45fSAndroid Build Coastguard Worker 
2764*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings redLayer{
2765*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2766*38e8c45fSAndroid Build Coastguard Worker             .source =
2767*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2768*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2769*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2770*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = redBuffer,
2771*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2772*38e8c45fSAndroid Build Coastguard Worker                                     },
2773*38e8c45fSAndroid Build Coastguard Worker                     },
2774*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2775*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = dataspace,
2776*38e8c45fSAndroid Build Coastguard Worker             // When the white point is not set for a layer, just ignore it and treat it as the same
2777*38e8c45fSAndroid Build Coastguard Worker             // as the max layer
2778*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = -1.f,
2779*38e8c45fSAndroid Build Coastguard Worker     };
2780*38e8c45fSAndroid Build Coastguard Worker 
2781*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{greenLayer, redLayer};
2782*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
2783*38e8c45fSAndroid Build Coastguard Worker 
2784*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(1, 1), 0, 0, 0, 255, 1);
2785*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(1, 0, 2, 1), 0, 122, 0, 255, 1);
2786*38e8c45fSAndroid Build Coastguard Worker }
2787*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,testDimming_inGammaSpace_withDisplayColorTransform_deviceHandles)2788*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, testDimming_inGammaSpace_withDisplayColorTransform_deviceHandles) {
2789*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2790*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2791*38e8c45fSAndroid Build Coastguard Worker     }
2792*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2793*38e8c45fSAndroid Build Coastguard Worker 
2794*38e8c45fSAndroid Build Coastguard Worker     const ui::Dataspace dataspace = static_cast<ui::Dataspace>(ui::Dataspace::STANDARD_BT709 |
2795*38e8c45fSAndroid Build Coastguard Worker                                                                ui::Dataspace::TRANSFER_GAMMA2_2 |
2796*38e8c45fSAndroid Build Coastguard Worker                                                                ui::Dataspace::RANGE_FULL);
2797*38e8c45fSAndroid Build Coastguard Worker 
2798*38e8c45fSAndroid Build Coastguard Worker     const auto displayRect = Rect(3, 1);
2799*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
2800*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = displayRect,
2801*38e8c45fSAndroid Build Coastguard Worker             .clip = displayRect,
2802*38e8c45fSAndroid Build Coastguard Worker             .outputDataspace = dataspace,
2803*38e8c45fSAndroid Build Coastguard Worker             .colorTransform = kRemoveGreenAndMoveRedToGreenMat4,
2804*38e8c45fSAndroid Build Coastguard Worker             .deviceHandlesColorTransform = true,
2805*38e8c45fSAndroid Build Coastguard Worker             .targetLuminanceNits = 1000.f,
2806*38e8c45fSAndroid Build Coastguard Worker             .dimmingStage = aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF,
2807*38e8c45fSAndroid Build Coastguard Worker     };
2808*38e8c45fSAndroid Build Coastguard Worker 
2809*38e8c45fSAndroid Build Coastguard Worker     const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2810*38e8c45fSAndroid Build Coastguard Worker     const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2811*38e8c45fSAndroid Build Coastguard Worker     const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255));
2812*38e8c45fSAndroid Build Coastguard Worker 
2813*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings greenLayer{
2814*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2815*38e8c45fSAndroid Build Coastguard Worker             .source =
2816*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2817*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2818*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2819*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = greenBuffer,
2820*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2821*38e8c45fSAndroid Build Coastguard Worker                                     },
2822*38e8c45fSAndroid Build Coastguard Worker                     },
2823*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2824*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = dataspace,
2825*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = 200.f,
2826*38e8c45fSAndroid Build Coastguard Worker     };
2827*38e8c45fSAndroid Build Coastguard Worker 
2828*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings redLayer{
2829*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2830*38e8c45fSAndroid Build Coastguard Worker             .source =
2831*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2832*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2833*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2834*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = redBuffer,
2835*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2836*38e8c45fSAndroid Build Coastguard Worker                                     },
2837*38e8c45fSAndroid Build Coastguard Worker                     },
2838*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2839*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = dataspace,
2840*38e8c45fSAndroid Build Coastguard Worker             // When the white point is not set for a layer, just ignore it and treat it as the same
2841*38e8c45fSAndroid Build Coastguard Worker             // as the max layer
2842*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = -1.f,
2843*38e8c45fSAndroid Build Coastguard Worker     };
2844*38e8c45fSAndroid Build Coastguard Worker 
2845*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{greenLayer, redLayer};
2846*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
2847*38e8c45fSAndroid Build Coastguard Worker 
2848*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(1, 1), 0, 122, 0, 255, 1);
2849*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(1, 0, 2, 1), 122, 0, 0, 255, 1);
2850*38e8c45fSAndroid Build Coastguard Worker }
2851*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,testDimming_withoutTargetLuminance)2852*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, testDimming_withoutTargetLuminance) {
2853*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2854*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2855*38e8c45fSAndroid Build Coastguard Worker     }
2856*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2857*38e8c45fSAndroid Build Coastguard Worker 
2858*38e8c45fSAndroid Build Coastguard Worker     const auto displayRect = Rect(2, 1);
2859*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
2860*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = displayRect,
2861*38e8c45fSAndroid Build Coastguard Worker             .clip = displayRect,
2862*38e8c45fSAndroid Build Coastguard Worker             .outputDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2863*38e8c45fSAndroid Build Coastguard Worker             .targetLuminanceNits = -1.f,
2864*38e8c45fSAndroid Build Coastguard Worker     };
2865*38e8c45fSAndroid Build Coastguard Worker 
2866*38e8c45fSAndroid Build Coastguard Worker     const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255));
2867*38e8c45fSAndroid Build Coastguard Worker     const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255));
2868*38e8c45fSAndroid Build Coastguard Worker 
2869*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings greenLayer{
2870*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f),
2871*38e8c45fSAndroid Build Coastguard Worker             .source =
2872*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2873*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2874*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2875*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = greenBuffer,
2876*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2877*38e8c45fSAndroid Build Coastguard Worker                                     },
2878*38e8c45fSAndroid Build Coastguard Worker                     },
2879*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2880*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2881*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = 200.f,
2882*38e8c45fSAndroid Build Coastguard Worker     };
2883*38e8c45fSAndroid Build Coastguard Worker 
2884*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings blueLayer{
2885*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f),
2886*38e8c45fSAndroid Build Coastguard Worker             .source =
2887*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2888*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2889*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2890*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = blueBuffer,
2891*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2892*38e8c45fSAndroid Build Coastguard Worker                                     },
2893*38e8c45fSAndroid Build Coastguard Worker                     },
2894*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2895*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR,
2896*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = 1000.f,
2897*38e8c45fSAndroid Build Coastguard Worker     };
2898*38e8c45fSAndroid Build Coastguard Worker 
2899*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{greenLayer, blueLayer};
2900*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
2901*38e8c45fSAndroid Build Coastguard Worker 
2902*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(1, 1), 0, 51, 0, 255, 1);
2903*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(1, 0, 2, 1), 0, 0, 255, 255);
2904*38e8c45fSAndroid Build Coastguard Worker }
2905*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,test_isOpaque)2906*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, test_isOpaque) {
2907*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2908*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2909*38e8c45fSAndroid Build Coastguard Worker     }
2910*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2911*38e8c45fSAndroid Build Coastguard Worker 
2912*38e8c45fSAndroid Build Coastguard Worker     const auto rect = Rect(0, 0, 1, 1);
2913*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
2914*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = rect,
2915*38e8c45fSAndroid Build Coastguard Worker             .clip = rect,
2916*38e8c45fSAndroid Build Coastguard Worker             .outputDataspace = ui::Dataspace::DISPLAY_P3,
2917*38e8c45fSAndroid Build Coastguard Worker     };
2918*38e8c45fSAndroid Build Coastguard Worker 
2919*38e8c45fSAndroid Build Coastguard Worker     // Create an unpremul buffer that is green with no alpha. Using isOpaque
2920*38e8c45fSAndroid Build Coastguard Worker     // should make the green show.
2921*38e8c45fSAndroid Build Coastguard Worker     const auto buf = allocateSourceBuffer(1, 1);
2922*38e8c45fSAndroid Build Coastguard Worker     {
2923*38e8c45fSAndroid Build Coastguard Worker         uint8_t* pixels;
2924*38e8c45fSAndroid Build Coastguard Worker         buf->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
2925*38e8c45fSAndroid Build Coastguard Worker                                reinterpret_cast<void**>(&pixels));
2926*38e8c45fSAndroid Build Coastguard Worker         pixels[0] = 0;
2927*38e8c45fSAndroid Build Coastguard Worker         pixels[1] = 255;
2928*38e8c45fSAndroid Build Coastguard Worker         pixels[2] = 0;
2929*38e8c45fSAndroid Build Coastguard Worker         pixels[3] = 0;
2930*38e8c45fSAndroid Build Coastguard Worker         buf->getBuffer()->unlock();
2931*38e8c45fSAndroid Build Coastguard Worker     }
2932*38e8c45fSAndroid Build Coastguard Worker 
2933*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings greenLayer{
2934*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
2935*38e8c45fSAndroid Build Coastguard Worker             .source =
2936*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
2937*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
2938*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
2939*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = buf,
2940*38e8c45fSAndroid Build Coastguard Worker                                             // Although the pixels are not
2941*38e8c45fSAndroid Build Coastguard Worker                                             // premultiplied in practice, this
2942*38e8c45fSAndroid Build Coastguard Worker                                             // matches the input we see.
2943*38e8c45fSAndroid Build Coastguard Worker                                             .usePremultipliedAlpha = true,
2944*38e8c45fSAndroid Build Coastguard Worker                                             .isOpaque = true,
2945*38e8c45fSAndroid Build Coastguard Worker                                     },
2946*38e8c45fSAndroid Build Coastguard Worker                     },
2947*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
2948*38e8c45fSAndroid Build Coastguard Worker     };
2949*38e8c45fSAndroid Build Coastguard Worker 
2950*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{greenLayer};
2951*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
2952*38e8c45fSAndroid Build Coastguard Worker 
2953*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(rect, 117, 251, 76, 255);
2954*38e8c45fSAndroid Build Coastguard Worker }
2955*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,test_tonemapPQMatches)2956*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, test_tonemapPQMatches) {
2957*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2958*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2959*38e8c45fSAndroid Build Coastguard Worker     }
2960*38e8c45fSAndroid Build Coastguard Worker 
2961*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2962*38e8c45fSAndroid Build Coastguard Worker 
2963*38e8c45fSAndroid Build Coastguard Worker     tonemap(
2964*38e8c45fSAndroid Build Coastguard Worker             static_cast<ui::Dataspace>(HAL_DATASPACE_STANDARD_BT2020 |
2965*38e8c45fSAndroid Build Coastguard Worker                                        HAL_DATASPACE_TRANSFER_ST2084 | HAL_DATASPACE_RANGE_FULL),
2966*38e8c45fSAndroid Build Coastguard Worker             [](vec3 color) { return EOTF_PQ(color); },
2967*38e8c45fSAndroid Build Coastguard Worker             [](vec3 color, float) {
2968*38e8c45fSAndroid Build Coastguard Worker                 static constexpr float kMaxPQLuminance = 10000.f;
2969*38e8c45fSAndroid Build Coastguard Worker                 return color * kMaxPQLuminance;
2970*38e8c45fSAndroid Build Coastguard Worker             });
2971*38e8c45fSAndroid Build Coastguard Worker }
2972*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,test_tonemapHLGMatches)2973*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, test_tonemapHLGMatches) {
2974*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2975*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2976*38e8c45fSAndroid Build Coastguard Worker     }
2977*38e8c45fSAndroid Build Coastguard Worker 
2978*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2979*38e8c45fSAndroid Build Coastguard Worker 
2980*38e8c45fSAndroid Build Coastguard Worker     tonemap(
2981*38e8c45fSAndroid Build Coastguard Worker             static_cast<ui::Dataspace>(HAL_DATASPACE_STANDARD_BT2020 | HAL_DATASPACE_TRANSFER_HLG |
2982*38e8c45fSAndroid Build Coastguard Worker                                        HAL_DATASPACE_RANGE_FULL),
2983*38e8c45fSAndroid Build Coastguard Worker             [](vec3 color) { return EOTF_HLG(color); },
2984*38e8c45fSAndroid Build Coastguard Worker             [](vec3 color, float currentLuminaceNits) {
2985*38e8c45fSAndroid Build Coastguard Worker                 static constexpr float kMaxHLGLuminance = 1000.f;
2986*38e8c45fSAndroid Build Coastguard Worker                 return color * kMaxHLGLuminance;
2987*38e8c45fSAndroid Build Coastguard Worker             });
2988*38e8c45fSAndroid Build Coastguard Worker }
2989*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,r8_behaves_as_mask)2990*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, r8_behaves_as_mask) {
2991*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
2992*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
2993*38e8c45fSAndroid Build Coastguard Worker     }
2994*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
2995*38e8c45fSAndroid Build Coastguard Worker 
2996*38e8c45fSAndroid Build Coastguard Worker     const auto r8Buffer = allocateR8Buffer(2, 1);
2997*38e8c45fSAndroid Build Coastguard Worker     if (!r8Buffer) {
2998*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP() << "Test is only necessary on devices that support r8";
2999*38e8c45fSAndroid Build Coastguard Worker         return;
3000*38e8c45fSAndroid Build Coastguard Worker     }
3001*38e8c45fSAndroid Build Coastguard Worker     {
3002*38e8c45fSAndroid Build Coastguard Worker         uint8_t* pixels;
3003*38e8c45fSAndroid Build Coastguard Worker         r8Buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
3004*38e8c45fSAndroid Build Coastguard Worker                                     reinterpret_cast<void**>(&pixels));
3005*38e8c45fSAndroid Build Coastguard Worker         // This will be drawn on top of a green buffer. We'll verify that 255
3006*38e8c45fSAndroid Build Coastguard Worker         // results in keeping the original green and 0 results in black.
3007*38e8c45fSAndroid Build Coastguard Worker         pixels[0] = 0;
3008*38e8c45fSAndroid Build Coastguard Worker         pixels[1] = 255;
3009*38e8c45fSAndroid Build Coastguard Worker         r8Buffer->getBuffer()->unlock();
3010*38e8c45fSAndroid Build Coastguard Worker     }
3011*38e8c45fSAndroid Build Coastguard Worker 
3012*38e8c45fSAndroid Build Coastguard Worker     const auto rect = Rect(0, 0, 2, 1);
3013*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
3014*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = rect,
3015*38e8c45fSAndroid Build Coastguard Worker             .clip = rect,
3016*38e8c45fSAndroid Build Coastguard Worker             .outputDataspace = ui::Dataspace::SRGB,
3017*38e8c45fSAndroid Build Coastguard Worker     };
3018*38e8c45fSAndroid Build Coastguard Worker 
3019*38e8c45fSAndroid Build Coastguard Worker     const auto greenBuffer = allocateAndFillSourceBuffer(2, 1, ubyte4(0, 255, 0, 255));
3020*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings greenLayer{
3021*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
3022*38e8c45fSAndroid Build Coastguard Worker             .source =
3023*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
3024*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
3025*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
3026*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = greenBuffer,
3027*38e8c45fSAndroid Build Coastguard Worker                                     },
3028*38e8c45fSAndroid Build Coastguard Worker                     },
3029*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
3030*38e8c45fSAndroid Build Coastguard Worker     };
3031*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings r8Layer{
3032*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
3033*38e8c45fSAndroid Build Coastguard Worker             .source =
3034*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
3035*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
3036*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
3037*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = r8Buffer,
3038*38e8c45fSAndroid Build Coastguard Worker                                     },
3039*38e8c45fSAndroid Build Coastguard Worker                     },
3040*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
3041*38e8c45fSAndroid Build Coastguard Worker     };
3042*38e8c45fSAndroid Build Coastguard Worker 
3043*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{greenLayer, r8Layer};
3044*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
3045*38e8c45fSAndroid Build Coastguard Worker 
3046*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, 1, 1), 0,   0, 0, 255);
3047*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(1, 0, 2, 1), 0, 255, 0, 255);
3048*38e8c45fSAndroid Build Coastguard Worker }
3049*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,r8_respects_color_transform)3050*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, r8_respects_color_transform) {
3051*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
3052*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
3053*38e8c45fSAndroid Build Coastguard Worker     }
3054*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
3055*38e8c45fSAndroid Build Coastguard Worker 
3056*38e8c45fSAndroid Build Coastguard Worker     const auto r8Buffer = allocateR8Buffer(2, 1);
3057*38e8c45fSAndroid Build Coastguard Worker     if (!r8Buffer) {
3058*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP() << "Test is only necessary on devices that support r8";
3059*38e8c45fSAndroid Build Coastguard Worker         return;
3060*38e8c45fSAndroid Build Coastguard Worker     }
3061*38e8c45fSAndroid Build Coastguard Worker     {
3062*38e8c45fSAndroid Build Coastguard Worker         uint8_t* pixels;
3063*38e8c45fSAndroid Build Coastguard Worker         r8Buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
3064*38e8c45fSAndroid Build Coastguard Worker                                     reinterpret_cast<void**>(&pixels));
3065*38e8c45fSAndroid Build Coastguard Worker         pixels[0] = 0;
3066*38e8c45fSAndroid Build Coastguard Worker         pixels[1] = 255;
3067*38e8c45fSAndroid Build Coastguard Worker         r8Buffer->getBuffer()->unlock();
3068*38e8c45fSAndroid Build Coastguard Worker     }
3069*38e8c45fSAndroid Build Coastguard Worker 
3070*38e8c45fSAndroid Build Coastguard Worker     const auto rect = Rect(0, 0, 2, 1);
3071*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
3072*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = rect,
3073*38e8c45fSAndroid Build Coastguard Worker             .clip = rect,
3074*38e8c45fSAndroid Build Coastguard Worker             .outputDataspace = ui::Dataspace::SRGB,
3075*38e8c45fSAndroid Build Coastguard Worker             // Verify that the R8 layer respects the color transform when
3076*38e8c45fSAndroid Build Coastguard Worker             // deviceHandlesColorTransform is false. This transform converts
3077*38e8c45fSAndroid Build Coastguard Worker             // pure red to pure green. That will occur when the R8 buffer is
3078*38e8c45fSAndroid Build Coastguard Worker             // 255. When the R8 buffer is 0, it will still change to black, as
3079*38e8c45fSAndroid Build Coastguard Worker             // with r8_behaves_as_mask.
3080*38e8c45fSAndroid Build Coastguard Worker             .colorTransform = kRemoveGreenAndMoveRedToGreenMat4,
3081*38e8c45fSAndroid Build Coastguard Worker             .deviceHandlesColorTransform = false,
3082*38e8c45fSAndroid Build Coastguard Worker     };
3083*38e8c45fSAndroid Build Coastguard Worker 
3084*38e8c45fSAndroid Build Coastguard Worker     const auto redBuffer = allocateAndFillSourceBuffer(2, 1, ubyte4(255, 0, 0, 255));
3085*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings redLayer{
3086*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
3087*38e8c45fSAndroid Build Coastguard Worker             .source =
3088*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
3089*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
3090*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
3091*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = redBuffer,
3092*38e8c45fSAndroid Build Coastguard Worker                                     },
3093*38e8c45fSAndroid Build Coastguard Worker                     },
3094*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
3095*38e8c45fSAndroid Build Coastguard Worker     };
3096*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings r8Layer{
3097*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
3098*38e8c45fSAndroid Build Coastguard Worker             .source =
3099*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
3100*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
3101*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
3102*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = r8Buffer,
3103*38e8c45fSAndroid Build Coastguard Worker                                     },
3104*38e8c45fSAndroid Build Coastguard Worker                     },
3105*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
3106*38e8c45fSAndroid Build Coastguard Worker     };
3107*38e8c45fSAndroid Build Coastguard Worker 
3108*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{redLayer, r8Layer};
3109*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
3110*38e8c45fSAndroid Build Coastguard Worker 
3111*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, 1, 1), 0,   0, 0, 255);
3112*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(1, 0, 2, 1), 0, 255, 0, 255);
3113*38e8c45fSAndroid Build Coastguard Worker }
3114*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,r8_respects_color_transform_when_device_handles)3115*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, r8_respects_color_transform_when_device_handles) {
3116*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
3117*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
3118*38e8c45fSAndroid Build Coastguard Worker     }
3119*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
3120*38e8c45fSAndroid Build Coastguard Worker 
3121*38e8c45fSAndroid Build Coastguard Worker     const auto r8Buffer = allocateR8Buffer(2, 1);
3122*38e8c45fSAndroid Build Coastguard Worker     if (!r8Buffer) {
3123*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP() << "Test is only necessary on devices that support r8";
3124*38e8c45fSAndroid Build Coastguard Worker         return;
3125*38e8c45fSAndroid Build Coastguard Worker     }
3126*38e8c45fSAndroid Build Coastguard Worker     {
3127*38e8c45fSAndroid Build Coastguard Worker         uint8_t* pixels;
3128*38e8c45fSAndroid Build Coastguard Worker         r8Buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
3129*38e8c45fSAndroid Build Coastguard Worker                                     reinterpret_cast<void**>(&pixels));
3130*38e8c45fSAndroid Build Coastguard Worker         pixels[0] = 0;
3131*38e8c45fSAndroid Build Coastguard Worker         pixels[1] = 255;
3132*38e8c45fSAndroid Build Coastguard Worker         r8Buffer->getBuffer()->unlock();
3133*38e8c45fSAndroid Build Coastguard Worker     }
3134*38e8c45fSAndroid Build Coastguard Worker 
3135*38e8c45fSAndroid Build Coastguard Worker     const auto rect = Rect(0, 0, 2, 1);
3136*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
3137*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = rect,
3138*38e8c45fSAndroid Build Coastguard Worker             .clip = rect,
3139*38e8c45fSAndroid Build Coastguard Worker             .outputDataspace = ui::Dataspace::SRGB,
3140*38e8c45fSAndroid Build Coastguard Worker             // If deviceHandlesColorTransform is true, pixels where the A8
3141*38e8c45fSAndroid Build Coastguard Worker             // buffer is opaque are unaffected. If the colorTransform is
3142*38e8c45fSAndroid Build Coastguard Worker             // invertible, pixels where the A8 buffer are transparent have the
3143*38e8c45fSAndroid Build Coastguard Worker             // inverse applied to them so that the DPU will convert them back to
3144*38e8c45fSAndroid Build Coastguard Worker             // black. Test with an arbitrary, invertible matrix.
3145*38e8c45fSAndroid Build Coastguard Worker             .colorTransform = mat4(1, 0, 0, 2,
3146*38e8c45fSAndroid Build Coastguard Worker                                    3, 1, 2, 5,
3147*38e8c45fSAndroid Build Coastguard Worker                                    0, 5, 3, 0,
3148*38e8c45fSAndroid Build Coastguard Worker                                    0, 1, 0, 2),
3149*38e8c45fSAndroid Build Coastguard Worker             .deviceHandlesColorTransform = true,
3150*38e8c45fSAndroid Build Coastguard Worker     };
3151*38e8c45fSAndroid Build Coastguard Worker 
3152*38e8c45fSAndroid Build Coastguard Worker     const auto redBuffer = allocateAndFillSourceBuffer(2, 1, ubyte4(255, 0, 0, 255));
3153*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings redLayer{
3154*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
3155*38e8c45fSAndroid Build Coastguard Worker             .source =
3156*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
3157*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
3158*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
3159*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = redBuffer,
3160*38e8c45fSAndroid Build Coastguard Worker                                     },
3161*38e8c45fSAndroid Build Coastguard Worker                     },
3162*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
3163*38e8c45fSAndroid Build Coastguard Worker     };
3164*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings r8Layer{
3165*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
3166*38e8c45fSAndroid Build Coastguard Worker             .source =
3167*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
3168*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
3169*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
3170*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = r8Buffer,
3171*38e8c45fSAndroid Build Coastguard Worker                                     },
3172*38e8c45fSAndroid Build Coastguard Worker                     },
3173*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
3174*38e8c45fSAndroid Build Coastguard Worker     };
3175*38e8c45fSAndroid Build Coastguard Worker 
3176*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{redLayer, r8Layer};
3177*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
3178*38e8c45fSAndroid Build Coastguard Worker 
3179*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(1, 0, 2, 1), 255, 0, 0, 255); // Still red.
3180*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, 1, 1), 0,  70, 0, 255);
3181*38e8c45fSAndroid Build Coastguard Worker }
3182*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,localTonemap_preservesFullscreenSdr)3183*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, localTonemap_preservesFullscreenSdr) {
3184*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
3185*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
3186*38e8c45fSAndroid Build Coastguard Worker     }
3187*38e8c45fSAndroid Build Coastguard Worker 
3188*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
3189*38e8c45fSAndroid Build Coastguard Worker 
3190*38e8c45fSAndroid Build Coastguard Worker     mBuffer = std::make_shared<
3191*38e8c45fSAndroid Build Coastguard Worker             renderengine::impl::
3192*38e8c45fSAndroid Build Coastguard Worker                     ExternalTexture>(sp<GraphicBuffer>::make(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1,
3193*38e8c45fSAndroid Build Coastguard Worker                                                              GRALLOC_USAGE_SW_READ_OFTEN |
3194*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_SW_WRITE_OFTEN |
3195*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_HW_RENDER |
3196*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_HW_TEXTURE,
3197*38e8c45fSAndroid Build Coastguard Worker                                                              "output"),
3198*38e8c45fSAndroid Build Coastguard Worker                                      *mRE,
3199*38e8c45fSAndroid Build Coastguard Worker                                      renderengine::impl::ExternalTexture::Usage::READABLE |
3200*38e8c45fSAndroid Build Coastguard Worker                                              renderengine::impl::ExternalTexture::Usage::WRITEABLE);
3201*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(0, mBuffer->getBuffer()->initCheck());
3202*38e8c45fSAndroid Build Coastguard Worker 
3203*38e8c45fSAndroid Build Coastguard Worker     const auto whiteBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(51, 51, 51, 255));
3204*38e8c45fSAndroid Build Coastguard Worker 
3205*38e8c45fSAndroid Build Coastguard Worker     const auto rect = Rect(0, 0, 1, 1);
3206*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
3207*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = rect,
3208*38e8c45fSAndroid Build Coastguard Worker             .clip = rect,
3209*38e8c45fSAndroid Build Coastguard Worker             .outputDataspace = ui::Dataspace::SRGB,
3210*38e8c45fSAndroid Build Coastguard Worker             .targetLuminanceNits = 40,
3211*38e8c45fSAndroid Build Coastguard Worker             .tonemapStrategy = renderengine::DisplaySettings::TonemapStrategy::Local,
3212*38e8c45fSAndroid Build Coastguard Worker     };
3213*38e8c45fSAndroid Build Coastguard Worker 
3214*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings whiteLayer{
3215*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
3216*38e8c45fSAndroid Build Coastguard Worker             .source =
3217*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
3218*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
3219*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
3220*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = whiteBuffer,
3221*38e8c45fSAndroid Build Coastguard Worker                                     },
3222*38e8c45fSAndroid Build Coastguard Worker                     },
3223*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
3224*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = ui::Dataspace::V0_SCRGB_LINEAR,
3225*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = 200,
3226*38e8c45fSAndroid Build Coastguard Worker     };
3227*38e8c45fSAndroid Build Coastguard Worker 
3228*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{whiteLayer};
3229*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
3230*38e8c45fSAndroid Build Coastguard Worker 
3231*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, 1, 1), 255, 255, 255, 255);
3232*38e8c45fSAndroid Build Coastguard Worker }
3233*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,localTonemap_preservesFarawaySdrRegions)3234*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, localTonemap_preservesFarawaySdrRegions) {
3235*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
3236*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
3237*38e8c45fSAndroid Build Coastguard Worker     }
3238*38e8c45fSAndroid Build Coastguard Worker 
3239*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
3240*38e8c45fSAndroid Build Coastguard Worker 
3241*38e8c45fSAndroid Build Coastguard Worker     const auto blockWidth = 256;
3242*38e8c45fSAndroid Build Coastguard Worker     const auto width = blockWidth * 4;
3243*38e8c45fSAndroid Build Coastguard Worker 
3244*38e8c45fSAndroid Build Coastguard Worker     const auto buffer = allocateSourceBuffer(width, 1);
3245*38e8c45fSAndroid Build Coastguard Worker 
3246*38e8c45fSAndroid Build Coastguard Worker     mBuffer = std::make_shared<
3247*38e8c45fSAndroid Build Coastguard Worker             renderengine::impl::
3248*38e8c45fSAndroid Build Coastguard Worker                     ExternalTexture>(sp<GraphicBuffer>::make(width, 1, HAL_PIXEL_FORMAT_RGBA_8888,
3249*38e8c45fSAndroid Build Coastguard Worker                                                              1,
3250*38e8c45fSAndroid Build Coastguard Worker                                                              GRALLOC_USAGE_SW_READ_OFTEN |
3251*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_SW_WRITE_OFTEN |
3252*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_HW_RENDER |
3253*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_HW_TEXTURE,
3254*38e8c45fSAndroid Build Coastguard Worker                                                              "output"),
3255*38e8c45fSAndroid Build Coastguard Worker                                      *mRE,
3256*38e8c45fSAndroid Build Coastguard Worker                                      renderengine::impl::ExternalTexture::Usage::READABLE |
3257*38e8c45fSAndroid Build Coastguard Worker                                              renderengine::impl::ExternalTexture::Usage::WRITEABLE);
3258*38e8c45fSAndroid Build Coastguard Worker 
3259*38e8c45fSAndroid Build Coastguard Worker     {
3260*38e8c45fSAndroid Build Coastguard Worker         uint8_t* pixels;
3261*38e8c45fSAndroid Build Coastguard Worker         buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
3262*38e8c45fSAndroid Build Coastguard Worker                                   reinterpret_cast<void**>(&pixels));
3263*38e8c45fSAndroid Build Coastguard Worker         uint8_t* dst = pixels;
3264*38e8c45fSAndroid Build Coastguard Worker         for (uint32_t i = 0; i < width; i++) {
3265*38e8c45fSAndroid Build Coastguard Worker             uint8_t value = 0;
3266*38e8c45fSAndroid Build Coastguard Worker             if (i < blockWidth) {
3267*38e8c45fSAndroid Build Coastguard Worker                 value = 51;
3268*38e8c45fSAndroid Build Coastguard Worker             } else if (i >= blockWidth * 3) {
3269*38e8c45fSAndroid Build Coastguard Worker                 value = 255;
3270*38e8c45fSAndroid Build Coastguard Worker             }
3271*38e8c45fSAndroid Build Coastguard Worker             dst[0] = value;
3272*38e8c45fSAndroid Build Coastguard Worker             dst[1] = value;
3273*38e8c45fSAndroid Build Coastguard Worker             dst[2] = value;
3274*38e8c45fSAndroid Build Coastguard Worker             dst[3] = 255;
3275*38e8c45fSAndroid Build Coastguard Worker             dst += 4;
3276*38e8c45fSAndroid Build Coastguard Worker         }
3277*38e8c45fSAndroid Build Coastguard Worker         buffer->getBuffer()->unlock();
3278*38e8c45fSAndroid Build Coastguard Worker     }
3279*38e8c45fSAndroid Build Coastguard Worker 
3280*38e8c45fSAndroid Build Coastguard Worker     const auto rect = Rect(0, 0, width, 1);
3281*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
3282*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = rect,
3283*38e8c45fSAndroid Build Coastguard Worker             .clip = rect,
3284*38e8c45fSAndroid Build Coastguard Worker             .outputDataspace = ui::Dataspace::V0_SRGB_LINEAR,
3285*38e8c45fSAndroid Build Coastguard Worker             .targetLuminanceNits = 40,
3286*38e8c45fSAndroid Build Coastguard Worker             .tonemapStrategy = renderengine::DisplaySettings::TonemapStrategy::Local,
3287*38e8c45fSAndroid Build Coastguard Worker     };
3288*38e8c45fSAndroid Build Coastguard Worker 
3289*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings whiteLayer{
3290*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
3291*38e8c45fSAndroid Build Coastguard Worker             .source =
3292*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
3293*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
3294*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
3295*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = buffer,
3296*38e8c45fSAndroid Build Coastguard Worker                                     },
3297*38e8c45fSAndroid Build Coastguard Worker                     },
3298*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
3299*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = ui::Dataspace::V0_SCRGB_LINEAR,
3300*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = 200,
3301*38e8c45fSAndroid Build Coastguard Worker     };
3302*38e8c45fSAndroid Build Coastguard Worker 
3303*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{whiteLayer};
3304*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
3305*38e8c45fSAndroid Build Coastguard Worker 
3306*38e8c45fSAndroid Build Coastguard Worker     // SDR regions are boosted to preserve SDR detail.
3307*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, blockWidth, 1), 255, 255, 255, 255);
3308*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(blockWidth, 0, blockWidth * 2, 1), 0, 0, 0, 255);
3309*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(blockWidth * 2, 0, blockWidth * 3, 1), 0, 0, 0, 255);
3310*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(blockWidth * 3, 0, blockWidth * 4, 1), 255, 255, 255, 255);
3311*38e8c45fSAndroid Build Coastguard Worker }
3312*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,localTonemap_tonemapsNearbySdrRegions)3313*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, localTonemap_tonemapsNearbySdrRegions) {
3314*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
3315*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
3316*38e8c45fSAndroid Build Coastguard Worker     }
3317*38e8c45fSAndroid Build Coastguard Worker 
3318*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
3319*38e8c45fSAndroid Build Coastguard Worker 
3320*38e8c45fSAndroid Build Coastguard Worker     const auto blockWidth = 2;
3321*38e8c45fSAndroid Build Coastguard Worker     const auto width = blockWidth * 2;
3322*38e8c45fSAndroid Build Coastguard Worker 
3323*38e8c45fSAndroid Build Coastguard Worker     mBuffer = std::make_shared<
3324*38e8c45fSAndroid Build Coastguard Worker             renderengine::impl::
3325*38e8c45fSAndroid Build Coastguard Worker                     ExternalTexture>(sp<GraphicBuffer>::make(width, 1, HAL_PIXEL_FORMAT_RGBA_8888,
3326*38e8c45fSAndroid Build Coastguard Worker                                                              1,
3327*38e8c45fSAndroid Build Coastguard Worker                                                              GRALLOC_USAGE_SW_READ_OFTEN |
3328*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_SW_WRITE_OFTEN |
3329*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_HW_RENDER |
3330*38e8c45fSAndroid Build Coastguard Worker                                                                      GRALLOC_USAGE_HW_TEXTURE,
3331*38e8c45fSAndroid Build Coastguard Worker                                                              "output"),
3332*38e8c45fSAndroid Build Coastguard Worker                                      *mRE,
3333*38e8c45fSAndroid Build Coastguard Worker                                      renderengine::impl::ExternalTexture::Usage::READABLE |
3334*38e8c45fSAndroid Build Coastguard Worker                                              renderengine::impl::ExternalTexture::Usage::WRITEABLE);
3335*38e8c45fSAndroid Build Coastguard Worker 
3336*38e8c45fSAndroid Build Coastguard Worker     const auto buffer = allocateSourceBuffer(width, 1);
3337*38e8c45fSAndroid Build Coastguard Worker 
3338*38e8c45fSAndroid Build Coastguard Worker     {
3339*38e8c45fSAndroid Build Coastguard Worker         uint8_t* pixels;
3340*38e8c45fSAndroid Build Coastguard Worker         buffer->getBuffer()->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
3341*38e8c45fSAndroid Build Coastguard Worker                                   reinterpret_cast<void**>(&pixels));
3342*38e8c45fSAndroid Build Coastguard Worker         uint8_t* dst = pixels;
3343*38e8c45fSAndroid Build Coastguard Worker         for (uint32_t i = 0; i < width; i++) {
3344*38e8c45fSAndroid Build Coastguard Worker             uint8_t value = 0;
3345*38e8c45fSAndroid Build Coastguard Worker             if (i < blockWidth) {
3346*38e8c45fSAndroid Build Coastguard Worker                 value = 51;
3347*38e8c45fSAndroid Build Coastguard Worker             } else if (i >= blockWidth) {
3348*38e8c45fSAndroid Build Coastguard Worker                 value = 255;
3349*38e8c45fSAndroid Build Coastguard Worker             }
3350*38e8c45fSAndroid Build Coastguard Worker             dst[0] = value;
3351*38e8c45fSAndroid Build Coastguard Worker             dst[1] = value;
3352*38e8c45fSAndroid Build Coastguard Worker             dst[2] = value;
3353*38e8c45fSAndroid Build Coastguard Worker             dst[3] = 255;
3354*38e8c45fSAndroid Build Coastguard Worker             dst += 4;
3355*38e8c45fSAndroid Build Coastguard Worker         }
3356*38e8c45fSAndroid Build Coastguard Worker         buffer->getBuffer()->unlock();
3357*38e8c45fSAndroid Build Coastguard Worker     }
3358*38e8c45fSAndroid Build Coastguard Worker 
3359*38e8c45fSAndroid Build Coastguard Worker     const auto rect = Rect(0, 0, width, 1);
3360*38e8c45fSAndroid Build Coastguard Worker     const renderengine::DisplaySettings display{
3361*38e8c45fSAndroid Build Coastguard Worker             .physicalDisplay = rect,
3362*38e8c45fSAndroid Build Coastguard Worker             .clip = rect,
3363*38e8c45fSAndroid Build Coastguard Worker             .outputDataspace = ui::Dataspace::V0_SRGB_LINEAR,
3364*38e8c45fSAndroid Build Coastguard Worker             .targetLuminanceNits = 40,
3365*38e8c45fSAndroid Build Coastguard Worker             .tonemapStrategy = renderengine::DisplaySettings::TonemapStrategy::Local,
3366*38e8c45fSAndroid Build Coastguard Worker     };
3367*38e8c45fSAndroid Build Coastguard Worker 
3368*38e8c45fSAndroid Build Coastguard Worker     const renderengine::LayerSettings whiteLayer{
3369*38e8c45fSAndroid Build Coastguard Worker             .geometry.boundaries = rect.toFloatRect(),
3370*38e8c45fSAndroid Build Coastguard Worker             .source =
3371*38e8c45fSAndroid Build Coastguard Worker                     renderengine::PixelSource{
3372*38e8c45fSAndroid Build Coastguard Worker                             .buffer =
3373*38e8c45fSAndroid Build Coastguard Worker                                     renderengine::Buffer{
3374*38e8c45fSAndroid Build Coastguard Worker                                             .buffer = buffer,
3375*38e8c45fSAndroid Build Coastguard Worker                                     },
3376*38e8c45fSAndroid Build Coastguard Worker                     },
3377*38e8c45fSAndroid Build Coastguard Worker             .alpha = 1.0f,
3378*38e8c45fSAndroid Build Coastguard Worker             .sourceDataspace = ui::Dataspace::V0_SCRGB_LINEAR,
3379*38e8c45fSAndroid Build Coastguard Worker             .whitePointNits = 200,
3380*38e8c45fSAndroid Build Coastguard Worker     };
3381*38e8c45fSAndroid Build Coastguard Worker 
3382*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers{whiteLayer};
3383*38e8c45fSAndroid Build Coastguard Worker     invokeDraw(display, layers);
3384*38e8c45fSAndroid Build Coastguard Worker 
3385*38e8c45fSAndroid Build Coastguard Worker     // SDR regions remain "dimmed", but preserve detail with a roll-off curve.
3386*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(0, 0, blockWidth, 1), 132, 132, 132, 255, 2);
3387*38e8c45fSAndroid Build Coastguard Worker     // HDR regions are not dimmed.
3388*38e8c45fSAndroid Build Coastguard Worker     expectBufferColor(Rect(blockWidth, 0, blockWidth * 2, 1), 255, 255, 255, 255);
3389*38e8c45fSAndroid Build Coastguard Worker }
3390*38e8c45fSAndroid Build Coastguard Worker 
TEST_P(RenderEngineTest,primeShaderCache)3391*38e8c45fSAndroid Build Coastguard Worker TEST_P(RenderEngineTest, primeShaderCache) {
3392*38e8c45fSAndroid Build Coastguard Worker     // TODO: b/331447071 - Fix in Graphite and re-enable.
3393*38e8c45fSAndroid Build Coastguard Worker     if (GetParam()->skiaBackend() == renderengine::RenderEngine::SkiaBackend::GRAPHITE) {
3394*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
3395*38e8c45fSAndroid Build Coastguard Worker     }
3396*38e8c45fSAndroid Build Coastguard Worker 
3397*38e8c45fSAndroid Build Coastguard Worker     if (!GetParam()->apiSupported()) {
3398*38e8c45fSAndroid Build Coastguard Worker         GTEST_SKIP();
3399*38e8c45fSAndroid Build Coastguard Worker     }
3400*38e8c45fSAndroid Build Coastguard Worker     initializeRenderEngine();
3401*38e8c45fSAndroid Build Coastguard Worker 
3402*38e8c45fSAndroid Build Coastguard Worker     PrimeCacheConfig config;
3403*38e8c45fSAndroid Build Coastguard Worker     config.cacheUltraHDR = false;
3404*38e8c45fSAndroid Build Coastguard Worker     auto fut = mRE->primeCache(config);
3405*38e8c45fSAndroid Build Coastguard Worker     if (fut.valid()) {
3406*38e8c45fSAndroid Build Coastguard Worker         fut.wait();
3407*38e8c45fSAndroid Build Coastguard Worker     }
3408*38e8c45fSAndroid Build Coastguard Worker 
3409*38e8c45fSAndroid Build Coastguard Worker     static constexpr int kMinimumExpectedShadersCompiled = 60;
3410*38e8c45fSAndroid Build Coastguard Worker     ASSERT_GT(static_cast<skia::SkiaGLRenderEngine*>(mRE.get())->reportShadersCompiled(),
3411*38e8c45fSAndroid Build Coastguard Worker               kMinimumExpectedShadersCompiled);
3412*38e8c45fSAndroid Build Coastguard Worker }
3413*38e8c45fSAndroid Build Coastguard Worker } // namespace renderengine
3414*38e8c45fSAndroid Build Coastguard Worker } // namespace android
3415*38e8c45fSAndroid Build Coastguard Worker 
3416*38e8c45fSAndroid Build Coastguard Worker // TODO(b/129481165): remove the #pragma below and fix conversion issues
3417*38e8c45fSAndroid Build Coastguard Worker #pragma clang diagnostic pop // ignored "-Wconversion -Wextra"
3418