xref: /aosp_15_r20/frameworks/native/services/surfaceflinger/tests/LayerTransactionTest.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2019 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 #pragma once
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker // TODO(b/129481165): remove the #pragma below and fix conversion issues
20*38e8c45fSAndroid Build Coastguard Worker #pragma clang diagnostic push
21*38e8c45fSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wconversion"
22*38e8c45fSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wextra"
23*38e8c45fSAndroid Build Coastguard Worker 
24*38e8c45fSAndroid Build Coastguard Worker #include <cutils/properties.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
26*38e8c45fSAndroid Build Coastguard Worker #include <gui/AidlUtil.h>
27*38e8c45fSAndroid Build Coastguard Worker #include <gui/ISurfaceComposer.h>
28*38e8c45fSAndroid Build Coastguard Worker #include <gui/SurfaceComposerClient.h>
29*38e8c45fSAndroid Build Coastguard Worker #include <private/gui/ComposerService.h>
30*38e8c45fSAndroid Build Coastguard Worker #include <private/gui/ComposerServiceAIDL.h>
31*38e8c45fSAndroid Build Coastguard Worker #include <ui/DisplayMode.h>
32*38e8c45fSAndroid Build Coastguard Worker 
33*38e8c45fSAndroid Build Coastguard Worker #include "BufferGenerator.h"
34*38e8c45fSAndroid Build Coastguard Worker #include "utils/ScreenshotUtils.h"
35*38e8c45fSAndroid Build Coastguard Worker #include "utils/TransactionUtils.h"
36*38e8c45fSAndroid Build Coastguard Worker 
37*38e8c45fSAndroid Build Coastguard Worker namespace android {
38*38e8c45fSAndroid Build Coastguard Worker 
39*38e8c45fSAndroid Build Coastguard Worker using android::hardware::graphics::common::V1_1::BufferUsage;
40*38e8c45fSAndroid Build Coastguard Worker 
41*38e8c45fSAndroid Build Coastguard Worker class LayerTransactionTest : public ::testing::Test {
42*38e8c45fSAndroid Build Coastguard Worker protected:
SetUp()43*38e8c45fSAndroid Build Coastguard Worker     void SetUp() override {
44*38e8c45fSAndroid Build Coastguard Worker         mClient = sp<SurfaceComposerClient>::make();
45*38e8c45fSAndroid Build Coastguard Worker         ASSERT_EQ(NO_ERROR, mClient->initCheck()) << "failed to create SurfaceComposerClient";
46*38e8c45fSAndroid Build Coastguard Worker 
47*38e8c45fSAndroid Build Coastguard Worker         ASSERT_NO_FATAL_FAILURE(SetUpDisplay());
48*38e8c45fSAndroid Build Coastguard Worker 
49*38e8c45fSAndroid Build Coastguard Worker         sp<gui::ISurfaceComposer> sf(ComposerServiceAIDL::getComposerService());
50*38e8c45fSAndroid Build Coastguard Worker     }
51*38e8c45fSAndroid Build Coastguard Worker 
TearDown()52*38e8c45fSAndroid Build Coastguard Worker     virtual void TearDown() {
53*38e8c45fSAndroid Build Coastguard Worker         mBlackBgSurface = 0;
54*38e8c45fSAndroid Build Coastguard Worker         mClient->dispose();
55*38e8c45fSAndroid Build Coastguard Worker         mClient = 0;
56*38e8c45fSAndroid Build Coastguard Worker     }
57*38e8c45fSAndroid Build Coastguard Worker 
58*38e8c45fSAndroid Build Coastguard Worker     virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client,
59*38e8c45fSAndroid Build Coastguard Worker                                            const char* name, uint32_t width, uint32_t height,
60*38e8c45fSAndroid Build Coastguard Worker                                            uint32_t flags = 0, SurfaceControl* parent = nullptr,
61*38e8c45fSAndroid Build Coastguard Worker                                            uint32_t* outTransformHint = nullptr,
62*38e8c45fSAndroid Build Coastguard Worker                                            PixelFormat format = PIXEL_FORMAT_RGBA_8888) {
63*38e8c45fSAndroid Build Coastguard Worker         auto layer =
64*38e8c45fSAndroid Build Coastguard Worker                 createSurface(client, name, width, height, format, flags, parent, outTransformHint);
65*38e8c45fSAndroid Build Coastguard Worker 
66*38e8c45fSAndroid Build Coastguard Worker         Transaction t;
67*38e8c45fSAndroid Build Coastguard Worker         t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase);
68*38e8c45fSAndroid Build Coastguard Worker 
69*38e8c45fSAndroid Build Coastguard Worker         status_t error = t.apply();
70*38e8c45fSAndroid Build Coastguard Worker         if (error != NO_ERROR) {
71*38e8c45fSAndroid Build Coastguard Worker             ADD_FAILURE() << "failed to initialize SurfaceControl";
72*38e8c45fSAndroid Build Coastguard Worker             layer.clear();
73*38e8c45fSAndroid Build Coastguard Worker         }
74*38e8c45fSAndroid Build Coastguard Worker 
75*38e8c45fSAndroid Build Coastguard Worker         return layer;
76*38e8c45fSAndroid Build Coastguard Worker     }
77*38e8c45fSAndroid Build Coastguard Worker 
78*38e8c45fSAndroid Build Coastguard Worker     virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client,
79*38e8c45fSAndroid Build Coastguard Worker                                              const char* name, uint32_t width, uint32_t height,
80*38e8c45fSAndroid Build Coastguard Worker                                              PixelFormat format, uint32_t flags,
81*38e8c45fSAndroid Build Coastguard Worker                                              SurfaceControl* parent = nullptr,
82*38e8c45fSAndroid Build Coastguard Worker                                              uint32_t* outTransformHint = nullptr) {
83*38e8c45fSAndroid Build Coastguard Worker         sp<IBinder> parentHandle = (parent) ? parent->getHandle() : nullptr;
84*38e8c45fSAndroid Build Coastguard Worker         auto layer = client->createSurface(String8(name), width, height, format, flags,
85*38e8c45fSAndroid Build Coastguard Worker                                            parentHandle, LayerMetadata(), outTransformHint);
86*38e8c45fSAndroid Build Coastguard Worker         EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl";
87*38e8c45fSAndroid Build Coastguard Worker         return layer;
88*38e8c45fSAndroid Build Coastguard Worker     }
89*38e8c45fSAndroid Build Coastguard Worker 
90*38e8c45fSAndroid Build Coastguard Worker     virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
91*38e8c45fSAndroid Build Coastguard Worker                                            uint32_t flags = 0, SurfaceControl* parent = nullptr,
92*38e8c45fSAndroid Build Coastguard Worker                                            uint32_t* outTransformHint = nullptr,
93*38e8c45fSAndroid Build Coastguard Worker                                            PixelFormat format = PIXEL_FORMAT_RGBA_8888) {
94*38e8c45fSAndroid Build Coastguard Worker         return createLayer(mClient, name, width, height, flags, parent, outTransformHint, format);
95*38e8c45fSAndroid Build Coastguard Worker     }
96*38e8c45fSAndroid Build Coastguard Worker 
97*38e8c45fSAndroid Build Coastguard Worker     sp<SurfaceControl> createColorLayer(const char* name, const Color& color,
98*38e8c45fSAndroid Build Coastguard Worker                                         SurfaceControl* parent = nullptr) {
99*38e8c45fSAndroid Build Coastguard Worker         auto colorLayer = createSurface(mClient, name, 0 /* buffer width */, 0 /* buffer height */,
100*38e8c45fSAndroid Build Coastguard Worker                                         PIXEL_FORMAT_RGBA_8888,
101*38e8c45fSAndroid Build Coastguard Worker                                         ISurfaceComposerClient::eFXSurfaceEffect, parent);
102*38e8c45fSAndroid Build Coastguard Worker         asTransaction([&](Transaction& t) {
103*38e8c45fSAndroid Build Coastguard Worker             t.setColor(colorLayer, half3{color.r / 255.0f, color.g / 255.0f, color.b / 255.0f});
104*38e8c45fSAndroid Build Coastguard Worker             t.setAlpha(colorLayer, color.a / 255.0f);
105*38e8c45fSAndroid Build Coastguard Worker         });
106*38e8c45fSAndroid Build Coastguard Worker         return colorLayer;
107*38e8c45fSAndroid Build Coastguard Worker     }
108*38e8c45fSAndroid Build Coastguard Worker 
mirrorSurface(SurfaceControl * mirrorFromSurface)109*38e8c45fSAndroid Build Coastguard Worker     sp<SurfaceControl> mirrorSurface(SurfaceControl* mirrorFromSurface) {
110*38e8c45fSAndroid Build Coastguard Worker         return mClient->mirrorSurface(mirrorFromSurface);
111*38e8c45fSAndroid Build Coastguard Worker     }
112*38e8c45fSAndroid Build Coastguard Worker 
getBufferQueueLayerBuffer(const sp<SurfaceControl> & layer)113*38e8c45fSAndroid Build Coastguard Worker     ANativeWindow_Buffer getBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
114*38e8c45fSAndroid Build Coastguard Worker         // wait for previous transactions (such as setSize) to complete
115*38e8c45fSAndroid Build Coastguard Worker         Transaction().apply(true);
116*38e8c45fSAndroid Build Coastguard Worker 
117*38e8c45fSAndroid Build Coastguard Worker         ANativeWindow_Buffer buffer = {};
118*38e8c45fSAndroid Build Coastguard Worker         EXPECT_EQ(NO_ERROR, layer->getSurface()->lock(&buffer, nullptr));
119*38e8c45fSAndroid Build Coastguard Worker 
120*38e8c45fSAndroid Build Coastguard Worker         return buffer;
121*38e8c45fSAndroid Build Coastguard Worker     }
122*38e8c45fSAndroid Build Coastguard Worker 
postBufferQueueLayerBuffer(const sp<SurfaceControl> & layer)123*38e8c45fSAndroid Build Coastguard Worker     void postBufferQueueLayerBuffer(const sp<SurfaceControl>& layer) {
124*38e8c45fSAndroid Build Coastguard Worker         ASSERT_EQ(NO_ERROR, layer->getSurface()->unlockAndPost());
125*38e8c45fSAndroid Build Coastguard Worker 
126*38e8c45fSAndroid Build Coastguard Worker         // wait for the newly posted buffer to be latched
127*38e8c45fSAndroid Build Coastguard Worker         waitForLayerBuffers();
128*38e8c45fSAndroid Build Coastguard Worker     }
129*38e8c45fSAndroid Build Coastguard Worker 
fillBufferQueueLayerColor(const sp<SurfaceControl> & layer,const Color & color,uint32_t bufferWidth,uint32_t bufferHeight)130*38e8c45fSAndroid Build Coastguard Worker     virtual void fillBufferQueueLayerColor(const sp<SurfaceControl>& layer, const Color& color,
131*38e8c45fSAndroid Build Coastguard Worker                                            uint32_t bufferWidth, uint32_t bufferHeight) {
132*38e8c45fSAndroid Build Coastguard Worker         ANativeWindow_Buffer buffer;
133*38e8c45fSAndroid Build Coastguard Worker         ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
134*38e8c45fSAndroid Build Coastguard Worker         TransactionUtils::fillANativeWindowBufferColor(buffer,
135*38e8c45fSAndroid Build Coastguard Worker                                                        Rect(0, 0, bufferWidth, bufferHeight),
136*38e8c45fSAndroid Build Coastguard Worker                                                        color);
137*38e8c45fSAndroid Build Coastguard Worker         postBufferQueueLayerBuffer(layer);
138*38e8c45fSAndroid Build Coastguard Worker     }
139*38e8c45fSAndroid Build Coastguard Worker 
fillBufferLayerColor(const sp<SurfaceControl> & layer,const Color & color,int32_t bufferWidth,int32_t bufferHeight)140*38e8c45fSAndroid Build Coastguard Worker     virtual void fillBufferLayerColor(const sp<SurfaceControl>& layer, const Color& color,
141*38e8c45fSAndroid Build Coastguard Worker                                       int32_t bufferWidth, int32_t bufferHeight) {
142*38e8c45fSAndroid Build Coastguard Worker         sp<GraphicBuffer> buffer =
143*38e8c45fSAndroid Build Coastguard Worker                 sp<GraphicBuffer>::make(static_cast<uint32_t>(bufferWidth),
144*38e8c45fSAndroid Build Coastguard Worker                                         static_cast<uint32_t>(bufferHeight), PIXEL_FORMAT_RGBA_8888,
145*38e8c45fSAndroid Build Coastguard Worker                                         1u,
146*38e8c45fSAndroid Build Coastguard Worker                                         BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
147*38e8c45fSAndroid Build Coastguard Worker                                                 BufferUsage::COMPOSER_OVERLAY |
148*38e8c45fSAndroid Build Coastguard Worker                                                 BufferUsage::GPU_TEXTURE,
149*38e8c45fSAndroid Build Coastguard Worker                                         "test");
150*38e8c45fSAndroid Build Coastguard Worker         TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight),
151*38e8c45fSAndroid Build Coastguard Worker                                                  color);
152*38e8c45fSAndroid Build Coastguard Worker         Transaction().setBuffer(layer, buffer).apply();
153*38e8c45fSAndroid Build Coastguard Worker     }
154*38e8c45fSAndroid Build Coastguard Worker 
fillLayerColor(uint32_t mLayerType,const sp<SurfaceControl> & layer,const Color & color,uint32_t bufferWidth,uint32_t bufferHeight)155*38e8c45fSAndroid Build Coastguard Worker     void fillLayerColor(uint32_t mLayerType, const sp<SurfaceControl>& layer, const Color& color,
156*38e8c45fSAndroid Build Coastguard Worker                         uint32_t bufferWidth, uint32_t bufferHeight) {
157*38e8c45fSAndroid Build Coastguard Worker         switch (mLayerType) {
158*38e8c45fSAndroid Build Coastguard Worker             case ISurfaceComposerClient::eFXSurfaceBufferQueue:
159*38e8c45fSAndroid Build Coastguard Worker                 fillBufferQueueLayerColor(layer, color, bufferWidth, bufferHeight);
160*38e8c45fSAndroid Build Coastguard Worker                 break;
161*38e8c45fSAndroid Build Coastguard Worker             case ISurfaceComposerClient::eFXSurfaceBufferState:
162*38e8c45fSAndroid Build Coastguard Worker                 fillBufferLayerColor(layer, color, bufferWidth, bufferHeight);
163*38e8c45fSAndroid Build Coastguard Worker                 break;
164*38e8c45fSAndroid Build Coastguard Worker             default:
165*38e8c45fSAndroid Build Coastguard Worker                 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
166*38e8c45fSAndroid Build Coastguard Worker         }
167*38e8c45fSAndroid Build Coastguard Worker     }
168*38e8c45fSAndroid Build Coastguard Worker 
fillLayerQuadrant(uint32_t mLayerType,const sp<SurfaceControl> & layer,int32_t bufferWidth,int32_t bufferHeight,const Color & topLeft,const Color & topRight,const Color & bottomLeft,const Color & bottomRight)169*38e8c45fSAndroid Build Coastguard Worker     void fillLayerQuadrant(uint32_t mLayerType, const sp<SurfaceControl>& layer,
170*38e8c45fSAndroid Build Coastguard Worker                            int32_t bufferWidth, int32_t bufferHeight, const Color& topLeft,
171*38e8c45fSAndroid Build Coastguard Worker                            const Color& topRight, const Color& bottomLeft,
172*38e8c45fSAndroid Build Coastguard Worker                            const Color& bottomRight) {
173*38e8c45fSAndroid Build Coastguard Worker         switch (mLayerType) {
174*38e8c45fSAndroid Build Coastguard Worker             case ISurfaceComposerClient::eFXSurfaceBufferQueue:
175*38e8c45fSAndroid Build Coastguard Worker                 fillBufferQueueLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
176*38e8c45fSAndroid Build Coastguard Worker                                              bottomLeft, bottomRight);
177*38e8c45fSAndroid Build Coastguard Worker                 break;
178*38e8c45fSAndroid Build Coastguard Worker             case ISurfaceComposerClient::eFXSurfaceBufferState:
179*38e8c45fSAndroid Build Coastguard Worker                 fillBufferStateLayerQuadrant(layer, bufferWidth, bufferHeight, topLeft, topRight,
180*38e8c45fSAndroid Build Coastguard Worker                                              bottomLeft, bottomRight);
181*38e8c45fSAndroid Build Coastguard Worker                 break;
182*38e8c45fSAndroid Build Coastguard Worker             default:
183*38e8c45fSAndroid Build Coastguard Worker                 ASSERT_TRUE(false) << "unsupported layer type: " << mLayerType;
184*38e8c45fSAndroid Build Coastguard Worker         }
185*38e8c45fSAndroid Build Coastguard Worker     }
186*38e8c45fSAndroid Build Coastguard Worker 
fillBufferQueueLayerQuadrant(const sp<SurfaceControl> & layer,int32_t bufferWidth,int32_t bufferHeight,const Color & topLeft,const Color & topRight,const Color & bottomLeft,const Color & bottomRight)187*38e8c45fSAndroid Build Coastguard Worker     virtual void fillBufferQueueLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
188*38e8c45fSAndroid Build Coastguard Worker                                               int32_t bufferHeight, const Color& topLeft,
189*38e8c45fSAndroid Build Coastguard Worker                                               const Color& topRight, const Color& bottomLeft,
190*38e8c45fSAndroid Build Coastguard Worker                                               const Color& bottomRight) {
191*38e8c45fSAndroid Build Coastguard Worker         ANativeWindow_Buffer buffer;
192*38e8c45fSAndroid Build Coastguard Worker         ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
193*38e8c45fSAndroid Build Coastguard Worker         ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
194*38e8c45fSAndroid Build Coastguard Worker 
195*38e8c45fSAndroid Build Coastguard Worker         const int32_t halfW = bufferWidth / 2;
196*38e8c45fSAndroid Build Coastguard Worker         const int32_t halfH = bufferHeight / 2;
197*38e8c45fSAndroid Build Coastguard Worker         TransactionUtils::fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
198*38e8c45fSAndroid Build Coastguard Worker         TransactionUtils::fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH),
199*38e8c45fSAndroid Build Coastguard Worker                                                        topRight);
200*38e8c45fSAndroid Build Coastguard Worker         TransactionUtils::fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight),
201*38e8c45fSAndroid Build Coastguard Worker                                                        bottomLeft);
202*38e8c45fSAndroid Build Coastguard Worker         TransactionUtils::fillANativeWindowBufferColor(buffer,
203*38e8c45fSAndroid Build Coastguard Worker                                                        Rect(halfW, halfH, bufferWidth,
204*38e8c45fSAndroid Build Coastguard Worker                                                             bufferHeight),
205*38e8c45fSAndroid Build Coastguard Worker                                                        bottomRight);
206*38e8c45fSAndroid Build Coastguard Worker 
207*38e8c45fSAndroid Build Coastguard Worker         postBufferQueueLayerBuffer(layer);
208*38e8c45fSAndroid Build Coastguard Worker     }
209*38e8c45fSAndroid Build Coastguard Worker 
fillBufferStateLayerQuadrant(const sp<SurfaceControl> & layer,int32_t bufferWidth,int32_t bufferHeight,const Color & topLeft,const Color & topRight,const Color & bottomLeft,const Color & bottomRight)210*38e8c45fSAndroid Build Coastguard Worker     virtual void fillBufferStateLayerQuadrant(const sp<SurfaceControl>& layer, int32_t bufferWidth,
211*38e8c45fSAndroid Build Coastguard Worker                                               int32_t bufferHeight, const Color& topLeft,
212*38e8c45fSAndroid Build Coastguard Worker                                               const Color& topRight, const Color& bottomLeft,
213*38e8c45fSAndroid Build Coastguard Worker                                               const Color& bottomRight) {
214*38e8c45fSAndroid Build Coastguard Worker         sp<GraphicBuffer> buffer =
215*38e8c45fSAndroid Build Coastguard Worker                 sp<GraphicBuffer>::make(static_cast<uint32_t>(bufferWidth),
216*38e8c45fSAndroid Build Coastguard Worker                                         static_cast<uint32_t>(bufferHeight), PIXEL_FORMAT_RGBA_8888,
217*38e8c45fSAndroid Build Coastguard Worker                                         1u,
218*38e8c45fSAndroid Build Coastguard Worker                                         BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
219*38e8c45fSAndroid Build Coastguard Worker                                                 BufferUsage::COMPOSER_OVERLAY |
220*38e8c45fSAndroid Build Coastguard Worker                                                 BufferUsage::GPU_TEXTURE,
221*38e8c45fSAndroid Build Coastguard Worker                                         "test");
222*38e8c45fSAndroid Build Coastguard Worker 
223*38e8c45fSAndroid Build Coastguard Worker         ASSERT_TRUE(bufferWidth % 2 == 0 && bufferHeight % 2 == 0);
224*38e8c45fSAndroid Build Coastguard Worker 
225*38e8c45fSAndroid Build Coastguard Worker         const int32_t halfW = bufferWidth / 2;
226*38e8c45fSAndroid Build Coastguard Worker         const int32_t halfH = bufferHeight / 2;
227*38e8c45fSAndroid Build Coastguard Worker         TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
228*38e8c45fSAndroid Build Coastguard Worker         TransactionUtils::fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH),
229*38e8c45fSAndroid Build Coastguard Worker                                                  topRight);
230*38e8c45fSAndroid Build Coastguard Worker         TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight),
231*38e8c45fSAndroid Build Coastguard Worker                                                  bottomLeft);
232*38e8c45fSAndroid Build Coastguard Worker         TransactionUtils::fillGraphicBufferColor(buffer,
233*38e8c45fSAndroid Build Coastguard Worker                                                  Rect(halfW, halfH, bufferWidth, bufferHeight),
234*38e8c45fSAndroid Build Coastguard Worker                                                  bottomRight);
235*38e8c45fSAndroid Build Coastguard Worker 
236*38e8c45fSAndroid Build Coastguard Worker         Transaction().setBuffer(layer, buffer).apply();
237*38e8c45fSAndroid Build Coastguard Worker     }
238*38e8c45fSAndroid Build Coastguard Worker 
screenshot()239*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<ScreenCapture> screenshot() {
240*38e8c45fSAndroid Build Coastguard Worker         std::unique_ptr<ScreenCapture> screenshot;
241*38e8c45fSAndroid Build Coastguard Worker         ScreenCapture::captureScreen(&screenshot);
242*38e8c45fSAndroid Build Coastguard Worker         return screenshot;
243*38e8c45fSAndroid Build Coastguard Worker     }
244*38e8c45fSAndroid Build Coastguard Worker 
asTransaction(const std::function<void (Transaction &)> & exec)245*38e8c45fSAndroid Build Coastguard Worker     void asTransaction(const std::function<void(Transaction&)>& exec) {
246*38e8c45fSAndroid Build Coastguard Worker         Transaction t;
247*38e8c45fSAndroid Build Coastguard Worker         exec(t);
248*38e8c45fSAndroid Build Coastguard Worker         t.apply(true);
249*38e8c45fSAndroid Build Coastguard Worker     }
250*38e8c45fSAndroid Build Coastguard Worker 
getBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence)251*38e8c45fSAndroid Build Coastguard Worker     static status_t getBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
252*38e8c45fSAndroid Build Coastguard Worker         static BufferGenerator bufferGenerator;
253*38e8c45fSAndroid Build Coastguard Worker         return bufferGenerator.get(outBuffer, outFence);
254*38e8c45fSAndroid Build Coastguard Worker     }
255*38e8c45fSAndroid Build Coastguard Worker 
getBufferSize()256*38e8c45fSAndroid Build Coastguard Worker     static ui::Size getBufferSize() {
257*38e8c45fSAndroid Build Coastguard Worker         static BufferGenerator bufferGenerator;
258*38e8c45fSAndroid Build Coastguard Worker         return bufferGenerator.getSize();
259*38e8c45fSAndroid Build Coastguard Worker     }
260*38e8c45fSAndroid Build Coastguard Worker 
261*38e8c45fSAndroid Build Coastguard Worker     sp<SurfaceComposerClient> mClient;
262*38e8c45fSAndroid Build Coastguard Worker 
deviceSupportsBlurs()263*38e8c45fSAndroid Build Coastguard Worker     bool deviceSupportsBlurs() {
264*38e8c45fSAndroid Build Coastguard Worker         char value[PROPERTY_VALUE_MAX];
265*38e8c45fSAndroid Build Coastguard Worker         property_get("ro.surface_flinger.supports_background_blur", value, "0");
266*38e8c45fSAndroid Build Coastguard Worker         return atoi(value);
267*38e8c45fSAndroid Build Coastguard Worker     }
268*38e8c45fSAndroid Build Coastguard Worker 
deviceUsesSkiaRenderEngine()269*38e8c45fSAndroid Build Coastguard Worker     bool deviceUsesSkiaRenderEngine() {
270*38e8c45fSAndroid Build Coastguard Worker         char value[PROPERTY_VALUE_MAX];
271*38e8c45fSAndroid Build Coastguard Worker         property_get("debug.renderengine.backend", value, "default");
272*38e8c45fSAndroid Build Coastguard Worker         return strstr(value, "skia") != nullptr;
273*38e8c45fSAndroid Build Coastguard Worker     }
274*38e8c45fSAndroid Build Coastguard Worker 
275*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> mDisplay;
276*38e8c45fSAndroid Build Coastguard Worker     uint32_t mDisplayWidth;
277*38e8c45fSAndroid Build Coastguard Worker     uint32_t mDisplayHeight;
278*38e8c45fSAndroid Build Coastguard Worker     ui::LayerStack mDisplayLayerStack = ui::DEFAULT_LAYER_STACK;
279*38e8c45fSAndroid Build Coastguard Worker     Rect mDisplayRect = Rect::INVALID_RECT;
280*38e8c45fSAndroid Build Coastguard Worker 
281*38e8c45fSAndroid Build Coastguard Worker     // leave room for ~256 layers
282*38e8c45fSAndroid Build Coastguard Worker     const int32_t mLayerZBase = std::numeric_limits<int32_t>::max() - 256;
283*38e8c45fSAndroid Build Coastguard Worker 
284*38e8c45fSAndroid Build Coastguard Worker     sp<SurfaceControl> mBlackBgSurface;
285*38e8c45fSAndroid Build Coastguard Worker     ScreenCaptureResults mCaptureResults;
286*38e8c45fSAndroid Build Coastguard Worker 
287*38e8c45fSAndroid Build Coastguard Worker private:
SetUpDisplay()288*38e8c45fSAndroid Build Coastguard Worker     void SetUpDisplay() {
289*38e8c45fSAndroid Build Coastguard Worker         const auto ids = SurfaceComposerClient::getPhysicalDisplayIds();
290*38e8c45fSAndroid Build Coastguard Worker         ASSERT_FALSE(ids.empty());
291*38e8c45fSAndroid Build Coastguard Worker         mDisplay = SurfaceComposerClient::getPhysicalDisplayToken(ids.front());
292*38e8c45fSAndroid Build Coastguard Worker         ASSERT_FALSE(mDisplay == nullptr) << "failed to get display";
293*38e8c45fSAndroid Build Coastguard Worker 
294*38e8c45fSAndroid Build Coastguard Worker         ui::DisplayMode mode;
295*38e8c45fSAndroid Build Coastguard Worker         ASSERT_EQ(NO_ERROR, SurfaceComposerClient::getActiveDisplayMode(mDisplay, &mode));
296*38e8c45fSAndroid Build Coastguard Worker         mDisplayRect = Rect(mode.resolution);
297*38e8c45fSAndroid Build Coastguard Worker         mDisplayWidth = mDisplayRect.getWidth();
298*38e8c45fSAndroid Build Coastguard Worker         mDisplayHeight = mDisplayRect.getHeight();
299*38e8c45fSAndroid Build Coastguard Worker 
300*38e8c45fSAndroid Build Coastguard Worker         // After a new buffer is queued, SurfaceFlinger is notified and will
301*38e8c45fSAndroid Build Coastguard Worker         // latch the new buffer on next vsync.  Let's heuristically wait for 3
302*38e8c45fSAndroid Build Coastguard Worker         // vsyncs.
303*38e8c45fSAndroid Build Coastguard Worker         mBufferPostDelay = static_cast<int32_t>(1e6 / mode.peakRefreshRate) * 3;
304*38e8c45fSAndroid Build Coastguard Worker 
305*38e8c45fSAndroid Build Coastguard Worker         mBlackBgSurface =
306*38e8c45fSAndroid Build Coastguard Worker                 createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */,
307*38e8c45fSAndroid Build Coastguard Worker                               PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceEffect);
308*38e8c45fSAndroid Build Coastguard Worker 
309*38e8c45fSAndroid Build Coastguard Worker         // set layer stack (b/68888219)
310*38e8c45fSAndroid Build Coastguard Worker         Transaction t;
311*38e8c45fSAndroid Build Coastguard Worker         t.setDisplayLayerStack(mDisplay, mDisplayLayerStack);
312*38e8c45fSAndroid Build Coastguard Worker         t.setCrop(mBlackBgSurface, Rect(0, 0, mDisplayWidth, mDisplayHeight));
313*38e8c45fSAndroid Build Coastguard Worker         t.setLayerStack(mBlackBgSurface, mDisplayLayerStack);
314*38e8c45fSAndroid Build Coastguard Worker         t.setColor(mBlackBgSurface, half3{0, 0, 0});
315*38e8c45fSAndroid Build Coastguard Worker         t.setLayer(mBlackBgSurface, mLayerZBase);
316*38e8c45fSAndroid Build Coastguard Worker         t.apply();
317*38e8c45fSAndroid Build Coastguard Worker     }
318*38e8c45fSAndroid Build Coastguard Worker 
waitForLayerBuffers()319*38e8c45fSAndroid Build Coastguard Worker     void waitForLayerBuffers() {
320*38e8c45fSAndroid Build Coastguard Worker         // Request an empty transaction to get applied synchronously to ensure the buffer is
321*38e8c45fSAndroid Build Coastguard Worker         // latched.
322*38e8c45fSAndroid Build Coastguard Worker         Transaction().apply(true);
323*38e8c45fSAndroid Build Coastguard Worker         usleep(mBufferPostDelay);
324*38e8c45fSAndroid Build Coastguard Worker     }
325*38e8c45fSAndroid Build Coastguard Worker 
326*38e8c45fSAndroid Build Coastguard Worker     int32_t mBufferPostDelay;
327*38e8c45fSAndroid Build Coastguard Worker 
328*38e8c45fSAndroid Build Coastguard Worker     friend class LayerRenderPathTestHarness;
329*38e8c45fSAndroid Build Coastguard Worker };
330*38e8c45fSAndroid Build Coastguard Worker 
331*38e8c45fSAndroid Build Coastguard Worker } // namespace android
332*38e8c45fSAndroid Build Coastguard Worker 
333*38e8c45fSAndroid Build Coastguard Worker // TODO(b/129481165): remove the #pragma below and fix conversion issues
334*38e8c45fSAndroid Build Coastguard Worker #pragma clang diagnostic pop // ignored "-Wconversion -Wextra"
335