| Index: cc/test/layer_tree_test.cc
|
| diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc
|
| index 90a0c8e51bb8c0fd3d99bde0eac54395e2a0ca85..a5a7a3d22ab572e0072fc6484f8c83ca5f1f04ca 100644
|
| --- a/cc/test/layer_tree_test.cc
|
| +++ b/cc/test/layer_tree_test.cc
|
| @@ -17,15 +17,18 @@
|
| #include "cc/input/input_handler.h"
|
| #include "cc/layers/layer.h"
|
| #include "cc/layers/layer_impl.h"
|
| +#include "cc/proto/compositor_message_to_impl.pb.h"
|
| #include "cc/test/animation_test_common.h"
|
| #include "cc/test/begin_frame_args_test.h"
|
| #include "cc/test/fake_external_begin_frame_source.h"
|
| #include "cc/test/fake_layer_tree_host_client.h"
|
| #include "cc/test/fake_output_surface.h"
|
| +#include "cc/test/remote_channel_impl_for_test.h"
|
| #include "cc/test/test_context_provider.h"
|
| #include "cc/test/test_gpu_memory_buffer_manager.h"
|
| #include "cc/test/test_shared_bitmap_manager.h"
|
| #include "cc/test/test_task_graph_runner.h"
|
| +#include "cc/test/threaded_channel_for_test.h"
|
| #include "cc/trees/layer_tree_host_client.h"
|
| #include "cc/trees/layer_tree_host_impl.h"
|
| #include "cc/trees/layer_tree_host_single_thread_client.h"
|
| @@ -427,6 +430,7 @@ class LayerTreeHostForTesting : public LayerTreeHost {
|
| TestHooks* test_hooks,
|
| CompositorMode mode,
|
| LayerTreeHostClientForTesting* client,
|
| + RemoteProtoChannel* remote_proto_channel,
|
| SharedBitmapManager* shared_bitmap_manager,
|
| gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
|
| TaskGraphRunner* task_graph_runner,
|
| @@ -445,15 +449,30 @@ class LayerTreeHostForTesting : public LayerTreeHost {
|
| scoped_ptr<TaskRunnerProvider> task_runner_provider =
|
| TaskRunnerProvider::Create(main_task_runner, impl_task_runner);
|
| scoped_ptr<Proxy> proxy;
|
| - if (mode == CompositorMode::Threaded) {
|
| - DCHECK(impl_task_runner.get());
|
| - scoped_ptr<ProxyMain> proxy_main = ProxyMainForTest::CreateThreaded(
|
| - test_hooks, layer_tree_host.get(), task_runner_provider.get());
|
| - proxy = std::move(proxy_main);
|
| - } else {
|
| - proxy =
|
| - SingleThreadProxyForTest::Create(test_hooks, layer_tree_host.get(),
|
| - client, task_runner_provider.get());
|
| + switch (mode) {
|
| + case CompositorMode::SINGLE_THREADED:
|
| + proxy = SingleThreadProxyForTest::Create(test_hooks,
|
| + layer_tree_host.get(), client,
|
| + task_runner_provider.get());
|
| + break;
|
| + case CompositorMode::THREADED:
|
| + DCHECK(impl_task_runner.get());
|
| + proxy = ProxyMainForTest::CreateThreaded(
|
| + test_hooks, layer_tree_host.get(), task_runner_provider.get());
|
| + break;
|
| + case CompositorMode::REMOTE:
|
| + DCHECK(!external_begin_frame_source);
|
| + // The Remote LayerTreeHost on the client has the impl task runner.
|
| + if (task_runner_provider->HasImplThread()) {
|
| + proxy = RemoteChannelImplForTest::Create(
|
| + test_hooks, layer_tree_host.get(), remote_proto_channel,
|
| + task_runner_provider.get());
|
| + } else {
|
| + proxy = ProxyMainForTest::CreateRemote(
|
| + test_hooks, remote_proto_channel, layer_tree_host.get(),
|
| + task_runner_provider.get());
|
| + }
|
| + break;
|
| }
|
| layer_tree_host->InitializeForTesting(
|
| std::move(task_runner_provider), std::move(proxy),
|
| @@ -498,6 +517,7 @@ class LayerTreeHostForTesting : public LayerTreeHost {
|
| LayerTreeTest::LayerTreeTest()
|
| : output_surface_(nullptr),
|
| external_begin_frame_source_(nullptr),
|
| + remote_proto_channel_bridge_(this),
|
| beginning_(false),
|
| end_when_begin_returns_(false),
|
| timed_out_(false),
|
| @@ -519,6 +539,17 @@ LayerTreeTest::LayerTreeTest()
|
|
|
| LayerTreeTest::~LayerTreeTest() {}
|
|
|
| +Proxy* LayerTreeTest::remote_client_proxy() const {
|
| + DCHECK(IsRemoteTest());
|
| + return remote_client_layer_tree_host_
|
| + ? remote_client_layer_tree_host_->proxy()
|
| + : nullptr;
|
| +}
|
| +
|
| +bool LayerTreeTest::IsRemoteTest() const {
|
| + return mode_ == CompositorMode::REMOTE;
|
| +}
|
| +
|
| void LayerTreeTest::EndTest() {
|
| if (ended_)
|
| return;
|
| @@ -669,18 +700,31 @@ void LayerTreeTest::DoBeginTest() {
|
|
|
| scoped_ptr<FakeExternalBeginFrameSource> external_begin_frame_source;
|
| if (settings_.use_external_begin_frame_source) {
|
| + DCHECK(!IsRemoteTest());
|
| external_begin_frame_source.reset(new FakeExternalBeginFrameSource(
|
| settings_.renderer_settings.refresh_rate));
|
| external_begin_frame_source_ = external_begin_frame_source.get();
|
| }
|
|
|
| DCHECK(!impl_thread_ || impl_thread_->task_runner().get());
|
| - layer_tree_host_ = LayerTreeHostForTesting::Create(
|
| - this, mode_, client_.get(), shared_bitmap_manager_.get(),
|
| - gpu_memory_buffer_manager_.get(), task_graph_runner_.get(), settings_,
|
| - base::ThreadTaskRunnerHandle::Get(),
|
| - impl_thread_ ? impl_thread_->task_runner() : NULL,
|
| - std::move(external_begin_frame_source));
|
| +
|
| + if (IsRemoteTest()) {
|
| + DCHECK(impl_thread_);
|
| + layer_tree_host_ = LayerTreeHostForTesting::Create(
|
| + this, mode_, client_.get(), &remote_proto_channel_bridge_.channel_main,
|
| + nullptr, nullptr, task_graph_runner_.get(), settings_,
|
| + base::ThreadTaskRunnerHandle::Get(), nullptr,
|
| + std::move(external_begin_frame_source));
|
| + DCHECK(remote_proto_channel_bridge_.channel_main.HasReceiver());
|
| + } else {
|
| + layer_tree_host_ = LayerTreeHostForTesting::Create(
|
| + this, mode_, client_.get(), nullptr, shared_bitmap_manager_.get(),
|
| + gpu_memory_buffer_manager_.get(), task_graph_runner_.get(), settings_,
|
| + base::ThreadTaskRunnerHandle::Get(),
|
| + impl_thread_ ? impl_thread_->task_runner() : NULL,
|
| + std::move(external_begin_frame_source));
|
| + }
|
| +
|
| ASSERT_TRUE(layer_tree_host_);
|
|
|
| started_ = true;
|
| @@ -721,8 +765,18 @@ void LayerTreeTest::Timeout() {
|
|
|
| void LayerTreeTest::RealEndTest() {
|
| // TODO(mithro): Make this method only end when not inside an impl frame.
|
| - if (layer_tree_host_ && !timed_out_ &&
|
| - proxy()->MainFrameWillHappenForTesting()) {
|
| + bool main_frame_will_happen;
|
| + if (IsRemoteTest()) {
|
| + main_frame_will_happen =
|
| + remote_client_layer_tree_host_
|
| + ? remote_client_proxy()->MainFrameWillHappenForTesting()
|
| + : false;
|
| + } else {
|
| + main_frame_will_happen =
|
| + layer_tree_host_ ? proxy()->MainFrameWillHappenForTesting() : false;
|
| + }
|
| +
|
| + if (main_frame_will_happen && !timed_out_) {
|
| main_task_runner_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&LayerTreeTest::RealEndTest, main_thread_weak_ptr_));
|
| @@ -815,7 +869,7 @@ void LayerTreeTest::DispatchNextCommitWaitsForActivation() {
|
|
|
| void LayerTreeTest::RunTest(CompositorMode mode, bool delegating_renderer) {
|
| mode_ = mode;
|
| - if (mode_ == CompositorMode::Threaded) {
|
| + if (mode_ == CompositorMode::THREADED || mode_ == CompositorMode::REMOTE) {
|
| impl_thread_.reset(new base::Thread("Compositor"));
|
| ASSERT_TRUE(impl_thread_->Start());
|
| }
|
| @@ -905,12 +959,60 @@ void LayerTreeTest::DestroyLayerTreeHost() {
|
| if (layer_tree_host_ && layer_tree_host_->root_layer())
|
| layer_tree_host_->root_layer()->SetLayerTreeHost(NULL);
|
| layer_tree_host_ = nullptr;
|
| +
|
| + DCHECK(!remote_proto_channel_bridge_.channel_main.HasReceiver());
|
| +
|
| + // Destroying the LayerTreeHost should destroy the remote client
|
| + // LayerTreeHost.
|
| + DCHECK(!remote_client_layer_tree_host_);
|
| +}
|
| +
|
| +void LayerTreeTest::DestroyRemoteClientHost() {
|
| + DCHECK(IsRemoteTest());
|
| + DCHECK(remote_client_layer_tree_host_);
|
| +
|
| + remote_client_layer_tree_host_ = nullptr;
|
| + DCHECK(!remote_proto_channel_bridge_.channel_impl.HasReceiver());
|
| +}
|
| +
|
| +void LayerTreeTest::CreateRemoteClientHost(
|
| + const proto::CompositorMessageToImpl& proto) {
|
| + DCHECK(IsRemoteTest());
|
| + DCHECK(!remote_client_layer_tree_host_);
|
| + DCHECK(impl_thread_);
|
| + DCHECK(proto.message_type() ==
|
| + proto::CompositorMessageToImpl::INITIALIZE_IMPL);
|
| +
|
| + proto::InitializeImpl initialize_proto = proto.initialize_impl_message();
|
| + LayerTreeSettings settings;
|
| + settings.FromProtobuf(initialize_proto.layer_tree_settings());
|
| + remote_client_layer_tree_host_ = LayerTreeHostForTesting::Create(
|
| + this, mode_, client_.get(), &remote_proto_channel_bridge_.channel_impl,
|
| + nullptr, nullptr, task_graph_runner_.get(), settings,
|
| + base::ThreadTaskRunnerHandle::Get(), impl_thread_->task_runner(),
|
| + nullptr);
|
| +
|
| + DCHECK(remote_proto_channel_bridge_.channel_impl.HasReceiver());
|
| + DCHECK(task_runner_provider()->HasImplThread());
|
| }
|
|
|
| TaskGraphRunner* LayerTreeTest::task_graph_runner() const {
|
| return task_graph_runner_.get();
|
| }
|
|
|
| +TaskRunnerProvider* LayerTreeTest::task_runner_provider() const {
|
| + // All LayerTreeTests can use the task runner provider to access the impl
|
| + // thread. In the remote mode, the impl thread of the compositor lives on
|
| + // the client, so return the task runner provider owned by the remote client
|
| + // LayerTreeHost.
|
| + if (IsRemoteTest()) {
|
| + return remote_client_layer_tree_host_
|
| + ? remote_client_layer_tree_host_->task_runner_provider()
|
| + : nullptr;
|
| + }
|
| + return layer_tree_host_ ? layer_tree_host_->task_runner_provider() : nullptr;
|
| +}
|
| +
|
| LayerTreeHost* LayerTreeTest::layer_tree_host() {
|
| // We check for a null task_runner_provider here as we sometimes ask for the
|
| // layer tree host when the task_runner_provider does not exist, often for
|
| @@ -929,14 +1031,32 @@ ProxyMainForTest* LayerTreeTest::GetProxyMainForTest() const {
|
|
|
| ProxyImplForTest* LayerTreeTest::GetProxyImplForTest() const {
|
| DCHECK(HasImplThread());
|
| - ThreadedChannel* threaded_channel =
|
| - static_cast<ThreadedChannel*>(GetProxyMainForTest()->channel_main());
|
| - ProxyImpl* proxy_impl = threaded_channel->GetProxyImplForTesting();
|
| +
|
| + if (IsRemoteTest()) {
|
| + return GetRemoteChannelImplForTest()->proxy_impl_for_test();
|
| + }
|
| +
|
| + ProxyImplForTest* proxy_impl_for_test =
|
| + GetThreadedChannelForTest()->proxy_impl_for_test();
|
|
|
| // We check for null ProxyImpl since ProxyImpl exists in the ThreadedChannel
|
| // only after it is initialized.
|
| - DCHECK(proxy_impl);
|
| - return static_cast<ProxyImplForTest*>(proxy_impl);
|
| + DCHECK(proxy_impl_for_test);
|
| + return proxy_impl_for_test;
|
| +}
|
| +
|
| +ThreadedChannelForTest* LayerTreeTest::GetThreadedChannelForTest() const {
|
| + DCHECK(mode_ == CompositorMode::THREADED);
|
| +
|
| + return GetProxyMainForTest()->threaded_channel_for_test();
|
| +}
|
| +
|
| +RemoteChannelImplForTest* LayerTreeTest::GetRemoteChannelImplForTest() const {
|
| + DCHECK(IsRemoteTest());
|
| + DCHECK(remote_client_layer_tree_host_);
|
| +
|
| + return static_cast<RemoteChannelImplForTest*>(
|
| + remote_client_layer_tree_host_->proxy());
|
| }
|
|
|
| } // namespace cc
|
|
|