xref: /aosp_15_r20/frameworks/native/libs/renderengine/tests/RenderEngineThreadedTest.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright 2020 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 #include <cutils/properties.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <gmock/gmock.h>
19*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <hardware/gralloc.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <renderengine/impl/ExternalTexture.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <renderengine/mock/RenderEngine.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <ui/PixelFormat.h>
24*38e8c45fSAndroid Build Coastguard Worker #include "../threaded/RenderEngineThreaded.h"
25*38e8c45fSAndroid Build Coastguard Worker 
26*38e8c45fSAndroid Build Coastguard Worker namespace android {
27*38e8c45fSAndroid Build Coastguard Worker 
28*38e8c45fSAndroid Build Coastguard Worker using renderengine::PrimeCacheConfig;
29*38e8c45fSAndroid Build Coastguard Worker using testing::_;
30*38e8c45fSAndroid Build Coastguard Worker using testing::Eq;
31*38e8c45fSAndroid Build Coastguard Worker using testing::Mock;
32*38e8c45fSAndroid Build Coastguard Worker using testing::Return;
33*38e8c45fSAndroid Build Coastguard Worker 
34*38e8c45fSAndroid Build Coastguard Worker struct RenderEngineThreadedTest : public ::testing::Test {
~RenderEngineThreadedTestandroid::RenderEngineThreadedTest35*38e8c45fSAndroid Build Coastguard Worker     ~RenderEngineThreadedTest() {}
36*38e8c45fSAndroid Build Coastguard Worker 
SetUpandroid::RenderEngineThreadedTest37*38e8c45fSAndroid Build Coastguard Worker     void SetUp() override {
38*38e8c45fSAndroid Build Coastguard Worker         mThreadedRE = renderengine::threaded::RenderEngineThreaded::create(
39*38e8c45fSAndroid Build Coastguard Worker                 [this]() { return std::unique_ptr<renderengine::RenderEngine>(mRenderEngine); });
40*38e8c45fSAndroid Build Coastguard Worker     }
41*38e8c45fSAndroid Build Coastguard Worker 
42*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<renderengine::threaded::RenderEngineThreaded> mThreadedRE;
43*38e8c45fSAndroid Build Coastguard Worker     renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine();
44*38e8c45fSAndroid Build Coastguard Worker };
45*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,dump)46*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, dump) {
47*38e8c45fSAndroid Build Coastguard Worker     std::string testString = "XYZ";
48*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, dump(_));
49*38e8c45fSAndroid Build Coastguard Worker     mThreadedRE->dump(testString);
50*38e8c45fSAndroid Build Coastguard Worker }
51*38e8c45fSAndroid Build Coastguard Worker 
52*38e8c45fSAndroid Build Coastguard Worker MATCHER_P(EqConfig, other, "Equality for prime cache config") {
53*38e8c45fSAndroid Build Coastguard Worker     return arg.cacheHolePunchLayer == other.cacheHolePunchLayer &&
54*38e8c45fSAndroid Build Coastguard Worker             arg.cacheSolidLayers == other.cacheSolidLayers &&
55*38e8c45fSAndroid Build Coastguard Worker             arg.cacheSolidDimmedLayers == other.cacheSolidDimmedLayers &&
56*38e8c45fSAndroid Build Coastguard Worker             arg.cacheImageLayers == other.cacheImageLayers &&
57*38e8c45fSAndroid Build Coastguard Worker             arg.cacheImageDimmedLayers == other.cacheImageDimmedLayers &&
58*38e8c45fSAndroid Build Coastguard Worker             arg.cacheClippedLayers == other.cacheClippedLayers &&
59*38e8c45fSAndroid Build Coastguard Worker             arg.cacheShadowLayers == other.cacheShadowLayers &&
60*38e8c45fSAndroid Build Coastguard Worker             arg.cachePIPImageLayers == other.cachePIPImageLayers &&
61*38e8c45fSAndroid Build Coastguard Worker             arg.cacheTransparentImageDimmedLayers == other.cacheTransparentImageDimmedLayers &&
62*38e8c45fSAndroid Build Coastguard Worker             arg.cacheClippedDimmedImageLayers == other.cacheClippedDimmedImageLayers &&
63*38e8c45fSAndroid Build Coastguard Worker             arg.cacheUltraHDR == other.cacheUltraHDR;
64*38e8c45fSAndroid Build Coastguard Worker }
65*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,primeCache)66*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, primeCache) {
67*38e8c45fSAndroid Build Coastguard Worker     PrimeCacheConfig config;
68*38e8c45fSAndroid Build Coastguard Worker     config.cacheUltraHDR = false;
69*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, primeCache(EqConfig(config)));
70*38e8c45fSAndroid Build Coastguard Worker     mThreadedRE->primeCache(config);
71*38e8c45fSAndroid Build Coastguard Worker     // need to call ANY synchronous function after primeCache to ensure that primeCache has
72*38e8c45fSAndroid Build Coastguard Worker     // completed asynchronously before the test completes execution.
73*38e8c45fSAndroid Build Coastguard Worker     mThreadedRE->getContextPriority();
74*38e8c45fSAndroid Build Coastguard Worker }
75*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,getMaxTextureSize_returns20)76*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, getMaxTextureSize_returns20) {
77*38e8c45fSAndroid Build Coastguard Worker     size_t size = 20;
78*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, getMaxTextureSize()).WillOnce(Return(size));
79*38e8c45fSAndroid Build Coastguard Worker     size_t result = mThreadedRE->getMaxTextureSize();
80*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(size, result);
81*38e8c45fSAndroid Build Coastguard Worker }
82*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,getMaxTextureSize_returns0)83*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, getMaxTextureSize_returns0) {
84*38e8c45fSAndroid Build Coastguard Worker     size_t size = 0;
85*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, getMaxTextureSize()).WillOnce(Return(size));
86*38e8c45fSAndroid Build Coastguard Worker     size_t result = mThreadedRE->getMaxTextureSize();
87*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(size, result);
88*38e8c45fSAndroid Build Coastguard Worker }
89*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,getMaxViewportDims_returns20)90*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, getMaxViewportDims_returns20) {
91*38e8c45fSAndroid Build Coastguard Worker     size_t dims = 20;
92*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, getMaxViewportDims()).WillOnce(Return(dims));
93*38e8c45fSAndroid Build Coastguard Worker     size_t result = mThreadedRE->getMaxViewportDims();
94*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(dims, result);
95*38e8c45fSAndroid Build Coastguard Worker }
96*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,getMaxViewportDims_returns0)97*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, getMaxViewportDims_returns0) {
98*38e8c45fSAndroid Build Coastguard Worker     size_t dims = 0;
99*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, getMaxViewportDims()).WillOnce(Return(dims));
100*38e8c45fSAndroid Build Coastguard Worker     size_t result = mThreadedRE->getMaxViewportDims();
101*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(dims, result);
102*38e8c45fSAndroid Build Coastguard Worker }
103*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,supportsProtectedContent_returnsFalse)104*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsFalse) {
105*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(false));
106*38e8c45fSAndroid Build Coastguard Worker     status_t result = mThreadedRE->supportsProtectedContent();
107*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(false, result);
108*38e8c45fSAndroid Build Coastguard Worker }
109*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,supportsProtectedContent_returnsTrue)110*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsTrue) {
111*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(true));
112*38e8c45fSAndroid Build Coastguard Worker     status_t result = mThreadedRE->supportsProtectedContent();
113*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(true, result);
114*38e8c45fSAndroid Build Coastguard Worker }
115*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,PostRenderCleanup_skipped)116*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, PostRenderCleanup_skipped) {
117*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, cleanupPostRender()).Times(0);
118*38e8c45fSAndroid Build Coastguard Worker     mThreadedRE->cleanupPostRender();
119*38e8c45fSAndroid Build Coastguard Worker 
120*38e8c45fSAndroid Build Coastguard Worker     // call ANY synchronous function to ensure that cleanupPostRender has completed.
121*38e8c45fSAndroid Build Coastguard Worker     mThreadedRE->getContextPriority();
122*38e8c45fSAndroid Build Coastguard Worker }
123*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,PostRenderCleanup_notSkipped)124*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, PostRenderCleanup_notSkipped) {
125*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
126*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
127*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
128*38e8c45fSAndroid Build Coastguard Worker             renderengine::impl::
129*38e8c45fSAndroid Build Coastguard Worker                     ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
130*38e8c45fSAndroid Build Coastguard Worker                                      renderengine::impl::ExternalTexture::Usage::READABLE |
131*38e8c45fSAndroid Build Coastguard Worker                                              renderengine::impl::ExternalTexture::Usage::WRITEABLE);
132*38e8c45fSAndroid Build Coastguard Worker     base::unique_fd bufferFence;
133*38e8c45fSAndroid Build Coastguard Worker 
134*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, useProtectedContext(false));
135*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, drawLayersInternal)
136*38e8c45fSAndroid Build Coastguard Worker         .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
137*38e8c45fSAndroid Build Coastguard Worker                           const renderengine::DisplaySettings&,
138*38e8c45fSAndroid Build Coastguard Worker                           const std::vector<renderengine::LayerSettings>&,
139*38e8c45fSAndroid Build Coastguard Worker                           const std::shared_ptr<renderengine::ExternalTexture>&,
140*38e8c45fSAndroid Build Coastguard Worker                           base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
141*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, cleanupPostRender()).WillOnce(Return());
142*38e8c45fSAndroid Build Coastguard Worker     ftl::Future<FenceResult> future =
143*38e8c45fSAndroid Build Coastguard Worker             mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
144*38e8c45fSAndroid Build Coastguard Worker     mThreadedRE->cleanupPostRender();
145*38e8c45fSAndroid Build Coastguard Worker 
146*38e8c45fSAndroid Build Coastguard Worker     // call ANY synchronous function to ensure that cleanupPostRender has completed.
147*38e8c45fSAndroid Build Coastguard Worker     mThreadedRE->getContextPriority();
148*38e8c45fSAndroid Build Coastguard Worker }
149*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,supportsBackgroundBlur_returnsFalse)150*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, supportsBackgroundBlur_returnsFalse) {
151*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, supportsBackgroundBlur()).WillOnce(Return(false));
152*38e8c45fSAndroid Build Coastguard Worker     status_t result = mThreadedRE->supportsBackgroundBlur();
153*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(false, result);
154*38e8c45fSAndroid Build Coastguard Worker }
155*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,supportsBackgroundBlur_returnsTrue)156*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, supportsBackgroundBlur_returnsTrue) {
157*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, supportsBackgroundBlur()).WillOnce(Return(true));
158*38e8c45fSAndroid Build Coastguard Worker     status_t result = mThreadedRE->supportsBackgroundBlur();
159*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(true, result);
160*38e8c45fSAndroid Build Coastguard Worker }
161*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,drawLayers)162*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, drawLayers) {
163*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
164*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
165*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
166*38e8c45fSAndroid Build Coastguard Worker             renderengine::impl::
167*38e8c45fSAndroid Build Coastguard Worker                     ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
168*38e8c45fSAndroid Build Coastguard Worker                                      renderengine::impl::ExternalTexture::Usage::READABLE |
169*38e8c45fSAndroid Build Coastguard Worker                                              renderengine::impl::ExternalTexture::Usage::WRITEABLE);
170*38e8c45fSAndroid Build Coastguard Worker 
171*38e8c45fSAndroid Build Coastguard Worker     base::unique_fd bufferFence;
172*38e8c45fSAndroid Build Coastguard Worker 
173*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, useProtectedContext(false));
174*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, drawLayersInternal)
175*38e8c45fSAndroid Build Coastguard Worker             .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
176*38e8c45fSAndroid Build Coastguard Worker                           const renderengine::DisplaySettings&,
177*38e8c45fSAndroid Build Coastguard Worker                           const std::vector<renderengine::LayerSettings>&,
178*38e8c45fSAndroid Build Coastguard Worker                           const std::shared_ptr<renderengine::ExternalTexture>&,
179*38e8c45fSAndroid Build Coastguard Worker                           base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
180*38e8c45fSAndroid Build Coastguard Worker 
181*38e8c45fSAndroid Build Coastguard Worker     ftl::Future<FenceResult> future =
182*38e8c45fSAndroid Build Coastguard Worker             mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
183*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(future.valid());
184*38e8c45fSAndroid Build Coastguard Worker     auto result = future.get();
185*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(result.ok());
186*38e8c45fSAndroid Build Coastguard Worker }
187*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,drawLayers_protectedLayer)188*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, drawLayers_protectedLayer) {
189*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
190*38e8c45fSAndroid Build Coastguard Worker     auto layerBuffer = sp<GraphicBuffer>::make();
191*38e8c45fSAndroid Build Coastguard Worker     layerBuffer->usage |= GRALLOC_USAGE_PROTECTED;
192*38e8c45fSAndroid Build Coastguard Worker     renderengine::LayerSettings layer;
193*38e8c45fSAndroid Build Coastguard Worker     layer.source.buffer.buffer = std::make_shared<
194*38e8c45fSAndroid Build Coastguard Worker             renderengine::impl::ExternalTexture>(std::move(layerBuffer), *mRenderEngine,
195*38e8c45fSAndroid Build Coastguard Worker                                                  renderengine::impl::ExternalTexture::Usage::
196*38e8c45fSAndroid Build Coastguard Worker                                                          READABLE);
197*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers = {std::move(layer)};
198*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
199*38e8c45fSAndroid Build Coastguard Worker             renderengine::impl::
200*38e8c45fSAndroid Build Coastguard Worker                     ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
201*38e8c45fSAndroid Build Coastguard Worker                                      renderengine::impl::ExternalTexture::Usage::READABLE |
202*38e8c45fSAndroid Build Coastguard Worker                                              renderengine::impl::ExternalTexture::Usage::WRITEABLE);
203*38e8c45fSAndroid Build Coastguard Worker 
204*38e8c45fSAndroid Build Coastguard Worker     base::unique_fd bufferFence;
205*38e8c45fSAndroid Build Coastguard Worker 
206*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, useProtectedContext(true));
207*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, drawLayersInternal)
208*38e8c45fSAndroid Build Coastguard Worker             .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
209*38e8c45fSAndroid Build Coastguard Worker                           const renderengine::DisplaySettings&,
210*38e8c45fSAndroid Build Coastguard Worker                           const std::vector<renderengine::LayerSettings>&,
211*38e8c45fSAndroid Build Coastguard Worker                           const std::shared_ptr<renderengine::ExternalTexture>&,
212*38e8c45fSAndroid Build Coastguard Worker                           base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
213*38e8c45fSAndroid Build Coastguard Worker 
214*38e8c45fSAndroid Build Coastguard Worker     ftl::Future<FenceResult> future =
215*38e8c45fSAndroid Build Coastguard Worker             mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
216*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(future.valid());
217*38e8c45fSAndroid Build Coastguard Worker     auto result = future.get();
218*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(result.ok());
219*38e8c45fSAndroid Build Coastguard Worker }
220*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(RenderEngineThreadedTest,drawLayers_protectedOutputBuffer)221*38e8c45fSAndroid Build Coastguard Worker TEST_F(RenderEngineThreadedTest, drawLayers_protectedOutputBuffer) {
222*38e8c45fSAndroid Build Coastguard Worker     renderengine::DisplaySettings settings;
223*38e8c45fSAndroid Build Coastguard Worker     std::vector<renderengine::LayerSettings> layers;
224*38e8c45fSAndroid Build Coastguard Worker     auto graphicBuffer = sp<GraphicBuffer>::make();
225*38e8c45fSAndroid Build Coastguard Worker     graphicBuffer->usage |= GRALLOC_USAGE_PROTECTED;
226*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
227*38e8c45fSAndroid Build Coastguard Worker             renderengine::impl::
228*38e8c45fSAndroid Build Coastguard Worker                     ExternalTexture>(std::move(graphicBuffer), *mRenderEngine,
229*38e8c45fSAndroid Build Coastguard Worker                                      renderengine::impl::ExternalTexture::Usage::READABLE |
230*38e8c45fSAndroid Build Coastguard Worker                                              renderengine::impl::ExternalTexture::Usage::WRITEABLE);
231*38e8c45fSAndroid Build Coastguard Worker 
232*38e8c45fSAndroid Build Coastguard Worker     base::unique_fd bufferFence;
233*38e8c45fSAndroid Build Coastguard Worker 
234*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, useProtectedContext(true));
235*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mRenderEngine, drawLayersInternal)
236*38e8c45fSAndroid Build Coastguard Worker             .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
237*38e8c45fSAndroid Build Coastguard Worker                           const renderengine::DisplaySettings&,
238*38e8c45fSAndroid Build Coastguard Worker                           const std::vector<renderengine::LayerSettings>&,
239*38e8c45fSAndroid Build Coastguard Worker                           const std::shared_ptr<renderengine::ExternalTexture>&,
240*38e8c45fSAndroid Build Coastguard Worker                           base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
241*38e8c45fSAndroid Build Coastguard Worker 
242*38e8c45fSAndroid Build Coastguard Worker     ftl::Future<FenceResult> future =
243*38e8c45fSAndroid Build Coastguard Worker             mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
244*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(future.valid());
245*38e8c45fSAndroid Build Coastguard Worker     auto result = future.get();
246*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(result.ok());
247*38e8c45fSAndroid Build Coastguard Worker }
248*38e8c45fSAndroid Build Coastguard Worker 
249*38e8c45fSAndroid Build Coastguard Worker } // namespace android
250