blob: 867a3068e6b7d005a5f72d3ba5dc33636f0e99d3 [file] [log] [blame]
[email protected]c0dd24c2012-08-30 23:25:271// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]cc3cfaa2013-03-18 09:05:525#include "cc/layers/texture_layer.h"
[email protected]c0dd24c2012-08-30 23:25:276
avi02a4d172015-12-21 06:14:367#include <stddef.h>
8#include <stdint.h>
9
[email protected]b04264f92013-09-13 23:37:2910#include <algorithm>
[email protected]de44a152013-01-08 15:28:4611#include <string>
12
[email protected]b04264f92013-09-13 23:37:2913#include "base/bind.h"
[email protected]de44a152013-01-08 15:28:4614#include "base/callback.h"
skyostil0fd1dad2015-04-13 20:11:4815#include "base/location.h"
avi02a4d172015-12-21 06:14:3616#include "base/macros.h"
danakj60bc3bc2016-04-09 00:24:4817#include "base/memory/ptr_util.h"
skyostil0fd1dad2015-04-13 20:11:4818#include "base/single_thread_task_runner.h"
danakj3c3973b2015-08-25 21:50:1819#include "base/synchronization/lock.h"
[email protected]9794fb32013-08-29 09:49:5920#include "base/synchronization/waitable_event.h"
[email protected]74b43cc2013-08-30 06:29:2721#include "base/threading/thread.h"
gab39cb4ed72016-05-11 17:45:1922#include "base/threading/thread_task_runner_handle.h"
[email protected]74b43cc2013-08-30 06:29:2723#include "base/time/time.h"
loysoab32ee72016-06-08 03:33:1824#include "cc/animation/animation_host.h"
[email protected]b04264f92013-09-13 23:37:2925#include "cc/layers/solid_color_layer.h"
[email protected]97d519fb2013-03-29 02:27:5426#include "cc/layers/texture_layer_client.h"
[email protected]cc3cfaa2013-03-18 09:05:5227#include "cc/layers/texture_layer_impl.h"
[email protected]e00bab022013-08-19 00:42:4528#include "cc/resources/returned_resource.h"
khushalsagarb64b360d2015-10-21 19:25:1629#include "cc/test/fake_impl_task_runner_provider.h"
danakjc7afae52017-06-20 21:12:4130#include "cc/test/fake_layer_tree_frame_sink.h"
[email protected]101441ce2012-10-16 01:45:0331#include "cc/test/fake_layer_tree_host_client.h"
[email protected]586d51ed2012-12-07 20:31:4532#include "cc/test/fake_layer_tree_host_impl.h"
[email protected]06d68d02013-04-19 18:46:2133#include "cc/test/layer_test_common.h"
[email protected]e216fef02013-03-20 22:56:1034#include "cc/test/layer_tree_test.h"
danakjffc181a2016-07-22 22:48:4335#include "cc/test/stub_layer_tree_host_single_thread_client.h"
reveman34b7a1522015-03-23 20:27:4736#include "cc/test/test_task_graph_runner.h"
[email protected]c2610b9f2013-10-31 06:54:5937#include "cc/test/test_web_graphics_context_3d.h"
[email protected]9794fb32013-08-29 09:49:5938#include "cc/trees/blocking_task_runner.h"
khushalsagare0e4486e2017-01-25 03:15:0339#include "cc/trees/layer_tree_host.h"
[email protected]556fd292013-03-18 08:03:0440#include "cc/trees/layer_tree_impl.h"
41#include "cc/trees/single_thread_proxy.h"
Xu Xing32549162017-07-17 22:25:4342#include "components/viz/common/gpu/context_provider.h"
danakjc391f332017-07-12 20:45:5243#include "components/viz/test/test_layer_tree_frame_sink.h"
[email protected]0bf5a202013-07-10 14:50:5444#include "gpu/GLES2/gl2extchromium.h"
[email protected]7f0c53db2012-10-02 00:23:1845#include "testing/gmock/include/gmock/gmock.h"
46#include "testing/gtest/include/gtest/gtest.h"
[email protected]c0dd24c2012-08-30 23:25:2747
[email protected]c0dd24c2012-08-30 23:25:2748using ::testing::Mock;
49using ::testing::_;
50using ::testing::AtLeast;
51using ::testing::AnyNumber;
[email protected]d72d9e02014-04-03 18:40:0952using ::testing::InvokeWithoutArgs;
[email protected]c0dd24c2012-08-30 23:25:2753
[email protected]ba565742012-11-10 09:29:4854namespace cc {
[email protected]c0dd24c2012-08-30 23:25:2755namespace {
56
[email protected]e0a4d732014-02-15 00:23:2657gpu::Mailbox MailboxFromChar(char value) {
[email protected]df41e252014-02-03 23:39:5058 gpu::Mailbox mailbox;
[email protected]e0a4d732014-02-15 00:23:2659 memset(mailbox.name, value, sizeof(mailbox.name));
[email protected]df41e252014-02-03 23:39:5060 return mailbox;
61}
62
dyen398dd0142016-01-21 22:05:5663gpu::SyncToken SyncTokenFromUInt(uint32_t value) {
lukasza2573ce7d2016-02-16 19:17:2264 return gpu::SyncToken(gpu::CommandBufferNamespace::GPU_IO, 0,
65 gpu::CommandBufferId::FromUnsafeValue(0x123), value);
dyen398dd0142016-01-21 22:05:5666}
67
khushalsagare0e4486e2017-01-25 03:15:0368class MockLayerTreeHost : public LayerTreeHost {
[email protected]28571b042013-03-14 07:59:1569 public:
danakj60bc3bc2016-04-09 00:24:4870 static std::unique_ptr<MockLayerTreeHost> Create(
danakjcf610582015-06-16 22:48:5671 FakeLayerTreeHostClient* client,
loyso2cb3f32f2016-11-08 07:08:3472 TaskGraphRunner* task_graph_runner,
73 MutatorHost* mutator_host) {
khushalsagare0e4486e2017-01-25 03:15:0374 LayerTreeHost::InitParams params;
sadrul6780f3da2015-05-11 17:01:5275 params.client = client;
danakjcf610582015-06-16 22:48:5676 params.task_graph_runner = task_graph_runner;
loyso2cb3f32f2016-11-08 07:08:3477 params.mutator_host = mutator_host;
sadrul6780f3da2015-05-11 17:01:5278 LayerTreeSettings settings;
79 params.settings = &settings;
danakjffc181a2016-07-22 22:48:4380 return base::WrapUnique(new MockLayerTreeHost(&params));
[email protected]28571b042013-03-14 07:59:1581 }
[email protected]c0dd24c2012-08-30 23:25:2782
[email protected]28571b042013-03-14 07:59:1583 MOCK_METHOD0(SetNeedsCommit, void());
[email protected]3519b872013-07-30 07:17:5084 MOCK_METHOD0(SetNeedsUpdateLayers, void());
[email protected]aeeb3372013-11-05 14:05:5485 MOCK_METHOD0(StartRateLimiter, void());
86 MOCK_METHOD0(StopRateLimiter, void());
sadrul6780f3da2015-05-11 17:01:5287
88 private:
khushalsagare0e4486e2017-01-25 03:15:0389 explicit MockLayerTreeHost(LayerTreeHost::InitParams* params)
90 : LayerTreeHost(params, CompositorMode::SINGLE_THREADED) {
danakjffc181a2016-07-22 22:48:4391 InitializeSingleThreaded(&single_thread_client_,
enne2b0ad682016-09-21 01:44:4792 base::ThreadTaskRunnerHandle::Get());
sadrul6780f3da2015-05-11 17:01:5293 }
danakjffc181a2016-07-22 22:48:4394
95 StubLayerTreeHostSingleThreadClient single_thread_client_;
[email protected]c0dd24c2012-08-30 23:25:2796};
97
[email protected]d72d9e02014-04-03 18:40:0998class FakeTextureLayerClient : public TextureLayerClient {
99 public:
[email protected]17e08432014-04-10 00:41:11100 FakeTextureLayerClient() : mailbox_changed_(true) {}
[email protected]d72d9e02014-04-03 18:40:09101
dcheng716bedf2014-10-21 09:51:08102 bool PrepareTextureMailbox(
Fady Samuel2a725ce52017-07-11 22:30:00103 viz::TextureMailbox* mailbox,
danakj4d0dd802016-08-23 22:10:06104 std::unique_ptr<SingleReleaseCallback>* release_callback) override {
[email protected]d72d9e02014-04-03 18:40:09105 if (!mailbox_changed_)
106 return false;
107
108 *mailbox = mailbox_;
danakja04855a2015-11-18 20:39:10109 *release_callback = std::move(release_callback_);
[email protected]d72d9e02014-04-03 18:40:09110 mailbox_changed_ = false;
111 return true;
112 }
113
Fady Samuel2a725ce52017-07-11 22:30:00114 void set_mailbox(const viz::TextureMailbox& mailbox,
danakj60bc3bc2016-04-09 00:24:48115 std::unique_ptr<SingleReleaseCallback> release_callback) {
[email protected]d72d9e02014-04-03 18:40:09116 mailbox_ = mailbox;
danakja04855a2015-11-18 20:39:10117 release_callback_ = std::move(release_callback);
[email protected]d72d9e02014-04-03 18:40:09118 mailbox_changed_ = true;
119 }
120
121 private:
Fady Samuel2a725ce52017-07-11 22:30:00122 viz::TextureMailbox mailbox_;
danakj60bc3bc2016-04-09 00:24:48123 std::unique_ptr<SingleReleaseCallback> release_callback_;
[email protected]d72d9e02014-04-03 18:40:09124 bool mailbox_changed_;
125 DISALLOW_COPY_AND_ASSIGN(FakeTextureLayerClient);
126};
127
128class MockMailboxCallback {
129 public:
130 MOCK_METHOD3(Release,
131 void(const gpu::Mailbox& mailbox,
dyencc16ed4d2015-11-03 20:03:04132 const gpu::SyncToken& sync_token,
[email protected]d72d9e02014-04-03 18:40:09133 bool lost_resource));
134 MOCK_METHOD3(Release2,
Fady Samuel4b5f9862017-07-11 05:27:20135 void(viz::SharedBitmap* shared_bitmap,
dyencc16ed4d2015-11-03 20:03:04136 const gpu::SyncToken& sync_token,
[email protected]d72d9e02014-04-03 18:40:09137 bool lost_resource));
skyostil3976a3f2014-09-04 22:07:23138 MOCK_METHOD4(ReleaseImpl,
139 void(const gpu::Mailbox& mailbox,
dyencc16ed4d2015-11-03 20:03:04140 const gpu::SyncToken& sync_token,
skyostil3976a3f2014-09-04 22:07:23141 bool lost_resource,
142 BlockingTaskRunner* main_thread_task_runner));
143 MOCK_METHOD4(ReleaseImpl2,
Fady Samuel4b5f9862017-07-11 05:27:20144 void(viz::SharedBitmap* shared_bitmap,
dyencc16ed4d2015-11-03 20:03:04145 const gpu::SyncToken& sync_token,
skyostil3976a3f2014-09-04 22:07:23146 bool lost_resource,
147 BlockingTaskRunner* main_thread_task_runner));
[email protected]d72d9e02014-04-03 18:40:09148};
149
150struct CommonMailboxObjects {
Fady Samuel4b5f9862017-07-11 05:27:20151 explicit CommonMailboxObjects(viz::SharedBitmapManager* manager)
[email protected]d72d9e02014-04-03 18:40:09152 : mailbox_name1_(MailboxFromChar('1')),
153 mailbox_name2_(MailboxFromChar('2')),
lukasza2573ce7d2016-02-16 19:17:22154 sync_token1_(gpu::CommandBufferNamespace::GPU_IO,
155 123,
156 gpu::CommandBufferId::FromUnsafeValue(0x234),
157 1),
158 sync_token2_(gpu::CommandBufferNamespace::GPU_IO,
159 123,
160 gpu::CommandBufferId::FromUnsafeValue(0x234),
161 2) {
[email protected]d72d9e02014-04-03 18:40:09162 release_mailbox1_ = base::Bind(&MockMailboxCallback::Release,
163 base::Unretained(&mock_callback_),
164 mailbox_name1_);
165 release_mailbox2_ = base::Bind(&MockMailboxCallback::Release,
166 base::Unretained(&mock_callback_),
167 mailbox_name2_);
skyostil3976a3f2014-09-04 22:07:23168 release_mailbox1_impl_ = base::Bind(&MockMailboxCallback::ReleaseImpl,
169 base::Unretained(&mock_callback_),
170 mailbox_name1_);
171 release_mailbox2_impl_ = base::Bind(&MockMailboxCallback::ReleaseImpl,
172 base::Unretained(&mock_callback_),
173 mailbox_name2_);
avi02a4d172015-12-21 06:14:36174 const uint32_t arbitrary_target1 = GL_TEXTURE_2D;
175 const uint32_t arbitrary_target2 = GL_TEXTURE_EXTERNAL_OES;
Fady Samuel2a725ce52017-07-11 22:30:00176 mailbox1_ =
177 viz::TextureMailbox(mailbox_name1_, sync_token1_, arbitrary_target1);
178 mailbox2_ =
179 viz::TextureMailbox(mailbox_name2_, sync_token2_, arbitrary_target2);
[email protected]d72d9e02014-04-03 18:40:09180 gfx::Size size(128, 128);
jbauman9015c8b2014-12-11 00:49:37181 shared_bitmap_ = manager->AllocateSharedBitmap(size);
182 DCHECK(shared_bitmap_);
183 release_mailbox3_ =
184 base::Bind(&MockMailboxCallback::Release2,
185 base::Unretained(&mock_callback_), shared_bitmap_.get());
186 release_mailbox3_impl_ =
187 base::Bind(&MockMailboxCallback::ReleaseImpl2,
188 base::Unretained(&mock_callback_), shared_bitmap_.get());
Fady Samuel2a725ce52017-07-11 22:30:00189 mailbox3_ = viz::TextureMailbox(shared_bitmap_.get(), size);
[email protected]d72d9e02014-04-03 18:40:09190 }
191
192 gpu::Mailbox mailbox_name1_;
193 gpu::Mailbox mailbox_name2_;
194 MockMailboxCallback mock_callback_;
195 ReleaseCallback release_mailbox1_;
196 ReleaseCallback release_mailbox2_;
197 ReleaseCallback release_mailbox3_;
skyostil3976a3f2014-09-04 22:07:23198 ReleaseCallbackImpl release_mailbox1_impl_;
199 ReleaseCallbackImpl release_mailbox2_impl_;
200 ReleaseCallbackImpl release_mailbox3_impl_;
Fady Samuel2a725ce52017-07-11 22:30:00201 viz::TextureMailbox mailbox1_;
202 viz::TextureMailbox mailbox2_;
203 viz::TextureMailbox mailbox3_;
dyencc16ed4d2015-11-03 20:03:04204 gpu::SyncToken sync_token1_;
205 gpu::SyncToken sync_token2_;
Fady Samuel4b5f9862017-07-11 05:27:20206 std::unique_ptr<viz::SharedBitmap> shared_bitmap_;
[email protected]d72d9e02014-04-03 18:40:09207};
208
[email protected]31d4df82013-07-18 10:17:22209class TextureLayerTest : public testing::Test {
210 public:
211 TextureLayerTest()
danakjc7afae52017-06-20 21:12:41212 : layer_tree_frame_sink_(FakeLayerTreeFrameSink::Create3d()),
213 host_impl_(&task_runner_provider_, &task_graph_runner_),
jbauman9015c8b2014-12-11 00:49:37214 test_data_(&shared_bitmap_manager_) {}
[email protected]31d4df82013-07-18 10:17:22215
216 protected:
dcheng93a52eb2014-12-23 02:14:23217 void SetUp() override {
loyso2cb3f32f2016-11-08 07:08:34218 animation_host_ = AnimationHost::CreateForTesting(ThreadInstance::MAIN);
219 layer_tree_host_ = MockLayerTreeHost::Create(
220 &fake_client_, &task_graph_runner_, animation_host_.get());
[email protected]d72d9e02014-04-03 18:40:09221 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber());
khushalsagarb69ba9452017-01-27 22:20:07222 layer_tree_host_->SetViewportSize(gfx::Size(10, 10));
[email protected]d72d9e02014-04-03 18:40:09223 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
[email protected]31d4df82013-07-18 10:17:22224 }
225
dcheng93a52eb2014-12-23 02:14:23226 void TearDown() override {
[email protected]31d4df82013-07-18 10:17:22227 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
[email protected]31d4df82013-07-18 10:17:22228 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber());
229
loyso2cb3f32f2016-11-08 07:08:34230 animation_host_->SetMutatorHostClient(nullptr);
khushalsagarb69ba9452017-01-27 22:20:07231 layer_tree_host_->SetRootLayer(nullptr);
danakjf446a072014-09-27 21:55:48232 layer_tree_host_ = nullptr;
loyso2cb3f32f2016-11-08 07:08:34233 animation_host_ = nullptr;
[email protected]31d4df82013-07-18 10:17:22234 }
235
danakj60bc3bc2016-04-09 00:24:48236 std::unique_ptr<MockLayerTreeHost> layer_tree_host_;
loyso2cb3f32f2016-11-08 07:08:34237 std::unique_ptr<AnimationHost> animation_host_;
khushalsagarb64b360d2015-10-21 19:25:16238 FakeImplTaskRunnerProvider task_runner_provider_;
[email protected]31d4df82013-07-18 10:17:22239 FakeLayerTreeHostClient fake_client_;
[email protected]4e2eb352014-03-20 17:25:45240 TestSharedBitmapManager shared_bitmap_manager_;
reveman34b7a1522015-03-23 20:27:47241 TestTaskGraphRunner task_graph_runner_;
danakjc7afae52017-06-20 21:12:41242 std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink_;
[email protected]31d4df82013-07-18 10:17:22243 FakeLayerTreeHostImpl host_impl_;
jbauman9015c8b2014-12-11 00:49:37244 CommonMailboxObjects test_data_;
[email protected]31d4df82013-07-18 10:17:22245};
246
[email protected]31d4df82013-07-18 10:17:22247TEST_F(TextureLayerTest, CheckPropertyChangeCausesCorrectBehavior) {
kulkarni.a4015690f12014-10-10 13:50:06248 scoped_refptr<TextureLayer> test_layer =
loyso0940d412016-03-14 01:30:31249 TextureLayer::CreateForMailbox(nullptr);
khushalsagarb69ba9452017-01-27 22:20:07250 EXPECT_SET_NEEDS_COMMIT(1, layer_tree_host_->SetRootLayer(test_layer));
[email protected]31d4df82013-07-18 10:17:22251
252 // Test properties that should call SetNeedsCommit. All properties need to
253 // be set to new values in order for SetNeedsCommit to be called.
254 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetFlipped(false));
jackhou10c9af42014-12-04 05:24:44255 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetNearestNeighbor(true));
[email protected]31d4df82013-07-18 10:17:22256 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetUV(
257 gfx::PointF(0.25f, 0.25f), gfx::PointF(0.75f, 0.75f)));
258 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetVertexOpacity(
259 0.5f, 0.5f, 0.5f, 0.5f));
260 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetPremultipliedAlpha(false));
261 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetBlendBackgroundColor(true));
[email protected]31d4df82013-07-18 10:17:22262}
263
[email protected]df41e252014-02-03 23:39:50264class TestMailboxHolder : public TextureLayer::TextureMailboxHolder {
[email protected]9794fb32013-08-29 09:49:59265 public:
[email protected]df41e252014-02-03 23:39:50266 using TextureLayer::TextureMailboxHolder::Create;
[email protected]9794fb32013-08-29 09:49:59267
268 protected:
dcheng716bedf2014-10-21 09:51:08269 ~TestMailboxHolder() override {}
[email protected]9794fb32013-08-29 09:49:59270};
271
[email protected]de44a152013-01-08 15:28:46272class TextureLayerWithMailboxTest : public TextureLayerTest {
[email protected]28571b042013-03-14 07:59:15273 protected:
dcheng93a52eb2014-12-23 02:14:23274 void TearDown() override {
[email protected]28571b042013-03-14 07:59:15275 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
dyencc16ed4d2015-11-03 20:03:04276 EXPECT_CALL(
277 test_data_.mock_callback_,
278 Release(test_data_.mailbox_name1_, test_data_.sync_token1_, false))
279 .Times(1);
[email protected]28571b042013-03-14 07:59:15280 TextureLayerTest::TearDown();
281 }
[email protected]de44a152013-01-08 15:28:46282};
283
[email protected]28571b042013-03-14 07:59:15284TEST_F(TextureLayerWithMailboxTest, ReplaceMailboxOnMainThreadBeforeCommit) {
kulkarni.a4015690f12014-10-10 13:50:06285 scoped_refptr<TextureLayer> test_layer =
loyso0940d412016-03-14 01:30:31286 TextureLayer::CreateForMailbox(nullptr);
[email protected]22898ed2013-06-01 04:52:30287 ASSERT_TRUE(test_layer.get());
[email protected]de44a152013-01-08 15:28:46288
[email protected]28571b042013-03-14 07:59:15289 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber());
khushalsagarb69ba9452017-01-27 22:20:07290 layer_tree_host_->SetRootLayer(test_layer);
[email protected]28571b042013-03-14 07:59:15291 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
[email protected]de44a152013-01-08 15:28:46292
[email protected]28571b042013-03-14 07:59:15293 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
[email protected]9260757f2013-09-17 01:24:16294 test_layer->SetTextureMailbox(
295 test_data_.mailbox1_,
296 SingleReleaseCallback::Create(test_data_.release_mailbox1_));
[email protected]28571b042013-03-14 07:59:15297 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
[email protected]de44a152013-01-08 15:28:46298
[email protected]28571b042013-03-14 07:59:15299 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
dyencc16ed4d2015-11-03 20:03:04300 EXPECT_CALL(
301 test_data_.mock_callback_,
302 Release(test_data_.mailbox_name1_, test_data_.sync_token1_, false))
[email protected]28571b042013-03-14 07:59:15303 .Times(1);
[email protected]9260757f2013-09-17 01:24:16304 test_layer->SetTextureMailbox(
305 test_data_.mailbox2_,
306 SingleReleaseCallback::Create(test_data_.release_mailbox2_));
[email protected]28571b042013-03-14 07:59:15307 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
308 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]de44a152013-01-08 15:28:46309
[email protected]28571b042013-03-14 07:59:15310 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
dyencc16ed4d2015-11-03 20:03:04311 EXPECT_CALL(
312 test_data_.mock_callback_,
313 Release(test_data_.mailbox_name2_, test_data_.sync_token2_, false))
[email protected]28571b042013-03-14 07:59:15314 .Times(1);
Fady Samuel2a725ce52017-07-11 22:30:00315 test_layer->SetTextureMailbox(viz::TextureMailbox(), nullptr);
[email protected]28571b042013-03-14 07:59:15316 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
317 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]de44a152013-01-08 15:28:46318
[email protected]80d42bd2013-08-30 19:13:45319 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
[email protected]9260757f2013-09-17 01:24:16320 test_layer->SetTextureMailbox(
321 test_data_.mailbox3_,
322 SingleReleaseCallback::Create(test_data_.release_mailbox3_));
[email protected]42f40a52013-06-08 04:38:51323 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
324 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
325
[email protected]42f40a52013-06-08 04:38:51326 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
327 EXPECT_CALL(test_data_.mock_callback_,
dyencc16ed4d2015-11-03 20:03:04328 Release2(test_data_.shared_bitmap_.get(), _, false))
329 .Times(1);
Fady Samuel2a725ce52017-07-11 22:30:00330 test_layer->SetTextureMailbox(viz::TextureMailbox(), nullptr);
[email protected]42f40a52013-06-08 04:38:51331 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
332 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
333
[email protected]28571b042013-03-14 07:59:15334 // Test destructor.
335 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
[email protected]9260757f2013-09-17 01:24:16336 test_layer->SetTextureMailbox(
337 test_data_.mailbox1_,
338 SingleReleaseCallback::Create(test_data_.release_mailbox1_));
[email protected]de44a152013-01-08 15:28:46339}
340
[email protected]9794fb32013-08-29 09:49:59341class TextureLayerMailboxHolderTest : public TextureLayerTest {
342 public:
343 TextureLayerMailboxHolderTest()
344 : main_thread_("MAIN") {
345 main_thread_.Start();
fdoray70df5a92016-06-22 21:13:59346 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22347 FROM_HERE,
348 base::BindOnce(&TextureLayerMailboxHolderTest::InitializeOnMain,
349 base::Unretained(this)));
skyostil3976a3f2014-09-04 22:07:23350 Wait(main_thread_);
[email protected]9794fb32013-08-29 09:49:59351 }
352
353 void Wait(const base::Thread& thread) {
gabcca53112016-06-08 20:13:28354 base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
355 base::WaitableEvent::InitialState::NOT_SIGNALED);
fdoray70df5a92016-06-22 21:13:59356 thread.task_runner()->PostTask(
[email protected]9794fb32013-08-29 09:49:59357 FROM_HERE,
tzik4604bb52017-04-13 21:50:22358 base::BindOnce(&base::WaitableEvent::Signal, base::Unretained(&event)));
[email protected]9794fb32013-08-29 09:49:59359 event.Wait();
360 }
361
362 void CreateMainRef() {
363 main_ref_ = TestMailboxHolder::Create(
[email protected]9260757f2013-09-17 01:24:16364 test_data_.mailbox1_,
danakja5a05ba02015-11-20 20:14:21365 SingleReleaseCallback::Create(test_data_.release_mailbox1_));
[email protected]9794fb32013-08-29 09:49:59366 }
367
danakjf446a072014-09-27 21:55:48368 void ReleaseMainRef() { main_ref_ = nullptr; }
[email protected]9794fb32013-08-29 09:49:59369
danakj60bc3bc2016-04-09 00:24:48370 void CreateImplRef(std::unique_ptr<SingleReleaseCallbackImpl>* impl_ref) {
[email protected]9794fb32013-08-29 09:49:59371 *impl_ref = main_ref_->holder()->GetCallbackForImplThread();
372 }
373
374 void CapturePostTasksAndWait(base::WaitableEvent* begin_capture,
375 base::WaitableEvent* wait_for_capture,
376 base::WaitableEvent* stop_capture) {
377 begin_capture->Wait();
skyostil3976a3f2014-09-04 22:07:23378 BlockingTaskRunner::CapturePostTasks capture(
379 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59380 wait_for_capture->Signal();
381 stop_capture->Wait();
382 }
383
384 protected:
skyostil3976a3f2014-09-04 22:07:23385 void InitializeOnMain() {
386 main_thread_task_runner_ =
skyostil0fd1dad2015-04-13 20:11:48387 BlockingTaskRunner::Create(main_thread_.task_runner());
skyostil3976a3f2014-09-04 22:07:23388 }
389
danakj60bc3bc2016-04-09 00:24:48390 std::unique_ptr<TestMailboxHolder::MainThreadReference> main_ref_;
[email protected]9794fb32013-08-29 09:49:59391 base::Thread main_thread_;
danakj60bc3bc2016-04-09 00:24:48392 std::unique_ptr<BlockingTaskRunner> main_thread_task_runner_;
[email protected]9794fb32013-08-29 09:49:59393};
394
395TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_BothReleaseThenMain) {
kulkarni.a4015690f12014-10-10 13:50:06396 scoped_refptr<TextureLayer> test_layer =
loyso0940d412016-03-14 01:30:31397 TextureLayer::CreateForMailbox(nullptr);
[email protected]9794fb32013-08-29 09:49:59398 ASSERT_TRUE(test_layer.get());
399
fdoray70df5a92016-06-22 21:13:59400 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22401 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateMainRef,
402 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59403
404 Wait(main_thread_);
405
406 // The texture layer is attached to compositor1, and passes a reference to its
407 // impl tree.
danakj60bc3bc2016-04-09 00:24:48408 std::unique_ptr<SingleReleaseCallbackImpl> compositor1;
fdoray70df5a92016-06-22 21:13:59409 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22410 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
411 base::Unretained(this), &compositor1));
[email protected]9794fb32013-08-29 09:49:59412
413 // Then the texture layer is removed and attached to compositor2, and passes a
414 // reference to its impl tree.
danakj60bc3bc2016-04-09 00:24:48415 std::unique_ptr<SingleReleaseCallbackImpl> compositor2;
fdoray70df5a92016-06-22 21:13:59416 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22417 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
418 base::Unretained(this), &compositor2));
[email protected]9794fb32013-08-29 09:49:59419
420 Wait(main_thread_);
421 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
422
423 // The compositors both destroy their impl trees before the main thread layer
424 // is destroyed.
dyen398dd0142016-01-21 22:05:56425 compositor1->Run(SyncTokenFromUInt(100), false,
426 main_thread_task_runner_.get());
427 compositor2->Run(SyncTokenFromUInt(200), false,
428 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59429
430 Wait(main_thread_);
431
432 EXPECT_CALL(test_data_.mock_callback_, Release(_, _, _)).Times(0);
433 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
434
435 // The main thread ref is the last one, so the mailbox is released back to the
436 // embedder, with the last sync point provided by the impl trees.
437 EXPECT_CALL(test_data_.mock_callback_,
dyen398dd0142016-01-21 22:05:56438 Release(test_data_.mailbox_name1_, SyncTokenFromUInt(200), false))
dyencc16ed4d2015-11-03 20:03:04439 .Times(1);
[email protected]9794fb32013-08-29 09:49:59440
fdoray70df5a92016-06-22 21:13:59441 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22442 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::ReleaseMainRef,
443 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59444 Wait(main_thread_);
445 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
446}
447
448TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_MainReleaseBetween) {
kulkarni.a4015690f12014-10-10 13:50:06449 scoped_refptr<TextureLayer> test_layer =
loyso0940d412016-03-14 01:30:31450 TextureLayer::CreateForMailbox(nullptr);
[email protected]9794fb32013-08-29 09:49:59451 ASSERT_TRUE(test_layer.get());
452
fdoray70df5a92016-06-22 21:13:59453 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22454 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateMainRef,
455 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59456
457 Wait(main_thread_);
458
459 // The texture layer is attached to compositor1, and passes a reference to its
460 // impl tree.
danakj60bc3bc2016-04-09 00:24:48461 std::unique_ptr<SingleReleaseCallbackImpl> compositor1;
fdoray70df5a92016-06-22 21:13:59462 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22463 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
464 base::Unretained(this), &compositor1));
[email protected]9794fb32013-08-29 09:49:59465
466 // Then the texture layer is removed and attached to compositor2, and passes a
467 // reference to its impl tree.
danakj60bc3bc2016-04-09 00:24:48468 std::unique_ptr<SingleReleaseCallbackImpl> compositor2;
fdoray70df5a92016-06-22 21:13:59469 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22470 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
471 base::Unretained(this), &compositor2));
[email protected]9794fb32013-08-29 09:49:59472
473 Wait(main_thread_);
474 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
475
476 // One compositor destroys their impl tree.
dyen398dd0142016-01-21 22:05:56477 compositor1->Run(SyncTokenFromUInt(100), false,
478 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59479
480 // Then the main thread reference is destroyed.
fdoray70df5a92016-06-22 21:13:59481 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22482 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::ReleaseMainRef,
483 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59484
485 Wait(main_thread_);
486
487 EXPECT_CALL(test_data_.mock_callback_, Release(_, _, _)).Times(0);
488 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
489
490 // The second impl reference is destroyed last, causing the mailbox to be
491 // released back to the embedder with the last sync point from the impl tree.
492 EXPECT_CALL(test_data_.mock_callback_,
dyen398dd0142016-01-21 22:05:56493 Release(test_data_.mailbox_name1_, SyncTokenFromUInt(200), true))
dyencc16ed4d2015-11-03 20:03:04494 .Times(1);
[email protected]9794fb32013-08-29 09:49:59495
dyen398dd0142016-01-21 22:05:56496 compositor2->Run(SyncTokenFromUInt(200), true,
497 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59498 Wait(main_thread_);
499 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
500}
501
502TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_MainReleasedFirst) {
kulkarni.a4015690f12014-10-10 13:50:06503 scoped_refptr<TextureLayer> test_layer =
loyso0940d412016-03-14 01:30:31504 TextureLayer::CreateForMailbox(nullptr);
[email protected]9794fb32013-08-29 09:49:59505 ASSERT_TRUE(test_layer.get());
506
fdoray70df5a92016-06-22 21:13:59507 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22508 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateMainRef,
509 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59510
511 Wait(main_thread_);
512
513 // The texture layer is attached to compositor1, and passes a reference to its
514 // impl tree.
danakj60bc3bc2016-04-09 00:24:48515 std::unique_ptr<SingleReleaseCallbackImpl> compositor1;
fdoray70df5a92016-06-22 21:13:59516 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22517 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
518 base::Unretained(this), &compositor1));
[email protected]9794fb32013-08-29 09:49:59519
520 // Then the texture layer is removed and attached to compositor2, and passes a
521 // reference to its impl tree.
danakj60bc3bc2016-04-09 00:24:48522 std::unique_ptr<SingleReleaseCallbackImpl> compositor2;
fdoray70df5a92016-06-22 21:13:59523 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22524 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
525 base::Unretained(this), &compositor2));
[email protected]9794fb32013-08-29 09:49:59526
527 Wait(main_thread_);
528 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
529
530 // The main thread reference is destroyed first.
fdoray70df5a92016-06-22 21:13:59531 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22532 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::ReleaseMainRef,
533 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59534
535 // One compositor destroys their impl tree.
dyen398dd0142016-01-21 22:05:56536 compositor2->Run(SyncTokenFromUInt(200), false,
537 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59538
539 Wait(main_thread_);
540
541 EXPECT_CALL(test_data_.mock_callback_, Release(_, _, _)).Times(0);
542 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
543
544 // The second impl reference is destroyed last, causing the mailbox to be
545 // released back to the embedder with the last sync point from the impl tree.
546 EXPECT_CALL(test_data_.mock_callback_,
dyen398dd0142016-01-21 22:05:56547 Release(test_data_.mailbox_name1_, SyncTokenFromUInt(100), true))
dyencc16ed4d2015-11-03 20:03:04548 .Times(1);
[email protected]9794fb32013-08-29 09:49:59549
dyen398dd0142016-01-21 22:05:56550 compositor1->Run(SyncTokenFromUInt(100), true,
551 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59552 Wait(main_thread_);
553 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
554}
555
556TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_SecondImplRefShortcut) {
kulkarni.a4015690f12014-10-10 13:50:06557 scoped_refptr<TextureLayer> test_layer =
loyso0940d412016-03-14 01:30:31558 TextureLayer::CreateForMailbox(nullptr);
[email protected]9794fb32013-08-29 09:49:59559 ASSERT_TRUE(test_layer.get());
560
fdoray70df5a92016-06-22 21:13:59561 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22562 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateMainRef,
563 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59564
565 Wait(main_thread_);
566
567 // The texture layer is attached to compositor1, and passes a reference to its
568 // impl tree.
danakj60bc3bc2016-04-09 00:24:48569 std::unique_ptr<SingleReleaseCallbackImpl> compositor1;
fdoray70df5a92016-06-22 21:13:59570 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22571 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
572 base::Unretained(this), &compositor1));
[email protected]9794fb32013-08-29 09:49:59573
574 // Then the texture layer is removed and attached to compositor2, and passes a
575 // reference to its impl tree.
danakj60bc3bc2016-04-09 00:24:48576 std::unique_ptr<SingleReleaseCallbackImpl> compositor2;
fdoray70df5a92016-06-22 21:13:59577 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22578 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
579 base::Unretained(this), &compositor2));
[email protected]9794fb32013-08-29 09:49:59580
581 Wait(main_thread_);
582 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
583
584 // The main thread reference is destroyed first.
fdoray70df5a92016-06-22 21:13:59585 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22586 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::ReleaseMainRef,
587 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59588
589 EXPECT_CALL(test_data_.mock_callback_,
dyen398dd0142016-01-21 22:05:56590 Release(test_data_.mailbox_name1_, SyncTokenFromUInt(200), true))
dyencc16ed4d2015-11-03 20:03:04591 .Times(1);
[email protected]9794fb32013-08-29 09:49:59592
gabcca53112016-06-08 20:13:28593 base::WaitableEvent begin_capture(
594 base::WaitableEvent::ResetPolicy::AUTOMATIC,
595 base::WaitableEvent::InitialState::NOT_SIGNALED);
596 base::WaitableEvent wait_for_capture(
597 base::WaitableEvent::ResetPolicy::AUTOMATIC,
598 base::WaitableEvent::InitialState::NOT_SIGNALED);
599 base::WaitableEvent stop_capture(
600 base::WaitableEvent::ResetPolicy::AUTOMATIC,
601 base::WaitableEvent::InitialState::NOT_SIGNALED);
[email protected]9794fb32013-08-29 09:49:59602
603 // Post a task to start capturing tasks on the main thread. This will block
604 // the main thread until we signal the |stop_capture| event.
fdoray70df5a92016-06-22 21:13:59605 main_thread_.task_runner()->PostTask(
[email protected]9794fb32013-08-29 09:49:59606 FROM_HERE,
tzik4604bb52017-04-13 21:50:22607 base::BindOnce(&TextureLayerMailboxHolderTest::CapturePostTasksAndWait,
608 base::Unretained(this), &begin_capture, &wait_for_capture,
609 &stop_capture));
[email protected]9794fb32013-08-29 09:49:59610
611 // Before the main thread capturing starts, one compositor destroys their
612 // impl reference. Since capturing did not start, this gets post-tasked to
613 // the main thread.
dyen398dd0142016-01-21 22:05:56614 compositor1->Run(SyncTokenFromUInt(100), false,
615 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59616
617 // Start capturing on the main thread.
618 begin_capture.Signal();
619 wait_for_capture.Wait();
620
621 // Meanwhile, the second compositor released its impl reference, but this task
622 // gets shortcutted directly to the main thread. This means the reference is
623 // released before compositor1, whose reference will be released later when
624 // the post-task is serviced. But since it was destroyed _on the impl thread_
625 // last, its sync point values should be used.
dyen398dd0142016-01-21 22:05:56626 compositor2->Run(SyncTokenFromUInt(200), true,
627 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59628
629 stop_capture.Signal();
630 Wait(main_thread_);
631
632 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
633}
634
[email protected]e216fef02013-03-20 22:56:10635class TextureLayerImplWithMailboxThreadedCallback : public LayerTreeTest {
[email protected]28571b042013-03-14 07:59:15636 public:
danakj014316e2016-08-04 18:40:26637 TextureLayerImplWithMailboxThreadedCallback() = default;
638
danakjc391f332017-07-12 20:45:52639 std::unique_ptr<viz::TestLayerTreeFrameSink> CreateLayerTreeFrameSink(
Alex Zhangbcce8b132017-07-20 20:17:24640 const viz::RendererSettings& renderer_settings,
Alex Zhang903cb6a2017-06-12 20:31:37641 double refresh_rate,
Xu Xing32549162017-07-17 22:25:43642 scoped_refptr<viz::ContextProvider> compositor_context_provider,
643 scoped_refptr<viz::ContextProvider> worker_context_provider) override {
staraz88677422017-05-26 13:53:03644 constexpr bool disable_display_vsync = false;
danakj014316e2016-08-04 18:40:26645 bool synchronous_composite =
646 !HasImplThread() &&
khushalsagarcebe4942016-09-07 23:27:01647 !layer_tree_host()->GetSettings().single_thread_proxy_scheduler;
danakjc391f332017-07-12 20:45:52648 return base::MakeUnique<viz::TestLayerTreeFrameSink>(
danakj014316e2016-08-04 18:40:26649 compositor_context_provider, std::move(worker_context_provider),
staraz88677422017-05-26 13:53:03650 shared_bitmap_manager(), gpu_memory_buffer_manager(), renderer_settings,
Alex Zhang903cb6a2017-06-12 20:31:37651 ImplThreadTaskRunner(), synchronous_composite, disable_display_vsync,
652 refresh_rate);
danakj014316e2016-08-04 18:40:26653 }
[email protected]28571b042013-03-14 07:59:15654
ericrkad5923812017-01-25 23:26:12655 void AdvanceTestCase() {
656 ++test_case_;
657 switch (test_case_) {
658 case 1:
659 // Case #1: change mailbox before the commit. The old mailbox should be
660 // released immediately.
661 SetMailbox('2');
662 EXPECT_EQ(1, callback_count_);
663 PostSetNeedsCommitToMainThread();
664
665 // Case 2 does not rely on callbacks to advance.
666 pending_callback_ = false;
667 break;
668 case 2:
669 // Case #2: change mailbox after the commit (and draw), where the
670 // layer draws. The old mailbox should be released during the next
671 // commit.
672 SetMailbox('3');
673 EXPECT_EQ(1, callback_count_);
674
675 // Cases 3-5 rely on a callback to advance.
676 pending_callback_ = true;
677 break;
678 case 3:
679 EXPECT_EQ(2, callback_count_);
680 // Case #3: change mailbox when the layer doesn't draw. The old
681 // mailbox should be released during the next commit.
682 layer_->SetBounds(gfx::Size());
683 SetMailbox('4');
684 break;
685 case 4:
686 EXPECT_EQ(3, callback_count_);
687 // Case #4: release mailbox that was committed but never drawn. The
688 // old mailbox should be released during the next commit.
Fady Samuel2a725ce52017-07-11 22:30:00689 layer_->SetTextureMailbox(viz::TextureMailbox(), nullptr);
ericrkad5923812017-01-25 23:26:12690 break;
691 case 5:
692 EXPECT_EQ(4, callback_count_);
693 // Restore a mailbox for the next step.
694 SetMailbox('5');
695
696 // Cases 6 and 7 do not rely on callbacks to advance.
697 pending_callback_ = false;
698 break;
699 case 6:
700 // Case #5: remove layer from tree. Callback should *not* be called, the
701 // mailbox is returned to the main thread.
702 EXPECT_EQ(4, callback_count_);
703 layer_->RemoveFromParent();
704 break;
705 case 7:
706 EXPECT_EQ(4, callback_count_);
707 // Resetting the mailbox will call the callback now.
Fady Samuel2a725ce52017-07-11 22:30:00708 layer_->SetTextureMailbox(viz::TextureMailbox(), nullptr);
ericrkad5923812017-01-25 23:26:12709 EXPECT_EQ(5, callback_count_);
710 EndTest();
711 break;
712 default:
713 NOTREACHED();
714 break;
715 }
716 }
717
[email protected]28571b042013-03-14 07:59:15718 // Make sure callback is received on main and doesn't block the impl thread.
danakj014316e2016-08-04 18:40:26719 void ReleaseCallback(char mailbox_char,
720 const gpu::SyncToken& sync_token,
721 bool lost_resource) {
[email protected]9794fb32013-08-29 09:49:59722 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
[email protected]7ba3ca72013-04-11 06:37:25723 EXPECT_FALSE(lost_resource);
[email protected]28571b042013-03-14 07:59:15724 ++callback_count_;
ericrkad5923812017-01-25 23:26:12725
726 // If we are waiting on a callback, advance now.
727 if (pending_callback_)
728 AdvanceTestCase();
[email protected]28571b042013-03-14 07:59:15729 }
730
731 void SetMailbox(char mailbox_char) {
[email protected]9794fb32013-08-29 09:49:59732 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
danakj60bc3bc2016-04-09 00:24:48733 std::unique_ptr<SingleReleaseCallback> callback =
734 SingleReleaseCallback::Create(base::Bind(
[email protected]28571b042013-03-14 07:59:15735 &TextureLayerImplWithMailboxThreadedCallback::ReleaseCallback,
danakj014316e2016-08-04 18:40:26736 base::Unretained(this), mailbox_char));
dyene5db881b2016-03-01 19:47:03737 layer_->SetTextureMailbox(
Fady Samuel2a725ce52017-07-11 22:30:00738 viz::TextureMailbox(
739 MailboxFromChar(mailbox_char),
740 SyncTokenFromUInt(static_cast<uint32_t>(mailbox_char)),
741 GL_TEXTURE_2D),
dyene5db881b2016-03-01 19:47:03742 std::move(callback));
danakj014316e2016-08-04 18:40:26743 // Damage the layer so we send a new frame with the new mailbox to the
744 // Display compositor.
745 layer_->SetNeedsDisplay();
[email protected]28571b042013-03-14 07:59:15746 }
747
dcheng716bedf2014-10-21 09:51:08748 void BeginTest() override {
[email protected]9794fb32013-08-29 09:49:59749 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
750
[email protected]28571b042013-03-14 07:59:15751 gfx::Size bounds(100, 100);
loyso0940d412016-03-14 01:30:31752 root_ = Layer::Create();
[email protected]28571b042013-03-14 07:59:15753 root_->SetBounds(bounds);
754
loyso0940d412016-03-14 01:30:31755 layer_ = TextureLayer::CreateForMailbox(nullptr);
[email protected]28571b042013-03-14 07:59:15756 layer_->SetIsDrawable(true);
[email protected]28571b042013-03-14 07:59:15757 layer_->SetBounds(bounds);
758
759 root_->AddChild(layer_);
khushalsagarb69ba9452017-01-27 22:20:07760 layer_tree_host()->SetRootLayer(root_);
761 layer_tree_host()->SetViewportSize(bounds);
[email protected]28571b042013-03-14 07:59:15762 SetMailbox('1');
763 EXPECT_EQ(0, callback_count_);
764
ericrkad5923812017-01-25 23:26:12765 // Setup is complete - advance to test case 1.
766 AdvanceTestCase();
[email protected]28571b042013-03-14 07:59:15767 }
768
dcheng716bedf2014-10-21 09:51:08769 void DidCommit() override {
ericrkad5923812017-01-25 23:26:12770 // If we are not waiting on a callback, advance now.
771 if (!pending_callback_)
772 AdvanceTestCase();
[email protected]28571b042013-03-14 07:59:15773 }
[email protected]de44a152013-01-08 15:28:46774
dcheng716bedf2014-10-21 09:51:08775 void AfterTest() override {}
[email protected]de44a152013-01-08 15:28:46776
[email protected]28571b042013-03-14 07:59:15777 private:
[email protected]9794fb32013-08-29 09:49:59778 base::ThreadChecker main_thread_;
danakj014316e2016-08-04 18:40:26779 int callback_count_ = 0;
ericrkad5923812017-01-25 23:26:12780 int test_case_ = 0;
781 // Whether we are waiting on a callback to advance the test case.
782 bool pending_callback_ = false;
[email protected]28571b042013-03-14 07:59:15783 scoped_refptr<Layer> root_;
784 scoped_refptr<TextureLayer> layer_;
[email protected]de44a152013-01-08 15:28:46785};
786
danakj0943a112016-08-11 00:33:46787SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerImplWithMailboxThreadedCallback);
[email protected]74b43cc2013-08-30 06:29:27788
[email protected]74b43cc2013-08-30 06:29:27789class TextureLayerMailboxIsActivatedDuringCommit : public LayerTreeTest {
790 protected:
samans0834fe042017-03-03 17:03:22791 void ReleaseCallback(const gpu::SyncToken& original_sync_token,
792 const gpu::SyncToken& release_sync_token,
793 bool lost_resource) {
794 released_count_++;
795 switch (released_count_) {
796 case 1:
797 break;
798 case 2:
799 EXPECT_EQ(3, layer_tree_host()->SourceFrameNumber());
800 EndTest();
801 break;
802 default:
803 NOTREACHED();
804 }
805 }
[email protected]74b43cc2013-08-30 06:29:27806
807 void SetMailbox(char mailbox_char) {
dyene5db881b2016-03-01 19:47:03808 const gpu::SyncToken sync_token =
809 SyncTokenFromUInt(static_cast<uint32_t>(mailbox_char));
danakj60bc3bc2016-04-09 00:24:48810 std::unique_ptr<SingleReleaseCallback> callback =
811 SingleReleaseCallback::Create(base::Bind(
812 &TextureLayerMailboxIsActivatedDuringCommit::ReleaseCallback,
samans0834fe042017-03-03 17:03:22813 base::Unretained(this), sync_token));
Fady Samuel2a725ce52017-07-11 22:30:00814 layer_->SetTextureMailbox(viz::TextureMailbox(MailboxFromChar(mailbox_char),
815 sync_token, GL_TEXTURE_2D),
danakja04855a2015-11-18 20:39:10816 std::move(callback));
[email protected]74b43cc2013-08-30 06:29:27817 }
818
dcheng716bedf2014-10-21 09:51:08819 void BeginTest() override {
[email protected]74b43cc2013-08-30 06:29:27820 gfx::Size bounds(100, 100);
loyso0940d412016-03-14 01:30:31821 root_ = Layer::Create();
[email protected]74b43cc2013-08-30 06:29:27822 root_->SetBounds(bounds);
823
loyso0940d412016-03-14 01:30:31824 layer_ = TextureLayer::CreateForMailbox(nullptr);
[email protected]74b43cc2013-08-30 06:29:27825 layer_->SetIsDrawable(true);
[email protected]74b43cc2013-08-30 06:29:27826 layer_->SetBounds(bounds);
827
828 root_->AddChild(layer_);
khushalsagarb69ba9452017-01-27 22:20:07829 layer_tree_host()->SetRootLayer(root_);
830 layer_tree_host()->SetViewportSize(bounds);
[email protected]74b43cc2013-08-30 06:29:27831 SetMailbox('1');
832
833 PostSetNeedsCommitToMainThread();
834 }
835
dcheng716bedf2014-10-21 09:51:08836 void WillActivateTreeOnThread(LayerTreeHostImpl* impl) override {
danakj3c3973b2015-08-25 21:50:18837 base::AutoLock lock(activate_count_lock_);
[email protected]74b43cc2013-08-30 06:29:27838 ++activate_count_;
839 }
840
dcheng716bedf2014-10-21 09:51:08841 void DidCommit() override {
danakj3c3973b2015-08-25 21:50:18842 // The first frame doesn't cause anything to be returned so it does not
843 // need to wait for activation.
khushalsagarcebe4942016-09-07 23:27:01844 if (layer_tree_host()->SourceFrameNumber() > 1) {
danakj3c3973b2015-08-25 21:50:18845 base::AutoLock lock(activate_count_lock_);
846 // The activate happened before commit is done on the main side.
khushalsagarcebe4942016-09-07 23:27:01847 EXPECT_EQ(activate_count_, layer_tree_host()->SourceFrameNumber());
danakj3c3973b2015-08-25 21:50:18848 }
849
khushalsagarcebe4942016-09-07 23:27:01850 switch (layer_tree_host()->SourceFrameNumber()) {
[email protected]74b43cc2013-08-30 06:29:27851 case 1:
852 // The first mailbox has been activated. Set a new mailbox, and
853 // expect the next commit to finish *after* it is activated.
854 SetMailbox('2');
[email protected]74b43cc2013-08-30 06:29:27855 break;
856 case 2:
857 // The second mailbox has been activated. Remove the layer from
858 // the tree to cause another commit/activation. The commit should
859 // finish *after* the layer is removed from the active tree.
860 layer_->RemoveFromParent();
[email protected]74b43cc2013-08-30 06:29:27861 break;
862 case 3:
samans0834fe042017-03-03 17:03:22863 // This ensures all texture mailboxes are released before the end of the
864 // test.
865 layer_->ClearClient();
[email protected]74b43cc2013-08-30 06:29:27866 break;
samans0834fe042017-03-03 17:03:22867 default:
868 NOTREACHED();
[email protected]74b43cc2013-08-30 06:29:27869 }
870 }
871
dcheng716bedf2014-10-21 09:51:08872 void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
danakj3c3973b2015-08-25 21:50:18873 // The activate didn't happen before commit is done on the impl side (but it
874 // should happen before the main thread is done).
875 EXPECT_EQ(activate_count_, host_impl->sync_tree()->source_frame_number());
[email protected]74b43cc2013-08-30 06:29:27876 }
877
dcheng716bedf2014-10-21 09:51:08878 void AfterTest() override {}
[email protected]74b43cc2013-08-30 06:29:27879
danakj3c3973b2015-08-25 21:50:18880 base::Lock activate_count_lock_;
samans0834fe042017-03-03 17:03:22881 int activate_count_ = 0;
[email protected]74b43cc2013-08-30 06:29:27882 scoped_refptr<Layer> root_;
883 scoped_refptr<TextureLayer> layer_;
samans0834fe042017-03-03 17:03:22884 int released_count_ = 0;
[email protected]74b43cc2013-08-30 06:29:27885};
886
danakj0943a112016-08-11 00:33:46887SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerMailboxIsActivatedDuringCommit);
[email protected]74b43cc2013-08-30 06:29:27888
[email protected]de44a152013-01-08 15:28:46889class TextureLayerImplWithMailboxTest : public TextureLayerTest {
[email protected]28571b042013-03-14 07:59:15890 protected:
dcheng93a52eb2014-12-23 02:14:23891 void SetUp() override {
[email protected]28571b042013-03-14 07:59:15892 TextureLayerTest::SetUp();
loyso2cb3f32f2016-11-08 07:08:34893 layer_tree_host_ = MockLayerTreeHost::Create(
894 &fake_client_, &task_graph_runner_, animation_host_.get());
sievers71c62dd52015-10-07 01:44:39895 host_impl_.SetVisible(true);
danakjc7afae52017-06-20 21:12:41896 EXPECT_TRUE(host_impl_.InitializeRenderer(layer_tree_frame_sink_.get()));
[email protected]28571b042013-03-14 07:59:15897 }
[email protected]de44a152013-01-08 15:28:46898
[email protected]0ec335c42013-07-04 06:17:08899 bool WillDraw(TextureLayerImpl* layer, DrawMode mode) {
900 bool will_draw = layer->WillDraw(
901 mode, host_impl_.active_tree()->resource_provider());
902 if (will_draw)
903 layer->DidDraw(host_impl_.active_tree()->resource_provider());
904 return will_draw;
905 }
906
[email protected]408b5e22013-03-19 09:48:09907 FakeLayerTreeHostClient fake_client_;
[email protected]de44a152013-01-08 15:28:46908};
909
[email protected]ffbb2212013-06-02 23:47:59910// Test conditions for results of TextureLayerImpl::WillDraw under
911// different configurations of different mailbox, texture_id, and draw_mode.
912TEST_F(TextureLayerImplWithMailboxTest, TestWillDraw) {
skyostil3976a3f2014-09-04 22:07:23913 EXPECT_CALL(
914 test_data_.mock_callback_,
dyencc16ed4d2015-11-03 20:03:04915 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_token1_, false, _))
[email protected]0ec335c42013-07-04 06:17:08916 .Times(AnyNumber());
dyencc16ed4d2015-11-03 20:03:04917 EXPECT_CALL(
918 test_data_.mock_callback_,
919 ReleaseImpl2(test_data_.shared_bitmap_.get(), gpu::SyncToken(), false, _))
[email protected]0ec335c42013-07-04 06:17:08920 .Times(AnyNumber());
[email protected]ffbb2212013-06-02 23:47:59921 // Hardware mode.
922 {
danakj60bc3bc2016-04-09 00:24:48923 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11924 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
[email protected]9260757f2013-09-17 01:24:16925 impl_layer->SetTextureMailbox(
926 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:23927 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]0ec335c42013-07-04 06:17:08928 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE));
[email protected]ffbb2212013-06-02 23:47:59929 }
930
931 {
danakj60bc3bc2016-04-09 00:24:48932 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11933 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
Fady Samuel2a725ce52017-07-11 22:30:00934 impl_layer->SetTextureMailbox(viz::TextureMailbox(), nullptr);
[email protected]0ec335c42013-07-04 06:17:08935 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE));
936 }
937
938 {
939 // Software resource.
danakj60bc3bc2016-04-09 00:24:48940 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11941 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
[email protected]9260757f2013-09-17 01:24:16942 impl_layer->SetTextureMailbox(
943 test_data_.mailbox3_,
skyostil3976a3f2014-09-04 22:07:23944 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox3_impl_));
[email protected]3e44d7a2013-07-30 00:03:10945 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE));
[email protected]ffbb2212013-06-02 23:47:59946 }
947
[email protected]0ec335c42013-07-04 06:17:08948 // Software mode.
949 {
danakj60bc3bc2016-04-09 00:24:48950 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11951 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
[email protected]9260757f2013-09-17 01:24:16952 impl_layer->SetTextureMailbox(
953 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:23954 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]0ec335c42013-07-04 06:17:08955 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE));
956 }
957
958 {
danakj60bc3bc2016-04-09 00:24:48959 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11960 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
Fady Samuel2a725ce52017-07-11 22:30:00961 impl_layer->SetTextureMailbox(viz::TextureMailbox(), nullptr);
[email protected]0ec335c42013-07-04 06:17:08962 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE));
963 }
964
965 {
966 // Software resource.
danakj60bc3bc2016-04-09 00:24:48967 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11968 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
[email protected]9260757f2013-09-17 01:24:16969 impl_layer->SetTextureMailbox(
970 test_data_.mailbox3_,
skyostil3976a3f2014-09-04 22:07:23971 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox3_impl_));
[email protected]0ec335c42013-07-04 06:17:08972 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE));
973 }
974
[email protected]ffbb2212013-06-02 23:47:59975 // Resourceless software mode.
976 {
danakj60bc3bc2016-04-09 00:24:48977 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11978 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
[email protected]9260757f2013-09-17 01:24:16979 impl_layer->SetTextureMailbox(
980 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:23981 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]0ec335c42013-07-04 06:17:08982 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_RESOURCELESS_SOFTWARE));
[email protected]ffbb2212013-06-02 23:47:59983 }
[email protected]ffbb2212013-06-02 23:47:59984}
985
[email protected]28571b042013-03-14 07:59:15986TEST_F(TextureLayerImplWithMailboxTest, TestImplLayerCallbacks) {
987 host_impl_.CreatePendingTree();
danakj60bc3bc2016-04-09 00:24:48988 std::unique_ptr<TextureLayerImpl> pending_layer;
[email protected]17e08432014-04-10 00:41:11989 pending_layer = TextureLayerImpl::Create(host_impl_.pending_tree(), 1);
[email protected]28571b042013-03-14 07:59:15990 ASSERT_TRUE(pending_layer);
[email protected]de44a152013-01-08 15:28:46991
danakj60bc3bc2016-04-09 00:24:48992 std::unique_ptr<LayerImpl> active_layer(
[email protected]28571b042013-03-14 07:59:15993 pending_layer->CreateLayerImpl(host_impl_.active_tree()));
[email protected]ed511b8d2013-03-25 03:29:29994 ASSERT_TRUE(active_layer);
[email protected]de44a152013-01-08 15:28:46995
[email protected]9260757f2013-09-17 01:24:16996 pending_layer->SetTextureMailbox(
997 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:23998 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]421e84f2013-02-22 03:27:15999
[email protected]28571b042013-03-14 07:59:151000 // Test multiple commits without an activation.
skyostil3976a3f2014-09-04 22:07:231001 EXPECT_CALL(
1002 test_data_.mock_callback_,
dyencc16ed4d2015-11-03 20:03:041003 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_token1_, false, _))
[email protected]28571b042013-03-14 07:59:151004 .Times(1);
[email protected]9260757f2013-09-17 01:24:161005 pending_layer->SetTextureMailbox(
1006 test_data_.mailbox2_,
skyostil3976a3f2014-09-04 22:07:231007 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox2_impl_));
[email protected]28571b042013-03-14 07:59:151008 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]421e84f2013-02-22 03:27:151009
[email protected]28571b042013-03-14 07:59:151010 // Test callback after activation.
[email protected]ed511b8d2013-03-25 03:29:291011 pending_layer->PushPropertiesTo(active_layer.get());
1012 active_layer->DidBecomeActive();
[email protected]421e84f2013-02-22 03:27:151013
skyostil3976a3f2014-09-04 22:07:231014 EXPECT_CALL(test_data_.mock_callback_, ReleaseImpl(_, _, _, _)).Times(0);
[email protected]9260757f2013-09-17 01:24:161015 pending_layer->SetTextureMailbox(
1016 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:231017 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]28571b042013-03-14 07:59:151018 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]421e84f2013-02-22 03:27:151019
[email protected]7ba3ca72013-04-11 06:37:251020 EXPECT_CALL(test_data_.mock_callback_,
skyostil3976a3f2014-09-04 22:07:231021 ReleaseImpl(test_data_.mailbox_name2_, _, false, _)).Times(1);
[email protected]ed511b8d2013-03-25 03:29:291022 pending_layer->PushPropertiesTo(active_layer.get());
1023 active_layer->DidBecomeActive();
[email protected]28571b042013-03-14 07:59:151024 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]de44a152013-01-08 15:28:461025
[email protected]28571b042013-03-14 07:59:151026 // Test resetting the mailbox.
[email protected]7ba3ca72013-04-11 06:37:251027 EXPECT_CALL(test_data_.mock_callback_,
skyostil3976a3f2014-09-04 22:07:231028 ReleaseImpl(test_data_.mailbox_name1_, _, false, _)).Times(1);
Fady Samuel2a725ce52017-07-11 22:30:001029 pending_layer->SetTextureMailbox(viz::TextureMailbox(), nullptr);
[email protected]ed511b8d2013-03-25 03:29:291030 pending_layer->PushPropertiesTo(active_layer.get());
1031 active_layer->DidBecomeActive();
[email protected]28571b042013-03-14 07:59:151032 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]de44a152013-01-08 15:28:461033
[email protected]28571b042013-03-14 07:59:151034 // Test destructor.
skyostil3976a3f2014-09-04 22:07:231035 EXPECT_CALL(
1036 test_data_.mock_callback_,
dyencc16ed4d2015-11-03 20:03:041037 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_token1_, false, _))
[email protected]28571b042013-03-14 07:59:151038 .Times(1);
[email protected]9260757f2013-09-17 01:24:161039 pending_layer->SetTextureMailbox(
1040 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:231041 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]de44a152013-01-08 15:28:461042}
1043
[email protected]28571b042013-03-14 07:59:151044TEST_F(TextureLayerImplWithMailboxTest,
1045 TestDestructorCallbackOnCreatedResource) {
danakj60bc3bc2016-04-09 00:24:481046 std::unique_ptr<TextureLayerImpl> impl_layer;
[email protected]17e08432014-04-10 00:41:111047 impl_layer = TextureLayerImpl::Create(host_impl_.active_tree(), 1);
[email protected]28571b042013-03-14 07:59:151048 ASSERT_TRUE(impl_layer);
[email protected]de44a152013-01-08 15:28:461049
[email protected]7ba3ca72013-04-11 06:37:251050 EXPECT_CALL(test_data_.mock_callback_,
skyostil3976a3f2014-09-04 22:07:231051 ReleaseImpl(test_data_.mailbox_name1_, _, false, _)).Times(1);
[email protected]9260757f2013-09-17 01:24:161052 impl_layer->SetTextureMailbox(
1053 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:231054 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]ffbb2212013-06-02 23:47:591055 impl_layer->DidBecomeActive();
1056 EXPECT_TRUE(impl_layer->WillDraw(
1057 DRAW_MODE_HARDWARE, host_impl_.active_tree()->resource_provider()));
[email protected]28571b042013-03-14 07:59:151058 impl_layer->DidDraw(host_impl_.active_tree()->resource_provider());
Fady Samuel2a725ce52017-07-11 22:30:001059 impl_layer->SetTextureMailbox(viz::TextureMailbox(), nullptr);
[email protected]de44a152013-01-08 15:28:461060}
1061
[email protected]28571b042013-03-14 07:59:151062TEST_F(TextureLayerImplWithMailboxTest, TestCallbackOnInUseResource) {
1063 ResourceProvider* provider = host_impl_.active_tree()->resource_provider();
jbaumanbbd425e2015-05-19 00:33:351064 ResourceId id = provider->CreateResourceFromTextureMailbox(
skyostil3976a3f2014-09-04 22:07:231065 test_data_.mailbox1_,
1066 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]28571b042013-03-14 07:59:151067 provider->AllocateForTesting(id);
[email protected]de44a152013-01-08 15:28:461068
[email protected]28571b042013-03-14 07:59:151069 // Transfer some resources to the parent.
1070 ResourceProvider::ResourceIdArray resource_ids_to_transfer;
1071 resource_ids_to_transfer.push_back(id);
danakj30464ba12017-06-29 21:26:451072 std::vector<TransferableResource> list;
[email protected]28571b042013-03-14 07:59:151073 provider->PrepareSendToParent(resource_ids_to_transfer, &list);
1074 EXPECT_TRUE(provider->InUseByConsumer(id));
skyostil3976a3f2014-09-04 22:07:231075 EXPECT_CALL(test_data_.mock_callback_, ReleaseImpl(_, _, _, _)).Times(0);
[email protected]28571b042013-03-14 07:59:151076 provider->DeleteResource(id);
1077 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]7ba3ca72013-04-11 06:37:251078 EXPECT_CALL(test_data_.mock_callback_,
skyostil3976a3f2014-09-04 22:07:231079 ReleaseImpl(test_data_.mailbox_name1_, _, false, _)).Times(1);
danakj30464ba12017-06-29 21:26:451080 std::vector<ReturnedResource> returned =
1081 TransferableResource::ReturnResources(list);
[email protected]e00bab022013-08-19 00:42:451082 provider->ReceiveReturnsFromParent(returned);
[email protected]de44a152013-01-08 15:28:461083}
1084
[email protected]4bad8b62013-10-24 01:27:291085// Checks that TextureLayer::Update does not cause an extra commit when setting
1086// the texture mailbox.
1087class TextureLayerNoExtraCommitForMailboxTest
1088 : public LayerTreeTest,
1089 public TextureLayerClient {
1090 public:
[email protected]4bad8b62013-10-24 01:27:291091 // TextureLayerClient implementation.
dcheng716bedf2014-10-21 09:51:081092 bool PrepareTextureMailbox(
Fady Samuel2a725ce52017-07-11 22:30:001093 viz::TextureMailbox* texture_mailbox,
danakj4d0dd802016-08-23 22:10:061094 std::unique_ptr<SingleReleaseCallback>* release_callback) override {
khushalsagarcebe4942016-09-07 23:27:011095 if (layer_tree_host()->SourceFrameNumber() == 1) {
[email protected]9f35bd22014-06-03 15:25:461096 // Once this has been committed, the mailbox will be released.
Fady Samuel2a725ce52017-07-11 22:30:001097 *texture_mailbox = viz::TextureMailbox();
[email protected]cce34bd2013-12-02 23:24:451098 return true;
1099 }
[email protected]4bad8b62013-10-24 01:27:291100
Fady Samuel2a725ce52017-07-11 22:30:001101 *texture_mailbox = viz::TextureMailbox(
1102 MailboxFromChar('1'), SyncTokenFromUInt(0x123), GL_TEXTURE_2D);
[email protected]4bad8b62013-10-24 01:27:291103 *release_callback = SingleReleaseCallback::Create(
1104 base::Bind(&TextureLayerNoExtraCommitForMailboxTest::MailboxReleased,
1105 base::Unretained(this)));
[email protected]4bad8b62013-10-24 01:27:291106 return true;
1107 }
1108
dyencc16ed4d2015-11-03 20:03:041109 void MailboxReleased(const gpu::SyncToken& sync_token, bool lost_resource) {
dyene5db881b2016-03-01 19:47:031110 EXPECT_TRUE(sync_token.HasData());
[email protected]cce34bd2013-12-02 23:24:451111 EndTest();
[email protected]4bad8b62013-10-24 01:27:291112 }
1113
dcheng716bedf2014-10-21 09:51:081114 void SetupTree() override {
loyso0940d412016-03-14 01:30:311115 scoped_refptr<Layer> root = Layer::Create();
[email protected]4bad8b62013-10-24 01:27:291116 root->SetBounds(gfx::Size(10, 10));
[email protected]4bad8b62013-10-24 01:27:291117 root->SetIsDrawable(true);
1118
loyso0940d412016-03-14 01:30:311119 texture_layer_ = TextureLayer::CreateForMailbox(this);
[email protected]4bad8b62013-10-24 01:27:291120 texture_layer_->SetBounds(gfx::Size(10, 10));
[email protected]4bad8b62013-10-24 01:27:291121 texture_layer_->SetIsDrawable(true);
[email protected]0d7fb302014-01-23 21:30:471122 root->AddChild(texture_layer_);
[email protected]4bad8b62013-10-24 01:27:291123
khushalsagarb69ba9452017-01-27 22:20:071124 layer_tree_host()->SetRootLayer(root);
[email protected]4bad8b62013-10-24 01:27:291125 LayerTreeTest::SetupTree();
1126 }
1127
dcheng716bedf2014-10-21 09:51:081128 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
[email protected]4bad8b62013-10-24 01:27:291129
dcheng716bedf2014-10-21 09:51:081130 void DidCommitAndDrawFrame() override {
khushalsagarcebe4942016-09-07 23:27:011131 switch (layer_tree_host()->SourceFrameNumber()) {
[email protected]4bad8b62013-10-24 01:27:291132 case 1:
[email protected]4ea293f72014-08-13 03:03:171133 EXPECT_FALSE(proxy()->MainFrameWillHappenForTesting());
[email protected]cce34bd2013-12-02 23:24:451134 // Invalidate the texture layer to clear the mailbox before
1135 // ending the test.
1136 texture_layer_->SetNeedsDisplay();
1137 break;
1138 case 2:
[email protected]4bad8b62013-10-24 01:27:291139 break;
1140 default:
1141 NOTREACHED();
1142 break;
1143 }
1144 }
1145
dcheng716bedf2014-10-21 09:51:081146 void AfterTest() override {}
[email protected]4bad8b62013-10-24 01:27:291147
1148 private:
[email protected]4bad8b62013-10-24 01:27:291149 scoped_refptr<TextureLayer> texture_layer_;
[email protected]4bad8b62013-10-24 01:27:291150};
1151
[email protected]cce34bd2013-12-02 23:24:451152SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerNoExtraCommitForMailboxTest);
[email protected]4bad8b62013-10-24 01:27:291153
[email protected]b04264f92013-09-13 23:37:291154// Checks that changing a mailbox in the client for a TextureLayer that's
1155// invisible correctly works and uses the new mailbox as soon as the layer
1156// becomes visible (and returns the old one).
1157class TextureLayerChangeInvisibleMailboxTest
1158 : public LayerTreeTest,
1159 public TextureLayerClient {
1160 public:
1161 TextureLayerChangeInvisibleMailboxTest()
1162 : mailbox_changed_(true),
1163 mailbox_returned_(0),
1164 prepare_called_(0),
1165 commit_count_(0) {
1166 mailbox_ = MakeMailbox('1');
1167 }
1168
1169 // TextureLayerClient implementation.
dcheng716bedf2014-10-21 09:51:081170 bool PrepareTextureMailbox(
Fady Samuel2a725ce52017-07-11 22:30:001171 viz::TextureMailbox* mailbox,
danakj4d0dd802016-08-23 22:10:061172 std::unique_ptr<SingleReleaseCallback>* release_callback) override {
[email protected]b04264f92013-09-13 23:37:291173 ++prepare_called_;
1174 if (!mailbox_changed_)
1175 return false;
1176 *mailbox = mailbox_;
[email protected]9260757f2013-09-17 01:24:161177 *release_callback = SingleReleaseCallback::Create(
1178 base::Bind(&TextureLayerChangeInvisibleMailboxTest::MailboxReleased,
1179 base::Unretained(this)));
[email protected]b04264f92013-09-13 23:37:291180 return true;
1181 }
1182
Fady Samuel2a725ce52017-07-11 22:30:001183 viz::TextureMailbox MakeMailbox(char name) {
1184 return viz::TextureMailbox(MailboxFromChar(name),
1185 SyncTokenFromUInt(static_cast<uint32_t>(name)),
1186 GL_TEXTURE_2D);
[email protected]b04264f92013-09-13 23:37:291187 }
1188
dyencc16ed4d2015-11-03 20:03:041189 void MailboxReleased(const gpu::SyncToken& sync_token, bool lost_resource) {
dyene5db881b2016-03-01 19:47:031190 EXPECT_TRUE(sync_token.HasData());
[email protected]b04264f92013-09-13 23:37:291191 ++mailbox_returned_;
1192 }
1193
dcheng716bedf2014-10-21 09:51:081194 void SetupTree() override {
loyso0940d412016-03-14 01:30:311195 scoped_refptr<Layer> root = Layer::Create();
[email protected]b04264f92013-09-13 23:37:291196 root->SetBounds(gfx::Size(10, 10));
[email protected]b04264f92013-09-13 23:37:291197 root->SetIsDrawable(true);
1198
loyso0940d412016-03-14 01:30:311199 solid_layer_ = SolidColorLayer::Create();
[email protected]b04264f92013-09-13 23:37:291200 solid_layer_->SetBounds(gfx::Size(10, 10));
1201 solid_layer_->SetIsDrawable(true);
1202 solid_layer_->SetBackgroundColor(SK_ColorWHITE);
1203 root->AddChild(solid_layer_);
1204
loyso0940d412016-03-14 01:30:311205 parent_layer_ = Layer::Create();
[email protected]b04264f92013-09-13 23:37:291206 parent_layer_->SetBounds(gfx::Size(10, 10));
1207 parent_layer_->SetIsDrawable(true);
1208 root->AddChild(parent_layer_);
1209
loyso0940d412016-03-14 01:30:311210 texture_layer_ = TextureLayer::CreateForMailbox(this);
[email protected]b04264f92013-09-13 23:37:291211 texture_layer_->SetBounds(gfx::Size(10, 10));
[email protected]b04264f92013-09-13 23:37:291212 texture_layer_->SetIsDrawable(true);
1213 parent_layer_->AddChild(texture_layer_);
1214
khushalsagarb69ba9452017-01-27 22:20:071215 layer_tree_host()->SetRootLayer(root);
[email protected]b04264f92013-09-13 23:37:291216 LayerTreeTest::SetupTree();
1217 }
1218
dcheng716bedf2014-10-21 09:51:081219 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
[email protected]b04264f92013-09-13 23:37:291220
samans44b6dfc2017-04-19 16:50:531221 void DidReceiveCompositorFrameAck() override {
[email protected]b04264f92013-09-13 23:37:291222 ++commit_count_;
1223 switch (commit_count_) {
1224 case 1:
1225 // We should have updated the layer, committing the texture.
1226 EXPECT_EQ(1, prepare_called_);
1227 // Make layer invisible.
1228 parent_layer_->SetOpacity(0.f);
1229 break;
1230 case 2:
1231 // Layer shouldn't have been updated.
1232 EXPECT_EQ(1, prepare_called_);
1233 // Change the texture.
1234 mailbox_ = MakeMailbox('2');
1235 mailbox_changed_ = true;
1236 texture_layer_->SetNeedsDisplay();
1237 // Force a change to make sure we draw a frame.
1238 solid_layer_->SetBackgroundColor(SK_ColorGRAY);
1239 break;
1240 case 3:
1241 // Layer shouldn't have been updated.
1242 EXPECT_EQ(1, prepare_called_);
1243 // So the old mailbox isn't returned yet.
1244 EXPECT_EQ(0, mailbox_returned_);
1245 // Make layer visible again.
jaydasikacf223762016-05-16 23:02:091246 parent_layer_->SetOpacity(0.9f);
[email protected]b04264f92013-09-13 23:37:291247 break;
1248 case 4:
1249 // Layer should have been updated.
1250 EXPECT_EQ(2, prepare_called_);
1251 // So the old mailbox should have been returned already.
1252 EXPECT_EQ(1, mailbox_returned_);
1253 texture_layer_->ClearClient();
1254 break;
1255 case 5:
samans44b6dfc2017-04-19 16:50:531256 EXPECT_EQ(2, mailbox_returned_);
1257 EndTest();
[email protected]b04264f92013-09-13 23:37:291258 break;
1259 default:
1260 NOTREACHED();
1261 break;
1262 }
1263 }
1264
dcheng716bedf2014-10-21 09:51:081265 void AfterTest() override {}
[email protected]b04264f92013-09-13 23:37:291266
1267 private:
1268 scoped_refptr<SolidColorLayer> solid_layer_;
1269 scoped_refptr<Layer> parent_layer_;
1270 scoped_refptr<TextureLayer> texture_layer_;
1271
1272 // Used on the main thread.
1273 bool mailbox_changed_;
Fady Samuel2a725ce52017-07-11 22:30:001274 viz::TextureMailbox mailbox_;
[email protected]b04264f92013-09-13 23:37:291275 int mailbox_returned_;
1276 int prepare_called_;
1277 int commit_count_;
1278};
1279
samans44b6dfc2017-04-19 16:50:531280SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerChangeInvisibleMailboxTest);
[email protected]b04264f92013-09-13 23:37:291281
[email protected]0d7fb302014-01-23 21:30:471282// Test that TextureLayerImpl::ReleaseResources can be called which releases
1283// the mailbox back to TextureLayerClient.
1284class TextureLayerReleaseResourcesBase
1285 : public LayerTreeTest,
1286 public TextureLayerClient {
1287 public:
1288 // TextureLayerClient implementation.
dcheng716bedf2014-10-21 09:51:081289 bool PrepareTextureMailbox(
Fady Samuel2a725ce52017-07-11 22:30:001290 viz::TextureMailbox* mailbox,
danakj4d0dd802016-08-23 22:10:061291 std::unique_ptr<SingleReleaseCallback>* release_callback) override {
Fady Samuel2a725ce52017-07-11 22:30:001292 *mailbox = viz::TextureMailbox(MailboxFromChar('1'), SyncTokenFromUInt(1),
1293 GL_TEXTURE_2D);
[email protected]0d7fb302014-01-23 21:30:471294 *release_callback = SingleReleaseCallback::Create(
1295 base::Bind(&TextureLayerReleaseResourcesBase::MailboxReleased,
1296 base::Unretained(this)));
1297 return true;
1298 }
1299
dyencc16ed4d2015-11-03 20:03:041300 void MailboxReleased(const gpu::SyncToken& sync_token, bool lost_resource) {
[email protected]0d7fb302014-01-23 21:30:471301 mailbox_released_ = true;
1302 }
1303
dcheng716bedf2014-10-21 09:51:081304 void SetupTree() override {
[email protected]0d7fb302014-01-23 21:30:471305 LayerTreeTest::SetupTree();
1306
1307 scoped_refptr<TextureLayer> texture_layer =
loyso0940d412016-03-14 01:30:311308 TextureLayer::CreateForMailbox(this);
[email protected]0d7fb302014-01-23 21:30:471309 texture_layer->SetBounds(gfx::Size(10, 10));
[email protected]0d7fb302014-01-23 21:30:471310 texture_layer->SetIsDrawable(true);
1311
khushalsagarb69ba9452017-01-27 22:20:071312 layer_tree_host()->root_layer()->AddChild(texture_layer);
jaydasikabd6f15a2016-04-21 19:45:371313 texture_layer_id_ = texture_layer->id();
[email protected]0d7fb302014-01-23 21:30:471314 }
1315
dcheng716bedf2014-10-21 09:51:081316 void BeginTest() override {
[email protected]0d7fb302014-01-23 21:30:471317 mailbox_released_ = false;
1318 PostSetNeedsCommitToMainThread();
1319 }
1320
dcheng716bedf2014-10-21 09:51:081321 void DidCommitAndDrawFrame() override { EndTest(); }
[email protected]0d7fb302014-01-23 21:30:471322
dcheng716bedf2014-10-21 09:51:081323 void AfterTest() override { EXPECT_TRUE(mailbox_released_); }
[email protected]0d7fb302014-01-23 21:30:471324
jaydasikabd6f15a2016-04-21 19:45:371325 protected:
1326 int texture_layer_id_;
1327
[email protected]0d7fb302014-01-23 21:30:471328 private:
1329 bool mailbox_released_;
1330};
1331
1332class TextureLayerReleaseResourcesAfterCommit
1333 : public TextureLayerReleaseResourcesBase {
1334 public:
dcheng716bedf2014-10-21 09:51:081335 void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
kulkarni.a4015690f12014-10-10 13:50:061336 LayerTreeImpl* tree = nullptr;
danakj009cdfdf2015-02-17 22:35:141337 tree = host_impl->sync_tree();
jaydasikabd6f15a2016-04-21 19:45:371338 tree->LayerById(texture_layer_id_)->ReleaseResources();
[email protected]0d7fb302014-01-23 21:30:471339 }
1340};
1341
1342SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerReleaseResourcesAfterCommit);
1343
1344class TextureLayerReleaseResourcesAfterActivate
1345 : public TextureLayerReleaseResourcesBase {
1346 public:
dcheng716bedf2014-10-21 09:51:081347 void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
jaydasikabd6f15a2016-04-21 19:45:371348 host_impl->active_tree()->LayerById(texture_layer_id_)->ReleaseResources();
[email protected]0d7fb302014-01-23 21:30:471349 }
1350};
1351
1352SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerReleaseResourcesAfterActivate);
1353
[email protected]9c2bd822013-07-26 12:30:171354class TextureLayerWithMailboxMainThreadDeleted : public LayerTreeTest {
1355 public:
dyencc16ed4d2015-11-03 20:03:041356 void ReleaseCallback(const gpu::SyncToken& sync_token, bool lost_resource) {
[email protected]9794fb32013-08-29 09:49:591357 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
[email protected]9c2bd822013-07-26 12:30:171358 EXPECT_FALSE(lost_resource);
1359 ++callback_count_;
1360 EndTest();
1361 }
1362
1363 void SetMailbox(char mailbox_char) {
[email protected]9794fb32013-08-29 09:49:591364 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
danakj60bc3bc2016-04-09 00:24:481365 std::unique_ptr<SingleReleaseCallback> callback =
1366 SingleReleaseCallback::Create(base::Bind(
[email protected]9c2bd822013-07-26 12:30:171367 &TextureLayerWithMailboxMainThreadDeleted::ReleaseCallback,
1368 base::Unretained(this)));
dyene5db881b2016-03-01 19:47:031369 layer_->SetTextureMailbox(
Fady Samuel2a725ce52017-07-11 22:30:001370 viz::TextureMailbox(
1371 MailboxFromChar(mailbox_char),
1372 SyncTokenFromUInt(static_cast<uint32_t>(mailbox_char)),
1373 GL_TEXTURE_2D),
dyene5db881b2016-03-01 19:47:031374 std::move(callback));
[email protected]9c2bd822013-07-26 12:30:171375 }
1376
dcheng716bedf2014-10-21 09:51:081377 void SetupTree() override {
[email protected]9c2bd822013-07-26 12:30:171378 gfx::Size bounds(100, 100);
loyso0940d412016-03-14 01:30:311379 root_ = Layer::Create();
[email protected]9c2bd822013-07-26 12:30:171380 root_->SetBounds(bounds);
1381
loyso0940d412016-03-14 01:30:311382 layer_ = TextureLayer::CreateForMailbox(nullptr);
[email protected]9c2bd822013-07-26 12:30:171383 layer_->SetIsDrawable(true);
[email protected]9c2bd822013-07-26 12:30:171384 layer_->SetBounds(bounds);
1385
1386 root_->AddChild(layer_);
khushalsagarb69ba9452017-01-27 22:20:071387 layer_tree_host()->SetRootLayer(root_);
1388 layer_tree_host()->SetViewportSize(bounds);
[email protected]9c2bd822013-07-26 12:30:171389 }
1390
dcheng716bedf2014-10-21 09:51:081391 void BeginTest() override {
[email protected]9794fb32013-08-29 09:49:591392 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
1393
[email protected]9c2bd822013-07-26 12:30:171394 callback_count_ = 0;
1395
1396 // Set the mailbox on the main thread.
1397 SetMailbox('1');
1398 EXPECT_EQ(0, callback_count_);
1399
1400 PostSetNeedsCommitToMainThread();
1401 }
1402
dcheng716bedf2014-10-21 09:51:081403 void DidCommitAndDrawFrame() override {
khushalsagarcebe4942016-09-07 23:27:011404 switch (layer_tree_host()->SourceFrameNumber()) {
[email protected]9c2bd822013-07-26 12:30:171405 case 1:
1406 // Delete the TextureLayer on the main thread while the mailbox is in
1407 // the impl tree.
1408 layer_->RemoveFromParent();
kulkarni.a4015690f12014-10-10 13:50:061409 layer_ = nullptr;
[email protected]9c2bd822013-07-26 12:30:171410 break;
1411 }
1412 }
1413
dcheng716bedf2014-10-21 09:51:081414 void AfterTest() override { EXPECT_EQ(1, callback_count_); }
[email protected]9c2bd822013-07-26 12:30:171415
1416 private:
[email protected]9794fb32013-08-29 09:49:591417 base::ThreadChecker main_thread_;
[email protected]9c2bd822013-07-26 12:30:171418 int callback_count_;
1419 scoped_refptr<Layer> root_;
1420 scoped_refptr<TextureLayer> layer_;
1421};
1422
danakj0943a112016-08-11 00:33:461423SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerWithMailboxMainThreadDeleted);
[email protected]9c2bd822013-07-26 12:30:171424
1425class TextureLayerWithMailboxImplThreadDeleted : public LayerTreeTest {
1426 public:
dyencc16ed4d2015-11-03 20:03:041427 void ReleaseCallback(const gpu::SyncToken& sync_token, bool lost_resource) {
[email protected]9794fb32013-08-29 09:49:591428 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
[email protected]9c2bd822013-07-26 12:30:171429 EXPECT_FALSE(lost_resource);
1430 ++callback_count_;
1431 EndTest();
1432 }
1433
1434 void SetMailbox(char mailbox_char) {
[email protected]9794fb32013-08-29 09:49:591435 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
danakj60bc3bc2016-04-09 00:24:481436 std::unique_ptr<SingleReleaseCallback> callback =
1437 SingleReleaseCallback::Create(base::Bind(
[email protected]9c2bd822013-07-26 12:30:171438 &TextureLayerWithMailboxImplThreadDeleted::ReleaseCallback,
1439 base::Unretained(this)));
dyene5db881b2016-03-01 19:47:031440 layer_->SetTextureMailbox(
Fady Samuel2a725ce52017-07-11 22:30:001441 viz::TextureMailbox(
1442 MailboxFromChar(mailbox_char),
1443 SyncTokenFromUInt(static_cast<uint32_t>(mailbox_char)),
1444 GL_TEXTURE_2D),
dyene5db881b2016-03-01 19:47:031445 std::move(callback));
[email protected]9c2bd822013-07-26 12:30:171446 }
1447
dcheng716bedf2014-10-21 09:51:081448 void SetupTree() override {
[email protected]9c2bd822013-07-26 12:30:171449 gfx::Size bounds(100, 100);
loyso0940d412016-03-14 01:30:311450 root_ = Layer::Create();
[email protected]9c2bd822013-07-26 12:30:171451 root_->SetBounds(bounds);
1452
loyso0940d412016-03-14 01:30:311453 layer_ = TextureLayer::CreateForMailbox(nullptr);
[email protected]9c2bd822013-07-26 12:30:171454 layer_->SetIsDrawable(true);
[email protected]9c2bd822013-07-26 12:30:171455 layer_->SetBounds(bounds);
1456
1457 root_->AddChild(layer_);
khushalsagarb69ba9452017-01-27 22:20:071458 layer_tree_host()->SetRootLayer(root_);
1459 layer_tree_host()->SetViewportSize(bounds);
[email protected]9c2bd822013-07-26 12:30:171460 }
1461
dcheng716bedf2014-10-21 09:51:081462 void BeginTest() override {
[email protected]9794fb32013-08-29 09:49:591463 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
1464
[email protected]9c2bd822013-07-26 12:30:171465 callback_count_ = 0;
1466
1467 // Set the mailbox on the main thread.
1468 SetMailbox('1');
1469 EXPECT_EQ(0, callback_count_);
1470
1471 PostSetNeedsCommitToMainThread();
1472 }
1473
dcheng716bedf2014-10-21 09:51:081474 void DidCommitAndDrawFrame() override {
khushalsagarcebe4942016-09-07 23:27:011475 switch (layer_tree_host()->SourceFrameNumber()) {
[email protected]9c2bd822013-07-26 12:30:171476 case 1:
1477 // Remove the TextureLayer on the main thread while the mailbox is in
1478 // the impl tree, but don't delete the TextureLayer until after the impl
1479 // tree side is deleted.
1480 layer_->RemoveFromParent();
1481 break;
1482 case 2:
kulkarni.a4015690f12014-10-10 13:50:061483 layer_ = nullptr;
[email protected]9c2bd822013-07-26 12:30:171484 break;
1485 }
1486 }
1487
dcheng716bedf2014-10-21 09:51:081488 void AfterTest() override { EXPECT_EQ(1, callback_count_); }
[email protected]9c2bd822013-07-26 12:30:171489
1490 private:
[email protected]9794fb32013-08-29 09:49:591491 base::ThreadChecker main_thread_;
[email protected]9c2bd822013-07-26 12:30:171492 int callback_count_;
1493 scoped_refptr<Layer> root_;
1494 scoped_refptr<TextureLayer> layer_;
1495};
1496
danakj0943a112016-08-11 00:33:461497SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerWithMailboxImplThreadDeleted);
[email protected]9c2bd822013-07-26 12:30:171498
[email protected]ba565742012-11-10 09:29:481499} // namespace
1500} // namespace cc