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

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

Issue 2337913003: Fork cc::OutputSurface into cc::CompositorFrameSink. (Closed)
Patch Set: cfsfork: android-vulkan Created 4 years, 3 months 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 <utility> 7 #include <utility>
8 8
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/run_loop.h" 12 #include "base/run_loop.h"
13 #include "base/single_thread_task_runner.h" 13 #include "base/single_thread_task_runner.h"
14 #include "base/threading/thread_task_runner_handle.h" 14 #include "base/threading/thread_task_runner_handle.h"
15 #include "cc/output/begin_frame_args.h" 15 #include "cc/output/begin_frame_args.h"
16 #include "cc/output/copy_output_request.h" 16 #include "cc/output/copy_output_request.h"
17 #include "cc/test/fake_compositor_frame_sink.h"
17 #include "cc/test/fake_external_begin_frame_source.h" 18 #include "cc/test/fake_external_begin_frame_source.h"
18 #include "cc/test/fake_output_surface.h"
19 #include "cc/test/test_context_provider.h" 19 #include "cc/test/test_context_provider.h"
20 #include "cc/test/test_web_graphics_context_3d.h"
20 #include "cc/trees/layer_tree_host.h" 21 #include "cc/trees/layer_tree_host.h"
21 #include "content/public/test/mock_render_thread.h" 22 #include "content/public/test/mock_render_thread.h"
22 #include "content/renderer/render_widget.h" 23 #include "content/renderer/render_widget.h"
23 #include "content/test/fake_compositor_dependencies.h" 24 #include "content/test/fake_compositor_dependencies.h"
24 #include "gpu/GLES2/gl2extchromium.h" 25 #include "gpu/GLES2/gl2extchromium.h"
25 #include "testing/gmock/include/gmock/gmock.h" 26 #include "testing/gmock/include/gmock/gmock.h"
26 #include "testing/gtest/include/gtest/gtest.h" 27 #include "testing/gtest/include/gtest/gtest.h"
27 28
28 using testing::AllOf; 29 using testing::AllOf;
29 using testing::Field; 30 using testing::Field;
30 31
31 namespace content { 32 namespace content {
32 namespace { 33 namespace {
33 34
34 class StubRenderWidgetCompositorDelegate 35 class StubRenderWidgetCompositorDelegate
35 : public RenderWidgetCompositorDelegate { 36 : public RenderWidgetCompositorDelegate {
36 public: 37 public:
37 // RenderWidgetCompositorDelegate implementation. 38 // RenderWidgetCompositorDelegate implementation.
38 void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta, 39 void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta,
39 const gfx::Vector2dF& outer_delta, 40 const gfx::Vector2dF& outer_delta,
40 const gfx::Vector2dF& elastic_overscroll_delta, 41 const gfx::Vector2dF& elastic_overscroll_delta,
41 float page_scale, 42 float page_scale,
42 float top_controls_delta) override {} 43 float top_controls_delta) override {}
43 void BeginMainFrame(double frame_time_sec) override {} 44 void BeginMainFrame(double frame_time_sec) override {}
44 std::unique_ptr<cc::OutputSurface> CreateOutputSurface( 45 std::unique_ptr<cc::CompositorFrameSink> CreateCompositorFrameSink(
45 bool fallback) override { 46 bool fallback) override {
46 return nullptr; 47 return nullptr;
47 } 48 }
48 void DidCommitAndDrawCompositorFrame() override {} 49 void DidCommitAndDrawCompositorFrame() override {}
49 void DidCommitCompositorFrame() override {} 50 void DidCommitCompositorFrame() override {}
50 void DidCompletePageScaleAnimation() override {} 51 void DidCompletePageScaleAnimation() override {}
51 void DidCompleteSwapBuffers() override {} 52 void DidCompleteSwapBuffers() override {}
52 void ForwardCompositorProto(const std::vector<uint8_t>& proto) override {} 53 void ForwardCompositorProto(const std::vector<uint8_t>& proto) override {}
53 bool IsClosing() const override { return false; } 54 bool IsClosing() const override { return false; }
54 void OnSwapBuffersAborted() override {} 55 void OnSwapBuffersAborted() override {}
55 void OnSwapBuffersComplete() override {} 56 void OnSwapBuffersComplete() override {}
56 void OnSwapBuffersPosted() override {} 57 void OnSwapBuffersPosted() override {}
57 void RequestScheduleAnimation() override {} 58 void RequestScheduleAnimation() override {}
58 void UpdateVisualState() override {} 59 void UpdateVisualState() override {}
59 void WillBeginCompositorFrame() override {} 60 void WillBeginCompositorFrame() override {}
60 std::unique_ptr<cc::SwapPromise> RequestCopyOfOutputForLayoutTest( 61 std::unique_ptr<cc::SwapPromise> RequestCopyOfOutputForLayoutTest(
61 std::unique_ptr<cc::CopyOutputRequest> request) override { 62 std::unique_ptr<cc::CopyOutputRequest> request) override {
62 return nullptr; 63 return nullptr;
63 } 64 }
64 }; 65 };
65 66
66 class FakeRenderWidgetCompositorDelegate 67 class FakeRenderWidgetCompositorDelegate
67 : public StubRenderWidgetCompositorDelegate { 68 : public StubRenderWidgetCompositorDelegate {
68 public: 69 public:
69 FakeRenderWidgetCompositorDelegate() = default; 70 FakeRenderWidgetCompositorDelegate() = default;
70 71
71 std::unique_ptr<cc::OutputSurface> CreateOutputSurface( 72 std::unique_ptr<cc::CompositorFrameSink> CreateCompositorFrameSink(
72 bool fallback) override { 73 bool fallback) override {
73 EXPECT_EQ( 74 EXPECT_EQ(num_requests_since_last_success_ >
74 num_requests_since_last_success_ > 75 RenderWidgetCompositor::
75 RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, 76 COMPOSITOR_FRAME_SINK_RETRIES_BEFORE_FALLBACK,
76 fallback); 77 fallback);
77 last_create_was_fallback_ = fallback; 78 last_create_was_fallback_ = fallback;
78 79
79 bool success = num_failures_ >= num_failures_before_success_; 80 bool success = num_failures_ >= num_failures_before_success_;
80 if (!success && use_null_output_surface_) 81 if (!success && use_null_compositor_frame_sink_)
81 return nullptr; 82 return nullptr;
82 83
83 auto context_provider = cc::TestContextProvider::Create(); 84 auto context_provider = cc::TestContextProvider::Create();
84 if (!success) { 85 if (!success) {
85 context_provider->UnboundTestContext3d()->loseContextCHROMIUM( 86 context_provider->UnboundTestContext3d()->loseContextCHROMIUM(
86 GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); 87 GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB);
87 } 88 }
88 89
89 // Create delegating surface so that max_pending_frames = 1. 90 auto s = cc::FakeCompositorFrameSink::Create3d(std::move(context_provider));
90 return cc::FakeOutputSurface::CreateDelegating3d( 91 EXPECT_EQ(1, s->capabilities().max_frames_pending);
91 std::move(context_provider)); 92 return std::move(s);
92 } 93 }
93 94
94 void add_success() { 95 void add_success() {
95 if (last_create_was_fallback_) 96 if (last_create_was_fallback_)
96 ++num_fallback_successes_; 97 ++num_fallback_successes_;
97 else 98 else
98 ++num_successes_; 99 ++num_successes_;
99 num_requests_since_last_success_ = 0; 100 num_requests_since_last_success_ = 0;
100 } 101 }
101 int num_successes() const { return num_successes_; } 102 int num_successes() const { return num_successes_; }
102 int num_fallback_successes() const { return num_fallback_successes_; } 103 int num_fallback_successes() const { return num_fallback_successes_; }
103 104
104 void add_request() { 105 void add_request() {
105 ++num_requests_since_last_success_; 106 ++num_requests_since_last_success_;
106 ++num_requests_; 107 ++num_requests_;
107 } 108 }
108 int num_requests() const { return num_requests_; } 109 int num_requests() const { return num_requests_; }
109 110
110 void add_failure() { ++num_failures_; } 111 void add_failure() { ++num_failures_; }
111 int num_failures() const { return num_failures_; } 112 int num_failures() const { return num_failures_; }
112 113
113 void set_num_failures_before_success(int n) { 114 void set_num_failures_before_success(int n) {
114 num_failures_before_success_ = n; 115 num_failures_before_success_ = n;
115 } 116 }
116 int num_failures_before_success() const { 117 int num_failures_before_success() const {
117 return num_failures_before_success_; 118 return num_failures_before_success_;
118 } 119 }
119 120
120 void set_use_null_output_surface(bool u) { use_null_output_surface_ = u; } 121 void set_use_null_compositor_frame_sink(bool u) {
121 bool use_null_output_surface() const { return use_null_output_surface_; } 122 use_null_compositor_frame_sink_ = u;
123 }
124 bool use_null_compositor_frame_sink() const {
125 return use_null_compositor_frame_sink_;
126 }
122 127
123 private: 128 private:
124 int num_requests_ = 0; 129 int num_requests_ = 0;
125 int num_requests_since_last_success_ = 0; 130 int num_requests_since_last_success_ = 0;
126 int num_failures_ = 0; 131 int num_failures_ = 0;
127 int num_failures_before_success_ = 0; 132 int num_failures_before_success_ = 0;
128 int num_fallback_successes_ = 0; 133 int num_fallback_successes_ = 0;
129 int num_successes_ = 0; 134 int num_successes_ = 0;
130 bool last_create_was_fallback_ = false; 135 bool last_create_was_fallback_ = false;
131 bool use_null_output_surface_ = true; 136 bool use_null_compositor_frame_sink_ = true;
132 137
133 DISALLOW_COPY_AND_ASSIGN(FakeRenderWidgetCompositorDelegate); 138 DISALLOW_COPY_AND_ASSIGN(FakeRenderWidgetCompositorDelegate);
134 }; 139 };
135 140
136 // Verify that failing to create an output surface will cause the compositor 141 // Verify that failing to create an output surface will cause the compositor
137 // to attempt to repeatedly create another output surface. After enough 142 // to attempt to repeatedly create another output surface. After enough
138 // failures, verify that it attempts to create a fallback output surface. 143 // failures, verify that it attempts to create a fallback output surface.
139 // The use null output surface parameter allows testing whether failures 144 // The use null output surface parameter allows testing whether failures
140 // from RenderWidget (couldn't create an output surface) vs failures from 145 // from RenderWidget (couldn't create an output surface) vs failures from
141 // the compositor (couldn't bind the output surface) are handled identically. 146 // the compositor (couldn't bind the output surface) are handled identically.
142 class RenderWidgetCompositorOutputSurface : public RenderWidgetCompositor { 147 class RenderWidgetCompositorFrameSink : public RenderWidgetCompositor {
143 public: 148 public:
144 RenderWidgetCompositorOutputSurface( 149 RenderWidgetCompositorFrameSink(FakeRenderWidgetCompositorDelegate* delegate,
145 FakeRenderWidgetCompositorDelegate* delegate, 150 CompositorDependencies* compositor_deps)
146 CompositorDependencies* compositor_deps)
147 : RenderWidgetCompositor(delegate, compositor_deps), 151 : RenderWidgetCompositor(delegate, compositor_deps),
148 delegate_(delegate) {} 152 delegate_(delegate) {}
149 153
150 using RenderWidgetCompositor::Initialize; 154 using RenderWidgetCompositor::Initialize;
151 155
152 // Force a new output surface to be created. 156 // Force a new output surface to be created.
153 void SynchronousComposite() { 157 void SynchronousComposite() {
154 layer_tree_host()->SetVisible(false); 158 layer_tree_host()->SetVisible(false);
155 layer_tree_host()->ReleaseOutputSurface(); 159 layer_tree_host()->ReleaseCompositorFrameSink();
156 layer_tree_host()->SetVisible(true); 160 layer_tree_host()->SetVisible(true);
157 161
158 base::TimeTicks some_time; 162 base::TimeTicks some_time;
159 layer_tree_host()->Composite(some_time); 163 layer_tree_host()->Composite(some_time);
160 } 164 }
161 165
162 void RequestNewOutputSurface() override { 166 void RequestNewCompositorFrameSink() override {
163 delegate_->add_request(); 167 delegate_->add_request();
164 RenderWidgetCompositor::RequestNewOutputSurface(); 168 RenderWidgetCompositor::RequestNewCompositorFrameSink();
165 } 169 }
166 170
167 void DidInitializeOutputSurface() override { 171 void DidInitializeCompositorFrameSink() override {
168 delegate_->add_success(); 172 delegate_->add_success();
169 if (delegate_->num_requests() == expected_requests_) { 173 if (delegate_->num_requests() == expected_requests_) {
170 EndTest(); 174 EndTest();
171 } else { 175 } else {
172 RenderWidgetCompositor::DidInitializeOutputSurface(); 176 RenderWidgetCompositor::DidInitializeCompositorFrameSink();
173 // Post the synchronous composite task so that it is not called 177 // Post the synchronous composite task so that it is not called
174 // reentrantly as a part of RequestNewOutputSurface. 178 // reentrantly as a part of RequestNewCompositorFrameSink.
175 base::ThreadTaskRunnerHandle::Get()->PostTask( 179 base::ThreadTaskRunnerHandle::Get()->PostTask(
176 FROM_HERE, 180 FROM_HERE,
177 base::Bind(&RenderWidgetCompositorOutputSurface::SynchronousComposite, 181 base::Bind(&RenderWidgetCompositorFrameSink::SynchronousComposite,
178 base::Unretained(this))); 182 base::Unretained(this)));
179 } 183 }
180 } 184 }
181 185
182 void DidFailToInitializeOutputSurface() override { 186 void DidFailToInitializeCompositorFrameSink() override {
183 delegate_->add_failure(); 187 delegate_->add_failure();
184 if (delegate_->num_requests() == expected_requests_) { 188 if (delegate_->num_requests() == expected_requests_) {
185 EndTest(); 189 EndTest();
186 return; 190 return;
187 } 191 }
188 192
189 RenderWidgetCompositor::DidFailToInitializeOutputSurface(); 193 RenderWidgetCompositor::DidFailToInitializeCompositorFrameSink();
190 } 194 }
191 195
192 void SetUp(int expected_successes, int expected_fallback_succeses) { 196 void SetUp(int expected_successes, int expected_fallback_succeses) {
193 expected_successes_ = expected_successes; 197 expected_successes_ = expected_successes;
194 expected_fallback_successes_ = expected_fallback_succeses; 198 expected_fallback_successes_ = expected_fallback_succeses;
195 expected_requests_ = delegate_->num_failures_before_success() + 199 expected_requests_ = delegate_->num_failures_before_success() +
196 expected_successes_ + expected_fallback_successes_; 200 expected_successes_ + expected_fallback_successes_;
197 } 201 }
198 202
199 void EndTest() { base::MessageLoop::current()->QuitWhenIdle(); } 203 void EndTest() { base::MessageLoop::current()->QuitWhenIdle(); }
200 204
201 void AfterTest() { 205 void AfterTest() {
202 EXPECT_EQ(delegate_->num_failures_before_success(), 206 EXPECT_EQ(delegate_->num_failures_before_success(),
203 delegate_->num_failures()); 207 delegate_->num_failures());
204 EXPECT_EQ(expected_successes_, delegate_->num_successes()); 208 EXPECT_EQ(expected_successes_, delegate_->num_successes());
205 EXPECT_EQ(expected_fallback_successes_, 209 EXPECT_EQ(expected_fallback_successes_,
206 delegate_->num_fallback_successes()); 210 delegate_->num_fallback_successes());
207 EXPECT_EQ(expected_requests_, delegate_->num_requests()); 211 EXPECT_EQ(expected_requests_, delegate_->num_requests());
208 } 212 }
209 213
210 private: 214 private:
211 FakeRenderWidgetCompositorDelegate* delegate_; 215 FakeRenderWidgetCompositorDelegate* delegate_;
212 int expected_successes_ = 0; 216 int expected_successes_ = 0;
213 int expected_fallback_successes_ = 0; 217 int expected_fallback_successes_ = 0;
214 int expected_requests_ = 0; 218 int expected_requests_ = 0;
215 219
216 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurface); 220 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorFrameSink);
217 }; 221 };
218 222
219 class RenderWidgetCompositorOutputSurfaceTest : public testing::Test { 223 class RenderWidgetCompositorFrameSinkTest : public testing::Test {
220 public: 224 public:
221 RenderWidgetCompositorOutputSurfaceTest() 225 RenderWidgetCompositorFrameSinkTest()
222 : render_widget_compositor_(&compositor_delegate_, &compositor_deps_) { 226 : render_widget_compositor_(&compositor_delegate_, &compositor_deps_) {
223 render_widget_compositor_.Initialize(1.f /* initial_device_scale_factor */); 227 render_widget_compositor_.Initialize(1.f /* initial_device_scale_factor */);
224 } 228 }
225 229
226 void RunTest(bool use_null_output_surface, 230 void RunTest(bool use_null_compositor_frame_sink,
227 int num_failures_before_success, 231 int num_failures_before_success,
228 int expected_successes, 232 int expected_successes,
229 int expected_fallback_succeses) { 233 int expected_fallback_succeses) {
230 compositor_delegate_.set_use_null_output_surface(use_null_output_surface); 234 compositor_delegate_.set_use_null_compositor_frame_sink(
235 use_null_compositor_frame_sink);
231 compositor_delegate_.set_num_failures_before_success( 236 compositor_delegate_.set_num_failures_before_success(
232 num_failures_before_success); 237 num_failures_before_success);
233 render_widget_compositor_.SetUp(expected_successes, 238 render_widget_compositor_.SetUp(expected_successes,
234 expected_fallback_succeses); 239 expected_fallback_succeses);
235 render_widget_compositor_.setVisible(true); 240 render_widget_compositor_.setVisible(true);
236 base::ThreadTaskRunnerHandle::Get()->PostTask( 241 base::ThreadTaskRunnerHandle::Get()->PostTask(
237 FROM_HERE, 242 FROM_HERE,
238 base::Bind(&RenderWidgetCompositorOutputSurface::SynchronousComposite, 243 base::Bind(&RenderWidgetCompositorFrameSink::SynchronousComposite,
239 base::Unretained(&render_widget_compositor_))); 244 base::Unretained(&render_widget_compositor_)));
240 base::RunLoop().Run(); 245 base::RunLoop().Run();
241 render_widget_compositor_.AfterTest(); 246 render_widget_compositor_.AfterTest();
242 } 247 }
243 248
244 protected: 249 protected:
245 base::MessageLoop ye_olde_message_loope_; 250 base::MessageLoop ye_olde_message_loope_;
246 MockRenderThread render_thread_; 251 MockRenderThread render_thread_;
247 FakeCompositorDependencies compositor_deps_; 252 FakeCompositorDependencies compositor_deps_;
248 FakeRenderWidgetCompositorDelegate compositor_delegate_; 253 FakeRenderWidgetCompositorDelegate compositor_delegate_;
249 RenderWidgetCompositorOutputSurface render_widget_compositor_; 254 RenderWidgetCompositorFrameSink render_widget_compositor_;
250 255
251 private: 256 private:
252 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorOutputSurfaceTest); 257 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorFrameSinkTest);
253 }; 258 };
254 259
255 TEST_F(RenderWidgetCompositorOutputSurfaceTest, SucceedOnce) { 260 TEST_F(RenderWidgetCompositorFrameSinkTest, SucceedOnce) {
256 RunTest(false, 0, 1, 0); 261 RunTest(false, 0, 1, 0);
257 } 262 }
258 263
259 TEST_F(RenderWidgetCompositorOutputSurfaceTest, SucceedTwice) { 264 TEST_F(RenderWidgetCompositorFrameSinkTest, SucceedTwice) {
260 RunTest(false, 0, 2, 0); 265 RunTest(false, 0, 2, 0);
261 } 266 }
262 267
263 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FailOnceNull) { 268 TEST_F(RenderWidgetCompositorFrameSinkTest, FailOnceNull) {
264 static_assert( 269 static_assert(
265 RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK >= 2, 270 RenderWidgetCompositor::COMPOSITOR_FRAME_SINK_RETRIES_BEFORE_FALLBACK >=
271 2,
266 "Adjust the values of this test if this fails"); 272 "Adjust the values of this test if this fails");
267 RunTest(true, 1, 1, 0); 273 RunTest(true, 1, 1, 0);
268 } 274 }
269 275
270 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FailOnceBind) { 276 TEST_F(RenderWidgetCompositorFrameSinkTest, FailOnceBind) {
271 static_assert( 277 static_assert(
272 RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK >= 2, 278 RenderWidgetCompositor::COMPOSITOR_FRAME_SINK_RETRIES_BEFORE_FALLBACK >=
279 2,
273 "Adjust the values of this test if this fails"); 280 "Adjust the values of this test if this fails");
274 RunTest(false, 1, 1, 0); 281 RunTest(false, 1, 1, 0);
275 } 282 }
276 283
277 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNull) { 284 TEST_F(RenderWidgetCompositorFrameSinkTest, FallbackSuccessNull) {
278 RunTest(true, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, 285 RunTest(true,
286 RenderWidgetCompositor::COMPOSITOR_FRAME_SINK_RETRIES_BEFORE_FALLBACK,
279 0, 1); 287 0, 1);
280 } 288 }
281 289
282 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessBind) { 290 TEST_F(RenderWidgetCompositorFrameSinkTest, FallbackSuccessBind) {
283 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, 291 RunTest(false,
292 RenderWidgetCompositor::COMPOSITOR_FRAME_SINK_RETRIES_BEFORE_FALLBACK,
284 0, 1); 293 0, 1);
285 } 294 }
286 295
287 TEST_F(RenderWidgetCompositorOutputSurfaceTest, FallbackSuccessNormalSuccess) { 296 TEST_F(RenderWidgetCompositorFrameSinkTest, FallbackSuccessNormalSuccess) {
288 // The first success is a fallback, but the next should not be a fallback. 297 // The first success is a fallback, but the next should not be a fallback.
289 RunTest(false, RenderWidgetCompositor::OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK, 298 RunTest(false,
299 RenderWidgetCompositor::COMPOSITOR_FRAME_SINK_RETRIES_BEFORE_FALLBACK,
290 1, 1); 300 1, 1);
291 } 301 }
292 302
293 } // namespace 303 } // namespace
294 } // namespace content 304 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/gpu/render_widget_compositor_delegate.h ('k') | content/renderer/gpu/renderer_compositor_frame_sink.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698