Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(150)

Side by Side Diff: content/renderer/gpu/render_widget_compositor_unittest.cc

Issue 801973002: Introduce CompositorDependencies for RenderWidgetCompositor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: compdep: move-compositordepsimpl-to-separate-file Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/gpu/render_widget_compositor.h" 5 #include "content/renderer/gpu/render_widget_compositor.h"
6 6
7 #include "cc/output/begin_frame_args.h" 7 #include "cc/output/begin_frame_args.h"
8 #include "cc/scheduler/begin_frame_source.h"
8 #include "cc/test/failure_output_surface.h" 9 #include "cc/test/failure_output_surface.h"
10 #include "cc/test/test_gpu_memory_buffer_manager.h"
11 #include "cc/test/test_shared_bitmap_manager.h"
9 #include "cc/trees/layer_tree_host.h" 12 #include "cc/trees/layer_tree_host.h"
10 #include "content/public/test/mock_render_thread.h" 13 #include "content/public/test/mock_render_thread.h"
11 #include "content/renderer/render_widget.h" 14 #include "content/renderer/render_widget.h"
15 #include "content/renderer/scheduler/renderer_scheduler.h"
12 #include "testing/gmock/include/gmock/gmock.h" 16 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
14 #include "third_party/WebKit/public/platform/WebScreenInfo.h" 18 #include "third_party/WebKit/public/platform/WebScreenInfo.h"
15 19
16 using testing::AllOf; 20 using testing::AllOf;
17 using testing::Field; 21 using testing::Field;
18 22
19 namespace content { 23 namespace content {
24 namespace {
20 25
21 class MockWebWidget : public blink::WebWidget { 26 class MockWebWidget : public blink::WebWidget {
22 public: 27 public:
23 MOCK_METHOD1(beginFrame, void(const blink::WebBeginFrameArgs& args)); 28 MOCK_METHOD1(beginFrame, void(const blink::WebBeginFrameArgs& args));
24 }; 29 };
25 30
26 class TestRenderWidget : public RenderWidget { 31 class TestRenderWidget : public RenderWidget {
27 public: 32 public:
28 TestRenderWidget() 33 TestRenderWidget()
29 : RenderWidget(blink::WebPopupTypeNone, 34 : RenderWidget(blink::WebPopupTypeNone,
30 blink::WebScreenInfo(), 35 blink::WebScreenInfo(),
31 true, 36 true,
32 false, 37 false,
33 false) { 38 false) {
34 webwidget_ = &mock_webwidget_; 39 webwidget_ = &mock_webwidget_;
35 } 40 }
36 41
37 MockWebWidget mock_webwidget_; 42 MockWebWidget mock_webwidget_;
38 43
39 protected: 44 protected:
40 ~TestRenderWidget() override { webwidget_ = NULL; } 45 ~TestRenderWidget() override { webwidget_ = NULL; }
41 46
42 DISALLOW_COPY_AND_ASSIGN(TestRenderWidget); 47 DISALLOW_COPY_AND_ASSIGN(TestRenderWidget);
43 }; 48 };
44 49
50 class FakeRendererScheduler : public RendererScheduler {
51 public:
52 FakeRendererScheduler() {}
53 virtual ~FakeRendererScheduler() {}
54
55 // RendererScheduler implementation.
56 scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner() override {
57 return nullptr;
58 }
59 scoped_refptr<base::SingleThreadTaskRunner> CompositorTaskRunner() override {
60 return nullptr;
61 }
62 scoped_refptr<SingleThreadIdleTaskRunner> IdleTaskRunner() override {
63 return nullptr;
64 }
65 void WillBeginFrame(const cc::BeginFrameArgs& args) override {}
66 void DidCommitFrameToCompositor() override {}
67 void DidReceiveInputEventOnCompositorThread(
68 blink::WebInputEvent::Type type) override {}
69 void DidAnimateForInputOnCompositorThread() override {}
70 bool ShouldYieldForHighPriorityWork() override { return false; }
71 void Shutdown() override {}
72 };
73
74 class FakeCompositorDependencies : public CompositorDependencies {
75 public:
76 // CompositorDependencies implementation.
77 bool IsImplSidePaintingEnabled() override { return true; }
78 bool IsGpuRasterizationForced() override { return false; }
79 bool IsGpuRasterizationEnabled() override { return false; }
80 bool IsLcdTextEnabled() override { return false; }
81 bool IsDistanceFieldTextEnabled() override { return false; }
82 bool IsZeroCopyEnabled() override { return false; }
83 bool IsOneCopyEnabled() override { return true; }
84 uint32 GetImageTextureTarget() override { return GL_TEXTURE_2D; }
85 scoped_refptr<base::SingleThreadTaskRunner>
86 GetCompositorMainThreadTaskRunner() override {
87 return base::MessageLoopProxy::current();
88 }
89 scoped_refptr<base::SingleThreadTaskRunner>
90 GetCompositorImplThreadTaskRunner() override {
91 return nullptr; // Currently never threaded compositing in unit tests.
92 }
93 cc::SharedBitmapManager* GetSharedBitmapManager() override {
94 return &shared_bitmap_manager_;
95 }
96 gpu::GpuMemoryBufferManager* GetGpuMemoryBufferManager() override {
97 return &gpu_memory_buffer_manager_;
98 }
99 RendererScheduler* GetRendererScheduler() override {
100 return &renderer_scheduler_;
101 }
102 cc::ContextProvider* GetSharedMainThreadContextProvider() override {
103 NOTREACHED();
104 return nullptr;
105 }
106 scoped_ptr<cc::BeginFrameSource> CreateExternalBeginFrameSource(
107 int routing_id) override {
108 NOTREACHED();
109 return nullptr;
110 }
111
112 private:
113 cc::TestSharedBitmapManager shared_bitmap_manager_;
114 cc::TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
115 FakeRendererScheduler renderer_scheduler_;
116 };
117
45 class RenderWidgetCompositorTest : public testing::Test { 118 class RenderWidgetCompositorTest : public testing::Test {
46 public: 119 public:
47 RenderWidgetCompositorTest() 120 RenderWidgetCompositorTest()
48 : render_widget_(make_scoped_refptr(new TestRenderWidget())), 121 : render_widget_(make_scoped_refptr(new TestRenderWidget())),
122 compositor_deps_(make_scoped_ptr(new FakeCompositorDependencies)),
49 render_widget_compositor_( 123 render_widget_compositor_(
50 RenderWidgetCompositor::Create(render_widget_.get(), false)) {} 124 RenderWidgetCompositor::Create(render_widget_.get(),
125 compositor_deps_.get())) {}
51 ~RenderWidgetCompositorTest() override {} 126 ~RenderWidgetCompositorTest() override {}
52 127
53 protected: 128 protected:
54 MockRenderThread render_thread_; 129 MockRenderThread render_thread_;
55 scoped_refptr<TestRenderWidget> render_widget_; 130 scoped_refptr<TestRenderWidget> render_widget_;
131 scoped_ptr<FakeCompositorDependencies> compositor_deps_;
56 scoped_ptr<RenderWidgetCompositor> render_widget_compositor_; 132 scoped_ptr<RenderWidgetCompositor> render_widget_compositor_;
57 133
58 private: 134 private:
59 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorTest); 135 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorTest);
60 }; 136 };
61 137
62 TEST_F(RenderWidgetCompositorTest, BeginMainFrame) { 138 TEST_F(RenderWidgetCompositorTest, BeginMainFrame) {
63 base::TimeTicks frame_time(base::TimeTicks() + 139 base::TimeTicks frame_time(base::TimeTicks() +
64 base::TimeDelta::FromSeconds(1)); 140 base::TimeDelta::FromSeconds(1));
65 base::TimeTicks deadline(base::TimeTicks() + base::TimeDelta::FromSeconds(2)); 141 base::TimeTicks deadline(base::TimeTicks() + base::TimeDelta::FromSeconds(2));
(...skipping 30 matching lines...) Expand all
96 }; 172 };
97 173
98 // Verify that failing to create an output surface will cause the compositor 174 // Verify that failing to create an output surface will cause the compositor
99 // to attempt to repeatedly create another output surface. After enough 175 // to attempt to repeatedly create another output surface. After enough
100 // failures, verify that it attempts to create a fallback output surface. 176 // failures, verify that it attempts to create a fallback output surface.
101 // The use null output surface parameter allows testing whether failures 177 // The use null output surface parameter allows testing whether failures
102 // from RenderWidget (couldn't create an output surface) vs failures from 178 // from RenderWidget (couldn't create an output surface) vs failures from
103 // the compositor (couldn't bind the output surface) are handled identically. 179 // the compositor (couldn't bind the output surface) are handled identically.
104 class RenderWidgetCompositorOutputSurface : public RenderWidgetCompositor { 180 class RenderWidgetCompositorOutputSurface : public RenderWidgetCompositor {
105 public: 181 public:
106 RenderWidgetCompositorOutputSurface(RenderWidget* widget, bool threaded) 182 RenderWidgetCompositorOutputSurface(RenderWidget* widget,
107 : RenderWidgetCompositor(widget, threaded), 183 CompositorDependencies* compositor_deps)
184 : RenderWidgetCompositor(widget, compositor_deps),
108 num_failures_before_success_(0), 185 num_failures_before_success_(0),
109 expected_successes_(0), 186 expected_successes_(0),
110 expected_fallback_successes_(0), 187 expected_fallback_successes_(0),
111 expected_requests_(0), 188 expected_requests_(0),
112 num_requests_(0), 189 num_requests_(0),
113 num_requests_since_last_success_(0), 190 num_requests_since_last_success_(0),
114 num_successes_(0), 191 num_successes_(0),
115 num_fallback_successes_(0), 192 num_fallback_successes_(0),
116 num_failures_(0), 193 num_failures_(0),
117 last_create_was_fallback_(false), 194 last_create_was_fallback_(false),
118 use_null_output_surface_(true) { 195 use_null_output_surface_(true) {}
119 cc::LayerTreeSettings settings; 196
120 Initialize(settings); 197 using RenderWidgetCompositor::Initialize;
121 }
122 198
123 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) { 199 scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) {
124 EXPECT_EQ(num_requests_since_last_success_ > 200 EXPECT_EQ(num_requests_since_last_success_ >
125 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, 201 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK,
126 fallback); 202 fallback);
127 last_create_was_fallback_ = fallback; 203 last_create_was_fallback_ = fallback;
128 bool success = num_failures_ >= num_failures_before_success_; 204 bool success = num_failures_ >= num_failures_before_success_;
129 if (success) 205 if (success)
130 return cc::FakeOutputSurface::Create3d(); 206 return cc::FakeOutputSurface::Create3d();
131 return use_null_output_surface_ 207 return use_null_output_surface_
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 bool last_create_was_fallback_; 275 bool last_create_was_fallback_;
200 bool use_null_output_surface_; 276 bool use_null_output_surface_;
201 277
202 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurface); 278 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurface);
203 }; 279 };
204 280
205 class RenderWidgetCompositorOutputSurfaceTest : public testing::Test { 281 class RenderWidgetCompositorOutputSurfaceTest : public testing::Test {
206 public: 282 public:
207 RenderWidgetCompositorOutputSurfaceTest() 283 RenderWidgetCompositorOutputSurfaceTest()
208 : render_widget_(make_scoped_refptr(new RenderWidgetOutputSurface)), 284 : render_widget_(make_scoped_refptr(new RenderWidgetOutputSurface)),
285 compositor_deps_(make_scoped_ptr(new FakeCompositorDependencies)),
209 render_widget_compositor_(make_scoped_ptr( 286 render_widget_compositor_(make_scoped_ptr(
210 new RenderWidgetCompositorOutputSurface(render_widget_.get(), 287 new RenderWidgetCompositorOutputSurface(render_widget_.get(),
211 false))) { 288 compositor_deps_.get()))) {
289 render_widget_compositor_->Initialize();
212 render_widget_->SetCompositor(render_widget_compositor_.get()); 290 render_widget_->SetCompositor(render_widget_compositor_.get());
213 } 291 }
214 292
215 void RunTest(bool use_null_output_surface, 293 void RunTest(bool use_null_output_surface,
216 int num_failures_before_success, 294 int num_failures_before_success,
217 int expected_successes, 295 int expected_successes,
218 int expected_fallback_succeses) { 296 int expected_fallback_succeses) {
219 render_widget_compositor_->SetUp( 297 render_widget_compositor_->SetUp(
220 use_null_output_surface, num_failures_before_success, 298 use_null_output_surface, num_failures_before_success,
221 expected_successes, expected_fallback_succeses); 299 expected_successes, expected_fallback_succeses);
222 base::MessageLoop::current()->PostTask( 300 base::MessageLoop::current()->PostTask(
223 FROM_HERE, 301 FROM_HERE,
224 base::Bind(&RenderWidgetCompositor::RequestNewOutputSurface, 302 base::Bind(&RenderWidgetCompositor::RequestNewOutputSurface,
225 base::Unretained(render_widget_compositor_.get()))); 303 base::Unretained(render_widget_compositor_.get())));
226 base::MessageLoop::current()->Run(); 304 base::MessageLoop::current()->Run();
227 render_widget_compositor_->AfterTest(); 305 render_widget_compositor_->AfterTest();
228 } 306 }
229 307
230 protected: 308 protected:
231 base::MessageLoop ye_olde_message_loope_; 309 base::MessageLoop ye_olde_message_loope_;
232 MockRenderThread render_thread_; 310 MockRenderThread render_thread_;
233 scoped_refptr<RenderWidgetOutputSurface> render_widget_; 311 scoped_refptr<RenderWidgetOutputSurface> render_widget_;
312 scoped_ptr<FakeCompositorDependencies> compositor_deps_;
234 scoped_ptr<RenderWidgetCompositorOutputSurface> render_widget_compositor_; 313 scoped_ptr<RenderWidgetCompositorOutputSurface> render_widget_compositor_;
235 314
236 private: 315 private:
237 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurfaceTest); 316 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurfaceTest);
238 }; 317 };
239 318
240 scoped_ptr<cc::OutputSurface> RenderWidgetOutputSurface::CreateOutputSurface( 319 scoped_ptr<cc::OutputSurface> RenderWidgetOutputSurface::CreateOutputSurface(
241 bool fallback) { 320 bool fallback) {
242 return compositor_->CreateOutputSurface(fallback); 321 return compositor_->CreateOutputSurface(fallback);
243 } 322 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, 357 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK,
279 0, 1); 358 0, 1);
280 } 359 }
281 360
282 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { 361 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) {
283 // The first success is a fallback, but the next should not be a fallback. 362 // The first success is a fallback, but the next should not be a fallback.
284 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, 363 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK,
285 1, 1); 364 1, 1);
286 } 365 }
287 366
367 } // namespace
288 } // namespace content 368 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698