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/layer_tree_host.h" | 5 #include "cc/layer_tree_host.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
11 #include "cc/font_atlas.h" | 11 #include "cc/font_atlas.h" |
| 12 #include "cc/graphics_context.h" |
12 #include "cc/heads_up_display_layer.h" | 13 #include "cc/heads_up_display_layer.h" |
13 #include "cc/heads_up_display_layer_impl.h" | 14 #include "cc/heads_up_display_layer_impl.h" |
14 #include "cc/layer.h" | 15 #include "cc/layer.h" |
15 #include "cc/layer_animation_controller.h" | 16 #include "cc/layer_animation_controller.h" |
16 #include "cc/layer_iterator.h" | 17 #include "cc/layer_iterator.h" |
17 #include "cc/layer_tree_host_client.h" | 18 #include "cc/layer_tree_host_client.h" |
18 #include "cc/layer_tree_host_common.h" | 19 #include "cc/layer_tree_host_common.h" |
19 #include "cc/layer_tree_host_impl.h" | 20 #include "cc/layer_tree_host_impl.h" |
20 #include "cc/math_util.h" | 21 #include "cc/math_util.h" |
21 #include "cc/occlusion_tracker.h" | 22 #include "cc/occlusion_tracker.h" |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 } | 140 } |
140 } | 141 } |
141 } | 142 } |
142 | 143 |
143 LayerTreeSettings::~LayerTreeSettings() | 144 LayerTreeSettings::~LayerTreeSettings() |
144 { | 145 { |
145 } | 146 } |
146 | 147 |
147 RendererCapabilities::RendererCapabilities() | 148 RendererCapabilities::RendererCapabilities() |
148 : bestTextureFormat(0) | 149 : bestTextureFormat(0) |
| 150 , contextHasCachedFrontBuffer(false) |
| 151 , usingPartialSwap(false) |
149 , usingAcceleratedPainting(false) | 152 , usingAcceleratedPainting(false) |
150 , usingSetVisibility(false) | 153 , usingSetVisibility(false) |
151 , usingSwapCompleteCallback(false) | 154 , usingSwapCompleteCallback(false) |
152 , usingGpuMemoryManager(false) | 155 , usingGpuMemoryManager(false) |
153 , usingDiscardFramebuffer(false) | 156 , usingDiscardFramebuffer(false) |
154 , usingEglImage(false) | 157 , usingEglImage(false) |
155 , allowPartialTextureUpdates(false) | 158 , allowPartialTextureUpdates(false) |
156 , maxTextureSize(0) | 159 , maxTextureSize(0) |
157 { | 160 { |
158 } | 161 } |
(...skipping 16 matching lines...) Expand all Loading... |
175 } | 178 } |
176 | 179 |
177 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, const LayerTreeSetting
s& settings) | 180 LayerTreeHost::LayerTreeHost(LayerTreeHostClient* client, const LayerTreeSetting
s& settings) |
178 : m_animating(false) | 181 : m_animating(false) |
179 , m_needsAnimateLayers(false) | 182 , m_needsAnimateLayers(false) |
180 , m_needsFullTreeSync(true) | 183 , m_needsFullTreeSync(true) |
181 , m_client(client) | 184 , m_client(client) |
182 , m_commitNumber(0) | 185 , m_commitNumber(0) |
183 , m_renderingStats() | 186 , m_renderingStats() |
184 , m_rendererInitialized(false) | 187 , m_rendererInitialized(false) |
185 , m_outputSurfaceLost(false) | 188 , m_contextLost(false) |
186 , m_numTimesRecreateShouldFail(0) | 189 , m_numTimesRecreateShouldFail(0) |
187 , m_numFailedRecreateAttempts(0) | 190 , m_numFailedRecreateAttempts(0) |
188 , m_settings(settings) | 191 , m_settings(settings) |
189 , m_debugState(settings.initialDebugState) | 192 , m_debugState(settings.initialDebugState) |
190 , m_deviceScaleFactor(1) | 193 , m_deviceScaleFactor(1) |
191 , m_visible(true) | 194 , m_visible(true) |
192 , m_pageScaleFactor(1) | 195 , m_pageScaleFactor(1) |
193 , m_minPageScaleFactor(1) | 196 , m_minPageScaleFactor(1) |
194 , m_maxPageScaleFactor(1) | 197 , m_maxPageScaleFactor(1) |
195 , m_triggerIdleUpdates(true) | 198 , m_triggerIdleUpdates(true) |
(...skipping 16 matching lines...) Expand all Loading... |
212 { | 215 { |
213 return initializeProxy(proxyForTesting.Pass()); | 216 return initializeProxy(proxyForTesting.Pass()); |
214 } | 217 } |
215 | 218 |
216 bool LayerTreeHost::initializeProxy(scoped_ptr<Proxy> proxy) | 219 bool LayerTreeHost::initializeProxy(scoped_ptr<Proxy> proxy) |
217 { | 220 { |
218 TRACE_EVENT0("cc", "LayerTreeHost::initializeForReal"); | 221 TRACE_EVENT0("cc", "LayerTreeHost::initializeForReal"); |
219 | 222 |
220 m_proxy = proxy.Pass(); | 223 m_proxy = proxy.Pass(); |
221 m_proxy->start(); | 224 m_proxy->start(); |
222 return m_proxy->initializeOutputSurface(); | 225 return m_proxy->initializeContext(); |
223 } | 226 } |
224 | 227 |
225 LayerTreeHost::~LayerTreeHost() | 228 LayerTreeHost::~LayerTreeHost() |
226 { | 229 { |
227 if (m_rootLayer) | 230 if (m_rootLayer) |
228 m_rootLayer->setLayerTreeHost(0); | 231 m_rootLayer->setLayerTreeHost(0); |
229 DCHECK(m_proxy); | 232 DCHECK(m_proxy); |
230 DCHECK(m_proxy->isMainThread()); | 233 DCHECK(m_proxy->isMainThread()); |
231 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost"); | 234 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost"); |
232 m_proxy->stop(); | 235 m_proxy->stop(); |
233 numLayerTreeInstances--; | 236 numLayerTreeInstances--; |
234 RateLimiterMap::iterator it = m_rateLimiters.begin(); | 237 RateLimiterMap::iterator it = m_rateLimiters.begin(); |
235 if (it != m_rateLimiters.end()) | 238 if (it != m_rateLimiters.end()) |
236 it->second->stop(); | 239 it->second->stop(); |
237 } | 240 } |
238 | 241 |
239 void LayerTreeHost::setSurfaceReady() | 242 void LayerTreeHost::setSurfaceReady() |
240 { | 243 { |
241 m_proxy->setSurfaceReady(); | 244 m_proxy->setSurfaceReady(); |
242 } | 245 } |
243 | 246 |
244 void LayerTreeHost::initializeRenderer() | 247 void LayerTreeHost::initializeRenderer() |
245 { | 248 { |
246 TRACE_EVENT0("cc", "LayerTreeHost::initializeRenderer"); | 249 TRACE_EVENT0("cc", "LayerTreeHost::initializeRenderer"); |
247 if (!m_proxy->initializeRenderer()) { | 250 if (!m_proxy->initializeRenderer()) { |
248 // Uh oh, better tell the client that we can't do anything with this out
put surface. | 251 // Uh oh, better tell the client that we can't do anything with this con
text. |
249 m_client->didRecreateOutputSurface(false); | 252 m_client->didRecreateOutputSurface(false); |
250 return; | 253 return; |
251 } | 254 } |
252 | 255 |
253 // Update m_settings based on capabilities that we got back from the rendere
r. | 256 // Update m_settings based on capabilities that we got back from the rendere
r. |
254 m_settings.acceleratePainting = m_proxy->rendererCapabilities().usingAcceler
atedPainting; | 257 m_settings.acceleratePainting = m_proxy->rendererCapabilities().usingAcceler
atedPainting; |
255 | 258 |
256 // Update m_settings based on partial update capability. | 259 // Update m_settings based on partial update capability. |
257 size_t maxPartialTextureUpdates = 0; | 260 size_t maxPartialTextureUpdates = 0; |
258 if (m_proxy->rendererCapabilities().allowPartialTextureUpdates) | 261 if (m_proxy->rendererCapabilities().allowPartialTextureUpdates) |
259 maxPartialTextureUpdates = min(m_settings.maxPartialTextureUpdates, m_pr
oxy->maxPartialTextureUpdates()); | 262 maxPartialTextureUpdates = min(m_settings.maxPartialTextureUpdates, m_pr
oxy->maxPartialTextureUpdates()); |
260 m_settings.maxPartialTextureUpdates = maxPartialTextureUpdates; | 263 m_settings.maxPartialTextureUpdates = maxPartialTextureUpdates; |
261 | 264 |
262 m_contentsTextureManager = PrioritizedResourceManager::create(Renderer::Cont
entPool, m_proxy.get()); | 265 m_contentsTextureManager = PrioritizedResourceManager::create(Renderer::Cont
entPool, m_proxy.get()); |
263 m_surfaceMemoryPlaceholder = m_contentsTextureManager->createTexture(gfx::Si
ze(), GL_RGBA); | 266 m_surfaceMemoryPlaceholder = m_contentsTextureManager->createTexture(gfx::Si
ze(), GL_RGBA); |
264 | 267 |
265 m_rendererInitialized = true; | 268 m_rendererInitialized = true; |
266 | 269 |
267 m_settings.defaultTileSize = gfx::Size(min(m_settings.defaultTileSize.width(
), m_proxy->rendererCapabilities().maxTextureSize), | 270 m_settings.defaultTileSize = gfx::Size(min(m_settings.defaultTileSize.width(
), m_proxy->rendererCapabilities().maxTextureSize), |
268 min(m_settings.defaultTileSize.height
(), m_proxy->rendererCapabilities().maxTextureSize)); | 271 min(m_settings.defaultTileSize.height
(), m_proxy->rendererCapabilities().maxTextureSize)); |
269 m_settings.maxUntiledLayerSize = gfx::Size(min(m_settings.maxUntiledLayerSiz
e.width(), m_proxy->rendererCapabilities().maxTextureSize), | 272 m_settings.maxUntiledLayerSize = gfx::Size(min(m_settings.maxUntiledLayerSiz
e.width(), m_proxy->rendererCapabilities().maxTextureSize), |
270 min(m_settings.maxUntiledLayerSiz
e.height(), m_proxy->rendererCapabilities().maxTextureSize)); | 273 min(m_settings.maxUntiledLayerSiz
e.height(), m_proxy->rendererCapabilities().maxTextureSize)); |
271 } | 274 } |
272 | 275 |
273 LayerTreeHost::RecreateResult LayerTreeHost::recreateOutputSurface() | 276 LayerTreeHost::RecreateResult LayerTreeHost::recreateContext() |
274 { | 277 { |
275 TRACE_EVENT0("cc", "LayerTreeHost::recreateOutputSurface"); | 278 TRACE_EVENT0("cc", "LayerTreeHost::recreateContext"); |
276 DCHECK(m_outputSurfaceLost); | 279 DCHECK(m_contextLost); |
277 | 280 |
278 bool recreated = false; | 281 bool recreated = false; |
279 if (!m_numTimesRecreateShouldFail) | 282 if (!m_numTimesRecreateShouldFail) |
280 recreated = m_proxy->recreateOutputSurface(); | 283 recreated = m_proxy->recreateContext(); |
281 else | 284 else |
282 m_numTimesRecreateShouldFail--; | 285 m_numTimesRecreateShouldFail--; |
283 | 286 |
284 if (recreated) { | 287 if (recreated) { |
285 m_client->didRecreateOutputSurface(true); | 288 m_client->didRecreateOutputSurface(true); |
286 m_outputSurfaceLost = false; | 289 m_contextLost = false; |
287 return RecreateSucceeded; | 290 return RecreateSucceeded; |
288 } | 291 } |
289 | 292 |
290 // Tolerate a certain number of recreation failures to work around races | 293 // Tolerate a certain number of recreation failures to work around races |
291 // in the output-surface-lost machinery. | 294 // in the context-lost machinery. |
292 m_numFailedRecreateAttempts++; | 295 m_numFailedRecreateAttempts++; |
293 if (m_numFailedRecreateAttempts < 5) { | 296 if (m_numFailedRecreateAttempts < 5) { |
294 // FIXME: The single thread does not self-schedule output surface | 297 // FIXME: The single thread does not self-schedule context |
295 // recreation. So force another recreation attempt to happen by requesti
ng | 298 // recreation. So force another recreation attempt to happen by requesti
ng |
296 // another commit. | 299 // another commit. |
297 if (!m_proxy->hasImplThread()) | 300 if (!m_proxy->hasImplThread()) |
298 setNeedsCommit(); | 301 setNeedsCommit(); |
299 return RecreateFailedButTryAgain; | 302 return RecreateFailedButTryAgain; |
300 } | 303 } |
301 | 304 |
302 // We have tried too many times to recreate the output surface. Tell the | 305 // We have tried too many times to recreate the context. Tell the host to fa
ll |
303 // host to fall back to software rendering. | 306 // back to software rendering. |
304 m_client->didRecreateOutputSurface(false); | 307 m_client->didRecreateOutputSurface(false); |
305 return RecreateFailedAndGaveUp; | 308 return RecreateFailedAndGaveUp; |
306 } | 309 } |
307 | 310 |
308 void LayerTreeHost::deleteContentsTexturesOnImplThread(ResourceProvider* resourc
eProvider) | 311 void LayerTreeHost::deleteContentsTexturesOnImplThread(ResourceProvider* resourc
eProvider) |
309 { | 312 { |
310 DCHECK(m_proxy->isImplThread()); | 313 DCHECK(m_proxy->isImplThread()); |
311 if (m_rendererInitialized) | 314 if (m_rendererInitialized) |
312 m_contentsTextureManager->clearAllMemory(resourceProvider); | 315 m_contentsTextureManager->clearAllMemory(resourceProvider); |
313 } | 316 } |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 m_hudLayer->removeFromParent(); | 422 m_hudLayer->removeFromParent(); |
420 m_hudLayer = 0; | 423 m_hudLayer = 0; |
421 } | 424 } |
422 } | 425 } |
423 | 426 |
424 void LayerTreeHost::commitComplete() | 427 void LayerTreeHost::commitComplete() |
425 { | 428 { |
426 m_client->didCommit(); | 429 m_client->didCommit(); |
427 } | 430 } |
428 | 431 |
429 scoped_ptr<OutputSurface> LayerTreeHost::createOutputSurface() | 432 scoped_ptr<GraphicsContext> LayerTreeHost::createContext() |
430 { | 433 { |
431 return m_client->createOutputSurface(); | 434 return m_client->createOutputSurface(); |
432 } | 435 } |
433 | 436 |
434 scoped_ptr<InputHandler> LayerTreeHost::createInputHandler() | 437 scoped_ptr<InputHandler> LayerTreeHost::createInputHandler() |
435 { | 438 { |
436 return m_client->createInputHandler(); | 439 return m_client->createInputHandler(); |
437 } | 440 } |
438 | 441 |
439 scoped_ptr<LayerTreeHostImpl> LayerTreeHost::createLayerTreeHostImpl(LayerTreeHo
stImplClient* client) | 442 scoped_ptr<LayerTreeHostImpl> LayerTreeHost::createLayerTreeHostImpl(LayerTreeHo
stImplClient* client) |
440 { | 443 { |
441 return LayerTreeHostImpl::create(m_settings, client, m_proxy.get()); | 444 return LayerTreeHostImpl::create(m_settings, client, m_proxy.get()); |
442 } | 445 } |
443 | 446 |
444 void LayerTreeHost::didLoseOutputSurface() | 447 void LayerTreeHost::didLoseContext() |
445 { | 448 { |
446 TRACE_EVENT0("cc", "LayerTreeHost::didLoseOutputSurface"); | 449 TRACE_EVENT0("cc", "LayerTreeHost::didLoseContext"); |
447 DCHECK(m_proxy->isMainThread()); | 450 DCHECK(m_proxy->isMainThread()); |
448 m_outputSurfaceLost = true; | 451 m_contextLost = true; |
449 m_numFailedRecreateAttempts = 0; | 452 m_numFailedRecreateAttempts = 0; |
450 setNeedsCommit(); | 453 setNeedsCommit(); |
451 } | 454 } |
452 | 455 |
453 bool LayerTreeHost::compositeAndReadback(void *pixels, const gfx::Rect& rect) | 456 bool LayerTreeHost::compositeAndReadback(void *pixels, const gfx::Rect& rect) |
454 { | 457 { |
455 m_triggerIdleUpdates = false; | 458 m_triggerIdleUpdates = false; |
456 bool ret = m_proxy->compositeAndReadback(pixels, rect); | 459 bool ret = m_proxy->compositeAndReadback(pixels, rect); |
457 m_triggerIdleUpdates = true; | 460 m_triggerIdleUpdates = true; |
458 return ret; | 461 return ret; |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
586 return; | 589 return; |
587 m_visible = visible; | 590 m_visible = visible; |
588 m_proxy->setVisible(visible); | 591 m_proxy->setVisible(visible); |
589 } | 592 } |
590 | 593 |
591 void LayerTreeHost::startPageScaleAnimation(gfx::Vector2d targetOffset, bool use
Anchor, float scale, base::TimeDelta duration) | 594 void LayerTreeHost::startPageScaleAnimation(gfx::Vector2d targetOffset, bool use
Anchor, float scale, base::TimeDelta duration) |
592 { | 595 { |
593 m_proxy->startPageScaleAnimation(targetOffset, useAnchor, scale, duration); | 596 m_proxy->startPageScaleAnimation(targetOffset, useAnchor, scale, duration); |
594 } | 597 } |
595 | 598 |
596 void LayerTreeHost::loseOutputSurface(int numTimes) | 599 void LayerTreeHost::loseContext(int numTimes) |
597 { | 600 { |
598 TRACE_EVENT1("cc", "LayerTreeHost::loseCompositorOutputSurface", "numTimes",
numTimes); | 601 TRACE_EVENT1("cc", "LayerTreeHost::loseCompositorContext", "numTimes", numTi
mes); |
599 m_numTimesRecreateShouldFail = numTimes - 1; | 602 m_numTimesRecreateShouldFail = numTimes - 1; |
600 m_proxy->loseOutputSurface(); | 603 m_proxy->loseContext(); |
601 } | 604 } |
602 | 605 |
603 PrioritizedResourceManager* LayerTreeHost::contentsTextureManager() const | 606 PrioritizedResourceManager* LayerTreeHost::contentsTextureManager() const |
604 { | 607 { |
605 return m_contentsTextureManager.get(); | 608 return m_contentsTextureManager.get(); |
606 } | 609 } |
607 | 610 |
608 void LayerTreeHost::composite() | 611 void LayerTreeHost::composite() |
609 { | 612 { |
610 if (!m_proxy->hasImplThread()) | 613 if (!m_proxy->hasImplThread()) |
611 static_cast<SingleThreadProxy*>(m_proxy.get())->compositeImmediately(); | 614 static_cast<SingleThreadProxy*>(m_proxy.get())->compositeImmediately(); |
612 else | 615 else |
613 setNeedsCommit(); | 616 setNeedsCommit(); |
614 } | 617 } |
615 | 618 |
616 void LayerTreeHost::scheduleComposite() | 619 void LayerTreeHost::scheduleComposite() |
617 { | 620 { |
618 m_client->scheduleComposite(); | 621 m_client->scheduleComposite(); |
619 } | 622 } |
620 | 623 |
621 bool LayerTreeHost::initializeRendererIfNeeded() | 624 bool LayerTreeHost::initializeRendererIfNeeded() |
622 { | 625 { |
623 if (!m_rendererInitialized) { | 626 if (!m_rendererInitialized) { |
624 initializeRenderer(); | 627 initializeRenderer(); |
625 // If we couldn't initialize, then bail since we're returning to softwar
e mode. | 628 // If we couldn't initialize, then bail since we're returning to softwar
e mode. |
626 if (!m_rendererInitialized) | 629 if (!m_rendererInitialized) |
627 return false; | 630 return false; |
628 } | 631 } |
629 if (m_outputSurfaceLost) { | 632 if (m_contextLost) { |
630 if (recreateOutputSurface() != RecreateSucceeded) | 633 if (recreateContext() != RecreateSucceeded) |
631 return false; | 634 return false; |
632 } | 635 } |
633 return true; | 636 return true; |
634 } | 637 } |
635 | 638 |
636 void LayerTreeHost::updateLayers(ResourceUpdateQueue& queue, size_t memoryAlloca
tionLimitBytes) | 639 void LayerTreeHost::updateLayers(ResourceUpdateQueue& queue, size_t memoryAlloca
tionLimitBytes) |
637 { | 640 { |
638 DCHECK(m_rendererInitialized); | 641 DCHECK(m_rendererInitialized); |
639 | 642 |
640 if (!rootLayer()) | 643 if (!rootLayer()) |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
973 else | 976 else |
974 layer->notifyAnimationFinished(wallClockTime.ToDoubleT()); | 977 layer->notifyAnimationFinished(wallClockTime.ToDoubleT()); |
975 } | 978 } |
976 } | 979 } |
977 | 980 |
978 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn
dex) | 981 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn
dex) |
979 setAnimationEventsRecursive(events, layer->children()[childIndex].get(),
wallClockTime); | 982 setAnimationEventsRecursive(events, layer->children()[childIndex].get(),
wallClockTime); |
980 } | 983 } |
981 | 984 |
982 } // namespace cc | 985 } // namespace cc |
OLD | NEW |