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