blob: 33a3f58873e3b50b4e954266c0d0f564491b2db7 [file] [log] [blame]
[email protected]94f206c12012-08-25 00:09:141// Copyright 2011 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]4456eee22012-10-19 18:16:385#include "cc/single_thread_proxy.h"
[email protected]94f206c12012-08-25 00:09:146
[email protected]6331a1172012-10-18 11:35:137#include "base/debug/trace_event.h"
[email protected]aa0a9d32012-10-24 01:58:108#include "cc/draw_quad.h"
[email protected]d50c6862012-10-23 02:08:319#include "cc/layer_tree_host.h"
[email protected]3be2171d2012-12-06 06:13:2010#include "cc/output_surface.h"
[email protected]cd98a8c32013-01-08 18:16:1711#include "cc/prioritized_resource_manager.h"
[email protected]b4da2032012-10-25 21:22:5512#include "cc/resource_update_controller.h"
[email protected]61de5812012-11-08 07:03:4413#include "cc/thread.h"
[email protected]94f206c12012-08-25 00:09:1414
[email protected]9c88e562012-09-14 22:21:3015namespace cc {
[email protected]94f206c12012-08-25 00:09:1416
[email protected]96baf3e2012-10-22 23:09:5517scoped_ptr<Proxy> SingleThreadProxy::create(LayerTreeHost* layerTreeHost)
[email protected]94f206c12012-08-25 00:09:1418{
[email protected]96baf3e2012-10-22 23:09:5519 return make_scoped_ptr(new SingleThreadProxy(layerTreeHost)).PassAs<Proxy>();
[email protected]94f206c12012-08-25 00:09:1420}
21
[email protected]96baf3e2012-10-22 23:09:5522SingleThreadProxy::SingleThreadProxy(LayerTreeHost* layerTreeHost)
[email protected]61de5812012-11-08 07:03:4423 : Proxy(scoped_ptr<Thread>(NULL))
24 , m_layerTreeHost(layerTreeHost)
[email protected]3be2171d2012-12-06 06:13:2025 , m_outputSurfaceLost(false)
[email protected]94f206c12012-08-25 00:09:1426 , m_rendererInitialized(false)
27 , m_nextFrameIsNewlyCommittedFrame(false)
[email protected]8b9af6b2012-09-27 00:36:3628 , m_totalCommitCount(0)
[email protected]94f206c12012-08-25 00:09:1429{
[email protected]96baf3e2012-10-22 23:09:5530 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy");
31 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:1432}
33
[email protected]96baf3e2012-10-22 23:09:5534void SingleThreadProxy::start()
[email protected]94f206c12012-08-25 00:09:1435{
[email protected]61de5812012-11-08 07:03:4436 DebugScopedSetImplThread impl(this);
[email protected]94f206c12012-08-25 00:09:1437 m_layerTreeHostImpl = m_layerTreeHost->createLayerTreeHostImpl(this);
38}
39
[email protected]96baf3e2012-10-22 23:09:5540SingleThreadProxy::~SingleThreadProxy()
[email protected]94f206c12012-08-25 00:09:1441{
[email protected]96baf3e2012-10-22 23:09:5542 TRACE_EVENT0("cc", "SingleThreadProxy::~SingleThreadProxy");
43 DCHECK(Proxy::isMainThread());
[email protected]1d993172012-10-18 18:15:0444 DCHECK(!m_layerTreeHostImpl.get() && !m_layerTreeHost); // make sure stop() got called.
[email protected]94f206c12012-08-25 00:09:1445}
46
[email protected]aad0a0072012-11-01 18:15:5847bool SingleThreadProxy::compositeAndReadback(void *pixels, const gfx::Rect& rect)
[email protected]94f206c12012-08-25 00:09:1448{
[email protected]96baf3e2012-10-22 23:09:5549 TRACE_EVENT0("cc", "SingleThreadProxy::compositeAndReadback");
50 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:1451
52 if (!commitAndComposite())
53 return false;
54
55 m_layerTreeHostImpl->readback(pixels, rect);
56
57 if (m_layerTreeHostImpl->isContextLost())
58 return false;
59
60 m_layerTreeHostImpl->swapBuffers();
61 didSwapFrame();
62
63 return true;
64}
65
[email protected]c9c1ebe2012-11-05 20:46:1366void SingleThreadProxy::startPageScaleAnimation(gfx::Vector2d targetOffset, bool useAnchor, float scale, base::TimeDelta duration)
[email protected]94f206c12012-08-25 00:09:1467{
[email protected]c9c1ebe2012-11-05 20:46:1368 m_layerTreeHostImpl->startPageScaleAnimation(targetOffset, useAnchor, scale, base::TimeTicks::Now(), duration);
[email protected]94f206c12012-08-25 00:09:1469}
70
[email protected]96baf3e2012-10-22 23:09:5571void SingleThreadProxy::finishAllRendering()
[email protected]94f206c12012-08-25 00:09:1472{
[email protected]96baf3e2012-10-22 23:09:5573 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:1474 {
[email protected]61de5812012-11-08 07:03:4475 DebugScopedSetImplThread impl(this);
[email protected]94f206c12012-08-25 00:09:1476 m_layerTreeHostImpl->finishAllRendering();
77 }
78}
79
[email protected]96baf3e2012-10-22 23:09:5580bool SingleThreadProxy::isStarted() const
[email protected]94f206c12012-08-25 00:09:1481{
[email protected]96baf3e2012-10-22 23:09:5582 DCHECK(Proxy::isMainThread());
[email protected]519281762012-10-06 20:06:3983 return m_layerTreeHostImpl.get();
[email protected]94f206c12012-08-25 00:09:1484}
85
[email protected]3be2171d2012-12-06 06:13:2086bool SingleThreadProxy::initializeOutputSurface()
[email protected]94f206c12012-08-25 00:09:1487{
[email protected]96baf3e2012-10-22 23:09:5588 DCHECK(Proxy::isMainThread());
[email protected]3be2171d2012-12-06 06:13:2089 scoped_ptr<OutputSurface> outputSurface = m_layerTreeHost->createOutputSurface();
90 if (!outputSurface.get())
[email protected]94f206c12012-08-25 00:09:1491 return false;
[email protected]3be2171d2012-12-06 06:13:2092 m_outputSurfaceBeforeInitialization = outputSurface.Pass();
[email protected]94f206c12012-08-25 00:09:1493 return true;
94}
95
[email protected]96baf3e2012-10-22 23:09:5596void SingleThreadProxy::setSurfaceReady()
[email protected]94f206c12012-08-25 00:09:1497{
98 // Scheduling is controlled by the embedder in the single thread case, so nothing to do.
99}
100
[email protected]96baf3e2012-10-22 23:09:55101void SingleThreadProxy::setVisible(bool visible)
[email protected]94f206c12012-08-25 00:09:14102{
[email protected]61de5812012-11-08 07:03:44103 DebugScopedSetImplThread impl(this);
[email protected]94f206c12012-08-25 00:09:14104 m_layerTreeHostImpl->setVisible(visible);
105}
106
[email protected]96baf3e2012-10-22 23:09:55107bool SingleThreadProxy::initializeRenderer()
[email protected]94f206c12012-08-25 00:09:14108{
[email protected]96baf3e2012-10-22 23:09:55109 DCHECK(Proxy::isMainThread());
[email protected]3be2171d2012-12-06 06:13:20110 DCHECK(m_outputSurfaceBeforeInitialization.get());
[email protected]94f206c12012-08-25 00:09:14111 {
[email protected]61de5812012-11-08 07:03:44112 DebugScopedSetImplThread impl(this);
[email protected]3be2171d2012-12-06 06:13:20113 bool ok = m_layerTreeHostImpl->initializeRenderer(m_outputSurfaceBeforeInitialization.Pass());
[email protected]94f206c12012-08-25 00:09:14114 if (ok) {
115 m_rendererInitialized = true;
116 m_RendererCapabilitiesForMainThread = m_layerTreeHostImpl->rendererCapabilities();
117 }
118
119 return ok;
120 }
121}
122
[email protected]3be2171d2012-12-06 06:13:20123bool SingleThreadProxy::recreateOutputSurface()
[email protected]94f206c12012-08-25 00:09:14124{
[email protected]96baf3e2012-10-22 23:09:55125 TRACE_EVENT0("cc", "SingleThreadProxy::recreateContext");
126 DCHECK(Proxy::isMainThread());
[email protected]3be2171d2012-12-06 06:13:20127 DCHECK(m_outputSurfaceLost);
[email protected]94f206c12012-08-25 00:09:14128
[email protected]3be2171d2012-12-06 06:13:20129 scoped_ptr<OutputSurface> outputSurface = m_layerTreeHost->createOutputSurface();
130 if (!outputSurface.get())
[email protected]94f206c12012-08-25 00:09:14131 return false;
132
133 bool initialized;
134 {
[email protected]61de5812012-11-08 07:03:44135 DebugScopedSetMainThreadBlocked mainThreadBlocked(this);
136 DebugScopedSetImplThread impl(this);
[email protected]f14764572012-12-20 03:15:13137 m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl->resourceProvider());
[email protected]3be2171d2012-12-06 06:13:20138 initialized = m_layerTreeHostImpl->initializeRenderer(outputSurface.Pass());
[email protected]94f206c12012-08-25 00:09:14139 if (initialized) {
140 m_RendererCapabilitiesForMainThread = m_layerTreeHostImpl->rendererCapabilities();
141 }
142 }
143
144 if (initialized)
[email protected]3be2171d2012-12-06 06:13:20145 m_outputSurfaceLost = false;
[email protected]94f206c12012-08-25 00:09:14146
147 return initialized;
148}
149
[email protected]96baf3e2012-10-22 23:09:55150void SingleThreadProxy::renderingStats(RenderingStats* stats)
[email protected]94f206c12012-08-25 00:09:14151{
[email protected]8b9af6b2012-09-27 00:36:36152 stats->totalCommitTimeInSeconds = m_totalCommitTime.InSecondsF();
153 stats->totalCommitCount = m_totalCommitCount;
[email protected]94f206c12012-08-25 00:09:14154 m_layerTreeHostImpl->renderingStats(stats);
155}
156
[email protected]96baf3e2012-10-22 23:09:55157const RendererCapabilities& SingleThreadProxy::rendererCapabilities() const
[email protected]94f206c12012-08-25 00:09:14158{
[email protected]1d993172012-10-18 18:15:04159 DCHECK(m_rendererInitialized);
[email protected]94f206c12012-08-25 00:09:14160 // Note: this gets called during the commit by the "impl" thread
161 return m_RendererCapabilitiesForMainThread;
162}
163
[email protected]96baf3e2012-10-22 23:09:55164void SingleThreadProxy::setNeedsAnimate()
[email protected]94f206c12012-08-25 00:09:14165{
[email protected]96baf3e2012-10-22 23:09:55166 // Thread-only feature
[email protected]1d993172012-10-18 18:15:04167 NOTREACHED();
[email protected]94f206c12012-08-25 00:09:14168}
169
[email protected]b4da2032012-10-25 21:22:55170void SingleThreadProxy::doCommit(scoped_ptr<ResourceUpdateQueue> queue)
[email protected]94f206c12012-08-25 00:09:14171{
[email protected]96baf3e2012-10-22 23:09:55172 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:14173 // Commit immediately
174 {
[email protected]61de5812012-11-08 07:03:44175 DebugScopedSetMainThreadBlocked mainThreadBlocked(this);
176 DebugScopedSetImplThread impl(this);
[email protected]94f206c12012-08-25 00:09:14177
[email protected]8b9af6b2012-09-27 00:36:36178 base::TimeTicks startTime = base::TimeTicks::HighResNow();
[email protected]94f206c12012-08-25 00:09:14179 m_layerTreeHostImpl->beginCommit();
180
[email protected]2c7d23f2012-10-15 20:43:25181 m_layerTreeHost->contentsTextureManager()->pushTexturePrioritiesToBackings();
[email protected]94f206c12012-08-25 00:09:14182 m_layerTreeHost->beginCommitOnImplThread(m_layerTreeHostImpl.get());
183
[email protected]b4da2032012-10-25 21:22:55184 scoped_ptr<ResourceUpdateController> updateController =
185 ResourceUpdateController::create(
[email protected]f961b792012-09-20 07:27:33186 NULL,
[email protected]96baf3e2012-10-22 23:09:55187 Proxy::mainThread(),
[email protected]b1b800c2012-10-16 05:03:59188 queue.Pass(),
[email protected]61de5812012-11-08 07:03:44189 m_layerTreeHostImpl->resourceProvider(),
190 hasImplThread());
[email protected]f961b792012-09-20 07:27:33191 updateController->finalize();
[email protected]94f206c12012-08-25 00:09:14192
193 m_layerTreeHost->finishCommitOnImplThread(m_layerTreeHostImpl.get());
194
195 m_layerTreeHostImpl->commitComplete();
196
[email protected]1d993172012-10-18 18:15:04197#ifndef NDEBUG
[email protected]94f206c12012-08-25 00:09:14198 // In the single-threaded case, the scroll deltas should never be
199 // touched on the impl layer tree.
[email protected]96baf3e2012-10-22 23:09:55200 scoped_ptr<ScrollAndScaleSet> scrollInfo = m_layerTreeHostImpl->processScrollDeltas();
[email protected]1d993172012-10-18 18:15:04201 DCHECK(!scrollInfo->scrolls.size());
[email protected]94f206c12012-08-25 00:09:14202#endif
[email protected]8b9af6b2012-09-27 00:36:36203
204 base::TimeTicks endTime = base::TimeTicks::HighResNow();
205 m_totalCommitTime += endTime - startTime;
206 m_totalCommitCount++;
[email protected]94f206c12012-08-25 00:09:14207 }
208 m_layerTreeHost->commitComplete();
209 m_nextFrameIsNewlyCommittedFrame = true;
210}
211
[email protected]96baf3e2012-10-22 23:09:55212void SingleThreadProxy::setNeedsCommit()
[email protected]94f206c12012-08-25 00:09:14213{
[email protected]96baf3e2012-10-22 23:09:55214 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:14215 m_layerTreeHost->scheduleComposite();
216}
217
[email protected]96baf3e2012-10-22 23:09:55218void SingleThreadProxy::setNeedsRedraw()
[email protected]94f206c12012-08-25 00:09:14219{
220 // FIXME: Once we move render_widget scheduling into this class, we can
221 // treat redraw requests more efficiently than commitAndRedraw requests.
222 m_layerTreeHostImpl->setFullRootLayerDamage();
223 setNeedsCommit();
224}
225
[email protected]2e7ca422012-12-20 02:57:27226void SingleThreadProxy::onHasPendingTreeStateChanged(bool havePendingTree)
227{
228 // Thread-only feature.
229 NOTREACHED();
230}
231
[email protected]6b16679e2012-10-27 00:44:28232void SingleThreadProxy::setDeferCommits(bool deferCommits)
233{
234 // Thread-only feature.
235 NOTREACHED();
236}
237
[email protected]96baf3e2012-10-22 23:09:55238bool SingleThreadProxy::commitRequested() const
[email protected]94f206c12012-08-25 00:09:14239{
240 return false;
241}
242
[email protected]96baf3e2012-10-22 23:09:55243size_t SingleThreadProxy::maxPartialTextureUpdates() const
[email protected]493067512012-09-19 23:34:10244{
245 return std::numeric_limits<size_t>::max();
246}
247
[email protected]96baf3e2012-10-22 23:09:55248void SingleThreadProxy::stop()
[email protected]94f206c12012-08-25 00:09:14249{
[email protected]96baf3e2012-10-22 23:09:55250 TRACE_EVENT0("cc", "SingleThreadProxy::stop");
251 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:14252 {
[email protected]61de5812012-11-08 07:03:44253 DebugScopedSetMainThreadBlocked mainThreadBlocked(this);
254 DebugScopedSetImplThread impl(this);
[email protected]94f206c12012-08-25 00:09:14255
256 if (!m_layerTreeHostImpl->contentsTexturesPurged())
257 m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl->resourceProvider());
[email protected]519281762012-10-06 20:06:39258 m_layerTreeHostImpl.reset();
[email protected]94f206c12012-08-25 00:09:14259 }
260 m_layerTreeHost = 0;
261}
262
[email protected]96baf3e2012-10-22 23:09:55263void SingleThreadProxy::setNeedsRedrawOnImplThread()
[email protected]493067512012-09-19 23:34:10264{
265 m_layerTreeHost->scheduleComposite();
266}
267
[email protected]96baf3e2012-10-22 23:09:55268void SingleThreadProxy::setNeedsCommitOnImplThread()
[email protected]493067512012-09-19 23:34:10269{
270 m_layerTreeHost->scheduleComposite();
271}
272
[email protected]8947cbe2012-11-28 05:27:43273void SingleThreadProxy::setNeedsManageTilesOnImplThread()
274{
275 m_layerTreeHost->scheduleComposite();
276}
277
[email protected]30faac92012-10-29 00:06:29278void SingleThreadProxy::postAnimationEventsToMainThreadOnImplThread(scoped_ptr<AnimationEventsVector> events, base::Time wallClockTime)
[email protected]94f206c12012-08-25 00:09:14279{
[email protected]96baf3e2012-10-22 23:09:55280 DCHECK(Proxy::isImplThread());
[email protected]61de5812012-11-08 07:03:44281 DebugScopedSetMainThread main(this);
[email protected]ec1d6d52012-10-10 01:28:57282 m_layerTreeHost->setAnimationEvents(events.Pass(), wallClockTime);
[email protected]94f206c12012-08-25 00:09:14283}
284
[email protected]96baf3e2012-10-22 23:09:55285bool SingleThreadProxy::reduceContentsTextureMemoryOnImplThread(size_t limitBytes, int priorityCutoff)
[email protected]e1fc8b32012-09-18 20:29:09286{
[email protected]1d993172012-10-18 18:15:04287 DCHECK(isImplThread());
[email protected]b1969fa2012-10-17 20:16:29288 if (!m_layerTreeHost->contentsTextureManager())
289 return false;
290
[email protected]a0a00842012-10-22 22:50:28291 return m_layerTreeHost->contentsTextureManager()->reduceMemoryOnImplThread(limitBytes, priorityCutoff, m_layerTreeHostImpl->resourceProvider());
[email protected]e1fc8b32012-09-18 20:29:09292}
293
[email protected]3d21e022012-10-25 20:03:08294void SingleThreadProxy::sendManagedMemoryStats()
295{
296 DCHECK(Proxy::isImplThread());
[email protected]1235c9cc2012-10-27 03:33:46297 if (!m_layerTreeHostImpl.get())
298 return;
[email protected]1235c9cc2012-10-27 03:33:46299 if (!m_layerTreeHost->contentsTextureManager())
300 return;
301
[email protected]d3afa112012-12-08 06:24:28302 m_layerTreeHostImpl->sendManagedMemoryStats(
[email protected]1235c9cc2012-10-27 03:33:46303 m_layerTreeHost->contentsTextureManager()->memoryVisibleBytes(),
304 m_layerTreeHost->contentsTextureManager()->memoryVisibleAndNearbyBytes(),
305 m_layerTreeHost->contentsTextureManager()->memoryUseBytes());
[email protected]3d21e022012-10-25 20:03:08306}
307
[email protected]94f206c12012-08-25 00:09:14308// Called by the legacy scheduling path (e.g. where render_widget does the scheduling)
[email protected]96baf3e2012-10-22 23:09:55309void SingleThreadProxy::compositeImmediately()
[email protected]94f206c12012-08-25 00:09:14310{
311 if (commitAndComposite()) {
312 m_layerTreeHostImpl->swapBuffers();
313 didSwapFrame();
314 }
315}
316
[email protected]96baf3e2012-10-22 23:09:55317void SingleThreadProxy::forceSerializeOnSwapBuffers()
[email protected]94f206c12012-08-25 00:09:14318{
319 {
[email protected]61de5812012-11-08 07:03:44320 DebugScopedSetImplThread impl(this);
[email protected]94f206c12012-08-25 00:09:14321 if (m_rendererInitialized)
322 m_layerTreeHostImpl->renderer()->doNoOp();
323 }
324}
325
[email protected]96baf3e2012-10-22 23:09:55326void SingleThreadProxy::onSwapBuffersCompleteOnImplThread()
[email protected]493067512012-09-19 23:34:10327{
[email protected]1d993172012-10-18 18:15:04328 NOTREACHED();
[email protected]493067512012-09-19 23:34:10329}
330
[email protected]96baf3e2012-10-22 23:09:55331bool SingleThreadProxy::commitAndComposite()
[email protected]94f206c12012-08-25 00:09:14332{
[email protected]96baf3e2012-10-22 23:09:55333 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:14334
[email protected]94f206c12012-08-25 00:09:14335 if (!m_layerTreeHost->initializeRendererIfNeeded())
336 return false;
337
[email protected]9fa7d382012-11-30 05:21:14338 m_layerTreeHost->contentsTextureManager()->unlinkAndClearEvictedBackings();
[email protected]94f206c12012-08-25 00:09:14339
[email protected]b4da2032012-10-25 21:22:55340 scoped_ptr<ResourceUpdateQueue> queue = make_scoped_ptr(new ResourceUpdateQueue);
[email protected]f961b792012-09-20 07:27:33341 m_layerTreeHost->updateLayers(*(queue.get()), m_layerTreeHostImpl->memoryAllocationLimitBytes());
[email protected]e1fc8b32012-09-18 20:29:09342
343 if (m_layerTreeHostImpl->contentsTexturesPurged())
344 m_layerTreeHostImpl->resetContentsTexturesPurged();
[email protected]94f206c12012-08-25 00:09:14345
346 m_layerTreeHost->willCommit();
[email protected]b1b800c2012-10-16 05:03:59347 doCommit(queue.Pass());
[email protected]94f206c12012-08-25 00:09:14348 bool result = doComposite();
349 m_layerTreeHost->didBeginFrame();
350 return result;
351}
352
[email protected]96baf3e2012-10-22 23:09:55353bool SingleThreadProxy::doComposite()
[email protected]94f206c12012-08-25 00:09:14354{
[email protected]3be2171d2012-12-06 06:13:20355 DCHECK(!m_outputSurfaceLost);
[email protected]94f206c12012-08-25 00:09:14356 {
[email protected]61de5812012-11-08 07:03:44357 DebugScopedSetImplThread impl(this);
[email protected]94f206c12012-08-25 00:09:14358
359 if (!m_layerTreeHostImpl->visible())
360 return false;
361
[email protected]30faac92012-10-29 00:06:29362 m_layerTreeHostImpl->animate(base::TimeTicks::Now(), base::Time::Now());
[email protected]94f206c12012-08-25 00:09:14363
[email protected]8947cbe2012-11-28 05:27:43364 if (m_layerTreeHostImpl->settings().implSidePainting)
365 m_layerTreeHostImpl->manageTiles();
366
[email protected]94f206c12012-08-25 00:09:14367 // We guard prepareToDraw() with canDraw() because it always returns a valid frame, so can only
368 // be used when such a frame is possible. Since drawLayers() depends on the result of
369 // prepareToDraw(), it is guarded on canDraw() as well.
370 if (!m_layerTreeHostImpl->canDraw())
371 return false;
372
[email protected]96baf3e2012-10-22 23:09:55373 LayerTreeHostImpl::FrameData frame;
[email protected]94f206c12012-08-25 00:09:14374 m_layerTreeHostImpl->prepareToDraw(frame);
375 m_layerTreeHostImpl->drawLayers(frame);
376 m_layerTreeHostImpl->didDrawAllLayers(frame);
377 }
378
379 if (m_layerTreeHostImpl->isContextLost()) {
[email protected]3be2171d2012-12-06 06:13:20380 m_outputSurfaceLost = true;
381 m_layerTreeHost->didLoseOutputSurface();
[email protected]94f206c12012-08-25 00:09:14382 return false;
383 }
384
385 return true;
386}
387
[email protected]96baf3e2012-10-22 23:09:55388void SingleThreadProxy::didSwapFrame()
[email protected]94f206c12012-08-25 00:09:14389{
390 if (m_nextFrameIsNewlyCommittedFrame) {
391 m_nextFrameIsNewlyCommittedFrame = false;
392 m_layerTreeHost->didCommitAndDrawFrame();
393 }
394}
395
[email protected]16288a42012-12-17 23:31:05396bool SingleThreadProxy::commitPendingForTesting()
397{
398 return false;
399}
400
[email protected]bc5e77c2012-11-05 20:00:49401} // namespace cc