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