summaryrefslogtreecommitdiffstats
path: root/cc/trees
diff options
context:
space:
mode:
authorsimonhong@chromium.org <simonhong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-22 02:51:56 +0000
committersimonhong@chromium.org <simonhong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-22 02:51:56 +0000
commit6f0fdcbf68437182793bebc39f2655a171f610df (patch)
treec598f3bbcbf855fbc0932fa118bf5168318482b5 /cc/trees
parent46615311db334a3453bc0f50361816c6baa890ef (diff)
downloadchromium_src-6f0fdcbf68437182793bebc39f2655a171f610df.zip
chromium_src-6f0fdcbf68437182793bebc39f2655a171f610df.tar.gz
chromium_src-6f0fdcbf68437182793bebc39f2655a171f610df.tar.bz2
cc: Add testing stubs for proxy test
This is initial patch for proxy unittests. New testing stubs are added to LayerTreeTest. R=brianderson@chromium.org, danakj@chomium.org BUG=356832 TEST=*ProxyTest* Review URL: https://codereview.chromium.org/242783003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@272051 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/trees')
-rw-r--r--cc/trees/layer_tree_host_unittest_proxy.cc135
-rw-r--r--cc/trees/single_thread_proxy.h3
-rw-r--r--cc/trees/thread_proxy.h217
3 files changed, 249 insertions, 106 deletions
diff --git a/cc/trees/layer_tree_host_unittest_proxy.cc b/cc/trees/layer_tree_host_unittest_proxy.cc
new file mode 100644
index 0000000..4f79311
--- /dev/null
+++ b/cc/trees/layer_tree_host_unittest_proxy.cc
@@ -0,0 +1,135 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "cc/test/layer_tree_test.h"
+#include "cc/trees/thread_proxy.h"
+
+#define THREAD_PROXY_NO_IMPL_TEST_F(TEST_FIXTURE_NAME) \
+ TEST_F(TEST_FIXTURE_NAME, Run_MainThreadPaint) { \
+ Run(true, false); \
+ }
+
+#define THREAD_PROXY_TEST_F(TEST_FIXTURE_NAME) \
+ THREAD_PROXY_NO_IMPL_TEST_F(TEST_FIXTURE_NAME); \
+ TEST_F(TEST_FIXTURE_NAME, Run_ImplSidePaint) { \
+ Run(true, true); \
+ }
+
+// Do common tests for single thread proxy and thread proxy.
+// TODO(simonhong): Add SINGLE_THREAD_PROXY_TEST_F
+#define PROXY_TEST_SCHEDULED_ACTION(TEST_FIXTURE_NAME) \
+ THREAD_PROXY_TEST_F(TEST_FIXTURE_NAME);
+
+namespace cc {
+
+class ProxyTest : public LayerTreeTest {
+ protected:
+ ProxyTest() {}
+ virtual ~ProxyTest() {}
+
+ void Run(bool threaded, bool impl_side_painting) {
+ // We don't need to care about delegating mode.
+ bool delegating_renderer = true;
+
+ RunTest(threaded, delegating_renderer, impl_side_painting);
+ }
+
+ virtual void BeginTest() OVERRIDE {}
+ virtual void AfterTest() OVERRIDE {}
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ProxyTest);
+};
+
+class ProxyTestScheduledActionsBasic : public ProxyTest {
+ protected:
+ virtual void BeginTest() OVERRIDE {
+ proxy()->SetNeedsCommit();
+ }
+
+ virtual void ScheduledActionBeginOutputSurfaceCreation() OVERRIDE {
+ EXPECT_EQ(0, action_phase_++);
+ }
+
+ virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {
+ EXPECT_EQ(1, action_phase_++);
+ }
+
+ virtual void ScheduledActionCommit() OVERRIDE {
+ EXPECT_EQ(2, action_phase_++);
+ }
+
+ virtual void ScheduledActionDrawAndSwapIfPossible() OVERRIDE {
+ EXPECT_EQ(3, action_phase_++);
+ EndTest();
+ }
+
+ virtual void AfterTest() OVERRIDE {
+ EXPECT_EQ(4, action_phase_);
+ }
+
+ ProxyTestScheduledActionsBasic() : action_phase_(0) {
+ }
+ virtual ~ProxyTestScheduledActionsBasic() {}
+
+ private:
+ int action_phase_;
+
+ DISALLOW_COPY_AND_ASSIGN(ProxyTestScheduledActionsBasic);
+};
+
+PROXY_TEST_SCHEDULED_ACTION(ProxyTestScheduledActionsBasic);
+
+class ThreadProxyTest : public ProxyTest {
+ protected:
+ ThreadProxyTest() {}
+ virtual ~ThreadProxyTest() {}
+
+ const ThreadProxy::MainThreadOnly& ThreadProxyMainOnly() const {
+ DCHECK(proxy());
+ DCHECK(proxy()->HasImplThread());
+ return static_cast<const ThreadProxy*>(proxy())->main();
+ }
+
+ const ThreadProxy::CompositorThreadOnly& ThreadProxyImplOnly() const {
+ DCHECK(proxy());
+ DCHECK(proxy()->HasImplThread());
+ return static_cast<const ThreadProxy*>(proxy())->impl();
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ThreadProxyTest);
+};
+
+class ThreadProxyTestSetNeedsCommit : public ThreadProxyTest {
+ protected:
+ ThreadProxyTestSetNeedsCommit() {}
+ virtual ~ThreadProxyTestSetNeedsCommit() {}
+
+ virtual void BeginTest() OVERRIDE {
+ EXPECT_FALSE(ThreadProxyMainOnly().commit_requested);
+ EXPECT_FALSE(ThreadProxyMainOnly().commit_request_sent_to_impl_thread);
+
+ proxy()->SetNeedsCommit();
+
+ EXPECT_TRUE(ThreadProxyMainOnly().commit_requested);
+ EXPECT_TRUE(ThreadProxyMainOnly().commit_request_sent_to_impl_thread);
+ }
+
+ virtual void DidBeginMainFrame() OVERRIDE {
+ EXPECT_FALSE(ThreadProxyMainOnly().commit_requested);
+ EXPECT_FALSE(ThreadProxyMainOnly().commit_request_sent_to_impl_thread);
+
+ EndTest();
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ThreadProxyTestSetNeedsCommit);
+};
+
+THREAD_PROXY_TEST_F(ThreadProxyTestSetNeedsCommit);
+
+} // namespace cc
diff --git a/cc/trees/single_thread_proxy.h b/cc/trees/single_thread_proxy.h
index dc87f5f..5de42b5 100644
--- a/cc/trees/single_thread_proxy.h
+++ b/cc/trees/single_thread_proxy.h
@@ -19,7 +19,8 @@ class ContextProvider;
class LayerTreeHost;
class LayerTreeHostSingleThreadClient;
-class SingleThreadProxy : public Proxy, LayerTreeHostImplClient {
+class CC_EXPORT SingleThreadProxy : public Proxy,
+ NON_EXPORTED_BASE(LayerTreeHostImplClient) {
public:
static scoped_ptr<Proxy> Create(
LayerTreeHost* layer_tree_host,
diff --git a/cc/trees/thread_proxy.h b/cc/trees/thread_proxy.h
index 7af16cd..134d5c5 100644
--- a/cc/trees/thread_proxy.h
+++ b/cc/trees/thread_proxy.h
@@ -31,10 +31,10 @@ class ResourceUpdateQueue;
class Scheduler;
class ScopedThreadProxy;
-class ThreadProxy : public Proxy,
- LayerTreeHostImplClient,
- SchedulerClient,
- ResourceUpdateControllerClient {
+class CC_EXPORT ThreadProxy : public Proxy,
+ NON_EXPORTED_BASE(LayerTreeHostImplClient),
+ NON_EXPORTED_BASE(SchedulerClient),
+ NON_EXPORTED_BASE(ResourceUpdateControllerClient) {
public:
static scoped_ptr<Proxy> Create(
LayerTreeHost* layer_tree_host,
@@ -42,6 +42,111 @@ class ThreadProxy : public Proxy,
virtual ~ThreadProxy();
+ struct BeginMainFrameAndCommitState {
+ BeginMainFrameAndCommitState();
+ ~BeginMainFrameAndCommitState();
+
+ base::TimeTicks monotonic_frame_begin_time;
+ scoped_ptr<ScrollAndScaleSet> scroll_info;
+ size_t memory_allocation_limit_bytes;
+ int memory_allocation_priority_cutoff;
+ bool evicted_ui_resources;
+ };
+
+ struct MainThreadOnly {
+ MainThreadOnly(ThreadProxy* proxy, int layer_tree_host_id);
+ ~MainThreadOnly();
+
+ const int layer_tree_host_id;
+
+ // Set only when SetNeedsAnimate is called.
+ bool animate_requested;
+ // Set only when SetNeedsCommit is called.
+ bool commit_requested;
+ // Set by SetNeedsAnimate, SetNeedsUpdateLayers, and SetNeedsCommit.
+ bool commit_request_sent_to_impl_thread;
+
+ bool started;
+ bool manage_tiles_pending;
+ bool can_cancel_commit;
+ bool defer_commits;
+
+ base::CancelableClosure output_surface_creation_callback;
+ RendererCapabilities renderer_capabilities_main_thread_copy;
+
+ scoped_ptr<BeginMainFrameAndCommitState> pending_deferred_commit;
+ base::WeakPtrFactory<ThreadProxy> weak_factory;
+ };
+
+ // Accessed on the main thread, or when main thread is blocked.
+ struct MainThreadOrBlockedMainThread {
+ explicit MainThreadOrBlockedMainThread(LayerTreeHost* host);
+ ~MainThreadOrBlockedMainThread();
+
+ PrioritizedResourceManager* contents_texture_manager();
+
+ LayerTreeHost* layer_tree_host;
+ bool commit_waits_for_activation;
+ bool main_thread_inside_commit;
+
+ base::TimeTicks last_monotonic_frame_begin_time;
+ };
+
+ struct ReadbackRequest;
+
+ struct CompositorThreadOnly {
+ CompositorThreadOnly(ThreadProxy* proxy, int layer_tree_host_id);
+ ~CompositorThreadOnly();
+
+ const int layer_tree_host_id;
+
+ // Copy of the main thread side contents texture manager for work
+ // that needs to be done on the compositor thread.
+ PrioritizedResourceManager* contents_texture_manager;
+
+ scoped_ptr<Scheduler> scheduler;
+
+ // Set when the main thread is waiting on a
+ // ScheduledActionSendBeginMainFrame to be issued.
+ CompletionEvent* begin_main_frame_sent_completion_event;
+
+ // Set when the main thread is waiting on a commit to complete.
+ CompletionEvent* commit_completion_event;
+
+ // Set when the main thread is waiting on a pending tree activation.
+ CompletionEvent* completion_event_for_commit_held_on_tree_activation;
+
+ scoped_ptr<ResourceUpdateController> current_resource_update_controller;
+
+ // Set when the next draw should post DidCommitAndDrawFrame to the main
+ // thread.
+ bool next_frame_is_newly_committed_frame;
+
+ bool inside_draw;
+
+ bool input_throttled_until_commit;
+
+ // Set when we freeze animations to avoid checkerboarding.
+ bool animations_frozen_until_next_draw;
+ base::TimeTicks animation_time;
+
+ // Whether a commit has been completed since the last time animations were
+ // ticked. If this happens, we need to animate again.
+ bool did_commit_after_animating;
+
+ base::TimeTicks smoothness_takes_priority_expiration_time;
+ bool renew_tree_priority_pending;
+
+ ProxyTimingHistory timing_history;
+
+ scoped_ptr<LayerTreeHostImpl> layer_tree_host_impl;
+ base::WeakPtrFactory<ThreadProxy> weak_factory;
+ };
+
+ const MainThreadOnly& main() const;
+ const MainThreadOrBlockedMainThread& blocked_main() const;
+ const CompositorThreadOnly& impl() const;
+
// Proxy implementation
virtual void FinishAllRendering() OVERRIDE;
virtual bool IsStarted() const OVERRIDE;
@@ -124,21 +229,11 @@ class ThreadProxy : public Proxy,
// ResourceUpdateControllerClient implementation
virtual void ReadyToFinalizeTextureUpdates() OVERRIDE;
- private:
+ protected:
ThreadProxy(LayerTreeHost* layer_tree_host,
scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner);
- struct BeginMainFrameAndCommitState {
- BeginMainFrameAndCommitState();
- ~BeginMainFrameAndCommitState();
-
- base::TimeTicks monotonic_frame_begin_time;
- scoped_ptr<ScrollAndScaleSet> scroll_info;
- size_t memory_allocation_limit_bytes;
- int memory_allocation_priority_cutoff;
- bool evicted_ui_resources;
- };
-
+ private:
// Called on main thread.
void SetRendererCapabilitiesMainThreadCopy(
const RendererCapabilities& capabilities);
@@ -166,7 +261,7 @@ class ThreadProxy : public Proxy,
void HasInitializedOutputSurfaceOnImplThread(
CompletionEvent* completion,
bool* has_initialized_output_surface);
- void InitializeOutputSurfaceOnImplThread(
+ virtual void InitializeOutputSurfaceOnImplThread(
CompletionEvent* completion,
scoped_ptr<OutputSurface> output_surface,
bool* success,
@@ -189,105 +284,17 @@ class ThreadProxy : public Proxy,
LayerTreeHost* layer_tree_host();
const LayerTreeHost* layer_tree_host() const;
- struct MainThreadOnly {
- MainThreadOnly(ThreadProxy* proxy, int layer_tree_host_id);
- ~MainThreadOnly();
-
- const int layer_tree_host_id;
-
- // Set only when SetNeedsAnimate is called.
- bool animate_requested;
- // Set only when SetNeedsCommit is called.
- bool commit_requested;
- // Set by SetNeedsAnimate, SetNeedsUpdateLayers, and SetNeedsCommit.
- bool commit_request_sent_to_impl_thread;
-
- bool started;
- bool manage_tiles_pending;
- bool can_cancel_commit;
- bool defer_commits;
-
- base::CancelableClosure output_surface_creation_callback;
- RendererCapabilities renderer_capabilities_main_thread_copy;
-
- scoped_ptr<BeginMainFrameAndCommitState> pending_deferred_commit;
- base::WeakPtrFactory<ThreadProxy> weak_factory;
- };
// Use accessors instead of this variable directly.
MainThreadOnly main_thread_only_vars_unsafe_;
MainThreadOnly& main();
- const MainThreadOnly& main() const;
- // Accessed on the main thread, or when main thread is blocked.
- struct MainThreadOrBlockedMainThread {
- explicit MainThreadOrBlockedMainThread(LayerTreeHost* host);
- ~MainThreadOrBlockedMainThread();
-
- PrioritizedResourceManager* contents_texture_manager();
-
- LayerTreeHost* layer_tree_host;
- bool commit_waits_for_activation;
- bool main_thread_inside_commit;
-
- base::TimeTicks last_monotonic_frame_begin_time;
- };
// Use accessors instead of this variable directly.
MainThreadOrBlockedMainThread main_thread_or_blocked_vars_unsafe_;
MainThreadOrBlockedMainThread& blocked_main();
- const MainThreadOrBlockedMainThread& blocked_main() const;
-
- struct CompositorThreadOnly {
- CompositorThreadOnly(ThreadProxy* proxy, int layer_tree_host_id);
- ~CompositorThreadOnly();
-
- const int layer_tree_host_id;
-
- // Copy of the main thread side contents texture manager for work
- // that needs to be done on the compositor thread.
- PrioritizedResourceManager* contents_texture_manager;
-
- scoped_ptr<Scheduler> scheduler;
-
- // Set when the main thread is waiting on a
- // ScheduledActionSendBeginMainFrame to be issued.
- CompletionEvent* begin_main_frame_sent_completion_event;
-
- // Set when the main thread is waiting on a commit to complete.
- CompletionEvent* commit_completion_event;
-
- // Set when the main thread is waiting on a pending tree activation.
- CompletionEvent* completion_event_for_commit_held_on_tree_activation;
-
- scoped_ptr<ResourceUpdateController> current_resource_update_controller;
- // Set when the next draw should post DidCommitAndDrawFrame to the main
- // thread.
- bool next_frame_is_newly_committed_frame;
-
- bool inside_draw;
-
- bool input_throttled_until_commit;
-
- // Set when we freeze animations to avoid checkerboarding.
- bool animations_frozen_until_next_draw;
- base::TimeTicks animation_time;
-
- // Whether a commit has been completed since the last time animations were
- // ticked. If this happens, we need to animate again.
- bool did_commit_after_animating;
-
- base::TimeTicks smoothness_takes_priority_expiration_time;
- bool renew_tree_priority_pending;
-
- ProxyTimingHistory timing_history;
-
- scoped_ptr<LayerTreeHostImpl> layer_tree_host_impl;
- base::WeakPtrFactory<ThreadProxy> weak_factory;
- };
// Use accessors instead of this variable directly.
CompositorThreadOnly compositor_thread_vars_unsafe_;
CompositorThreadOnly& impl();
- const CompositorThreadOnly& impl() const;
base::WeakPtr<ThreadProxy> main_thread_weak_ptr_;
base::WeakPtr<ThreadProxy> impl_thread_weak_ptr_;