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

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

Issue 369043003: Let canvas decide how to handle the case of resource lost reported by client: 2D part (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: add default parameter value for mailboxReleased interface Created 6 years, 5 months 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
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 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 // means there is a problem. 482 // means there is a problem.
483 // For the single-threaded case, this value needs to be at least 483 // For the single-threaded case, this value needs to be at least
484 // kMaxSwapBuffersPending+1 (in render_widget.h). 484 // kMaxSwapBuffersPending+1 (in render_widget.h).
485 // Because of crbug.com/247874, it needs to be kMaxSwapBuffersPending+2. 485 // Because of crbug.com/247874, it needs to be kMaxSwapBuffersPending+2.
486 // TODO(piman): fix this. 486 // TODO(piman): fix this.
487 ASSERT(m_mailboxes.size() <= 4); 487 ASSERT(m_mailboxes.size() <= 4);
488 ASSERT(mailboxInfo < m_mailboxes.end()); 488 ASSERT(mailboxInfo < m_mailboxes.end());
489 return mailboxInfo; 489 return mailboxInfo;
490 } 490 }
491 491
492 void Canvas2DLayerBridge::mailboxReleased(const blink::WebExternalTextureMailbox & mailbox) 492 void Canvas2DLayerBridge::mailboxReleased(const blink::WebExternalTextureMailbox & mailbox, bool lostResource)
493 { 493 {
494 freeReleasedMailbox(); // Never have more than one mailbox in the released s tate. 494 freeReleasedMailbox(); // Never have more than one mailbox in the released s tate.
495 bool contextLost = m_contextProvider->context3d()->isContextLost() || !m_isS urfaceValid;
496 bool reallyLostResource = lostResource && contextLost;
495 Vector<MailboxInfo>::iterator mailboxInfo; 497 Vector<MailboxInfo>::iterator mailboxInfo;
496 for (mailboxInfo = m_mailboxes.begin(); mailboxInfo < m_mailboxes.end(); ++m ailboxInfo) { 498 for (mailboxInfo = m_mailboxes.begin(); mailboxInfo < m_mailboxes.end(); ++m ailboxInfo) {
497 if (nameEquals(mailboxInfo->m_mailbox, mailbox)) { 499 if (nameEquals(mailboxInfo->m_mailbox, mailbox)) {
498 mailboxInfo->m_mailbox.syncPoint = mailbox.syncPoint; 500 mailboxInfo->m_mailbox.syncPoint = mailbox.syncPoint;
499 ASSERT(mailboxInfo->m_status == MailboxInUse); 501 ASSERT(mailboxInfo->m_status == MailboxInUse);
500 mailboxInfo->m_status = MailboxReleased;
501 // Trigger Canvas2DLayerBridge self-destruction if this is the 502 // Trigger Canvas2DLayerBridge self-destruction if this is the
502 // last live mailbox and the layer bridge is not externally 503 // last live mailbox and the layer bridge is not externally
503 // referenced. 504 // referenced.
504 m_releasedMailboxInfoIndex = mailboxInfo - m_mailboxes.begin();
505 m_framesSinceMailboxRelease = 0;
506 if (isHidden()) {
507 freeReleasedMailbox();
508 } else {
509 ASSERT(!m_destructionInProgress);
510 Canvas2DLayerManager::get().layerTransientResourceAllocationChan ged(this);
511 }
512 ASSERT(mailboxInfo->m_parentLayerBridge.get() == this); 505 ASSERT(mailboxInfo->m_parentLayerBridge.get() == this);
513 mailboxInfo->m_parentLayerBridge.clear(); 506 mailboxInfo->m_parentLayerBridge.clear();
507
508 if (reallyLostResource) {
Justin Novosad 2014/07/03 14:50:32 I think this condition could just be "if (contextL
Hongbo Min 2014/07/03 14:55:28 Done.
509 // No need to clean up the mailbox resource, but make sure the
510 // mailbox can also be reusable once the context is restored.
511 mailboxInfo->m_status = MailboxAvailable;
512 m_releasedMailboxInfoIndex = InvalidMailboxIndex;
513 Canvas2DLayerManager::get().layerTransientResourceAllocationChan ged(this);
514 } else {
515 mailboxInfo->m_status = MailboxReleased;
516 m_releasedMailboxInfoIndex = mailboxInfo - m_mailboxes.begin();
517 m_framesSinceMailboxRelease = 0;
518 if (isHidden()) {
519 freeReleasedMailbox();
520 } else {
521 ASSERT(!m_destructionInProgress);
522 Canvas2DLayerManager::get().layerTransientResourceAllocation Changed(this);
523 }
524 }
514 return; 525 return;
515 } 526 }
516 } 527 }
517 } 528 }
518 529
519 blink::WebLayer* Canvas2DLayerBridge::layer() const 530 blink::WebLayer* Canvas2DLayerBridge::layer() const
520 { 531 {
521 ASSERT(!m_destructionInProgress); 532 ASSERT(!m_destructionInProgress);
522 ASSERT(m_layer); 533 ASSERT(m_layer);
523 return m_layer->layer(); 534 return m_layer->layer();
(...skipping 24 matching lines...) Expand all
548 Canvas2DLayerBridge::MailboxInfo::MailboxInfo(const MailboxInfo& other) { 559 Canvas2DLayerBridge::MailboxInfo::MailboxInfo(const MailboxInfo& other) {
549 // This copy constructor should only be used for Vector reallocation 560 // This copy constructor should only be used for Vector reallocation
550 // Assuming 'other' is to be destroyed, we transfer m_image ownership 561 // Assuming 'other' is to be destroyed, we transfer m_image ownership
551 // rather than do a refcount dance. 562 // rather than do a refcount dance.
552 memcpy(&m_mailbox, &other.m_mailbox, sizeof(m_mailbox)); 563 memcpy(&m_mailbox, &other.m_mailbox, sizeof(m_mailbox));
553 m_image = const_cast<MailboxInfo*>(&other)->m_image.release(); 564 m_image = const_cast<MailboxInfo*>(&other)->m_image.release();
554 m_status = other.m_status; 565 m_status = other.m_status;
555 } 566 }
556 567
557 } 568 }
OLDNEW
« no previous file with comments | « Source/platform/graphics/Canvas2DLayerBridge.h ('k') | Source/platform/graphics/gpu/DrawingBuffer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698