blob: 73e48a432b41ed1235cec8830496ec627747ef8b [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]b04264f92013-09-13 23:37:2928#include "cc/output/context_provider.h"
[email protected]e00bab022013-08-19 00:42:4529#include "cc/resources/returned_resource.h"
khushalsagarb64b360d2015-10-21 19:25:1630#include "cc/test/fake_impl_task_runner_provider.h"
danakjc7afae52017-06-20 21:12:4131#include "cc/test/fake_layer_tree_frame_sink.h"
[email protected]101441ce2012-10-16 01:45:0332#include "cc/test/fake_layer_tree_host_client.h"
[email protected]586d51ed2012-12-07 20:31:4533#include "cc/test/fake_layer_tree_host_impl.h"
[email protected]06d68d02013-04-19 18:46:2134#include "cc/test/layer_test_common.h"
[email protected]e216fef02013-03-20 22:56:1035#include "cc/test/layer_tree_test.h"
danakjffc181a2016-07-22 22:48:4336#include "cc/test/stub_layer_tree_host_single_thread_client.h"
danakjc7afae52017-06-20 21:12:4137#include "cc/test/test_layer_tree_frame_sink.h"
reveman34b7a1522015-03-23 20:27:4738#include "cc/test/test_task_graph_runner.h"
[email protected]c2610b9f2013-10-31 06:54:5939#include "cc/test/test_web_graphics_context_3d.h"
[email protected]9794fb32013-08-29 09:49:5940#include "cc/trees/blocking_task_runner.h"
khushalsagare0e4486e2017-01-25 03:15:0341#include "cc/trees/layer_tree_host.h"
[email protected]556fd292013-03-18 08:03:0442#include "cc/trees/layer_tree_impl.h"
43#include "cc/trees/single_thread_proxy.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(
[email protected]d72d9e02014-04-03 18:40:09103 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
[email protected]d72d9e02014-04-03 18:40:09114 void set_mailbox(const 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:
[email protected]d72d9e02014-04-03 18:40:09122 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,
jbauman9015c8b2014-12-11 00:49:37135 void(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,
jbauman9015c8b2014-12-11 00:49:37144 void(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 {
jbauman9015c8b2014-12-11 00:49:37151 explicit CommonMailboxObjects(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;
dyencc16ed4d2015-11-03 20:03:04176 mailbox1_ = TextureMailbox(mailbox_name1_, sync_token1_, arbitrary_target1);
177 mailbox2_ = TextureMailbox(mailbox_name2_, sync_token2_, arbitrary_target2);
[email protected]d72d9e02014-04-03 18:40:09178 gfx::Size size(128, 128);
jbauman9015c8b2014-12-11 00:49:37179 shared_bitmap_ = manager->AllocateSharedBitmap(size);
180 DCHECK(shared_bitmap_);
181 release_mailbox3_ =
182 base::Bind(&MockMailboxCallback::Release2,
183 base::Unretained(&mock_callback_), shared_bitmap_.get());
184 release_mailbox3_impl_ =
185 base::Bind(&MockMailboxCallback::ReleaseImpl2,
186 base::Unretained(&mock_callback_), shared_bitmap_.get());
187 mailbox3_ = TextureMailbox(shared_bitmap_.get(), size);
[email protected]d72d9e02014-04-03 18:40:09188 }
189
190 gpu::Mailbox mailbox_name1_;
191 gpu::Mailbox mailbox_name2_;
192 MockMailboxCallback mock_callback_;
193 ReleaseCallback release_mailbox1_;
194 ReleaseCallback release_mailbox2_;
195 ReleaseCallback release_mailbox3_;
skyostil3976a3f2014-09-04 22:07:23196 ReleaseCallbackImpl release_mailbox1_impl_;
197 ReleaseCallbackImpl release_mailbox2_impl_;
198 ReleaseCallbackImpl release_mailbox3_impl_;
[email protected]d72d9e02014-04-03 18:40:09199 TextureMailbox mailbox1_;
200 TextureMailbox mailbox2_;
201 TextureMailbox mailbox3_;
dyencc16ed4d2015-11-03 20:03:04202 gpu::SyncToken sync_token1_;
203 gpu::SyncToken sync_token2_;
danakj60bc3bc2016-04-09 00:24:48204 std::unique_ptr<SharedBitmap> shared_bitmap_;
[email protected]d72d9e02014-04-03 18:40:09205};
206
[email protected]31d4df82013-07-18 10:17:22207class TextureLayerTest : public testing::Test {
208 public:
209 TextureLayerTest()
danakjc7afae52017-06-20 21:12:41210 : layer_tree_frame_sink_(FakeLayerTreeFrameSink::Create3d()),
211 host_impl_(&task_runner_provider_, &task_graph_runner_),
jbauman9015c8b2014-12-11 00:49:37212 test_data_(&shared_bitmap_manager_) {}
[email protected]31d4df82013-07-18 10:17:22213
214 protected:
dcheng93a52eb2014-12-23 02:14:23215 void SetUp() override {
loyso2cb3f32f2016-11-08 07:08:34216 animation_host_ = AnimationHost::CreateForTesting(ThreadInstance::MAIN);
217 layer_tree_host_ = MockLayerTreeHost::Create(
218 &fake_client_, &task_graph_runner_, animation_host_.get());
[email protected]d72d9e02014-04-03 18:40:09219 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber());
khushalsagarb69ba9452017-01-27 22:20:07220 layer_tree_host_->SetViewportSize(gfx::Size(10, 10));
[email protected]d72d9e02014-04-03 18:40:09221 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
[email protected]31d4df82013-07-18 10:17:22222 }
223
dcheng93a52eb2014-12-23 02:14:23224 void TearDown() override {
[email protected]31d4df82013-07-18 10:17:22225 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
[email protected]31d4df82013-07-18 10:17:22226 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber());
227
loyso2cb3f32f2016-11-08 07:08:34228 animation_host_->SetMutatorHostClient(nullptr);
khushalsagarb69ba9452017-01-27 22:20:07229 layer_tree_host_->SetRootLayer(nullptr);
danakjf446a072014-09-27 21:55:48230 layer_tree_host_ = nullptr;
loyso2cb3f32f2016-11-08 07:08:34231 animation_host_ = nullptr;
[email protected]31d4df82013-07-18 10:17:22232 }
233
danakj60bc3bc2016-04-09 00:24:48234 std::unique_ptr<MockLayerTreeHost> layer_tree_host_;
loyso2cb3f32f2016-11-08 07:08:34235 std::unique_ptr<AnimationHost> animation_host_;
khushalsagarb64b360d2015-10-21 19:25:16236 FakeImplTaskRunnerProvider task_runner_provider_;
[email protected]31d4df82013-07-18 10:17:22237 FakeLayerTreeHostClient fake_client_;
[email protected]4e2eb352014-03-20 17:25:45238 TestSharedBitmapManager shared_bitmap_manager_;
reveman34b7a1522015-03-23 20:27:47239 TestTaskGraphRunner task_graph_runner_;
danakjc7afae52017-06-20 21:12:41240 std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink_;
[email protected]31d4df82013-07-18 10:17:22241 FakeLayerTreeHostImpl host_impl_;
jbauman9015c8b2014-12-11 00:49:37242 CommonMailboxObjects test_data_;
[email protected]31d4df82013-07-18 10:17:22243};
244
[email protected]31d4df82013-07-18 10:17:22245TEST_F(TextureLayerTest, CheckPropertyChangeCausesCorrectBehavior) {
kulkarni.a4015690f12014-10-10 13:50:06246 scoped_refptr<TextureLayer> test_layer =
loyso0940d412016-03-14 01:30:31247 TextureLayer::CreateForMailbox(nullptr);
khushalsagarb69ba9452017-01-27 22:20:07248 EXPECT_SET_NEEDS_COMMIT(1, layer_tree_host_->SetRootLayer(test_layer));
[email protected]31d4df82013-07-18 10:17:22249
250 // Test properties that should call SetNeedsCommit. All properties need to
251 // be set to new values in order for SetNeedsCommit to be called.
252 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetFlipped(false));
jackhou10c9af42014-12-04 05:24:44253 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetNearestNeighbor(true));
[email protected]31d4df82013-07-18 10:17:22254 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetUV(
255 gfx::PointF(0.25f, 0.25f), gfx::PointF(0.75f, 0.75f)));
256 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetVertexOpacity(
257 0.5f, 0.5f, 0.5f, 0.5f));
258 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetPremultipliedAlpha(false));
259 EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetBlendBackgroundColor(true));
[email protected]31d4df82013-07-18 10:17:22260}
261
[email protected]df41e252014-02-03 23:39:50262class TestMailboxHolder : public TextureLayer::TextureMailboxHolder {
[email protected]9794fb32013-08-29 09:49:59263 public:
[email protected]df41e252014-02-03 23:39:50264 using TextureLayer::TextureMailboxHolder::Create;
[email protected]9794fb32013-08-29 09:49:59265
266 protected:
dcheng716bedf2014-10-21 09:51:08267 ~TestMailboxHolder() override {}
[email protected]9794fb32013-08-29 09:49:59268};
269
[email protected]de44a152013-01-08 15:28:46270class TextureLayerWithMailboxTest : public TextureLayerTest {
[email protected]28571b042013-03-14 07:59:15271 protected:
dcheng93a52eb2014-12-23 02:14:23272 void TearDown() override {
[email protected]28571b042013-03-14 07:59:15273 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
dyencc16ed4d2015-11-03 20:03:04274 EXPECT_CALL(
275 test_data_.mock_callback_,
276 Release(test_data_.mailbox_name1_, test_data_.sync_token1_, false))
277 .Times(1);
[email protected]28571b042013-03-14 07:59:15278 TextureLayerTest::TearDown();
279 }
[email protected]de44a152013-01-08 15:28:46280};
281
[email protected]28571b042013-03-14 07:59:15282TEST_F(TextureLayerWithMailboxTest, ReplaceMailboxOnMainThreadBeforeCommit) {
kulkarni.a4015690f12014-10-10 13:50:06283 scoped_refptr<TextureLayer> test_layer =
loyso0940d412016-03-14 01:30:31284 TextureLayer::CreateForMailbox(nullptr);
[email protected]22898ed2013-06-01 04:52:30285 ASSERT_TRUE(test_layer.get());
[email protected]de44a152013-01-08 15:28:46286
[email protected]28571b042013-03-14 07:59:15287 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber());
khushalsagarb69ba9452017-01-27 22:20:07288 layer_tree_host_->SetRootLayer(test_layer);
[email protected]28571b042013-03-14 07:59:15289 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
[email protected]de44a152013-01-08 15:28:46290
[email protected]28571b042013-03-14 07:59:15291 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
[email protected]9260757f2013-09-17 01:24:16292 test_layer->SetTextureMailbox(
293 test_data_.mailbox1_,
294 SingleReleaseCallback::Create(test_data_.release_mailbox1_));
[email protected]28571b042013-03-14 07:59:15295 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
[email protected]de44a152013-01-08 15:28:46296
[email protected]28571b042013-03-14 07:59:15297 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
dyencc16ed4d2015-11-03 20:03:04298 EXPECT_CALL(
299 test_data_.mock_callback_,
300 Release(test_data_.mailbox_name1_, test_data_.sync_token1_, false))
[email protected]28571b042013-03-14 07:59:15301 .Times(1);
[email protected]9260757f2013-09-17 01:24:16302 test_layer->SetTextureMailbox(
303 test_data_.mailbox2_,
304 SingleReleaseCallback::Create(test_data_.release_mailbox2_));
[email protected]28571b042013-03-14 07:59:15305 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
306 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]de44a152013-01-08 15:28:46307
[email protected]28571b042013-03-14 07:59:15308 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
dyencc16ed4d2015-11-03 20:03:04309 EXPECT_CALL(
310 test_data_.mock_callback_,
311 Release(test_data_.mailbox_name2_, test_data_.sync_token2_, false))
[email protected]28571b042013-03-14 07:59:15312 .Times(1);
danakj968153f32014-10-15 22:52:16313 test_layer->SetTextureMailbox(TextureMailbox(), nullptr);
[email protected]28571b042013-03-14 07:59:15314 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
315 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]de44a152013-01-08 15:28:46316
[email protected]80d42bd2013-08-30 19:13:45317 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
[email protected]9260757f2013-09-17 01:24:16318 test_layer->SetTextureMailbox(
319 test_data_.mailbox3_,
320 SingleReleaseCallback::Create(test_data_.release_mailbox3_));
[email protected]42f40a52013-06-08 04:38:51321 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
322 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
323
[email protected]42f40a52013-06-08 04:38:51324 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
325 EXPECT_CALL(test_data_.mock_callback_,
dyencc16ed4d2015-11-03 20:03:04326 Release2(test_data_.shared_bitmap_.get(), _, false))
327 .Times(1);
danakj968153f32014-10-15 22:52:16328 test_layer->SetTextureMailbox(TextureMailbox(), nullptr);
[email protected]42f40a52013-06-08 04:38:51329 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
330 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
331
[email protected]28571b042013-03-14 07:59:15332 // Test destructor.
333 EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1));
[email protected]9260757f2013-09-17 01:24:16334 test_layer->SetTextureMailbox(
335 test_data_.mailbox1_,
336 SingleReleaseCallback::Create(test_data_.release_mailbox1_));
[email protected]de44a152013-01-08 15:28:46337}
338
[email protected]9794fb32013-08-29 09:49:59339class TextureLayerMailboxHolderTest : public TextureLayerTest {
340 public:
341 TextureLayerMailboxHolderTest()
342 : main_thread_("MAIN") {
343 main_thread_.Start();
fdoray70df5a92016-06-22 21:13:59344 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22345 FROM_HERE,
346 base::BindOnce(&TextureLayerMailboxHolderTest::InitializeOnMain,
347 base::Unretained(this)));
skyostil3976a3f2014-09-04 22:07:23348 Wait(main_thread_);
[email protected]9794fb32013-08-29 09:49:59349 }
350
351 void Wait(const base::Thread& thread) {
gabcca53112016-06-08 20:13:28352 base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
353 base::WaitableEvent::InitialState::NOT_SIGNALED);
fdoray70df5a92016-06-22 21:13:59354 thread.task_runner()->PostTask(
[email protected]9794fb32013-08-29 09:49:59355 FROM_HERE,
tzik4604bb52017-04-13 21:50:22356 base::BindOnce(&base::WaitableEvent::Signal, base::Unretained(&event)));
[email protected]9794fb32013-08-29 09:49:59357 event.Wait();
358 }
359
360 void CreateMainRef() {
361 main_ref_ = TestMailboxHolder::Create(
[email protected]9260757f2013-09-17 01:24:16362 test_data_.mailbox1_,
danakja5a05ba02015-11-20 20:14:21363 SingleReleaseCallback::Create(test_data_.release_mailbox1_));
[email protected]9794fb32013-08-29 09:49:59364 }
365
danakjf446a072014-09-27 21:55:48366 void ReleaseMainRef() { main_ref_ = nullptr; }
[email protected]9794fb32013-08-29 09:49:59367
danakj60bc3bc2016-04-09 00:24:48368 void CreateImplRef(std::unique_ptr<SingleReleaseCallbackImpl>* impl_ref) {
[email protected]9794fb32013-08-29 09:49:59369 *impl_ref = main_ref_->holder()->GetCallbackForImplThread();
370 }
371
372 void CapturePostTasksAndWait(base::WaitableEvent* begin_capture,
373 base::WaitableEvent* wait_for_capture,
374 base::WaitableEvent* stop_capture) {
375 begin_capture->Wait();
skyostil3976a3f2014-09-04 22:07:23376 BlockingTaskRunner::CapturePostTasks capture(
377 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59378 wait_for_capture->Signal();
379 stop_capture->Wait();
380 }
381
382 protected:
skyostil3976a3f2014-09-04 22:07:23383 void InitializeOnMain() {
384 main_thread_task_runner_ =
skyostil0fd1dad2015-04-13 20:11:48385 BlockingTaskRunner::Create(main_thread_.task_runner());
skyostil3976a3f2014-09-04 22:07:23386 }
387
danakj60bc3bc2016-04-09 00:24:48388 std::unique_ptr<TestMailboxHolder::MainThreadReference> main_ref_;
[email protected]9794fb32013-08-29 09:49:59389 base::Thread main_thread_;
danakj60bc3bc2016-04-09 00:24:48390 std::unique_ptr<BlockingTaskRunner> main_thread_task_runner_;
[email protected]9794fb32013-08-29 09:49:59391};
392
393TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_BothReleaseThenMain) {
kulkarni.a4015690f12014-10-10 13:50:06394 scoped_refptr<TextureLayer> test_layer =
loyso0940d412016-03-14 01:30:31395 TextureLayer::CreateForMailbox(nullptr);
[email protected]9794fb32013-08-29 09:49:59396 ASSERT_TRUE(test_layer.get());
397
fdoray70df5a92016-06-22 21:13:59398 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22399 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateMainRef,
400 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59401
402 Wait(main_thread_);
403
404 // The texture layer is attached to compositor1, and passes a reference to its
405 // impl tree.
danakj60bc3bc2016-04-09 00:24:48406 std::unique_ptr<SingleReleaseCallbackImpl> compositor1;
fdoray70df5a92016-06-22 21:13:59407 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22408 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
409 base::Unretained(this), &compositor1));
[email protected]9794fb32013-08-29 09:49:59410
411 // Then the texture layer is removed and attached to compositor2, and passes a
412 // reference to its impl tree.
danakj60bc3bc2016-04-09 00:24:48413 std::unique_ptr<SingleReleaseCallbackImpl> compositor2;
fdoray70df5a92016-06-22 21:13:59414 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22415 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
416 base::Unretained(this), &compositor2));
[email protected]9794fb32013-08-29 09:49:59417
418 Wait(main_thread_);
419 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
420
421 // The compositors both destroy their impl trees before the main thread layer
422 // is destroyed.
dyen398dd0142016-01-21 22:05:56423 compositor1->Run(SyncTokenFromUInt(100), false,
424 main_thread_task_runner_.get());
425 compositor2->Run(SyncTokenFromUInt(200), false,
426 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59427
428 Wait(main_thread_);
429
430 EXPECT_CALL(test_data_.mock_callback_, Release(_, _, _)).Times(0);
431 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
432
433 // The main thread ref is the last one, so the mailbox is released back to the
434 // embedder, with the last sync point provided by the impl trees.
435 EXPECT_CALL(test_data_.mock_callback_,
dyen398dd0142016-01-21 22:05:56436 Release(test_data_.mailbox_name1_, SyncTokenFromUInt(200), false))
dyencc16ed4d2015-11-03 20:03:04437 .Times(1);
[email protected]9794fb32013-08-29 09:49:59438
fdoray70df5a92016-06-22 21:13:59439 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22440 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::ReleaseMainRef,
441 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59442 Wait(main_thread_);
443 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
444}
445
446TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_MainReleaseBetween) {
kulkarni.a4015690f12014-10-10 13:50:06447 scoped_refptr<TextureLayer> test_layer =
loyso0940d412016-03-14 01:30:31448 TextureLayer::CreateForMailbox(nullptr);
[email protected]9794fb32013-08-29 09:49:59449 ASSERT_TRUE(test_layer.get());
450
fdoray70df5a92016-06-22 21:13:59451 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22452 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateMainRef,
453 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59454
455 Wait(main_thread_);
456
457 // The texture layer is attached to compositor1, and passes a reference to its
458 // impl tree.
danakj60bc3bc2016-04-09 00:24:48459 std::unique_ptr<SingleReleaseCallbackImpl> compositor1;
fdoray70df5a92016-06-22 21:13:59460 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22461 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
462 base::Unretained(this), &compositor1));
[email protected]9794fb32013-08-29 09:49:59463
464 // Then the texture layer is removed and attached to compositor2, and passes a
465 // reference to its impl tree.
danakj60bc3bc2016-04-09 00:24:48466 std::unique_ptr<SingleReleaseCallbackImpl> compositor2;
fdoray70df5a92016-06-22 21:13:59467 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22468 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
469 base::Unretained(this), &compositor2));
[email protected]9794fb32013-08-29 09:49:59470
471 Wait(main_thread_);
472 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
473
474 // One compositor destroys their impl tree.
dyen398dd0142016-01-21 22:05:56475 compositor1->Run(SyncTokenFromUInt(100), false,
476 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59477
478 // Then the main thread reference is destroyed.
fdoray70df5a92016-06-22 21:13:59479 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22480 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::ReleaseMainRef,
481 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59482
483 Wait(main_thread_);
484
485 EXPECT_CALL(test_data_.mock_callback_, Release(_, _, _)).Times(0);
486 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
487
488 // The second impl reference is destroyed last, causing the mailbox to be
489 // released back to the embedder with the last sync point from the impl tree.
490 EXPECT_CALL(test_data_.mock_callback_,
dyen398dd0142016-01-21 22:05:56491 Release(test_data_.mailbox_name1_, SyncTokenFromUInt(200), true))
dyencc16ed4d2015-11-03 20:03:04492 .Times(1);
[email protected]9794fb32013-08-29 09:49:59493
dyen398dd0142016-01-21 22:05:56494 compositor2->Run(SyncTokenFromUInt(200), true,
495 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59496 Wait(main_thread_);
497 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
498}
499
500TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_MainReleasedFirst) {
kulkarni.a4015690f12014-10-10 13:50:06501 scoped_refptr<TextureLayer> test_layer =
loyso0940d412016-03-14 01:30:31502 TextureLayer::CreateForMailbox(nullptr);
[email protected]9794fb32013-08-29 09:49:59503 ASSERT_TRUE(test_layer.get());
504
fdoray70df5a92016-06-22 21:13:59505 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22506 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateMainRef,
507 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59508
509 Wait(main_thread_);
510
511 // The texture layer is attached to compositor1, and passes a reference to its
512 // impl tree.
danakj60bc3bc2016-04-09 00:24:48513 std::unique_ptr<SingleReleaseCallbackImpl> compositor1;
fdoray70df5a92016-06-22 21:13:59514 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22515 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
516 base::Unretained(this), &compositor1));
[email protected]9794fb32013-08-29 09:49:59517
518 // Then the texture layer is removed and attached to compositor2, and passes a
519 // reference to its impl tree.
danakj60bc3bc2016-04-09 00:24:48520 std::unique_ptr<SingleReleaseCallbackImpl> compositor2;
fdoray70df5a92016-06-22 21:13:59521 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22522 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
523 base::Unretained(this), &compositor2));
[email protected]9794fb32013-08-29 09:49:59524
525 Wait(main_thread_);
526 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
527
528 // The main thread reference is destroyed first.
fdoray70df5a92016-06-22 21:13:59529 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22530 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::ReleaseMainRef,
531 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59532
533 // One compositor destroys their impl tree.
dyen398dd0142016-01-21 22:05:56534 compositor2->Run(SyncTokenFromUInt(200), false,
535 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59536
537 Wait(main_thread_);
538
539 EXPECT_CALL(test_data_.mock_callback_, Release(_, _, _)).Times(0);
540 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
541
542 // The second impl reference is destroyed last, causing the mailbox to be
543 // released back to the embedder with the last sync point from the impl tree.
544 EXPECT_CALL(test_data_.mock_callback_,
dyen398dd0142016-01-21 22:05:56545 Release(test_data_.mailbox_name1_, SyncTokenFromUInt(100), true))
dyencc16ed4d2015-11-03 20:03:04546 .Times(1);
[email protected]9794fb32013-08-29 09:49:59547
dyen398dd0142016-01-21 22:05:56548 compositor1->Run(SyncTokenFromUInt(100), true,
549 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59550 Wait(main_thread_);
551 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
552}
553
554TEST_F(TextureLayerMailboxHolderTest, TwoCompositors_SecondImplRefShortcut) {
kulkarni.a4015690f12014-10-10 13:50:06555 scoped_refptr<TextureLayer> test_layer =
loyso0940d412016-03-14 01:30:31556 TextureLayer::CreateForMailbox(nullptr);
[email protected]9794fb32013-08-29 09:49:59557 ASSERT_TRUE(test_layer.get());
558
fdoray70df5a92016-06-22 21:13:59559 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22560 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateMainRef,
561 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59562
563 Wait(main_thread_);
564
565 // The texture layer is attached to compositor1, and passes a reference to its
566 // impl tree.
danakj60bc3bc2016-04-09 00:24:48567 std::unique_ptr<SingleReleaseCallbackImpl> compositor1;
fdoray70df5a92016-06-22 21:13:59568 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22569 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
570 base::Unretained(this), &compositor1));
[email protected]9794fb32013-08-29 09:49:59571
572 // Then the texture layer is removed and attached to compositor2, and passes a
573 // reference to its impl tree.
danakj60bc3bc2016-04-09 00:24:48574 std::unique_ptr<SingleReleaseCallbackImpl> compositor2;
fdoray70df5a92016-06-22 21:13:59575 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22576 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::CreateImplRef,
577 base::Unretained(this), &compositor2));
[email protected]9794fb32013-08-29 09:49:59578
579 Wait(main_thread_);
580 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
581
582 // The main thread reference is destroyed first.
fdoray70df5a92016-06-22 21:13:59583 main_thread_.task_runner()->PostTask(
tzik4604bb52017-04-13 21:50:22584 FROM_HERE, base::BindOnce(&TextureLayerMailboxHolderTest::ReleaseMainRef,
585 base::Unretained(this)));
[email protected]9794fb32013-08-29 09:49:59586
587 EXPECT_CALL(test_data_.mock_callback_,
dyen398dd0142016-01-21 22:05:56588 Release(test_data_.mailbox_name1_, SyncTokenFromUInt(200), true))
dyencc16ed4d2015-11-03 20:03:04589 .Times(1);
[email protected]9794fb32013-08-29 09:49:59590
gabcca53112016-06-08 20:13:28591 base::WaitableEvent begin_capture(
592 base::WaitableEvent::ResetPolicy::AUTOMATIC,
593 base::WaitableEvent::InitialState::NOT_SIGNALED);
594 base::WaitableEvent wait_for_capture(
595 base::WaitableEvent::ResetPolicy::AUTOMATIC,
596 base::WaitableEvent::InitialState::NOT_SIGNALED);
597 base::WaitableEvent stop_capture(
598 base::WaitableEvent::ResetPolicy::AUTOMATIC,
599 base::WaitableEvent::InitialState::NOT_SIGNALED);
[email protected]9794fb32013-08-29 09:49:59600
601 // Post a task to start capturing tasks on the main thread. This will block
602 // the main thread until we signal the |stop_capture| event.
fdoray70df5a92016-06-22 21:13:59603 main_thread_.task_runner()->PostTask(
[email protected]9794fb32013-08-29 09:49:59604 FROM_HERE,
tzik4604bb52017-04-13 21:50:22605 base::BindOnce(&TextureLayerMailboxHolderTest::CapturePostTasksAndWait,
606 base::Unretained(this), &begin_capture, &wait_for_capture,
607 &stop_capture));
[email protected]9794fb32013-08-29 09:49:59608
609 // Before the main thread capturing starts, one compositor destroys their
610 // impl reference. Since capturing did not start, this gets post-tasked to
611 // the main thread.
dyen398dd0142016-01-21 22:05:56612 compositor1->Run(SyncTokenFromUInt(100), false,
613 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59614
615 // Start capturing on the main thread.
616 begin_capture.Signal();
617 wait_for_capture.Wait();
618
619 // Meanwhile, the second compositor released its impl reference, but this task
620 // gets shortcutted directly to the main thread. This means the reference is
621 // released before compositor1, whose reference will be released later when
622 // the post-task is serviced. But since it was destroyed _on the impl thread_
623 // last, its sync point values should be used.
dyen398dd0142016-01-21 22:05:56624 compositor2->Run(SyncTokenFromUInt(200), true,
625 main_thread_task_runner_.get());
[email protected]9794fb32013-08-29 09:49:59626
627 stop_capture.Signal();
628 Wait(main_thread_);
629
630 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
631}
632
[email protected]e216fef02013-03-20 22:56:10633class TextureLayerImplWithMailboxThreadedCallback : public LayerTreeTest {
[email protected]28571b042013-03-14 07:59:15634 public:
danakj014316e2016-08-04 18:40:26635 TextureLayerImplWithMailboxThreadedCallback() = default;
636
danakjc7afae52017-06-20 21:12:41637 std::unique_ptr<TestLayerTreeFrameSink> CreateLayerTreeFrameSink(
staraz88677422017-05-26 13:53:03638 const RendererSettings& renderer_settings,
Alex Zhang903cb6a2017-06-12 20:31:37639 double refresh_rate,
danakj014316e2016-08-04 18:40:26640 scoped_refptr<ContextProvider> compositor_context_provider,
641 scoped_refptr<ContextProvider> worker_context_provider) override {
staraz88677422017-05-26 13:53:03642 constexpr bool disable_display_vsync = false;
danakj014316e2016-08-04 18:40:26643 bool synchronous_composite =
644 !HasImplThread() &&
khushalsagarcebe4942016-09-07 23:27:01645 !layer_tree_host()->GetSettings().single_thread_proxy_scheduler;
danakjc7afae52017-06-20 21:12:41646 return base::MakeUnique<TestLayerTreeFrameSink>(
danakj014316e2016-08-04 18:40:26647 compositor_context_provider, std::move(worker_context_provider),
staraz88677422017-05-26 13:53:03648 shared_bitmap_manager(), gpu_memory_buffer_manager(), renderer_settings,
Alex Zhang903cb6a2017-06-12 20:31:37649 ImplThreadTaskRunner(), synchronous_composite, disable_display_vsync,
650 refresh_rate);
danakj014316e2016-08-04 18:40:26651 }
[email protected]28571b042013-03-14 07:59:15652
ericrkad5923812017-01-25 23:26:12653 void AdvanceTestCase() {
654 ++test_case_;
655 switch (test_case_) {
656 case 1:
657 // Case #1: change mailbox before the commit. The old mailbox should be
658 // released immediately.
659 SetMailbox('2');
660 EXPECT_EQ(1, callback_count_);
661 PostSetNeedsCommitToMainThread();
662
663 // Case 2 does not rely on callbacks to advance.
664 pending_callback_ = false;
665 break;
666 case 2:
667 // Case #2: change mailbox after the commit (and draw), where the
668 // layer draws. The old mailbox should be released during the next
669 // commit.
670 SetMailbox('3');
671 EXPECT_EQ(1, callback_count_);
672
673 // Cases 3-5 rely on a callback to advance.
674 pending_callback_ = true;
675 break;
676 case 3:
677 EXPECT_EQ(2, callback_count_);
678 // Case #3: change mailbox when the layer doesn't draw. The old
679 // mailbox should be released during the next commit.
680 layer_->SetBounds(gfx::Size());
681 SetMailbox('4');
682 break;
683 case 4:
684 EXPECT_EQ(3, callback_count_);
685 // Case #4: release mailbox that was committed but never drawn. The
686 // old mailbox should be released during the next commit.
687 layer_->SetTextureMailbox(TextureMailbox(), nullptr);
688 break;
689 case 5:
690 EXPECT_EQ(4, callback_count_);
691 // Restore a mailbox for the next step.
692 SetMailbox('5');
693
694 // Cases 6 and 7 do not rely on callbacks to advance.
695 pending_callback_ = false;
696 break;
697 case 6:
698 // Case #5: remove layer from tree. Callback should *not* be called, the
699 // mailbox is returned to the main thread.
700 EXPECT_EQ(4, callback_count_);
701 layer_->RemoveFromParent();
702 break;
703 case 7:
704 EXPECT_EQ(4, callback_count_);
705 // Resetting the mailbox will call the callback now.
706 layer_->SetTextureMailbox(TextureMailbox(), nullptr);
707 EXPECT_EQ(5, callback_count_);
708 EndTest();
709 break;
710 default:
711 NOTREACHED();
712 break;
713 }
714 }
715
[email protected]28571b042013-03-14 07:59:15716 // Make sure callback is received on main and doesn't block the impl thread.
danakj014316e2016-08-04 18:40:26717 void ReleaseCallback(char mailbox_char,
718 const gpu::SyncToken& sync_token,
719 bool lost_resource) {
[email protected]9794fb32013-08-29 09:49:59720 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
[email protected]7ba3ca72013-04-11 06:37:25721 EXPECT_FALSE(lost_resource);
[email protected]28571b042013-03-14 07:59:15722 ++callback_count_;
ericrkad5923812017-01-25 23:26:12723
724 // If we are waiting on a callback, advance now.
725 if (pending_callback_)
726 AdvanceTestCase();
[email protected]28571b042013-03-14 07:59:15727 }
728
729 void SetMailbox(char mailbox_char) {
[email protected]9794fb32013-08-29 09:49:59730 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
danakj60bc3bc2016-04-09 00:24:48731 std::unique_ptr<SingleReleaseCallback> callback =
732 SingleReleaseCallback::Create(base::Bind(
[email protected]28571b042013-03-14 07:59:15733 &TextureLayerImplWithMailboxThreadedCallback::ReleaseCallback,
danakj014316e2016-08-04 18:40:26734 base::Unretained(this), mailbox_char));
dyene5db881b2016-03-01 19:47:03735 layer_->SetTextureMailbox(
736 TextureMailbox(MailboxFromChar(mailbox_char),
737 SyncTokenFromUInt(static_cast<uint32_t>(mailbox_char)),
738 GL_TEXTURE_2D),
739 std::move(callback));
danakj014316e2016-08-04 18:40:26740 // Damage the layer so we send a new frame with the new mailbox to the
741 // Display compositor.
742 layer_->SetNeedsDisplay();
[email protected]28571b042013-03-14 07:59:15743 }
744
dcheng716bedf2014-10-21 09:51:08745 void BeginTest() override {
[email protected]9794fb32013-08-29 09:49:59746 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
747
[email protected]28571b042013-03-14 07:59:15748 gfx::Size bounds(100, 100);
loyso0940d412016-03-14 01:30:31749 root_ = Layer::Create();
[email protected]28571b042013-03-14 07:59:15750 root_->SetBounds(bounds);
751
loyso0940d412016-03-14 01:30:31752 layer_ = TextureLayer::CreateForMailbox(nullptr);
[email protected]28571b042013-03-14 07:59:15753 layer_->SetIsDrawable(true);
[email protected]28571b042013-03-14 07:59:15754 layer_->SetBounds(bounds);
755
756 root_->AddChild(layer_);
khushalsagarb69ba9452017-01-27 22:20:07757 layer_tree_host()->SetRootLayer(root_);
758 layer_tree_host()->SetViewportSize(bounds);
[email protected]28571b042013-03-14 07:59:15759 SetMailbox('1');
760 EXPECT_EQ(0, callback_count_);
761
ericrkad5923812017-01-25 23:26:12762 // Setup is complete - advance to test case 1.
763 AdvanceTestCase();
[email protected]28571b042013-03-14 07:59:15764 }
765
dcheng716bedf2014-10-21 09:51:08766 void DidCommit() override {
ericrkad5923812017-01-25 23:26:12767 // If we are not waiting on a callback, advance now.
768 if (!pending_callback_)
769 AdvanceTestCase();
[email protected]28571b042013-03-14 07:59:15770 }
[email protected]de44a152013-01-08 15:28:46771
dcheng716bedf2014-10-21 09:51:08772 void AfterTest() override {}
[email protected]de44a152013-01-08 15:28:46773
[email protected]28571b042013-03-14 07:59:15774 private:
[email protected]9794fb32013-08-29 09:49:59775 base::ThreadChecker main_thread_;
danakj014316e2016-08-04 18:40:26776 int callback_count_ = 0;
ericrkad5923812017-01-25 23:26:12777 int test_case_ = 0;
778 // Whether we are waiting on a callback to advance the test case.
779 bool pending_callback_ = false;
[email protected]28571b042013-03-14 07:59:15780 scoped_refptr<Layer> root_;
781 scoped_refptr<TextureLayer> layer_;
[email protected]de44a152013-01-08 15:28:46782};
783
danakj0943a112016-08-11 00:33:46784SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerImplWithMailboxThreadedCallback);
[email protected]74b43cc2013-08-30 06:29:27785
[email protected]74b43cc2013-08-30 06:29:27786class TextureLayerMailboxIsActivatedDuringCommit : public LayerTreeTest {
787 protected:
samans0834fe042017-03-03 17:03:22788 void ReleaseCallback(const gpu::SyncToken& original_sync_token,
789 const gpu::SyncToken& release_sync_token,
790 bool lost_resource) {
791 released_count_++;
792 switch (released_count_) {
793 case 1:
794 break;
795 case 2:
796 EXPECT_EQ(3, layer_tree_host()->SourceFrameNumber());
797 EndTest();
798 break;
799 default:
800 NOTREACHED();
801 }
802 }
[email protected]74b43cc2013-08-30 06:29:27803
804 void SetMailbox(char mailbox_char) {
dyene5db881b2016-03-01 19:47:03805 const gpu::SyncToken sync_token =
806 SyncTokenFromUInt(static_cast<uint32_t>(mailbox_char));
danakj60bc3bc2016-04-09 00:24:48807 std::unique_ptr<SingleReleaseCallback> callback =
808 SingleReleaseCallback::Create(base::Bind(
809 &TextureLayerMailboxIsActivatedDuringCommit::ReleaseCallback,
samans0834fe042017-03-03 17:03:22810 base::Unretained(this), sync_token));
dyencc16ed4d2015-11-03 20:03:04811 layer_->SetTextureMailbox(TextureMailbox(MailboxFromChar(mailbox_char),
dyene5db881b2016-03-01 19:47:03812 sync_token, GL_TEXTURE_2D),
danakja04855a2015-11-18 20:39:10813 std::move(callback));
[email protected]74b43cc2013-08-30 06:29:27814 }
815
dcheng716bedf2014-10-21 09:51:08816 void BeginTest() override {
[email protected]74b43cc2013-08-30 06:29:27817 gfx::Size bounds(100, 100);
loyso0940d412016-03-14 01:30:31818 root_ = Layer::Create();
[email protected]74b43cc2013-08-30 06:29:27819 root_->SetBounds(bounds);
820
loyso0940d412016-03-14 01:30:31821 layer_ = TextureLayer::CreateForMailbox(nullptr);
[email protected]74b43cc2013-08-30 06:29:27822 layer_->SetIsDrawable(true);
[email protected]74b43cc2013-08-30 06:29:27823 layer_->SetBounds(bounds);
824
825 root_->AddChild(layer_);
khushalsagarb69ba9452017-01-27 22:20:07826 layer_tree_host()->SetRootLayer(root_);
827 layer_tree_host()->SetViewportSize(bounds);
[email protected]74b43cc2013-08-30 06:29:27828 SetMailbox('1');
829
830 PostSetNeedsCommitToMainThread();
831 }
832
dcheng716bedf2014-10-21 09:51:08833 void WillActivateTreeOnThread(LayerTreeHostImpl* impl) override {
danakj3c3973b2015-08-25 21:50:18834 base::AutoLock lock(activate_count_lock_);
[email protected]74b43cc2013-08-30 06:29:27835 ++activate_count_;
836 }
837
dcheng716bedf2014-10-21 09:51:08838 void DidCommit() override {
danakj3c3973b2015-08-25 21:50:18839 // The first frame doesn't cause anything to be returned so it does not
840 // need to wait for activation.
khushalsagarcebe4942016-09-07 23:27:01841 if (layer_tree_host()->SourceFrameNumber() > 1) {
danakj3c3973b2015-08-25 21:50:18842 base::AutoLock lock(activate_count_lock_);
843 // The activate happened before commit is done on the main side.
khushalsagarcebe4942016-09-07 23:27:01844 EXPECT_EQ(activate_count_, layer_tree_host()->SourceFrameNumber());
danakj3c3973b2015-08-25 21:50:18845 }
846
khushalsagarcebe4942016-09-07 23:27:01847 switch (layer_tree_host()->SourceFrameNumber()) {
[email protected]74b43cc2013-08-30 06:29:27848 case 1:
849 // The first mailbox has been activated. Set a new mailbox, and
850 // expect the next commit to finish *after* it is activated.
851 SetMailbox('2');
[email protected]74b43cc2013-08-30 06:29:27852 break;
853 case 2:
854 // The second mailbox has been activated. Remove the layer from
855 // the tree to cause another commit/activation. The commit should
856 // finish *after* the layer is removed from the active tree.
857 layer_->RemoveFromParent();
[email protected]74b43cc2013-08-30 06:29:27858 break;
859 case 3:
samans0834fe042017-03-03 17:03:22860 // This ensures all texture mailboxes are released before the end of the
861 // test.
862 layer_->ClearClient();
[email protected]74b43cc2013-08-30 06:29:27863 break;
samans0834fe042017-03-03 17:03:22864 default:
865 NOTREACHED();
[email protected]74b43cc2013-08-30 06:29:27866 }
867 }
868
dcheng716bedf2014-10-21 09:51:08869 void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
danakj3c3973b2015-08-25 21:50:18870 // The activate didn't happen before commit is done on the impl side (but it
871 // should happen before the main thread is done).
872 EXPECT_EQ(activate_count_, host_impl->sync_tree()->source_frame_number());
[email protected]74b43cc2013-08-30 06:29:27873 }
874
dcheng716bedf2014-10-21 09:51:08875 void AfterTest() override {}
[email protected]74b43cc2013-08-30 06:29:27876
danakj3c3973b2015-08-25 21:50:18877 base::Lock activate_count_lock_;
samans0834fe042017-03-03 17:03:22878 int activate_count_ = 0;
[email protected]74b43cc2013-08-30 06:29:27879 scoped_refptr<Layer> root_;
880 scoped_refptr<TextureLayer> layer_;
samans0834fe042017-03-03 17:03:22881 int released_count_ = 0;
[email protected]74b43cc2013-08-30 06:29:27882};
883
danakj0943a112016-08-11 00:33:46884SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerMailboxIsActivatedDuringCommit);
[email protected]74b43cc2013-08-30 06:29:27885
[email protected]de44a152013-01-08 15:28:46886class TextureLayerImplWithMailboxTest : public TextureLayerTest {
[email protected]28571b042013-03-14 07:59:15887 protected:
dcheng93a52eb2014-12-23 02:14:23888 void SetUp() override {
[email protected]28571b042013-03-14 07:59:15889 TextureLayerTest::SetUp();
loyso2cb3f32f2016-11-08 07:08:34890 layer_tree_host_ = MockLayerTreeHost::Create(
891 &fake_client_, &task_graph_runner_, animation_host_.get());
sievers71c62dd52015-10-07 01:44:39892 host_impl_.SetVisible(true);
danakjc7afae52017-06-20 21:12:41893 EXPECT_TRUE(host_impl_.InitializeRenderer(layer_tree_frame_sink_.get()));
[email protected]28571b042013-03-14 07:59:15894 }
[email protected]de44a152013-01-08 15:28:46895
[email protected]0ec335c42013-07-04 06:17:08896 bool WillDraw(TextureLayerImpl* layer, DrawMode mode) {
897 bool will_draw = layer->WillDraw(
898 mode, host_impl_.active_tree()->resource_provider());
899 if (will_draw)
900 layer->DidDraw(host_impl_.active_tree()->resource_provider());
901 return will_draw;
902 }
903
[email protected]408b5e22013-03-19 09:48:09904 FakeLayerTreeHostClient fake_client_;
[email protected]de44a152013-01-08 15:28:46905};
906
[email protected]ffbb2212013-06-02 23:47:59907// Test conditions for results of TextureLayerImpl::WillDraw under
908// different configurations of different mailbox, texture_id, and draw_mode.
909TEST_F(TextureLayerImplWithMailboxTest, TestWillDraw) {
skyostil3976a3f2014-09-04 22:07:23910 EXPECT_CALL(
911 test_data_.mock_callback_,
dyencc16ed4d2015-11-03 20:03:04912 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_token1_, false, _))
[email protected]0ec335c42013-07-04 06:17:08913 .Times(AnyNumber());
dyencc16ed4d2015-11-03 20:03:04914 EXPECT_CALL(
915 test_data_.mock_callback_,
916 ReleaseImpl2(test_data_.shared_bitmap_.get(), gpu::SyncToken(), false, _))
[email protected]0ec335c42013-07-04 06:17:08917 .Times(AnyNumber());
[email protected]ffbb2212013-06-02 23:47:59918 // Hardware mode.
919 {
danakj60bc3bc2016-04-09 00:24:48920 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11921 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
[email protected]9260757f2013-09-17 01:24:16922 impl_layer->SetTextureMailbox(
923 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:23924 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]0ec335c42013-07-04 06:17:08925 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE));
[email protected]ffbb2212013-06-02 23:47:59926 }
927
928 {
danakj60bc3bc2016-04-09 00:24:48929 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11930 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
danakj968153f32014-10-15 22:52:16931 impl_layer->SetTextureMailbox(TextureMailbox(), nullptr);
[email protected]0ec335c42013-07-04 06:17:08932 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE));
933 }
934
935 {
936 // Software resource.
danakj60bc3bc2016-04-09 00:24:48937 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11938 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
[email protected]9260757f2013-09-17 01:24:16939 impl_layer->SetTextureMailbox(
940 test_data_.mailbox3_,
skyostil3976a3f2014-09-04 22:07:23941 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox3_impl_));
[email protected]3e44d7a2013-07-30 00:03:10942 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_HARDWARE));
[email protected]ffbb2212013-06-02 23:47:59943 }
944
[email protected]0ec335c42013-07-04 06:17:08945 // Software mode.
946 {
danakj60bc3bc2016-04-09 00:24:48947 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11948 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
[email protected]9260757f2013-09-17 01:24:16949 impl_layer->SetTextureMailbox(
950 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:23951 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]0ec335c42013-07-04 06:17:08952 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE));
953 }
954
955 {
danakj60bc3bc2016-04-09 00:24:48956 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11957 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
danakj968153f32014-10-15 22:52:16958 impl_layer->SetTextureMailbox(TextureMailbox(), nullptr);
[email protected]0ec335c42013-07-04 06:17:08959 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE));
960 }
961
962 {
963 // Software resource.
danakj60bc3bc2016-04-09 00:24:48964 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11965 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
[email protected]9260757f2013-09-17 01:24:16966 impl_layer->SetTextureMailbox(
967 test_data_.mailbox3_,
skyostil3976a3f2014-09-04 22:07:23968 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox3_impl_));
[email protected]0ec335c42013-07-04 06:17:08969 EXPECT_TRUE(WillDraw(impl_layer.get(), DRAW_MODE_SOFTWARE));
970 }
971
[email protected]ffbb2212013-06-02 23:47:59972 // Resourceless software mode.
973 {
danakj60bc3bc2016-04-09 00:24:48974 std::unique_ptr<TextureLayerImpl> impl_layer =
[email protected]17e08432014-04-10 00:41:11975 TextureLayerImpl::Create(host_impl_.active_tree(), 1);
[email protected]9260757f2013-09-17 01:24:16976 impl_layer->SetTextureMailbox(
977 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:23978 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]0ec335c42013-07-04 06:17:08979 EXPECT_FALSE(WillDraw(impl_layer.get(), DRAW_MODE_RESOURCELESS_SOFTWARE));
[email protected]ffbb2212013-06-02 23:47:59980 }
[email protected]ffbb2212013-06-02 23:47:59981}
982
[email protected]28571b042013-03-14 07:59:15983TEST_F(TextureLayerImplWithMailboxTest, TestImplLayerCallbacks) {
984 host_impl_.CreatePendingTree();
danakj60bc3bc2016-04-09 00:24:48985 std::unique_ptr<TextureLayerImpl> pending_layer;
[email protected]17e08432014-04-10 00:41:11986 pending_layer = TextureLayerImpl::Create(host_impl_.pending_tree(), 1);
[email protected]28571b042013-03-14 07:59:15987 ASSERT_TRUE(pending_layer);
[email protected]de44a152013-01-08 15:28:46988
danakj60bc3bc2016-04-09 00:24:48989 std::unique_ptr<LayerImpl> active_layer(
[email protected]28571b042013-03-14 07:59:15990 pending_layer->CreateLayerImpl(host_impl_.active_tree()));
[email protected]ed511b8d2013-03-25 03:29:29991 ASSERT_TRUE(active_layer);
[email protected]de44a152013-01-08 15:28:46992
[email protected]9260757f2013-09-17 01:24:16993 pending_layer->SetTextureMailbox(
994 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:23995 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]421e84f2013-02-22 03:27:15996
[email protected]28571b042013-03-14 07:59:15997 // Test multiple commits without an activation.
skyostil3976a3f2014-09-04 22:07:23998 EXPECT_CALL(
999 test_data_.mock_callback_,
dyencc16ed4d2015-11-03 20:03:041000 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_token1_, false, _))
[email protected]28571b042013-03-14 07:59:151001 .Times(1);
[email protected]9260757f2013-09-17 01:24:161002 pending_layer->SetTextureMailbox(
1003 test_data_.mailbox2_,
skyostil3976a3f2014-09-04 22:07:231004 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox2_impl_));
[email protected]28571b042013-03-14 07:59:151005 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]421e84f2013-02-22 03:27:151006
[email protected]28571b042013-03-14 07:59:151007 // Test callback after activation.
[email protected]ed511b8d2013-03-25 03:29:291008 pending_layer->PushPropertiesTo(active_layer.get());
1009 active_layer->DidBecomeActive();
[email protected]421e84f2013-02-22 03:27:151010
skyostil3976a3f2014-09-04 22:07:231011 EXPECT_CALL(test_data_.mock_callback_, ReleaseImpl(_, _, _, _)).Times(0);
[email protected]9260757f2013-09-17 01:24:161012 pending_layer->SetTextureMailbox(
1013 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:231014 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]28571b042013-03-14 07:59:151015 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]421e84f2013-02-22 03:27:151016
[email protected]7ba3ca72013-04-11 06:37:251017 EXPECT_CALL(test_data_.mock_callback_,
skyostil3976a3f2014-09-04 22:07:231018 ReleaseImpl(test_data_.mailbox_name2_, _, false, _)).Times(1);
[email protected]ed511b8d2013-03-25 03:29:291019 pending_layer->PushPropertiesTo(active_layer.get());
1020 active_layer->DidBecomeActive();
[email protected]28571b042013-03-14 07:59:151021 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]de44a152013-01-08 15:28:461022
[email protected]28571b042013-03-14 07:59:151023 // Test resetting the mailbox.
[email protected]7ba3ca72013-04-11 06:37:251024 EXPECT_CALL(test_data_.mock_callback_,
skyostil3976a3f2014-09-04 22:07:231025 ReleaseImpl(test_data_.mailbox_name1_, _, false, _)).Times(1);
danakj968153f32014-10-15 22:52:161026 pending_layer->SetTextureMailbox(TextureMailbox(), nullptr);
[email protected]ed511b8d2013-03-25 03:29:291027 pending_layer->PushPropertiesTo(active_layer.get());
1028 active_layer->DidBecomeActive();
[email protected]28571b042013-03-14 07:59:151029 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]de44a152013-01-08 15:28:461030
[email protected]28571b042013-03-14 07:59:151031 // Test destructor.
skyostil3976a3f2014-09-04 22:07:231032 EXPECT_CALL(
1033 test_data_.mock_callback_,
dyencc16ed4d2015-11-03 20:03:041034 ReleaseImpl(test_data_.mailbox_name1_, test_data_.sync_token1_, false, _))
[email protected]28571b042013-03-14 07:59:151035 .Times(1);
[email protected]9260757f2013-09-17 01:24:161036 pending_layer->SetTextureMailbox(
1037 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:231038 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]de44a152013-01-08 15:28:461039}
1040
[email protected]28571b042013-03-14 07:59:151041TEST_F(TextureLayerImplWithMailboxTest,
1042 TestDestructorCallbackOnCreatedResource) {
danakj60bc3bc2016-04-09 00:24:481043 std::unique_ptr<TextureLayerImpl> impl_layer;
[email protected]17e08432014-04-10 00:41:111044 impl_layer = TextureLayerImpl::Create(host_impl_.active_tree(), 1);
[email protected]28571b042013-03-14 07:59:151045 ASSERT_TRUE(impl_layer);
[email protected]de44a152013-01-08 15:28:461046
[email protected]7ba3ca72013-04-11 06:37:251047 EXPECT_CALL(test_data_.mock_callback_,
skyostil3976a3f2014-09-04 22:07:231048 ReleaseImpl(test_data_.mailbox_name1_, _, false, _)).Times(1);
[email protected]9260757f2013-09-17 01:24:161049 impl_layer->SetTextureMailbox(
1050 test_data_.mailbox1_,
skyostil3976a3f2014-09-04 22:07:231051 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]ffbb2212013-06-02 23:47:591052 impl_layer->DidBecomeActive();
1053 EXPECT_TRUE(impl_layer->WillDraw(
1054 DRAW_MODE_HARDWARE, host_impl_.active_tree()->resource_provider()));
[email protected]28571b042013-03-14 07:59:151055 impl_layer->DidDraw(host_impl_.active_tree()->resource_provider());
danakj968153f32014-10-15 22:52:161056 impl_layer->SetTextureMailbox(TextureMailbox(), nullptr);
[email protected]de44a152013-01-08 15:28:461057}
1058
[email protected]28571b042013-03-14 07:59:151059TEST_F(TextureLayerImplWithMailboxTest, TestCallbackOnInUseResource) {
1060 ResourceProvider* provider = host_impl_.active_tree()->resource_provider();
jbaumanbbd425e2015-05-19 00:33:351061 ResourceId id = provider->CreateResourceFromTextureMailbox(
skyostil3976a3f2014-09-04 22:07:231062 test_data_.mailbox1_,
1063 SingleReleaseCallbackImpl::Create(test_data_.release_mailbox1_impl_));
[email protected]28571b042013-03-14 07:59:151064 provider->AllocateForTesting(id);
[email protected]de44a152013-01-08 15:28:461065
[email protected]28571b042013-03-14 07:59:151066 // Transfer some resources to the parent.
1067 ResourceProvider::ResourceIdArray resource_ids_to_transfer;
1068 resource_ids_to_transfer.push_back(id);
danakj30464ba12017-06-29 21:26:451069 std::vector<TransferableResource> list;
[email protected]28571b042013-03-14 07:59:151070 provider->PrepareSendToParent(resource_ids_to_transfer, &list);
1071 EXPECT_TRUE(provider->InUseByConsumer(id));
skyostil3976a3f2014-09-04 22:07:231072 EXPECT_CALL(test_data_.mock_callback_, ReleaseImpl(_, _, _, _)).Times(0);
[email protected]28571b042013-03-14 07:59:151073 provider->DeleteResource(id);
1074 Mock::VerifyAndClearExpectations(&test_data_.mock_callback_);
[email protected]7ba3ca72013-04-11 06:37:251075 EXPECT_CALL(test_data_.mock_callback_,
skyostil3976a3f2014-09-04 22:07:231076 ReleaseImpl(test_data_.mailbox_name1_, _, false, _)).Times(1);
danakj30464ba12017-06-29 21:26:451077 std::vector<ReturnedResource> returned =
1078 TransferableResource::ReturnResources(list);
[email protected]e00bab022013-08-19 00:42:451079 provider->ReceiveReturnsFromParent(returned);
[email protected]de44a152013-01-08 15:28:461080}
1081
[email protected]4bad8b62013-10-24 01:27:291082// Checks that TextureLayer::Update does not cause an extra commit when setting
1083// the texture mailbox.
1084class TextureLayerNoExtraCommitForMailboxTest
1085 : public LayerTreeTest,
1086 public TextureLayerClient {
1087 public:
[email protected]4bad8b62013-10-24 01:27:291088 // TextureLayerClient implementation.
dcheng716bedf2014-10-21 09:51:081089 bool PrepareTextureMailbox(
[email protected]df41e252014-02-03 23:39:501090 TextureMailbox* texture_mailbox,
danakj4d0dd802016-08-23 22:10:061091 std::unique_ptr<SingleReleaseCallback>* release_callback) override {
khushalsagarcebe4942016-09-07 23:27:011092 if (layer_tree_host()->SourceFrameNumber() == 1) {
[email protected]9f35bd22014-06-03 15:25:461093 // Once this has been committed, the mailbox will be released.
[email protected]df41e252014-02-03 23:39:501094 *texture_mailbox = TextureMailbox();
[email protected]cce34bd2013-12-02 23:24:451095 return true;
1096 }
[email protected]4bad8b62013-10-24 01:27:291097
dyene5db881b2016-03-01 19:47:031098 *texture_mailbox = TextureMailbox(MailboxFromChar('1'),
1099 SyncTokenFromUInt(0x123), GL_TEXTURE_2D);
[email protected]4bad8b62013-10-24 01:27:291100 *release_callback = SingleReleaseCallback::Create(
1101 base::Bind(&TextureLayerNoExtraCommitForMailboxTest::MailboxReleased,
1102 base::Unretained(this)));
[email protected]4bad8b62013-10-24 01:27:291103 return true;
1104 }
1105
dyencc16ed4d2015-11-03 20:03:041106 void MailboxReleased(const gpu::SyncToken& sync_token, bool lost_resource) {
dyene5db881b2016-03-01 19:47:031107 EXPECT_TRUE(sync_token.HasData());
[email protected]cce34bd2013-12-02 23:24:451108 EndTest();
[email protected]4bad8b62013-10-24 01:27:291109 }
1110
dcheng716bedf2014-10-21 09:51:081111 void SetupTree() override {
loyso0940d412016-03-14 01:30:311112 scoped_refptr<Layer> root = Layer::Create();
[email protected]4bad8b62013-10-24 01:27:291113 root->SetBounds(gfx::Size(10, 10));
[email protected]4bad8b62013-10-24 01:27:291114 root->SetIsDrawable(true);
1115
loyso0940d412016-03-14 01:30:311116 texture_layer_ = TextureLayer::CreateForMailbox(this);
[email protected]4bad8b62013-10-24 01:27:291117 texture_layer_->SetBounds(gfx::Size(10, 10));
[email protected]4bad8b62013-10-24 01:27:291118 texture_layer_->SetIsDrawable(true);
[email protected]0d7fb302014-01-23 21:30:471119 root->AddChild(texture_layer_);
[email protected]4bad8b62013-10-24 01:27:291120
khushalsagarb69ba9452017-01-27 22:20:071121 layer_tree_host()->SetRootLayer(root);
[email protected]4bad8b62013-10-24 01:27:291122 LayerTreeTest::SetupTree();
1123 }
1124
dcheng716bedf2014-10-21 09:51:081125 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
[email protected]4bad8b62013-10-24 01:27:291126
dcheng716bedf2014-10-21 09:51:081127 void DidCommitAndDrawFrame() override {
khushalsagarcebe4942016-09-07 23:27:011128 switch (layer_tree_host()->SourceFrameNumber()) {
[email protected]4bad8b62013-10-24 01:27:291129 case 1:
[email protected]4ea293f72014-08-13 03:03:171130 EXPECT_FALSE(proxy()->MainFrameWillHappenForTesting());
[email protected]cce34bd2013-12-02 23:24:451131 // Invalidate the texture layer to clear the mailbox before
1132 // ending the test.
1133 texture_layer_->SetNeedsDisplay();
1134 break;
1135 case 2:
[email protected]4bad8b62013-10-24 01:27:291136 break;
1137 default:
1138 NOTREACHED();
1139 break;
1140 }
1141 }
1142
dcheng716bedf2014-10-21 09:51:081143 void AfterTest() override {}
[email protected]4bad8b62013-10-24 01:27:291144
1145 private:
[email protected]4bad8b62013-10-24 01:27:291146 scoped_refptr<TextureLayer> texture_layer_;
[email protected]4bad8b62013-10-24 01:27:291147};
1148
[email protected]cce34bd2013-12-02 23:24:451149SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerNoExtraCommitForMailboxTest);
[email protected]4bad8b62013-10-24 01:27:291150
[email protected]b04264f92013-09-13 23:37:291151// Checks that changing a mailbox in the client for a TextureLayer that's
1152// invisible correctly works and uses the new mailbox as soon as the layer
1153// becomes visible (and returns the old one).
1154class TextureLayerChangeInvisibleMailboxTest
1155 : public LayerTreeTest,
1156 public TextureLayerClient {
1157 public:
1158 TextureLayerChangeInvisibleMailboxTest()
1159 : mailbox_changed_(true),
1160 mailbox_returned_(0),
1161 prepare_called_(0),
1162 commit_count_(0) {
1163 mailbox_ = MakeMailbox('1');
1164 }
1165
1166 // TextureLayerClient implementation.
dcheng716bedf2014-10-21 09:51:081167 bool PrepareTextureMailbox(
[email protected]e51444a2013-12-10 23:05:011168 TextureMailbox* mailbox,
danakj4d0dd802016-08-23 22:10:061169 std::unique_ptr<SingleReleaseCallback>* release_callback) override {
[email protected]b04264f92013-09-13 23:37:291170 ++prepare_called_;
1171 if (!mailbox_changed_)
1172 return false;
1173 *mailbox = mailbox_;
[email protected]9260757f2013-09-17 01:24:161174 *release_callback = SingleReleaseCallback::Create(
1175 base::Bind(&TextureLayerChangeInvisibleMailboxTest::MailboxReleased,
1176 base::Unretained(this)));
[email protected]b04264f92013-09-13 23:37:291177 return true;
1178 }
1179
1180 TextureMailbox MakeMailbox(char name) {
dyene5db881b2016-03-01 19:47:031181 return TextureMailbox(MailboxFromChar(name),
1182 SyncTokenFromUInt(static_cast<uint32_t>(name)),
dyencc16ed4d2015-11-03 20:03:041183 GL_TEXTURE_2D);
[email protected]b04264f92013-09-13 23:37:291184 }
1185
dyencc16ed4d2015-11-03 20:03:041186 void MailboxReleased(const gpu::SyncToken& sync_token, bool lost_resource) {
dyene5db881b2016-03-01 19:47:031187 EXPECT_TRUE(sync_token.HasData());
[email protected]b04264f92013-09-13 23:37:291188 ++mailbox_returned_;
1189 }
1190
dcheng716bedf2014-10-21 09:51:081191 void SetupTree() override {
loyso0940d412016-03-14 01:30:311192 scoped_refptr<Layer> root = Layer::Create();
[email protected]b04264f92013-09-13 23:37:291193 root->SetBounds(gfx::Size(10, 10));
[email protected]b04264f92013-09-13 23:37:291194 root->SetIsDrawable(true);
1195
loyso0940d412016-03-14 01:30:311196 solid_layer_ = SolidColorLayer::Create();
[email protected]b04264f92013-09-13 23:37:291197 solid_layer_->SetBounds(gfx::Size(10, 10));
1198 solid_layer_->SetIsDrawable(true);
1199 solid_layer_->SetBackgroundColor(SK_ColorWHITE);
1200 root->AddChild(solid_layer_);
1201
loyso0940d412016-03-14 01:30:311202 parent_layer_ = Layer::Create();
[email protected]b04264f92013-09-13 23:37:291203 parent_layer_->SetBounds(gfx::Size(10, 10));
1204 parent_layer_->SetIsDrawable(true);
1205 root->AddChild(parent_layer_);
1206
loyso0940d412016-03-14 01:30:311207 texture_layer_ = TextureLayer::CreateForMailbox(this);
[email protected]b04264f92013-09-13 23:37:291208 texture_layer_->SetBounds(gfx::Size(10, 10));
[email protected]b04264f92013-09-13 23:37:291209 texture_layer_->SetIsDrawable(true);
1210 parent_layer_->AddChild(texture_layer_);
1211
khushalsagarb69ba9452017-01-27 22:20:071212 layer_tree_host()->SetRootLayer(root);
[email protected]b04264f92013-09-13 23:37:291213 LayerTreeTest::SetupTree();
1214 }
1215
dcheng716bedf2014-10-21 09:51:081216 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
[email protected]b04264f92013-09-13 23:37:291217
samans44b6dfc2017-04-19 16:50:531218 void DidReceiveCompositorFrameAck() override {
[email protected]b04264f92013-09-13 23:37:291219 ++commit_count_;
1220 switch (commit_count_) {
1221 case 1:
1222 // We should have updated the layer, committing the texture.
1223 EXPECT_EQ(1, prepare_called_);
1224 // Make layer invisible.
1225 parent_layer_->SetOpacity(0.f);
1226 break;
1227 case 2:
1228 // Layer shouldn't have been updated.
1229 EXPECT_EQ(1, prepare_called_);
1230 // Change the texture.
1231 mailbox_ = MakeMailbox('2');
1232 mailbox_changed_ = true;
1233 texture_layer_->SetNeedsDisplay();
1234 // Force a change to make sure we draw a frame.
1235 solid_layer_->SetBackgroundColor(SK_ColorGRAY);
1236 break;
1237 case 3:
1238 // Layer shouldn't have been updated.
1239 EXPECT_EQ(1, prepare_called_);
1240 // So the old mailbox isn't returned yet.
1241 EXPECT_EQ(0, mailbox_returned_);
1242 // Make layer visible again.
jaydasikacf223762016-05-16 23:02:091243 parent_layer_->SetOpacity(0.9f);
[email protected]b04264f92013-09-13 23:37:291244 break;
1245 case 4:
1246 // Layer should have been updated.
1247 EXPECT_EQ(2, prepare_called_);
1248 // So the old mailbox should have been returned already.
1249 EXPECT_EQ(1, mailbox_returned_);
1250 texture_layer_->ClearClient();
1251 break;
1252 case 5:
samans44b6dfc2017-04-19 16:50:531253 EXPECT_EQ(2, mailbox_returned_);
1254 EndTest();
[email protected]b04264f92013-09-13 23:37:291255 break;
1256 default:
1257 NOTREACHED();
1258 break;
1259 }
1260 }
1261
dcheng716bedf2014-10-21 09:51:081262 void AfterTest() override {}
[email protected]b04264f92013-09-13 23:37:291263
1264 private:
1265 scoped_refptr<SolidColorLayer> solid_layer_;
1266 scoped_refptr<Layer> parent_layer_;
1267 scoped_refptr<TextureLayer> texture_layer_;
1268
1269 // Used on the main thread.
1270 bool mailbox_changed_;
1271 TextureMailbox mailbox_;
1272 int mailbox_returned_;
1273 int prepare_called_;
1274 int commit_count_;
1275};
1276
samans44b6dfc2017-04-19 16:50:531277SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerChangeInvisibleMailboxTest);
[email protected]b04264f92013-09-13 23:37:291278
[email protected]0d7fb302014-01-23 21:30:471279// Test that TextureLayerImpl::ReleaseResources can be called which releases
1280// the mailbox back to TextureLayerClient.
1281class TextureLayerReleaseResourcesBase
1282 : public LayerTreeTest,
1283 public TextureLayerClient {
1284 public:
1285 // TextureLayerClient implementation.
dcheng716bedf2014-10-21 09:51:081286 bool PrepareTextureMailbox(
[email protected]0d7fb302014-01-23 21:30:471287 TextureMailbox* mailbox,
danakj4d0dd802016-08-23 22:10:061288 std::unique_ptr<SingleReleaseCallback>* release_callback) override {
dyene5db881b2016-03-01 19:47:031289 *mailbox = TextureMailbox(MailboxFromChar('1'), SyncTokenFromUInt(1),
1290 GL_TEXTURE_2D);
[email protected]0d7fb302014-01-23 21:30:471291 *release_callback = SingleReleaseCallback::Create(
1292 base::Bind(&TextureLayerReleaseResourcesBase::MailboxReleased,
1293 base::Unretained(this)));
1294 return true;
1295 }
1296
dyencc16ed4d2015-11-03 20:03:041297 void MailboxReleased(const gpu::SyncToken& sync_token, bool lost_resource) {
[email protected]0d7fb302014-01-23 21:30:471298 mailbox_released_ = true;
1299 }
1300
dcheng716bedf2014-10-21 09:51:081301 void SetupTree() override {
[email protected]0d7fb302014-01-23 21:30:471302 LayerTreeTest::SetupTree();
1303
1304 scoped_refptr<TextureLayer> texture_layer =
loyso0940d412016-03-14 01:30:311305 TextureLayer::CreateForMailbox(this);
[email protected]0d7fb302014-01-23 21:30:471306 texture_layer->SetBounds(gfx::Size(10, 10));
[email protected]0d7fb302014-01-23 21:30:471307 texture_layer->SetIsDrawable(true);
1308
khushalsagarb69ba9452017-01-27 22:20:071309 layer_tree_host()->root_layer()->AddChild(texture_layer);
jaydasikabd6f15a2016-04-21 19:45:371310 texture_layer_id_ = texture_layer->id();
[email protected]0d7fb302014-01-23 21:30:471311 }
1312
dcheng716bedf2014-10-21 09:51:081313 void BeginTest() override {
[email protected]0d7fb302014-01-23 21:30:471314 mailbox_released_ = false;
1315 PostSetNeedsCommitToMainThread();
1316 }
1317
dcheng716bedf2014-10-21 09:51:081318 void DidCommitAndDrawFrame() override { EndTest(); }
[email protected]0d7fb302014-01-23 21:30:471319
dcheng716bedf2014-10-21 09:51:081320 void AfterTest() override { EXPECT_TRUE(mailbox_released_); }
[email protected]0d7fb302014-01-23 21:30:471321
jaydasikabd6f15a2016-04-21 19:45:371322 protected:
1323 int texture_layer_id_;
1324
[email protected]0d7fb302014-01-23 21:30:471325 private:
1326 bool mailbox_released_;
1327};
1328
1329class TextureLayerReleaseResourcesAfterCommit
1330 : public TextureLayerReleaseResourcesBase {
1331 public:
dcheng716bedf2014-10-21 09:51:081332 void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
kulkarni.a4015690f12014-10-10 13:50:061333 LayerTreeImpl* tree = nullptr;
danakj009cdfdf2015-02-17 22:35:141334 tree = host_impl->sync_tree();
jaydasikabd6f15a2016-04-21 19:45:371335 tree->LayerById(texture_layer_id_)->ReleaseResources();
[email protected]0d7fb302014-01-23 21:30:471336 }
1337};
1338
1339SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerReleaseResourcesAfterCommit);
1340
1341class TextureLayerReleaseResourcesAfterActivate
1342 : public TextureLayerReleaseResourcesBase {
1343 public:
dcheng716bedf2014-10-21 09:51:081344 void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
jaydasikabd6f15a2016-04-21 19:45:371345 host_impl->active_tree()->LayerById(texture_layer_id_)->ReleaseResources();
[email protected]0d7fb302014-01-23 21:30:471346 }
1347};
1348
1349SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerReleaseResourcesAfterActivate);
1350
[email protected]9c2bd822013-07-26 12:30:171351class TextureLayerWithMailboxMainThreadDeleted : public LayerTreeTest {
1352 public:
dyencc16ed4d2015-11-03 20:03:041353 void ReleaseCallback(const gpu::SyncToken& sync_token, bool lost_resource) {
[email protected]9794fb32013-08-29 09:49:591354 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
[email protected]9c2bd822013-07-26 12:30:171355 EXPECT_FALSE(lost_resource);
1356 ++callback_count_;
1357 EndTest();
1358 }
1359
1360 void SetMailbox(char mailbox_char) {
[email protected]9794fb32013-08-29 09:49:591361 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
danakj60bc3bc2016-04-09 00:24:481362 std::unique_ptr<SingleReleaseCallback> callback =
1363 SingleReleaseCallback::Create(base::Bind(
[email protected]9c2bd822013-07-26 12:30:171364 &TextureLayerWithMailboxMainThreadDeleted::ReleaseCallback,
1365 base::Unretained(this)));
dyene5db881b2016-03-01 19:47:031366 layer_->SetTextureMailbox(
1367 TextureMailbox(MailboxFromChar(mailbox_char),
1368 SyncTokenFromUInt(static_cast<uint32_t>(mailbox_char)),
1369 GL_TEXTURE_2D),
1370 std::move(callback));
[email protected]9c2bd822013-07-26 12:30:171371 }
1372
dcheng716bedf2014-10-21 09:51:081373 void SetupTree() override {
[email protected]9c2bd822013-07-26 12:30:171374 gfx::Size bounds(100, 100);
loyso0940d412016-03-14 01:30:311375 root_ = Layer::Create();
[email protected]9c2bd822013-07-26 12:30:171376 root_->SetBounds(bounds);
1377
loyso0940d412016-03-14 01:30:311378 layer_ = TextureLayer::CreateForMailbox(nullptr);
[email protected]9c2bd822013-07-26 12:30:171379 layer_->SetIsDrawable(true);
[email protected]9c2bd822013-07-26 12:30:171380 layer_->SetBounds(bounds);
1381
1382 root_->AddChild(layer_);
khushalsagarb69ba9452017-01-27 22:20:071383 layer_tree_host()->SetRootLayer(root_);
1384 layer_tree_host()->SetViewportSize(bounds);
[email protected]9c2bd822013-07-26 12:30:171385 }
1386
dcheng716bedf2014-10-21 09:51:081387 void BeginTest() override {
[email protected]9794fb32013-08-29 09:49:591388 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
1389
[email protected]9c2bd822013-07-26 12:30:171390 callback_count_ = 0;
1391
1392 // Set the mailbox on the main thread.
1393 SetMailbox('1');
1394 EXPECT_EQ(0, callback_count_);
1395
1396 PostSetNeedsCommitToMainThread();
1397 }
1398
dcheng716bedf2014-10-21 09:51:081399 void DidCommitAndDrawFrame() override {
khushalsagarcebe4942016-09-07 23:27:011400 switch (layer_tree_host()->SourceFrameNumber()) {
[email protected]9c2bd822013-07-26 12:30:171401 case 1:
1402 // Delete the TextureLayer on the main thread while the mailbox is in
1403 // the impl tree.
1404 layer_->RemoveFromParent();
kulkarni.a4015690f12014-10-10 13:50:061405 layer_ = nullptr;
[email protected]9c2bd822013-07-26 12:30:171406 break;
1407 }
1408 }
1409
dcheng716bedf2014-10-21 09:51:081410 void AfterTest() override { EXPECT_EQ(1, callback_count_); }
[email protected]9c2bd822013-07-26 12:30:171411
1412 private:
[email protected]9794fb32013-08-29 09:49:591413 base::ThreadChecker main_thread_;
[email protected]9c2bd822013-07-26 12:30:171414 int callback_count_;
1415 scoped_refptr<Layer> root_;
1416 scoped_refptr<TextureLayer> layer_;
1417};
1418
danakj0943a112016-08-11 00:33:461419SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerWithMailboxMainThreadDeleted);
[email protected]9c2bd822013-07-26 12:30:171420
1421class TextureLayerWithMailboxImplThreadDeleted : public LayerTreeTest {
1422 public:
dyencc16ed4d2015-11-03 20:03:041423 void ReleaseCallback(const gpu::SyncToken& sync_token, bool lost_resource) {
[email protected]9794fb32013-08-29 09:49:591424 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
[email protected]9c2bd822013-07-26 12:30:171425 EXPECT_FALSE(lost_resource);
1426 ++callback_count_;
1427 EndTest();
1428 }
1429
1430 void SetMailbox(char mailbox_char) {
[email protected]9794fb32013-08-29 09:49:591431 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
danakj60bc3bc2016-04-09 00:24:481432 std::unique_ptr<SingleReleaseCallback> callback =
1433 SingleReleaseCallback::Create(base::Bind(
[email protected]9c2bd822013-07-26 12:30:171434 &TextureLayerWithMailboxImplThreadDeleted::ReleaseCallback,
1435 base::Unretained(this)));
dyene5db881b2016-03-01 19:47:031436 layer_->SetTextureMailbox(
1437 TextureMailbox(MailboxFromChar(mailbox_char),
1438 SyncTokenFromUInt(static_cast<uint32_t>(mailbox_char)),
1439 GL_TEXTURE_2D),
1440 std::move(callback));
[email protected]9c2bd822013-07-26 12:30:171441 }
1442
dcheng716bedf2014-10-21 09:51:081443 void SetupTree() override {
[email protected]9c2bd822013-07-26 12:30:171444 gfx::Size bounds(100, 100);
loyso0940d412016-03-14 01:30:311445 root_ = Layer::Create();
[email protected]9c2bd822013-07-26 12:30:171446 root_->SetBounds(bounds);
1447
loyso0940d412016-03-14 01:30:311448 layer_ = TextureLayer::CreateForMailbox(nullptr);
[email protected]9c2bd822013-07-26 12:30:171449 layer_->SetIsDrawable(true);
[email protected]9c2bd822013-07-26 12:30:171450 layer_->SetBounds(bounds);
1451
1452 root_->AddChild(layer_);
khushalsagarb69ba9452017-01-27 22:20:071453 layer_tree_host()->SetRootLayer(root_);
1454 layer_tree_host()->SetViewportSize(bounds);
[email protected]9c2bd822013-07-26 12:30:171455 }
1456
dcheng716bedf2014-10-21 09:51:081457 void BeginTest() override {
[email protected]9794fb32013-08-29 09:49:591458 EXPECT_EQ(true, main_thread_.CalledOnValidThread());
1459
[email protected]9c2bd822013-07-26 12:30:171460 callback_count_ = 0;
1461
1462 // Set the mailbox on the main thread.
1463 SetMailbox('1');
1464 EXPECT_EQ(0, callback_count_);
1465
1466 PostSetNeedsCommitToMainThread();
1467 }
1468
dcheng716bedf2014-10-21 09:51:081469 void DidCommitAndDrawFrame() override {
khushalsagarcebe4942016-09-07 23:27:011470 switch (layer_tree_host()->SourceFrameNumber()) {
[email protected]9c2bd822013-07-26 12:30:171471 case 1:
1472 // Remove the TextureLayer on the main thread while the mailbox is in
1473 // the impl tree, but don't delete the TextureLayer until after the impl
1474 // tree side is deleted.
1475 layer_->RemoveFromParent();
1476 break;
1477 case 2:
kulkarni.a4015690f12014-10-10 13:50:061478 layer_ = nullptr;
[email protected]9c2bd822013-07-26 12:30:171479 break;
1480 }
1481 }
1482
dcheng716bedf2014-10-21 09:51:081483 void AfterTest() override { EXPECT_EQ(1, callback_count_); }
[email protected]9c2bd822013-07-26 12:30:171484
1485 private:
[email protected]9794fb32013-08-29 09:49:591486 base::ThreadChecker main_thread_;
[email protected]9c2bd822013-07-26 12:30:171487 int callback_count_;
1488 scoped_refptr<Layer> root_;
1489 scoped_refptr<TextureLayer> layer_;
1490};
1491
danakj0943a112016-08-11 00:33:461492SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerWithMailboxImplThreadDeleted);
[email protected]9c2bd822013-07-26 12:30:171493
[email protected]ba565742012-11-10 09:29:481494} // namespace
1495} // namespace cc