OLD | NEW |
---|---|
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 Loading... | |
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; | |
495 Vector<MailboxInfo>::iterator mailboxInfo; | 496 Vector<MailboxInfo>::iterator mailboxInfo; |
496 for (mailboxInfo = m_mailboxes.begin(); mailboxInfo < m_mailboxes.end(); ++m ailboxInfo) { | 497 for (mailboxInfo = m_mailboxes.begin(); mailboxInfo < m_mailboxes.end(); ++m ailboxInfo) { |
497 if (nameEquals(mailboxInfo->m_mailbox, mailbox)) { | 498 if (nameEquals(mailboxInfo->m_mailbox, mailbox)) { |
498 mailboxInfo->m_mailbox.syncPoint = mailbox.syncPoint; | 499 mailboxInfo->m_mailbox.syncPoint = mailbox.syncPoint; |
499 ASSERT(mailboxInfo->m_status == MailboxInUse); | 500 ASSERT(mailboxInfo->m_status == MailboxInUse); |
500 mailboxInfo->m_status = MailboxReleased; | |
501 // Trigger Canvas2DLayerBridge self-destruction if this is the | 501 // Trigger Canvas2DLayerBridge self-destruction if this is the |
502 // last live mailbox and the layer bridge is not externally | 502 // last live mailbox and the layer bridge is not externally |
503 // referenced. | 503 // 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); | 504 ASSERT(mailboxInfo->m_parentLayerBridge.get() == this); |
513 mailboxInfo->m_parentLayerBridge.clear(); | 505 mailboxInfo->m_parentLayerBridge.clear(); |
506 | |
507 if (contextLost) { | |
508 // No need to clean up the mailbox resource, but make sure the | |
509 // mailbox can also be reusable once the context is restored. | |
510 mailboxInfo->m_status = MailboxAvailable; | |
511 m_releasedMailboxInfoIndex = InvalidMailboxIndex; | |
512 Canvas2DLayerManager::get().layerTransientResourceAllocationChan ged(this); | |
513 } else { | |
514 mailboxInfo->m_status = MailboxReleased; | |
515 // Reset the syncPoint to 0 for a lost resource, and we have no | |
516 // need to wait sync point when freeing the mailbox. | |
517 if (lostResource) | |
518 mailboxInfo->m_mailbox.syncPoint = 0; | |
Justin Novosad
2014/07/15 14:38:28
I think you should be doing more than this. Accord
danakj
2014/07/15 14:53:07
Yes.
| |
519 m_releasedMailboxInfoIndex = mailboxInfo - m_mailboxes.begin(); | |
520 m_framesSinceMailboxRelease = 0; | |
521 if (isHidden() || lostResource) { | |
522 freeReleasedMailbox(); | |
523 } else { | |
524 ASSERT(!m_destructionInProgress); | |
525 Canvas2DLayerManager::get().layerTransientResourceAllocation Changed(this); | |
526 } | |
527 } | |
514 return; | 528 return; |
515 } | 529 } |
516 } | 530 } |
517 } | 531 } |
518 | 532 |
519 blink::WebLayer* Canvas2DLayerBridge::layer() const | 533 blink::WebLayer* Canvas2DLayerBridge::layer() const |
520 { | 534 { |
521 ASSERT(!m_destructionInProgress); | 535 ASSERT(!m_destructionInProgress); |
522 ASSERT(m_layer); | 536 ASSERT(m_layer); |
523 return m_layer->layer(); | 537 return m_layer->layer(); |
(...skipping 24 matching lines...) Expand all Loading... | |
548 Canvas2DLayerBridge::MailboxInfo::MailboxInfo(const MailboxInfo& other) { | 562 Canvas2DLayerBridge::MailboxInfo::MailboxInfo(const MailboxInfo& other) { |
549 // This copy constructor should only be used for Vector reallocation | 563 // This copy constructor should only be used for Vector reallocation |
550 // Assuming 'other' is to be destroyed, we transfer m_image ownership | 564 // Assuming 'other' is to be destroyed, we transfer m_image ownership |
551 // rather than do a refcount dance. | 565 // rather than do a refcount dance. |
552 memcpy(&m_mailbox, &other.m_mailbox, sizeof(m_mailbox)); | 566 memcpy(&m_mailbox, &other.m_mailbox, sizeof(m_mailbox)); |
553 m_image = const_cast<MailboxInfo*>(&other)->m_image.release(); | 567 m_image = const_cast<MailboxInfo*>(&other)->m_image.release(); |
554 m_status = other.m_status; | 568 m_status = other.m_status; |
555 } | 569 } |
556 | 570 |
557 } | 571 } |
OLD | NEW |