| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 "cc/single_thread_proxy.h" | 5 #include "cc/single_thread_proxy.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "cc/draw_quad.h" | 8 #include "cc/draw_quad.h" |
| 9 #include "cc/graphics_context.h" | |
| 10 #include "cc/layer_tree_host.h" | 9 #include "cc/layer_tree_host.h" |
| 10 #include "cc/output_surface.h" |
| 11 #include "cc/resource_update_controller.h" | 11 #include "cc/resource_update_controller.h" |
| 12 #include "cc/thread.h" | 12 #include "cc/thread.h" |
| 13 | 13 |
| 14 namespace cc { | 14 namespace cc { |
| 15 | 15 |
| 16 scoped_ptr<Proxy> SingleThreadProxy::create(LayerTreeHost* layerTreeHost) | 16 scoped_ptr<Proxy> SingleThreadProxy::create(LayerTreeHost* layerTreeHost) |
| 17 { | 17 { |
| 18 return make_scoped_ptr(new SingleThreadProxy(layerTreeHost)).PassAs<Proxy>()
; | 18 return make_scoped_ptr(new SingleThreadProxy(layerTreeHost)).PassAs<Proxy>()
; |
| 19 } | 19 } |
| 20 | 20 |
| 21 SingleThreadProxy::SingleThreadProxy(LayerTreeHost* layerTreeHost) | 21 SingleThreadProxy::SingleThreadProxy(LayerTreeHost* layerTreeHost) |
| 22 : Proxy(scoped_ptr<Thread>(NULL)) | 22 : Proxy(scoped_ptr<Thread>(NULL)) |
| 23 , m_layerTreeHost(layerTreeHost) | 23 , m_layerTreeHost(layerTreeHost) |
| 24 , m_contextLost(false) | 24 , m_outputSurfaceLost(false) |
| 25 , m_rendererInitialized(false) | 25 , m_rendererInitialized(false) |
| 26 , m_nextFrameIsNewlyCommittedFrame(false) | 26 , m_nextFrameIsNewlyCommittedFrame(false) |
| 27 , m_totalCommitCount(0) | 27 , m_totalCommitCount(0) |
| 28 { | 28 { |
| 29 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy"); | 29 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy"); |
| 30 DCHECK(Proxy::isMainThread()); | 30 DCHECK(Proxy::isMainThread()); |
| 31 } | 31 } |
| 32 | 32 |
| 33 void SingleThreadProxy::start() | 33 void SingleThreadProxy::start() |
| 34 { | 34 { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 m_layerTreeHostImpl->finishAllRendering(); | 75 m_layerTreeHostImpl->finishAllRendering(); |
| 76 } | 76 } |
| 77 } | 77 } |
| 78 | 78 |
| 79 bool SingleThreadProxy::isStarted() const | 79 bool SingleThreadProxy::isStarted() const |
| 80 { | 80 { |
| 81 DCHECK(Proxy::isMainThread()); | 81 DCHECK(Proxy::isMainThread()); |
| 82 return m_layerTreeHostImpl.get(); | 82 return m_layerTreeHostImpl.get(); |
| 83 } | 83 } |
| 84 | 84 |
| 85 bool SingleThreadProxy::initializeContext() | 85 bool SingleThreadProxy::initializeOutputSurface() |
| 86 { | 86 { |
| 87 DCHECK(Proxy::isMainThread()); | 87 DCHECK(Proxy::isMainThread()); |
| 88 scoped_ptr<GraphicsContext> context = m_layerTreeHost->createContext(); | 88 scoped_ptr<OutputSurface> outputSurface = m_layerTreeHost->createOutputSurfa
ce(); |
| 89 if (!context.get()) | 89 if (!outputSurface.get()) |
| 90 return false; | 90 return false; |
| 91 m_contextBeforeInitialization = context.Pass(); | 91 m_outputSurfaceBeforeInitialization = outputSurface.Pass(); |
| 92 return true; | 92 return true; |
| 93 } | 93 } |
| 94 | 94 |
| 95 void SingleThreadProxy::setSurfaceReady() | 95 void SingleThreadProxy::setSurfaceReady() |
| 96 { | 96 { |
| 97 // Scheduling is controlled by the embedder in the single thread case, so no
thing to do. | 97 // Scheduling is controlled by the embedder in the single thread case, so no
thing to do. |
| 98 } | 98 } |
| 99 | 99 |
| 100 void SingleThreadProxy::setVisible(bool visible) | 100 void SingleThreadProxy::setVisible(bool visible) |
| 101 { | 101 { |
| 102 DebugScopedSetImplThread impl(this); | 102 DebugScopedSetImplThread impl(this); |
| 103 m_layerTreeHostImpl->setVisible(visible); | 103 m_layerTreeHostImpl->setVisible(visible); |
| 104 } | 104 } |
| 105 | 105 |
| 106 bool SingleThreadProxy::initializeRenderer() | 106 bool SingleThreadProxy::initializeRenderer() |
| 107 { | 107 { |
| 108 DCHECK(Proxy::isMainThread()); | 108 DCHECK(Proxy::isMainThread()); |
| 109 DCHECK(m_contextBeforeInitialization.get()); | 109 DCHECK(m_outputSurfaceBeforeInitialization.get()); |
| 110 { | 110 { |
| 111 DebugScopedSetImplThread impl(this); | 111 DebugScopedSetImplThread impl(this); |
| 112 bool ok = m_layerTreeHostImpl->initializeRenderer(m_contextBeforeInitial
ization.Pass()); | 112 bool ok = m_layerTreeHostImpl->initializeRenderer(m_outputSurfaceBeforeI
nitialization.Pass()); |
| 113 if (ok) { | 113 if (ok) { |
| 114 m_rendererInitialized = true; | 114 m_rendererInitialized = true; |
| 115 m_RendererCapabilitiesForMainThread = m_layerTreeHostImpl->rendererC
apabilities(); | 115 m_RendererCapabilitiesForMainThread = m_layerTreeHostImpl->rendererC
apabilities(); |
| 116 } | 116 } |
| 117 | 117 |
| 118 return ok; | 118 return ok; |
| 119 } | 119 } |
| 120 } | 120 } |
| 121 | 121 |
| 122 bool SingleThreadProxy::recreateContext() | 122 bool SingleThreadProxy::recreateOutputSurface() |
| 123 { | 123 { |
| 124 TRACE_EVENT0("cc", "SingleThreadProxy::recreateContext"); | 124 TRACE_EVENT0("cc", "SingleThreadProxy::recreateContext"); |
| 125 DCHECK(Proxy::isMainThread()); | 125 DCHECK(Proxy::isMainThread()); |
| 126 DCHECK(m_contextLost); | 126 DCHECK(m_outputSurfaceLost); |
| 127 | 127 |
| 128 scoped_ptr<GraphicsContext> context = m_layerTreeHost->createContext(); | 128 scoped_ptr<OutputSurface> outputSurface = m_layerTreeHost->createOutputSurfa
ce(); |
| 129 if (!context.get()) | 129 if (!outputSurface.get()) |
| 130 return false; | 130 return false; |
| 131 | 131 |
| 132 bool initialized; | 132 bool initialized; |
| 133 { | 133 { |
| 134 DebugScopedSetMainThreadBlocked mainThreadBlocked(this); | 134 DebugScopedSetMainThreadBlocked mainThreadBlocked(this); |
| 135 DebugScopedSetImplThread impl(this); | 135 DebugScopedSetImplThread impl(this); |
| 136 if (!m_layerTreeHostImpl->contentsTexturesPurged()) | 136 if (!m_layerTreeHostImpl->contentsTexturesPurged()) |
| 137 m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostI
mpl->resourceProvider()); | 137 m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostI
mpl->resourceProvider()); |
| 138 initialized = m_layerTreeHostImpl->initializeRenderer(context.Pass()); | 138 initialized = m_layerTreeHostImpl->initializeRenderer(outputSurface.Pass
()); |
| 139 if (initialized) { | 139 if (initialized) { |
| 140 m_RendererCapabilitiesForMainThread = m_layerTreeHostImpl->rendererC
apabilities(); | 140 m_RendererCapabilitiesForMainThread = m_layerTreeHostImpl->rendererC
apabilities(); |
| 141 } | 141 } |
| 142 } | 142 } |
| 143 | 143 |
| 144 if (initialized) | 144 if (initialized) |
| 145 m_contextLost = false; | 145 m_outputSurfaceLost = false; |
| 146 | 146 |
| 147 return initialized; | 147 return initialized; |
| 148 } | 148 } |
| 149 | 149 |
| 150 void SingleThreadProxy::renderingStats(RenderingStats* stats) | 150 void SingleThreadProxy::renderingStats(RenderingStats* stats) |
| 151 { | 151 { |
| 152 stats->totalCommitTimeInSeconds = m_totalCommitTime.InSecondsF(); | 152 stats->totalCommitTimeInSeconds = m_totalCommitTime.InSecondsF(); |
| 153 stats->totalCommitCount = m_totalCommitCount; | 153 stats->totalCommitCount = m_totalCommitCount; |
| 154 m_layerTreeHostImpl->renderingStats(stats); | 154 m_layerTreeHostImpl->renderingStats(stats); |
| 155 } | 155 } |
| 156 | 156 |
| 157 const RendererCapabilities& SingleThreadProxy::rendererCapabilities() const | 157 const RendererCapabilities& SingleThreadProxy::rendererCapabilities() const |
| 158 { | 158 { |
| 159 DCHECK(m_rendererInitialized); | 159 DCHECK(m_rendererInitialized); |
| 160 // Note: this gets called during the commit by the "impl" thread | 160 // Note: this gets called during the commit by the "impl" thread |
| 161 return m_RendererCapabilitiesForMainThread; | 161 return m_RendererCapabilitiesForMainThread; |
| 162 } | 162 } |
| 163 | 163 |
| 164 void SingleThreadProxy::loseContext() | 164 void SingleThreadProxy::loseOutputSurface() |
| 165 { | 165 { |
| 166 DCHECK(Proxy::isMainThread()); | 166 DCHECK(Proxy::isMainThread()); |
| 167 m_layerTreeHost->didLoseContext(); | 167 m_layerTreeHost->didLoseOutputSurface(); |
| 168 m_contextLost = true; | 168 m_outputSurfaceLost = true; |
| 169 } | 169 } |
| 170 | 170 |
| 171 void SingleThreadProxy::setNeedsAnimate() | 171 void SingleThreadProxy::setNeedsAnimate() |
| 172 { | 172 { |
| 173 // Thread-only feature | 173 // Thread-only feature |
| 174 NOTREACHED(); | 174 NOTREACHED(); |
| 175 } | 175 } |
| 176 | 176 |
| 177 void SingleThreadProxy::doCommit(scoped_ptr<ResourceUpdateQueue> queue) | 177 void SingleThreadProxy::doCommit(scoped_ptr<ResourceUpdateQueue> queue) |
| 178 { | 178 { |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 | 352 |
| 353 m_layerTreeHost->willCommit(); | 353 m_layerTreeHost->willCommit(); |
| 354 doCommit(queue.Pass()); | 354 doCommit(queue.Pass()); |
| 355 bool result = doComposite(); | 355 bool result = doComposite(); |
| 356 m_layerTreeHost->didBeginFrame(); | 356 m_layerTreeHost->didBeginFrame(); |
| 357 return result; | 357 return result; |
| 358 } | 358 } |
| 359 | 359 |
| 360 bool SingleThreadProxy::doComposite() | 360 bool SingleThreadProxy::doComposite() |
| 361 { | 361 { |
| 362 DCHECK(!m_contextLost); | 362 DCHECK(!m_outputSurfaceLost); |
| 363 { | 363 { |
| 364 DebugScopedSetImplThread impl(this); | 364 DebugScopedSetImplThread impl(this); |
| 365 | 365 |
| 366 if (!m_layerTreeHostImpl->visible()) | 366 if (!m_layerTreeHostImpl->visible()) |
| 367 return false; | 367 return false; |
| 368 | 368 |
| 369 m_layerTreeHostImpl->animate(base::TimeTicks::Now(), base::Time::Now()); | 369 m_layerTreeHostImpl->animate(base::TimeTicks::Now(), base::Time::Now()); |
| 370 | 370 |
| 371 if (m_layerTreeHostImpl->settings().implSidePainting) | 371 if (m_layerTreeHostImpl->settings().implSidePainting) |
| 372 m_layerTreeHostImpl->manageTiles(); | 372 m_layerTreeHostImpl->manageTiles(); |
| 373 | 373 |
| 374 // We guard prepareToDraw() with canDraw() because it always returns a v
alid frame, so can only | 374 // We guard prepareToDraw() with canDraw() because it always returns a v
alid frame, so can only |
| 375 // be used when such a frame is possible. Since drawLayers() depends on
the result of | 375 // be used when such a frame is possible. Since drawLayers() depends on
the result of |
| 376 // prepareToDraw(), it is guarded on canDraw() as well. | 376 // prepareToDraw(), it is guarded on canDraw() as well. |
| 377 if (!m_layerTreeHostImpl->canDraw()) | 377 if (!m_layerTreeHostImpl->canDraw()) |
| 378 return false; | 378 return false; |
| 379 | 379 |
| 380 LayerTreeHostImpl::FrameData frame; | 380 LayerTreeHostImpl::FrameData frame; |
| 381 m_layerTreeHostImpl->prepareToDraw(frame); | 381 m_layerTreeHostImpl->prepareToDraw(frame); |
| 382 m_layerTreeHostImpl->drawLayers(frame); | 382 m_layerTreeHostImpl->drawLayers(frame); |
| 383 m_layerTreeHostImpl->didDrawAllLayers(frame); | 383 m_layerTreeHostImpl->didDrawAllLayers(frame); |
| 384 } | 384 } |
| 385 | 385 |
| 386 if (m_layerTreeHostImpl->isContextLost()) { | 386 if (m_layerTreeHostImpl->isContextLost()) { |
| 387 m_contextLost = true; | 387 m_outputSurfaceLost = true; |
| 388 m_layerTreeHost->didLoseContext(); | 388 m_layerTreeHost->didLoseOutputSurface(); |
| 389 return false; | 389 return false; |
| 390 } | 390 } |
| 391 | 391 |
| 392 return true; | 392 return true; |
| 393 } | 393 } |
| 394 | 394 |
| 395 void SingleThreadProxy::didSwapFrame() | 395 void SingleThreadProxy::didSwapFrame() |
| 396 { | 396 { |
| 397 if (m_nextFrameIsNewlyCommittedFrame) { | 397 if (m_nextFrameIsNewlyCommittedFrame) { |
| 398 m_nextFrameIsNewlyCommittedFrame = false; | 398 m_nextFrameIsNewlyCommittedFrame = false; |
| 399 m_layerTreeHost->didCommitAndDrawFrame(); | 399 m_layerTreeHost->didCommitAndDrawFrame(); |
| 400 } | 400 } |
| 401 } | 401 } |
| 402 | 402 |
| 403 } // namespace cc | 403 } // namespace cc |
| OLD | NEW |