blob: baa0f2a2f8582ee906c85bd6332f40ec24e1dd1c [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
5#include "config.h"
6
[email protected]4456eee22012-10-19 18:16:387#include "cc/single_thread_proxy.h"
[email protected]94f206c12012-08-25 00:09:148
[email protected]6331a1172012-10-18 11:35:139#include "base/debug/trace_event.h"
[email protected]aa0a9d32012-10-24 01:58:1010#include "cc/draw_quad.h"
11#include "cc/graphics_context.h"
[email protected]d50c6862012-10-23 02:08:3112#include "cc/layer_tree_host.h"
[email protected]b4da2032012-10-25 21:22:5513#include "cc/resource_update_controller.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]068d7ef2012-11-05 07:17:4623 : m_layerTreeHost(layerTreeHost)
[email protected]94f206c12012-08-25 00:09:1424 , m_contextLost(false)
[email protected]94f206c12012-08-25 00:09:1425 , m_rendererInitialized(false)
26 , m_nextFrameIsNewlyCommittedFrame(false)
[email protected]8b9af6b2012-09-27 00:36:3627 , m_totalCommitCount(0)
[email protected]94f206c12012-08-25 00:09:1428{
[email protected]96baf3e2012-10-22 23:09:5529 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy");
30 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:1431}
32
[email protected]96baf3e2012-10-22 23:09:5533void SingleThreadProxy::start()
[email protected]94f206c12012-08-25 00:09:1434{
[email protected]068d7ef2012-11-05 07:17:4635 DebugScopedSetImplThread impl;
[email protected]94f206c12012-08-25 00:09:1436 m_layerTreeHostImpl = m_layerTreeHost->createLayerTreeHostImpl(this);
37}
38
[email protected]96baf3e2012-10-22 23:09:5539SingleThreadProxy::~SingleThreadProxy()
[email protected]94f206c12012-08-25 00:09:1440{
[email protected]96baf3e2012-10-22 23:09:5541 TRACE_EVENT0("cc", "SingleThreadProxy::~SingleThreadProxy");
42 DCHECK(Proxy::isMainThread());
[email protected]1d993172012-10-18 18:15:0443 DCHECK(!m_layerTreeHostImpl.get() && !m_layerTreeHost); // make sure stop() got called.
[email protected]94f206c12012-08-25 00:09:1444}
45
[email protected]aad0a0072012-11-01 18:15:5846bool SingleThreadProxy::compositeAndReadback(void *pixels, const gfx::Rect& rect)
[email protected]94f206c12012-08-25 00:09:1447{
[email protected]96baf3e2012-10-22 23:09:5548 TRACE_EVENT0("cc", "SingleThreadProxy::compositeAndReadback");
49 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:1450
51 if (!commitAndComposite())
52 return false;
53
54 m_layerTreeHostImpl->readback(pixels, rect);
55
56 if (m_layerTreeHostImpl->isContextLost())
57 return false;
58
59 m_layerTreeHostImpl->swapBuffers();
60 didSwapFrame();
61
62 return true;
63}
64
[email protected]cf817fb2012-11-05 17:17:3465void SingleThreadProxy::startPageScaleAnimation(const IntSize& targetPosition, bool useAnchor, float scale, base::TimeDelta duration)
[email protected]94f206c12012-08-25 00:09:1466{
[email protected]cf817fb2012-11-05 17:17:3467 m_layerTreeHostImpl->startPageScaleAnimation(targetPosition, useAnchor, scale, base::TimeTicks::Now(), duration);
[email protected]94f206c12012-08-25 00:09:1468}
69
[email protected]96baf3e2012-10-22 23:09:5570void SingleThreadProxy::finishAllRendering()
[email protected]94f206c12012-08-25 00:09:1471{
[email protected]96baf3e2012-10-22 23:09:5572 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:1473 {
[email protected]068d7ef2012-11-05 07:17:4674 DebugScopedSetImplThread impl;
[email protected]94f206c12012-08-25 00:09:1475 m_layerTreeHostImpl->finishAllRendering();
76 }
77}
78
[email protected]96baf3e2012-10-22 23:09:5579bool SingleThreadProxy::isStarted() const
[email protected]94f206c12012-08-25 00:09:1480{
[email protected]96baf3e2012-10-22 23:09:5581 DCHECK(Proxy::isMainThread());
[email protected]519281762012-10-06 20:06:3982 return m_layerTreeHostImpl.get();
[email protected]94f206c12012-08-25 00:09:1483}
84
[email protected]96baf3e2012-10-22 23:09:5585bool SingleThreadProxy::initializeContext()
[email protected]94f206c12012-08-25 00:09:1486{
[email protected]96baf3e2012-10-22 23:09:5587 DCHECK(Proxy::isMainThread());
88 scoped_ptr<GraphicsContext> context = m_layerTreeHost->createContext();
[email protected]e28efacd2012-10-06 17:07:4989 if (!context.get())
[email protected]94f206c12012-08-25 00:09:1490 return false;
[email protected]e28efacd2012-10-06 17:07:4991 m_contextBeforeInitialization = context.Pass();
[email protected]94f206c12012-08-25 00:09:1492 return true;
93}
94
[email protected]96baf3e2012-10-22 23:09:5595void SingleThreadProxy::setSurfaceReady()
[email protected]94f206c12012-08-25 00:09:1496{
97 // Scheduling is controlled by the embedder in the single thread case, so nothing to do.
98}
99
[email protected]96baf3e2012-10-22 23:09:55100void SingleThreadProxy::setVisible(bool visible)
[email protected]94f206c12012-08-25 00:09:14101{
[email protected]068d7ef2012-11-05 07:17:46102 DebugScopedSetImplThread impl;
[email protected]94f206c12012-08-25 00:09:14103 m_layerTreeHostImpl->setVisible(visible);
104}
105
[email protected]96baf3e2012-10-22 23:09:55106bool SingleThreadProxy::initializeRenderer()
[email protected]94f206c12012-08-25 00:09:14107{
[email protected]96baf3e2012-10-22 23:09:55108 DCHECK(Proxy::isMainThread());
[email protected]1d993172012-10-18 18:15:04109 DCHECK(m_contextBeforeInitialization.get());
[email protected]94f206c12012-08-25 00:09:14110 {
[email protected]068d7ef2012-11-05 07:17:46111 DebugScopedSetImplThread impl;
[email protected]e28efacd2012-10-06 17:07:49112 bool ok = m_layerTreeHostImpl->initializeRenderer(m_contextBeforeInitialization.Pass());
[email protected]94f206c12012-08-25 00:09:14113 if (ok) {
114 m_rendererInitialized = true;
115 m_RendererCapabilitiesForMainThread = m_layerTreeHostImpl->rendererCapabilities();
116 }
117
118 return ok;
119 }
120}
121
[email protected]96baf3e2012-10-22 23:09:55122bool SingleThreadProxy::recreateContext()
[email protected]94f206c12012-08-25 00:09:14123{
[email protected]96baf3e2012-10-22 23:09:55124 TRACE_EVENT0("cc", "SingleThreadProxy::recreateContext");
125 DCHECK(Proxy::isMainThread());
[email protected]1d993172012-10-18 18:15:04126 DCHECK(m_contextLost);
[email protected]94f206c12012-08-25 00:09:14127
[email protected]96baf3e2012-10-22 23:09:55128 scoped_ptr<GraphicsContext> context = m_layerTreeHost->createContext();
[email protected]e28efacd2012-10-06 17:07:49129 if (!context.get())
[email protected]94f206c12012-08-25 00:09:14130 return false;
131
132 bool initialized;
133 {
[email protected]068d7ef2012-11-05 07:17:46134 DebugScopedSetMainThreadBlocked mainThreadBlocked;
135 DebugScopedSetImplThread impl;
[email protected]94f206c12012-08-25 00:09:14136 if (!m_layerTreeHostImpl->contentsTexturesPurged())
137 m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl->resourceProvider());
[email protected]e28efacd2012-10-06 17:07:49138 initialized = m_layerTreeHostImpl->initializeRenderer(context.Pass());
[email protected]94f206c12012-08-25 00:09:14139 if (initialized) {
140 m_RendererCapabilitiesForMainThread = m_layerTreeHostImpl->rendererCapabilities();
141 }
142 }
143
144 if (initialized)
145 m_contextLost = false;
146
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::loseContext()
[email protected]94f206c12012-08-25 00:09:14165{
[email protected]96baf3e2012-10-22 23:09:55166 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:14167 m_layerTreeHost->didLoseContext();
168 m_contextLost = true;
169}
170
[email protected]96baf3e2012-10-22 23:09:55171void SingleThreadProxy::setNeedsAnimate()
[email protected]94f206c12012-08-25 00:09:14172{
[email protected]96baf3e2012-10-22 23:09:55173 // Thread-only feature
[email protected]1d993172012-10-18 18:15:04174 NOTREACHED();
[email protected]94f206c12012-08-25 00:09:14175}
176
[email protected]b4da2032012-10-25 21:22:55177void SingleThreadProxy::doCommit(scoped_ptr<ResourceUpdateQueue> queue)
[email protected]94f206c12012-08-25 00:09:14178{
[email protected]96baf3e2012-10-22 23:09:55179 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:14180 // Commit immediately
181 {
[email protected]068d7ef2012-11-05 07:17:46182 DebugScopedSetMainThreadBlocked mainThreadBlocked;
183 DebugScopedSetImplThread impl;
[email protected]94f206c12012-08-25 00:09:14184
[email protected]8b9af6b2012-09-27 00:36:36185 base::TimeTicks startTime = base::TimeTicks::HighResNow();
[email protected]94f206c12012-08-25 00:09:14186 m_layerTreeHostImpl->beginCommit();
187
[email protected]2c7d23f2012-10-15 20:43:25188 m_layerTreeHost->contentsTextureManager()->pushTexturePrioritiesToBackings();
[email protected]94f206c12012-08-25 00:09:14189 m_layerTreeHost->beginCommitOnImplThread(m_layerTreeHostImpl.get());
190
[email protected]b4da2032012-10-25 21:22:55191 scoped_ptr<ResourceUpdateController> updateController =
192 ResourceUpdateController::create(
[email protected]f961b792012-09-20 07:27:33193 NULL,
[email protected]96baf3e2012-10-22 23:09:55194 Proxy::mainThread(),
[email protected]b1b800c2012-10-16 05:03:59195 queue.Pass(),
[email protected]068d7ef2012-11-05 07:17:46196 m_layerTreeHostImpl->resourceProvider());
[email protected]f961b792012-09-20 07:27:33197 updateController->finalize();
[email protected]94f206c12012-08-25 00:09:14198
199 m_layerTreeHost->finishCommitOnImplThread(m_layerTreeHostImpl.get());
200
201 m_layerTreeHostImpl->commitComplete();
202
[email protected]1d993172012-10-18 18:15:04203#ifndef NDEBUG
[email protected]94f206c12012-08-25 00:09:14204 // In the single-threaded case, the scroll deltas should never be
205 // touched on the impl layer tree.
[email protected]96baf3e2012-10-22 23:09:55206 scoped_ptr<ScrollAndScaleSet> scrollInfo = m_layerTreeHostImpl->processScrollDeltas();
[email protected]1d993172012-10-18 18:15:04207 DCHECK(!scrollInfo->scrolls.size());
[email protected]94f206c12012-08-25 00:09:14208#endif
[email protected]8b9af6b2012-09-27 00:36:36209
210 base::TimeTicks endTime = base::TimeTicks::HighResNow();
211 m_totalCommitTime += endTime - startTime;
212 m_totalCommitCount++;
[email protected]94f206c12012-08-25 00:09:14213 }
214 m_layerTreeHost->commitComplete();
215 m_nextFrameIsNewlyCommittedFrame = true;
216}
217
[email protected]96baf3e2012-10-22 23:09:55218void SingleThreadProxy::setNeedsCommit()
[email protected]94f206c12012-08-25 00:09:14219{
[email protected]96baf3e2012-10-22 23:09:55220 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:14221 m_layerTreeHost->scheduleComposite();
222}
223
[email protected]96baf3e2012-10-22 23:09:55224void SingleThreadProxy::setNeedsRedraw()
[email protected]94f206c12012-08-25 00:09:14225{
226 // FIXME: Once we move render_widget scheduling into this class, we can
227 // treat redraw requests more efficiently than commitAndRedraw requests.
228 m_layerTreeHostImpl->setFullRootLayerDamage();
229 setNeedsCommit();
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:55243void SingleThreadProxy::didAddAnimation()
[email protected]94f206c12012-08-25 00:09:14244{
245}
246
[email protected]96baf3e2012-10-22 23:09:55247size_t SingleThreadProxy::maxPartialTextureUpdates() const
[email protected]493067512012-09-19 23:34:10248{
249 return std::numeric_limits<size_t>::max();
250}
251
[email protected]96baf3e2012-10-22 23:09:55252void SingleThreadProxy::stop()
[email protected]94f206c12012-08-25 00:09:14253{
[email protected]96baf3e2012-10-22 23:09:55254 TRACE_EVENT0("cc", "SingleThreadProxy::stop");
255 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:14256 {
[email protected]068d7ef2012-11-05 07:17:46257 DebugScopedSetMainThreadBlocked mainThreadBlocked;
258 DebugScopedSetImplThread impl;
[email protected]94f206c12012-08-25 00:09:14259
260 if (!m_layerTreeHostImpl->contentsTexturesPurged())
261 m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl->resourceProvider());
[email protected]519281762012-10-06 20:06:39262 m_layerTreeHostImpl.reset();
[email protected]94f206c12012-08-25 00:09:14263 }
264 m_layerTreeHost = 0;
265}
266
[email protected]96baf3e2012-10-22 23:09:55267void SingleThreadProxy::setNeedsRedrawOnImplThread()
[email protected]493067512012-09-19 23:34:10268{
269 m_layerTreeHost->scheduleComposite();
270}
271
[email protected]96baf3e2012-10-22 23:09:55272void SingleThreadProxy::setNeedsCommitOnImplThread()
[email protected]493067512012-09-19 23:34:10273{
274 m_layerTreeHost->scheduleComposite();
275}
276
[email protected]30faac92012-10-29 00:06:29277void SingleThreadProxy::postAnimationEventsToMainThreadOnImplThread(scoped_ptr<AnimationEventsVector> events, base::Time wallClockTime)
[email protected]94f206c12012-08-25 00:09:14278{
[email protected]96baf3e2012-10-22 23:09:55279 DCHECK(Proxy::isImplThread());
[email protected]068d7ef2012-11-05 07:17:46280 DebugScopedSetMainThread main;
[email protected]ec1d6d52012-10-10 01:28:57281 m_layerTreeHost->setAnimationEvents(events.Pass(), wallClockTime);
[email protected]94f206c12012-08-25 00:09:14282}
283
[email protected]96baf3e2012-10-22 23:09:55284bool SingleThreadProxy::reduceContentsTextureMemoryOnImplThread(size_t limitBytes, int priorityCutoff)
[email protected]e1fc8b32012-09-18 20:29:09285{
[email protected]1d993172012-10-18 18:15:04286 DCHECK(isImplThread());
[email protected]b1969fa2012-10-17 20:16:29287 if (!m_layerTreeHost->contentsTextureManager())
288 return false;
289
[email protected]a0a00842012-10-22 22:50:28290 return m_layerTreeHost->contentsTextureManager()->reduceMemoryOnImplThread(limitBytes, priorityCutoff, m_layerTreeHostImpl->resourceProvider());
[email protected]e1fc8b32012-09-18 20:29:09291}
292
[email protected]3d21e022012-10-25 20:03:08293void SingleThreadProxy::sendManagedMemoryStats()
294{
295 DCHECK(Proxy::isImplThread());
[email protected]1235c9cc2012-10-27 03:33:46296 if (!m_layerTreeHostImpl.get())
297 return;
298 if (!m_layerTreeHostImpl->renderer())
299 return;
300 if (!m_layerTreeHost->contentsTextureManager())
301 return;
302
303 m_layerTreeHostImpl->renderer()->sendManagedMemoryStats(
304 m_layerTreeHost->contentsTextureManager()->memoryVisibleBytes(),
305 m_layerTreeHost->contentsTextureManager()->memoryVisibleAndNearbyBytes(),
306 m_layerTreeHost->contentsTextureManager()->memoryUseBytes());
[email protected]3d21e022012-10-25 20:03:08307}
308
[email protected]94f206c12012-08-25 00:09:14309// Called by the legacy scheduling path (e.g. where render_widget does the scheduling)
[email protected]96baf3e2012-10-22 23:09:55310void SingleThreadProxy::compositeImmediately()
[email protected]94f206c12012-08-25 00:09:14311{
312 if (commitAndComposite()) {
313 m_layerTreeHostImpl->swapBuffers();
314 didSwapFrame();
315 }
316}
317
[email protected]96baf3e2012-10-22 23:09:55318void SingleThreadProxy::forceSerializeOnSwapBuffers()
[email protected]94f206c12012-08-25 00:09:14319{
320 {
[email protected]068d7ef2012-11-05 07:17:46321 DebugScopedSetImplThread impl;
[email protected]94f206c12012-08-25 00:09:14322 if (m_rendererInitialized)
323 m_layerTreeHostImpl->renderer()->doNoOp();
324 }
325}
326
[email protected]96baf3e2012-10-22 23:09:55327void SingleThreadProxy::onSwapBuffersCompleteOnImplThread()
[email protected]493067512012-09-19 23:34:10328{
[email protected]1d993172012-10-18 18:15:04329 NOTREACHED();
[email protected]493067512012-09-19 23:34:10330}
331
[email protected]96baf3e2012-10-22 23:09:55332bool SingleThreadProxy::commitAndComposite()
[email protected]94f206c12012-08-25 00:09:14333{
[email protected]96baf3e2012-10-22 23:09:55334 DCHECK(Proxy::isMainThread());
[email protected]94f206c12012-08-25 00:09:14335
[email protected]94f206c12012-08-25 00:09:14336 if (!m_layerTreeHost->initializeRendererIfNeeded())
337 return false;
338
[email protected]e1fc8b32012-09-18 20:29:09339 // Unlink any texture backings that were deleted
[email protected]96baf3e2012-10-22 23:09:55340 PrioritizedTextureManager::BackingList evictedContentsTexturesBackings;
[email protected]e1fc8b32012-09-18 20:29:09341 {
[email protected]068d7ef2012-11-05 07:17:46342 DebugScopedSetImplThread implThread;
[email protected]2c7d23f2012-10-15 20:43:25343 m_layerTreeHost->contentsTextureManager()->getEvictedBackings(evictedContentsTexturesBackings);
[email protected]e1fc8b32012-09-18 20:29:09344 }
[email protected]2c7d23f2012-10-15 20:43:25345 m_layerTreeHost->contentsTextureManager()->unlinkEvictedBackings(evictedContentsTexturesBackings);
[email protected]94f206c12012-08-25 00:09:14346
[email protected]b4da2032012-10-25 21:22:55347 scoped_ptr<ResourceUpdateQueue> queue = make_scoped_ptr(new ResourceUpdateQueue);
[email protected]f961b792012-09-20 07:27:33348 m_layerTreeHost->updateLayers(*(queue.get()), m_layerTreeHostImpl->memoryAllocationLimitBytes());
[email protected]e1fc8b32012-09-18 20:29:09349
350 if (m_layerTreeHostImpl->contentsTexturesPurged())
351 m_layerTreeHostImpl->resetContentsTexturesPurged();
[email protected]94f206c12012-08-25 00:09:14352
353 m_layerTreeHost->willCommit();
[email protected]b1b800c2012-10-16 05:03:59354 doCommit(queue.Pass());
[email protected]94f206c12012-08-25 00:09:14355 bool result = doComposite();
356 m_layerTreeHost->didBeginFrame();
357 return result;
358}
359
[email protected]96baf3e2012-10-22 23:09:55360bool SingleThreadProxy::doComposite()
[email protected]94f206c12012-08-25 00:09:14361{
[email protected]1d993172012-10-18 18:15:04362 DCHECK(!m_contextLost);
[email protected]94f206c12012-08-25 00:09:14363 {
[email protected]068d7ef2012-11-05 07:17:46364 DebugScopedSetImplThread impl;
[email protected]94f206c12012-08-25 00:09:14365
366 if (!m_layerTreeHostImpl->visible())
367 return false;
368
[email protected]30faac92012-10-29 00:06:29369 m_layerTreeHostImpl->animate(base::TimeTicks::Now(), base::Time::Now());
[email protected]94f206c12012-08-25 00:09:14370
371 // We guard prepareToDraw() with canDraw() because it always returns a valid frame, so can only
372 // be used when such a frame is possible. Since drawLayers() depends on the result of
373 // prepareToDraw(), it is guarded on canDraw() as well.
374 if (!m_layerTreeHostImpl->canDraw())
375 return false;
376
[email protected]96baf3e2012-10-22 23:09:55377 LayerTreeHostImpl::FrameData frame;
[email protected]94f206c12012-08-25 00:09:14378 m_layerTreeHostImpl->prepareToDraw(frame);
379 m_layerTreeHostImpl->drawLayers(frame);
380 m_layerTreeHostImpl->didDrawAllLayers(frame);
381 }
382
383 if (m_layerTreeHostImpl->isContextLost()) {
384 m_contextLost = true;
385 m_layerTreeHost->didLoseContext();
386 return false;
387 }
388
389 return true;
390}
391
[email protected]96baf3e2012-10-22 23:09:55392void SingleThreadProxy::didSwapFrame()
[email protected]94f206c12012-08-25 00:09:14393{
394 if (m_nextFrameIsNewlyCommittedFrame) {
395 m_nextFrameIsNewlyCommittedFrame = false;
396 m_layerTreeHost->didCommitAndDrawFrame();
397 }
398}
399
[email protected]bc5e77c2012-11-05 20:00:49400} // namespace cc