OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 return nullptr; | 65 return nullptr; |
66 return layerTreeHost.release(); | 66 return layerTreeHost.release(); |
67 } | 67 } |
68 | 68 |
69 CCLayerTreeHost::CCLayerTreeHost(CCLayerTreeHostClient* client, const CCLayerTre
eSettings& settings) | 69 CCLayerTreeHost::CCLayerTreeHost(CCLayerTreeHostClient* client, const CCLayerTre
eSettings& settings) |
70 : m_compositorIdentifier(-1) | 70 : m_compositorIdentifier(-1) |
71 , m_animating(false) | 71 , m_animating(false) |
72 , m_needsAnimateLayers(false) | 72 , m_needsAnimateLayers(false) |
73 , m_client(client) | 73 , m_client(client) |
74 , m_frameNumber(0) | 74 , m_frameNumber(0) |
75 , m_frameIsForDisplay(false) | |
76 , m_layerRendererInitialized(false) | 75 , m_layerRendererInitialized(false) |
77 , m_contextLost(false) | 76 , m_contextLost(false) |
78 , m_numTimesRecreateShouldFail(0) | 77 , m_numTimesRecreateShouldFail(0) |
79 , m_numFailedRecreateAttempts(0) | 78 , m_numFailedRecreateAttempts(0) |
80 , m_settings(settings) | 79 , m_settings(settings) |
81 , m_deviceScaleFactor(1) | 80 , m_deviceScaleFactor(1) |
82 , m_visible(true) | 81 , m_visible(true) |
83 , m_memoryAllocationBytes(0) | |
84 , m_memoryAllocationIsForDisplay(false) | |
85 , m_pageScaleFactor(1) | 82 , m_pageScaleFactor(1) |
86 , m_minPageScaleFactor(1) | 83 , m_minPageScaleFactor(1) |
87 , m_maxPageScaleFactor(1) | 84 , m_maxPageScaleFactor(1) |
88 , m_triggerIdlePaints(true) | 85 , m_triggerIdlePaints(true) |
89 , m_backgroundColor(Color::white) | 86 , m_backgroundColor(Color::white) |
90 , m_hasTransparentBackground(false) | 87 , m_hasTransparentBackground(false) |
91 , m_partialTextureUpdateRequests(0) | 88 , m_partialTextureUpdateRequests(0) |
92 { | 89 { |
93 ASSERT(CCProxy::isMainThread()); | 90 ASSERT(CCProxy::isMainThread()); |
94 numLayerTreeInstances++; | 91 numLayerTreeInstances++; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 } | 141 } |
145 | 142 |
146 // Update m_settings based on capabilities that we got back from the rendere
r. | 143 // Update m_settings based on capabilities that we got back from the rendere
r. |
147 m_settings.acceleratePainting = m_proxy->layerRendererCapabilities().usingAc
celeratedPainting; | 144 m_settings.acceleratePainting = m_proxy->layerRendererCapabilities().usingAc
celeratedPainting; |
148 | 145 |
149 // Update m_settings based on partial update capability. | 146 // Update m_settings based on partial update capability. |
150 m_settings.maxPartialTextureUpdates = min(m_settings.maxPartialTextureUpdate
s, m_proxy->maxPartialTextureUpdates()); | 147 m_settings.maxPartialTextureUpdates = min(m_settings.maxPartialTextureUpdate
s, m_proxy->maxPartialTextureUpdates()); |
151 | 148 |
152 m_contentsTextureManager = TextureManager::create(0, 0, m_proxy->layerRender
erCapabilities().maxTextureSize); | 149 m_contentsTextureManager = TextureManager::create(0, 0, m_proxy->layerRender
erCapabilities().maxTextureSize); |
153 | 150 |
154 // FIXME: This is the same as setContentsMemoryAllocationLimitBytes, but | |
155 // we're in the middle of a commit here and don't want to force another. | |
156 m_memoryAllocationBytes = TextureManager::highLimitBytes(deviceViewportSize(
)); | |
157 m_memoryAllocationIsForDisplay = true; | |
158 | |
159 m_layerRendererInitialized = true; | 151 m_layerRendererInitialized = true; |
160 | 152 |
161 m_settings.defaultTileSize = IntSize(min(m_settings.defaultTileSize.width(),
m_proxy->layerRendererCapabilities().maxTextureSize), | 153 m_settings.defaultTileSize = IntSize(min(m_settings.defaultTileSize.width(),
m_proxy->layerRendererCapabilities().maxTextureSize), |
162 min(m_settings.defaultTileSize.height()
, m_proxy->layerRendererCapabilities().maxTextureSize)); | 154 min(m_settings.defaultTileSize.height()
, m_proxy->layerRendererCapabilities().maxTextureSize)); |
163 m_settings.maxUntiledLayerSize = IntSize(min(m_settings.maxUntiledLayerSize.
width(), m_proxy->layerRendererCapabilities().maxTextureSize), | 155 m_settings.maxUntiledLayerSize = IntSize(min(m_settings.maxUntiledLayerSize.
width(), m_proxy->layerRendererCapabilities().maxTextureSize), |
164 min(m_settings.maxUntiledLayerSize.
height(), m_proxy->layerRendererCapabilities().maxTextureSize)); | 156 min(m_settings.maxUntiledLayerSize.
height(), m_proxy->layerRendererCapabilities().maxTextureSize)); |
165 } | 157 } |
166 | 158 |
167 CCLayerTreeHost::RecreateResult CCLayerTreeHost::recreateContext() | 159 CCLayerTreeHost::RecreateResult CCLayerTreeHost::recreateContext() |
168 { | 160 { |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 // to visit their controllers. | 241 // to visit their controllers. |
250 if (rootLayer() && m_needsAnimateLayers) | 242 if (rootLayer() && m_needsAnimateLayers) |
251 hostImpl->setNeedsAnimateLayers(); | 243 hostImpl->setNeedsAnimateLayers(); |
252 | 244 |
253 hostImpl->setSourceFrameNumber(frameNumber()); | 245 hostImpl->setSourceFrameNumber(frameNumber()); |
254 hostImpl->setViewportSize(viewportSize()); | 246 hostImpl->setViewportSize(viewportSize()); |
255 hostImpl->setDeviceScaleFactor(deviceScaleFactor()); | 247 hostImpl->setDeviceScaleFactor(deviceScaleFactor()); |
256 hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFacto
r, m_maxPageScaleFactor); | 248 hostImpl->setPageScaleFactorAndLimits(m_pageScaleFactor, m_minPageScaleFacto
r, m_maxPageScaleFactor); |
257 hostImpl->setBackgroundColor(m_backgroundColor); | 249 hostImpl->setBackgroundColor(m_backgroundColor); |
258 hostImpl->setHasTransparentBackground(m_hasTransparentBackground); | 250 hostImpl->setHasTransparentBackground(m_hasTransparentBackground); |
259 hostImpl->setVisible(m_visible); | |
260 hostImpl->setSourceFrameCanBeDrawn(m_frameIsForDisplay); | |
261 | 251 |
262 m_frameNumber++; | 252 m_frameNumber++; |
263 } | 253 } |
264 | 254 |
265 void CCLayerTreeHost::commitComplete() | 255 void CCLayerTreeHost::commitComplete() |
266 { | 256 { |
267 m_deleteTextureAfterCommitList.clear(); | 257 m_deleteTextureAfterCommitList.clear(); |
268 m_contentsTextureManager->unprotectAllTextures(); | 258 m_contentsTextureManager->unprotectAllTextures(); |
269 m_client->didCommit(); | 259 m_client->didCommit(); |
270 } | 260 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 { | 311 { |
322 ASSERT(CCProxy::hasImplThread()); | 312 ASSERT(CCProxy::hasImplThread()); |
323 m_proxy->setNeedsAnimate(); | 313 m_proxy->setNeedsAnimate(); |
324 } | 314 } |
325 | 315 |
326 void CCLayerTreeHost::setNeedsCommit() | 316 void CCLayerTreeHost::setNeedsCommit() |
327 { | 317 { |
328 m_proxy->setNeedsCommit(); | 318 m_proxy->setNeedsCommit(); |
329 } | 319 } |
330 | 320 |
331 void CCLayerTreeHost::setNeedsForcedCommit() | |
332 { | |
333 m_proxy->setNeedsForcedCommit(); | |
334 } | |
335 | |
336 void CCLayerTreeHost::setNeedsRedraw() | 321 void CCLayerTreeHost::setNeedsRedraw() |
337 { | 322 { |
338 m_proxy->setNeedsRedraw(); | 323 m_proxy->setNeedsRedraw(); |
339 if (!CCThreadProxy::implThread()) | 324 if (!CCThreadProxy::implThread()) |
340 m_client->scheduleComposite(); | 325 m_client->scheduleComposite(); |
341 } | 326 } |
342 | 327 |
343 bool CCLayerTreeHost::commitRequested() const | 328 bool CCLayerTreeHost::commitRequested() const |
344 { | 329 { |
345 return m_proxy->commitRequested(); | 330 return m_proxy->commitRequested(); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 m_pageScaleFactor = pageScaleFactor; | 376 m_pageScaleFactor = pageScaleFactor; |
392 m_minPageScaleFactor = minPageScaleFactor; | 377 m_minPageScaleFactor = minPageScaleFactor; |
393 m_maxPageScaleFactor = maxPageScaleFactor; | 378 m_maxPageScaleFactor = maxPageScaleFactor; |
394 setNeedsCommit(); | 379 setNeedsCommit(); |
395 } | 380 } |
396 | 381 |
397 void CCLayerTreeHost::setVisible(bool visible) | 382 void CCLayerTreeHost::setVisible(bool visible) |
398 { | 383 { |
399 if (m_visible == visible) | 384 if (m_visible == visible) |
400 return; | 385 return; |
401 | |
402 m_visible = visible; | 386 m_visible = visible; |
403 | 387 m_proxy->setVisible(visible); |
404 // FIXME: Remove this stuff, it is here just for the m20 merge. | |
405 if (!m_visible && m_layerRendererInitialized) { | |
406 if (m_proxy->layerRendererCapabilities().contextHasCachedFrontBuffer) | |
407 setContentsMemoryAllocationLimitBytes(0); | |
408 else | |
409 setContentsMemoryAllocationLimitBytes(m_contentsTextureManager->pref
erredMemoryLimitBytes()); | |
410 } | |
411 | |
412 setNeedsForcedCommit(); | |
413 } | 388 } |
414 | 389 |
415 void CCLayerTreeHost::setContentsMemoryAllocationLimitBytes(size_t bytes) | 390 void CCLayerTreeHost::evictAllContentTextures() |
416 { | 391 { |
417 ASSERT(CCProxy::isMainThread()); | 392 ASSERT(CCProxy::isMainThread()); |
418 if (m_memoryAllocationBytes == bytes) | 393 ASSERT(m_contentsTextureManager.get()); |
419 return; | 394 m_contentsTextureManager->evictAndRemoveAllDeletedTextures(); |
420 | |
421 m_memoryAllocationBytes = bytes; | |
422 m_memoryAllocationIsForDisplay = bytes; | |
423 | |
424 // When not visible, force a commit so that we change our memory allocation | |
425 // and evict/delete any textures if we are being requested to. | |
426 if (!m_visible) | |
427 setNeedsForcedCommit(); | |
428 else | |
429 setNeedsCommit(); | |
430 } | 395 } |
431 | 396 |
432 void CCLayerTreeHost::startPageScaleAnimation(const IntSize& targetPosition, boo
l useAnchor, float scale, double durationSec) | 397 void CCLayerTreeHost::startPageScaleAnimation(const IntSize& targetPosition, boo
l useAnchor, float scale, double durationSec) |
433 { | 398 { |
434 m_proxy->startPageScaleAnimation(targetPosition, useAnchor, scale, durationS
ec); | 399 m_proxy->startPageScaleAnimation(targetPosition, useAnchor, scale, durationS
ec); |
435 } | 400 } |
436 | 401 |
437 void CCLayerTreeHost::loseContext(int numTimes) | 402 void CCLayerTreeHost::loseContext(int numTimes) |
438 { | 403 { |
439 TRACE_EVENT1("cc", "CCLayerTreeHost::loseCompositorContext", "numTimes", num
Times); | 404 TRACE_EVENT1("cc", "CCLayerTreeHost::loseCompositorContext", "numTimes", num
Times); |
(...skipping 26 matching lines...) Expand all Loading... |
466 return false; | 431 return false; |
467 } | 432 } |
468 if (m_contextLost) { | 433 if (m_contextLost) { |
469 if (recreateContext() != RecreateSucceeded) | 434 if (recreateContext() != RecreateSucceeded) |
470 return false; | 435 return false; |
471 } | 436 } |
472 return true; | 437 return true; |
473 } | 438 } |
474 | 439 |
475 | 440 |
476 void CCLayerTreeHost::updateLayers(CCTextureUpdater& updater) | 441 void CCLayerTreeHost::updateLayers(CCTextureUpdater& updater, size_t contentsMem
oryLimitBytes) |
477 { | 442 { |
478 ASSERT(m_layerRendererInitialized); | 443 ASSERT(m_layerRendererInitialized); |
479 // The visible state and memory allocation are set independently and in | 444 ASSERT(contentsMemoryLimitBytes); |
480 // arbitrary order, so do not change the memory allocation used for the | |
481 // current commit until both values match intentions. | |
482 // FIXME: These two states should be combined into a single action so we | |
483 // need a single commit to change visible state, and this can be removed. | |
484 bool memoryAllocationStateMatchesVisibility = m_visible == m_memoryAllocatio
nIsForDisplay; | |
485 if (memoryAllocationStateMatchesVisibility) { | |
486 m_contentsTextureManager->setMemoryAllocationLimitBytes(m_memoryAllocati
onBytes); | |
487 m_frameIsForDisplay = m_memoryAllocationIsForDisplay; | |
488 } | |
489 | 445 |
490 if (!rootLayer()) | 446 if (!rootLayer()) |
491 return; | 447 return; |
492 | 448 |
493 if (viewportSize().isEmpty()) | 449 if (viewportSize().isEmpty()) |
494 return; | 450 return; |
495 | 451 |
| 452 m_contentsTextureManager->setMemoryAllocationLimitBytes(contentsMemoryLimitB
ytes); |
| 453 |
496 updateLayers(rootLayer(), updater); | 454 updateLayers(rootLayer(), updater); |
497 } | 455 } |
498 | 456 |
499 void CCLayerTreeHost::updateLayers(LayerChromium* rootLayer, CCTextureUpdater& u
pdater) | 457 void CCLayerTreeHost::updateLayers(LayerChromium* rootLayer, CCTextureUpdater& u
pdater) |
500 { | 458 { |
501 TRACE_EVENT("CCLayerTreeHost::updateLayers", this, 0); | 459 TRACE_EVENT("CCLayerTreeHost::updateLayers", this, 0); |
502 | 460 |
503 if (!rootLayer->renderSurface()) | 461 if (!rootLayer->renderSurface()) |
504 rootLayer->createRenderSurface(); | 462 rootLayer->createRenderSurface(); |
505 rootLayer->renderSurface()->setContentRect(IntRect(IntPoint(0, 0), deviceVie
wportSize())); | 463 rootLayer->renderSurface()->setContentRect(IntRect(IntPoint(0, 0), deviceVie
wportSize())); |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
758 else | 716 else |
759 layer->notifyAnimationFinished(wallClockTime); | 717 layer->notifyAnimationFinished(wallClockTime); |
760 } | 718 } |
761 } | 719 } |
762 | 720 |
763 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn
dex) | 721 for (size_t childIndex = 0; childIndex < layer->children().size(); ++childIn
dex) |
764 setAnimationEventsRecursive(events, layer->children()[childIndex].get(),
wallClockTime); | 722 setAnimationEventsRecursive(events, layer->children()[childIndex].get(),
wallClockTime); |
765 } | 723 } |
766 | 724 |
767 } // namespace WebCore | 725 } // namespace WebCore |
OLD | NEW |