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