blob: 67a524799dcb8a97a821d1bf40c9d42e731f5701 [file] [log] [blame]
Valerie Hau9cfc6d82019-09-23 13:54:07 -07001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#ifndef ANDROID_TRANSACTION_TEST_HARNESSES
17#define ANDROID_TRANSACTION_TEST_HARNESSES
18
Jim Shargo6ccc5e82024-07-27 03:42:08 +000019#include <com_android_graphics_libgui_flags.h>
Melody Hsu793f8362024-01-08 20:00:35 +000020#include <common/FlagManager.h>
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -080021#include <ui/DisplayState.h>
Valerie Hau9cfc6d82019-09-23 13:54:07 -070022
Valerie Hau9cfc6d82019-09-23 13:54:07 -070023#include "LayerTransactionTest.h"
Melody Hsu793f8362024-01-08 20:00:35 +000024#include "ui/LayerStack.h"
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -080025
Valerie Hau9cfc6d82019-09-23 13:54:07 -070026namespace android {
27
28using android::hardware::graphics::common::V1_1::BufferUsage;
29
30class LayerRenderPathTestHarness {
31public:
32 LayerRenderPathTestHarness(LayerTransactionTest* delegate, RenderPath renderPath)
33 : mDelegate(delegate), mRenderPath(renderPath) {}
34
35 std::unique_ptr<ScreenCapture> getScreenCapture() {
36 switch (mRenderPath) {
37 case RenderPath::SCREENSHOT:
38 return mDelegate->screenshot();
39 case RenderPath::VIRTUAL_DISPLAY:
40
Huihong Luo31b5ac22022-08-15 20:38:10 -070041 const auto ids = SurfaceComposerClient::getPhysicalDisplayIds();
Melody Hsu793f8362024-01-08 20:00:35 +000042 const PhysicalDisplayId displayId = ids.front();
Huihong Luo31b5ac22022-08-15 20:38:10 -070043 const auto displayToken = ids.empty()
44 ? nullptr
Melody Hsu793f8362024-01-08 20:00:35 +000045 : SurfaceComposerClient::getPhysicalDisplayToken(displayId);
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -080046
47 ui::DisplayState displayState;
48 SurfaceComposerClient::getDisplayState(displayToken, &displayState);
49
Marin Shalamanova7fe3042021-01-29 21:02:08 +010050 ui::DisplayMode displayMode;
51 SurfaceComposerClient::getActiveDisplayMode(displayToken, &displayMode);
52 const ui::Size& resolution = displayMode.resolution;
Valerie Hau9cfc6d82019-09-23 13:54:07 -070053
54 sp<IBinder> vDisplay;
Jim Shargo6ccc5e82024-07-27 03:42:08 +000055
56#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
57 sp<BufferItemConsumer> itemConsumer = sp<BufferItemConsumer>::make(
58 // Sample usage bits from screenrecord
59 GRALLOC_USAGE_HW_VIDEO_ENCODER | GRALLOC_USAGE_SW_READ_OFTEN);
60 sp<BufferListener> listener = sp<BufferListener>::make(this);
61 itemConsumer->setFrameAvailableListener(listener);
62 itemConsumer->setName(String8("Virtual disp consumer"));
63 itemConsumer->setDefaultBufferSize(resolution.getWidth(), resolution.getHeight());
64#else
Valerie Hau9cfc6d82019-09-23 13:54:07 -070065 sp<IGraphicBufferProducer> producer;
66 sp<IGraphicBufferConsumer> consumer;
67 sp<BufferItemConsumer> itemConsumer;
68 BufferQueue::createBufferQueue(&producer, &consumer);
69
70 consumer->setConsumerName(String8("Virtual disp consumer"));
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -080071 consumer->setDefaultBufferSize(resolution.getWidth(), resolution.getHeight());
Valerie Hau9cfc6d82019-09-23 13:54:07 -070072
Ady Abrahamd11bade2022-08-01 16:18:03 -070073 itemConsumer = sp<BufferItemConsumer>::make(consumer,
74 // Sample usage bits from screenrecord
75 GRALLOC_USAGE_HW_VIDEO_ENCODER |
76 GRALLOC_USAGE_SW_READ_OFTEN);
77 sp<BufferListener> listener = sp<BufferListener>::make(this);
Arthur Hung58144272021-01-16 03:43:53 +000078 itemConsumer->setFrameAvailableListener(listener);
Jim Shargo6ccc5e82024-07-27 03:42:08 +000079#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
Valerie Hau9cfc6d82019-09-23 13:54:07 -070080
Alan Dingd53801c2024-05-08 16:45:29 -070081 static const std::string kDisplayName("VirtualDisplay");
82 vDisplay = SurfaceComposerClient::createVirtualDisplay(kDisplayName,
83 false /*isSecure*/);
Valerie Hau9cfc6d82019-09-23 13:54:07 -070084
Melody Hsu793f8362024-01-08 20:00:35 +000085 constexpr ui::LayerStack layerStack{
86 848472}; // ASCII for TTH (TransactionTestHarnesses)
87 sp<SurfaceControl> mirrorSc =
88 SurfaceComposerClient::getDefault()->mirrorDisplay(displayId);
89
Valerie Hau9cfc6d82019-09-23 13:54:07 -070090 SurfaceComposerClient::Transaction t;
Jim Shargo6ccc5e82024-07-27 03:42:08 +000091#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
92 t.setDisplaySurface(vDisplay,
93 itemConsumer->getSurface()->getIGraphicBufferProducer());
94#else
Valerie Hau9cfc6d82019-09-23 13:54:07 -070095 t.setDisplaySurface(vDisplay, producer);
Jim Shargo6ccc5e82024-07-27 03:42:08 +000096#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
Dominik Laskowski3cb3d4e2019-11-21 11:14:45 -080097 t.setDisplayProjection(vDisplay, displayState.orientation,
Marin Shalamanov6ad317c2020-07-29 23:34:07 +020098 Rect(displayState.layerStackSpaceRect), Rect(resolution));
Melody Hsu793f8362024-01-08 20:00:35 +000099 if (FlagManager::getInstance().ce_fence_promise()) {
100 t.setDisplayLayerStack(vDisplay, layerStack);
101 t.setLayerStack(mirrorSc, layerStack);
102 } else {
103 t.setDisplayLayerStack(vDisplay, ui::DEFAULT_LAYER_STACK);
104 }
Valerie Hau9cfc6d82019-09-23 13:54:07 -0700105 t.apply();
106 SurfaceComposerClient::Transaction().apply(true);
Arthur Hung58144272021-01-16 03:43:53 +0000107
108 std::unique_lock lock(mMutex);
109 mAvailable = false;
110 // Wait for frame buffer ready.
111 mCondition.wait_for(lock, std::chrono::seconds(2),
112 [this]() NO_THREAD_SAFETY_ANALYSIS { return mAvailable; });
113
Valerie Hau9cfc6d82019-09-23 13:54:07 -0700114 BufferItem item;
115 itemConsumer->acquireBuffer(&item, 0, true);
Alec Mouri14d5b862022-04-27 21:20:04 +0000116 constexpr bool kContainsHdr = false;
117 auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer, kContainsHdr);
Valerie Hau9cfc6d82019-09-23 13:54:07 -0700118 itemConsumer->releaseBuffer(item);
Melody Hsu793f8362024-01-08 20:00:35 +0000119
120 // Possible race condition with destroying virtual displays, in which
121 // CompositionEngine::present may attempt to be called on the same
122 // display multiple times. The layerStack is set to invalid here so
123 // that the display is ignored if that scenario occurs.
124 if (FlagManager::getInstance().ce_fence_promise()) {
125 t.setLayerStack(mirrorSc, ui::INVALID_LAYER_STACK);
126 t.apply(true);
127 }
Alan Dingd53801c2024-05-08 16:45:29 -0700128 SurfaceComposerClient::destroyVirtualDisplay(vDisplay);
Valerie Hau9cfc6d82019-09-23 13:54:07 -0700129 return sc;
130 }
131 }
132
133protected:
134 LayerTransactionTest* mDelegate;
135 RenderPath mRenderPath;
Arthur Hung58144272021-01-16 03:43:53 +0000136 std::mutex mMutex;
137 std::condition_variable mCondition;
138 bool mAvailable = false;
139
140 void onFrameAvailable() {
141 std::unique_lock lock(mMutex);
142 mAvailable = true;
143 mCondition.notify_all();
144 }
145
146 class BufferListener : public ConsumerBase::FrameAvailableListener {
147 public:
148 BufferListener(LayerRenderPathTestHarness* owner) : mOwner(owner) {}
149 LayerRenderPathTestHarness* mOwner;
150
151 void onFrameAvailable(const BufferItem& /*item*/) { mOwner->onFrameAvailable(); }
152 };
Valerie Hau9cfc6d82019-09-23 13:54:07 -0700153};
154
155class LayerTypeTransactionHarness : public LayerTransactionTest {
156public:
157 LayerTypeTransactionHarness(uint32_t layerType) : mLayerType(layerType) {}
158
159 sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height,
Valerie Hau1acd6962019-10-28 16:35:48 -0700160 uint32_t flags = 0, SurfaceControl* parent = nullptr,
chaviwdebadb82020-03-26 14:57:24 -0700161 uint32_t* outTransformHint = nullptr,
162 PixelFormat format = PIXEL_FORMAT_RGBA_8888) {
Valerie Hau9cfc6d82019-09-23 13:54:07 -0700163 // if the flags already have a layer type specified, return an error
164 if (flags & ISurfaceComposerClient::eFXSurfaceMask) {
165 return nullptr;
166 }
Valerie Hau1acd6962019-10-28 16:35:48 -0700167 return LayerTransactionTest::createLayer(name, width, height, flags | mLayerType, parent,
chaviwdebadb82020-03-26 14:57:24 -0700168 outTransformHint, format);
Valerie Hau9cfc6d82019-09-23 13:54:07 -0700169 }
170
Marin Shalamanov46084422020-10-13 12:33:42 +0200171 void fillLayerColor(const sp<SurfaceControl>& layer, const Color& color, uint32_t bufferWidth,
172 uint32_t bufferHeight) {
Valerie Hau9cfc6d82019-09-23 13:54:07 -0700173 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerColor(mLayerType, layer, color,
174 bufferWidth, bufferHeight));
175 }
176
Marin Shalamanov46084422020-10-13 12:33:42 +0200177 void fillLayerQuadrant(const sp<SurfaceControl>& layer, uint32_t bufferWidth,
178 uint32_t bufferHeight, const Color& topLeft, const Color& topRight,
Valerie Hau9cfc6d82019-09-23 13:54:07 -0700179 const Color& bottomLeft, const Color& bottomRight) {
180 ASSERT_NO_FATAL_FAILURE(LayerTransactionTest::fillLayerQuadrant(mLayerType, layer,
181 bufferWidth, bufferHeight,
182 topLeft, topRight,
183 bottomLeft, bottomRight));
184 }
185
186protected:
187 uint32_t mLayerType;
188};
189} // namespace android
190#endif