Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp

Issue 1520123002: Fix state restoration logic in canvas 2d wakeup from hibernation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 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 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 bool Canvas2DLayerBridge::shouldAccelerate(AccelerationHint hint) const 163 bool Canvas2DLayerBridge::shouldAccelerate(AccelerationHint hint) const
164 { 164 {
165 bool accelerate; 165 bool accelerate;
166 if (m_softwareRenderingWhileHidden) 166 if (m_softwareRenderingWhileHidden)
167 accelerate = false; 167 accelerate = false;
168 else if (m_accelerationMode == ForceAccelerationForTesting) 168 else if (m_accelerationMode == ForceAccelerationForTesting)
169 accelerate = true; 169 accelerate = true;
170 else if (m_accelerationMode == DisableAcceleration) 170 else if (m_accelerationMode == DisableAcceleration)
171 accelerate = false; 171 accelerate = false;
172 else 172 else
173 accelerate = hint == PreferAcceleration; 173 accelerate = hint == PreferAcceleration || hint == PreferAccelerationAft erVisibilityChange;
174 174
175 if (accelerate && (!m_contextProvider || m_contextProvider->context3d()->isC ontextLost())) 175 if (accelerate && (!m_contextProvider || m_contextProvider->context3d()->isC ontextLost()))
176 accelerate = false; 176 accelerate = false;
177 return accelerate; 177 return accelerate;
178 } 178 }
179 179
180 bool Canvas2DLayerBridge::isAccelerated() const 180 bool Canvas2DLayerBridge::isAccelerated() const
181 { 181 {
182 if (isHibernating()) 182 if (isHibernating())
183 return false; 183 return false;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 } else { 244 } else {
245 m_logger->reportHibernationEvent(HibernationAbortedDueToAllocationFailur e); 245 m_logger->reportHibernationEvent(HibernationAbortedDueToAllocationFailur e);
246 } 246 }
247 } 247 }
248 248
249 SkSurface* Canvas2DLayerBridge::getOrCreateSurface(AccelerationHint hint) 249 SkSurface* Canvas2DLayerBridge::getOrCreateSurface(AccelerationHint hint)
250 { 250 {
251 if (m_surface) 251 if (m_surface)
252 return m_surface.get(); 252 return m_surface.get();
253 253
254 if (m_layer && !isHibernating()) 254 if (m_layer && !isHibernating() && hint == PreferAcceleration) {
255 return nullptr; // re-creation will happen through restore() 255 return nullptr; // re-creation will happen through restore()
256 }
256 257
257 bool wantAcceleration = shouldAccelerate(hint); 258 bool wantAcceleration = shouldAccelerate(hint);
258 bool surfaceIsAccelerated; 259 bool surfaceIsAccelerated;
259 260
260 if (isHidden() && wantAcceleration) { 261 if (isHidden() && wantAcceleration) {
261 wantAcceleration = false; 262 wantAcceleration = false;
262 m_softwareRenderingWhileHidden = true; 263 m_softwareRenderingWhileHidden = true;
263 } 264 }
264 265
265 m_surface = createSkSurface(wantAcceleration ? m_contextProvider->grContext( ) : nullptr, m_size, m_msaaSampleCount, m_opacityMode, &surfaceIsAccelerated); 266 m_surface = createSkSurface(wantAcceleration ? m_contextProvider->grContext( ) : nullptr, m_size, m_msaaSampleCount, m_opacityMode, &surfaceIsAccelerated);
(...skipping 16 matching lines...) Expand all
282 m_logger->reportHibernationEvent(HibernationEndedWithFallbackToS W); 283 m_logger->reportHibernationEvent(HibernationEndedWithFallbackToS W);
283 } 284 }
284 285
285 SkPaint copyPaint; 286 SkPaint copyPaint;
286 copyPaint.setXfermodeMode(SkXfermode::kSrc_Mode); 287 copyPaint.setXfermodeMode(SkXfermode::kSrc_Mode);
287 m_surface->getCanvas()->drawImage(m_hibernationImage.get(), 0, 0, &copyP aint); 288 m_surface->getCanvas()->drawImage(m_hibernationImage.get(), 0, 0, &copyP aint);
288 m_hibernationImage.clear(); 289 m_hibernationImage.clear();
289 290
290 if (m_imageBuffer) 291 if (m_imageBuffer)
291 m_imageBuffer->updateGPUMemoryUsage(); 292 m_imageBuffer->updateGPUMemoryUsage();
293
294 if (m_imageBuffer && !m_isDeferralEnabled)
295 m_imageBuffer->resetCanvas(m_surface->getCanvas());
292 } 296 }
293 return m_surface.get(); 297 return m_surface.get();
294 } 298 }
295 299
296 SkCanvas* Canvas2DLayerBridge::canvas() 300 SkCanvas* Canvas2DLayerBridge::canvas()
297 { 301 {
298 if (!m_isDeferralEnabled) { 302 if (!m_isDeferralEnabled) {
299 SkSurface* s = getOrCreateSurface(); 303 SkSurface* s = getOrCreateSurface();
300 return s ? s->getCanvas() : nullptr; 304 return s ? s->getCanvas() : nullptr;
301 } 305 }
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 m_layer->clearTexture(); 391 m_layer->clearTexture();
388 m_logger->reportHibernationEvent(HibernationScheduled); 392 m_logger->reportHibernationEvent(HibernationScheduled);
389 Platform::current()->currentThread()->scheduler()->postIdleTask(BLINK_FR OM_HERE, WTF::bind<double>(&hibernateWrapper, m_weakPtrFactory.createWeakPtr())) ; 393 Platform::current()->currentThread()->scheduler()->postIdleTask(BLINK_FR OM_HERE, WTF::bind<double>(&hibernateWrapper, m_weakPtrFactory.createWeakPtr())) ;
390 } 394 }
391 if (!isHidden() && m_softwareRenderingWhileHidden) { 395 if (!isHidden() && m_softwareRenderingWhileHidden) {
392 flushRecordingOnly(); 396 flushRecordingOnly();
393 SkPaint copyPaint; 397 SkPaint copyPaint;
394 copyPaint.setXfermodeMode(SkXfermode::kSrc_Mode); 398 copyPaint.setXfermodeMode(SkXfermode::kSrc_Mode);
395 RefPtr<SkSurface> oldSurface = m_surface.release(); 399 RefPtr<SkSurface> oldSurface = m_surface.release();
396 m_softwareRenderingWhileHidden = false; 400 m_softwareRenderingWhileHidden = false;
397 SkSurface* newSurface = getOrCreateSurface(); 401 SkSurface* newSurface = getOrCreateSurface(PreferAccelerationAfterVisibi lityChange);
398 if (newSurface) { 402 if (newSurface) {
399 oldSurface->draw(newSurface->getCanvas(), 0, 0, &copyPaint); 403 oldSurface->draw(newSurface->getCanvas(), 0, 0, &copyPaint);
404 if (m_imageBuffer && !m_isDeferralEnabled) {
405 m_imageBuffer->resetCanvas(m_surface->getCanvas());
406 }
400 } 407 }
401 } 408 }
402 if (!isHidden() && isHibernating()) { 409 if (!isHidden() && isHibernating()) {
403 getOrCreateSurface(); // Rude awakening 410 getOrCreateSurface(); // Rude awakening
404 } 411 }
405 } 412 }
406 413
407 bool Canvas2DLayerBridge::writePixels(const SkImageInfo& origInfo, const void* p ixels, size_t rowBytes, int x, int y) 414 bool Canvas2DLayerBridge::writePixels(const SkImageInfo& origInfo, const void* p ixels, size_t rowBytes, int x, int y)
408 { 415 {
409 if (!getOrCreateSurface()) 416 if (!getOrCreateSurface())
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 m_image = other.m_image; 783 m_image = other.m_image;
777 m_parentLayerBridge = other.m_parentLayerBridge; 784 m_parentLayerBridge = other.m_parentLayerBridge;
778 } 785 }
779 786
780 void Canvas2DLayerBridge::Logger::reportHibernationEvent(HibernationEvent event) 787 void Canvas2DLayerBridge::Logger::reportHibernationEvent(HibernationEvent event)
781 { 788 {
782 blink::Platform::current()->histogramEnumeration("Canvas.HibernationEvents", event, HibernationEventCount); 789 blink::Platform::current()->histogramEnumeration("Canvas.HibernationEvents", event, HibernationEventCount);
783 } 790 }
784 791
785 } // namespace blink 792 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698