Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 "config.h" | 5 #include "config.h" |
| 6 | 6 |
| 7 #include "cc/resource_provider.h" | 7 #include "cc/resource_provider.h" |
| 8 | 8 |
| 9 #include <limits.h> | 9 #include <limits.h> |
| 10 | 10 |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 171 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL _CLAMP_TO_EDGE)); | 171 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL _CLAMP_TO_EDGE)); |
| 172 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE)); | 172 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE)); |
| 173 | 173 |
| 174 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) | 174 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) |
| 175 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_ ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | 175 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_ ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
| 176 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { | 176 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { |
| 177 GLenum storageFormat = textureToStorageFormat(format); | 177 GLenum storageFormat = textureToStorageFormat(format); |
| 178 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma t, size.width(), size.height())); | 178 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma t, size.width(), size.height())); |
| 179 } else | 179 } else |
| 180 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); | 180 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); |
| 181 | |
| 181 ResourceId id = m_nextId++; | 182 ResourceId id = m_nextId++; |
| 182 Resource resource(textureId, pool, size, format); | 183 Resource resource(textureId, pool, size, format); |
| 183 m_resources[id] = resource; | 184 m_resources[id] = resource; |
| 184 return id; | 185 return id; |
| 185 } | 186 } |
| 186 | 187 |
| 187 ResourceProvider::ResourceId ResourceProvider::createBitmap(int pool, const gfx: :Size& size) | 188 ResourceProvider::ResourceId ResourceProvider::createBitmap(int pool, const gfx: :Size& size) |
| 188 { | 189 { |
| 189 DCHECK(Proxy::isImplThread()); | 190 DCHECK(Proxy::isImplThread()); |
| 190 | 191 |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 531 return child; | 532 return child; |
| 532 } | 533 } |
| 533 | 534 |
| 534 void ResourceProvider::destroyChild(int child) | 535 void ResourceProvider::destroyChild(int child) |
| 535 { | 536 { |
| 536 DCHECK(Proxy::isImplThread()); | 537 DCHECK(Proxy::isImplThread()); |
| 537 ChildMap::iterator it = m_children.find(child); | 538 ChildMap::iterator it = m_children.find(child); |
| 538 DCHECK(it != m_children.end()); | 539 DCHECK(it != m_children.end()); |
| 539 deleteOwnedResources(it->second.pool); | 540 deleteOwnedResources(it->second.pool); |
| 540 m_children.erase(it); | 541 m_children.erase(it); |
| 541 trimMailboxDeque(); | |
| 542 } | 542 } |
| 543 | 543 |
| 544 const ResourceProvider::ResourceIdMap& ResourceProvider::getChildToParentMap(int child) const | 544 const ResourceProvider::ResourceIdMap& ResourceProvider::getChildToParentMap(int child) const |
| 545 { | 545 { |
| 546 DCHECK(Proxy::isImplThread()); | 546 DCHECK(Proxy::isImplThread()); |
| 547 ChildMap::const_iterator it = m_children.find(child); | 547 ChildMap::const_iterator it = m_children.find(child); |
| 548 DCHECK(it != m_children.end()); | 548 DCHECK(it != m_children.end()); |
| 549 return it->second.childToParentMap; | 549 return it->second.childToParentMap; |
| 550 } | 550 } |
| 551 | 551 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 614 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); | 614 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); |
| 615 } | 615 } |
| 616 Child& childInfo = m_children.find(child)->second; | 616 Child& childInfo = m_children.find(child)->second; |
| 617 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) { | 617 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) { |
| 618 unsigned textureId; | 618 unsigned textureId; |
| 619 GLC(context3d, textureId = context3d->createTexture()); | 619 GLC(context3d, textureId = context3d->createTexture()); |
| 620 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); | 620 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
| 621 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name)); | 621 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name)); |
| 622 ResourceId id = m_nextId++; | 622 ResourceId id = m_nextId++; |
| 623 Resource resource(textureId, childInfo.pool, it->size, it->format); | 623 Resource resource(textureId, childInfo.pool, it->size, it->format); |
| 624 resource.mailbox.setName(it->mailbox.name); | |
| 624 m_resources[id] = resource; | 625 m_resources[id] = resource; |
| 625 m_mailboxes.push_back(it->mailbox); | |
| 626 childInfo.parentToChildMap[id] = it->id; | 626 childInfo.parentToChildMap[id] = it->id; |
| 627 childInfo.childToParentMap[it->id] = id; | 627 childInfo.childToParentMap[it->id] = id; |
| 628 } | 628 } |
| 629 } | 629 } |
| 630 | 630 |
| 631 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc es) | 631 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc es) |
| 632 { | 632 { |
| 633 DCHECK(Proxy::isImplThread()); | 633 DCHECK(Proxy::isImplThread()); |
| 634 WebGraphicsContext3D* context3d = m_context->context3D(); | 634 WebGraphicsContext3D* context3d = m_context->context3D(); |
| 635 if (!context3d || !context3d->makeContextCurrent()) { | 635 if (!context3d || !context3d->makeContextCurrent()) { |
| 636 // FIXME: Implement this path for software compositing. | 636 // FIXME: Implement this path for software compositing. |
| 637 return; | 637 return; |
| 638 } | 638 } |
| 639 if (resources.sync_point) | 639 if (resources.sync_point) |
| 640 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); | 640 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); |
| 641 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) { | 641 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) { |
| 642 ResourceMap::iterator mapIterator = m_resources.find(it->id); | 642 ResourceMap::iterator mapIterator = m_resources.find(it->id); |
| 643 DCHECK(mapIterator != m_resources.end()); | 643 DCHECK(mapIterator != m_resources.end()); |
| 644 Resource* resource = &mapIterator->second; | 644 Resource* resource = &mapIterator->second; |
| 645 DCHECK(resource->exported); | 645 DCHECK(resource->exported); |
| 646 resource->exported = false; | 646 resource->exported = false; |
| 647 resource->mailbox.setName(it->mailbox.name); | |
| 647 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); | 648 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); |
| 648 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name)); | 649 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name)); |
| 649 m_mailboxes.push_back(it->mailbox); | |
| 650 if (resource->markedForDeletion) | 650 if (resource->markedForDeletion) |
| 651 deleteResourceInternal(mapIterator); | 651 deleteResourceInternal(mapIterator); |
| 652 } | 652 } |
| 653 } | 653 } |
| 654 | 654 |
| 655 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI d id, TransferableResource* resource) | 655 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI d id, TransferableResource* resource) |
| 656 { | 656 { |
| 657 DCHECK(Proxy::isImplThread()); | 657 DCHECK(Proxy::isImplThread()); |
| 658 ResourceMap::const_iterator it = m_resources.find(id); | 658 WebGraphicsContext3D* context3d = m_context->context3D(); |
| 659 ResourceMap::iterator it = m_resources.find(id); | |
| 659 CHECK(it != m_resources.end()); | 660 CHECK(it != m_resources.end()); |
| 660 const Resource* source = &it->second; | 661 Resource* source = &it->second; |
| 661 DCHECK(!source->lockedForWrite); | 662 DCHECK(!source->lockedForWrite); |
| 662 DCHECK(!source->lockForReadCount); | 663 DCHECK(!source->lockForReadCount); |
| 663 DCHECK(!source->external); | 664 DCHECK(!source->external); |
| 664 if (source->exported) | 665 if (source->exported) |
| 665 return false; | 666 return false; |
| 666 resource->id = id; | 667 resource->id = id; |
| 667 resource->format = source->format; | 668 resource->format = source->format; |
| 668 resource->size = source->size; | 669 resource->size = source->size; |
| 669 if (!m_mailboxes.empty()) { | 670 |
| 670 resource->mailbox = m_mailboxes.front(); | 671 if (source->mailbox.isZero()) { |
| 671 m_mailboxes.pop_front(); | 672 GLbyte name[GL_MAILBOX_SIZE_CHROMIUM]; |
| 673 GLC(context3d, context3d->genMailboxCHROMIUM(name)); | |
|
apatrick_chromium
2012/11/08 21:36:09
Counting the needed mailboxes is obviously possibl
| |
| 674 source->mailbox.setName(name); | |
| 672 } | 675 } |
| 673 else | 676 |
| 674 GLC(context, context->genMailboxCHROMIUM(resource->mailbox.name)); | 677 resource->mailbox = source->mailbox; |
| 675 GLC(context, context->bindTexture(GL_TEXTURE_2D, source->glId)); | 678 GLC(context, context->bindTexture(GL_TEXTURE_2D, source->glId)); |
| 676 GLC(context, context->produceTextureCHROMIUM(GL_TEXTURE_2D, resource->mailbo x.name)); | 679 GLC(context, context->produceTextureCHROMIUM(GL_TEXTURE_2D, resource->mailbo x.name)); |
| 677 return true; | 680 return true; |
| 678 } | 681 } |
| 679 | 682 |
| 680 void ResourceProvider::trimMailboxDeque() | |
| 681 { | |
| 682 // Trim the mailbox deque to the maximum number of resources we may need to | |
| 683 // send. | |
| 684 // If we have a parent, any non-external resource not already transfered is | |
| 685 // eligible to be sent to the parent. Otherwise, all resources belonging to | |
| 686 // a child might need to be sent back to the child. | |
| 687 size_t maxMailboxCount = 0; | |
| 688 if (m_context->capabilities().hasParentCompositor) { | |
| 689 for (ResourceMap::iterator it = m_resources.begin(); it != m_resources.e nd(); ++it) { | |
| 690 if (!it->second.exported && !it->second.external) | |
| 691 ++maxMailboxCount; | |
| 692 } | |
| 693 } else { | |
| 694 base::hash_set<int> childPoolSet; | |
| 695 for (ChildMap::iterator it = m_children.begin(); it != m_children.end(); ++it) | |
| 696 childPoolSet.insert(it->second.pool); | |
| 697 for (ResourceMap::iterator it = m_resources.begin(); it != m_resources.e nd(); ++it) { | |
| 698 if (ContainsKey(childPoolSet, it->second.pool)) | |
| 699 ++maxMailboxCount; | |
| 700 } | |
| 701 } | |
| 702 while (m_mailboxes.size() > maxMailboxCount) | |
| 703 m_mailboxes.pop_front(); | |
| 704 } | |
| 705 | |
| 706 void ResourceProvider::debugNotifyEnterZone(unsigned int zone) | 683 void ResourceProvider::debugNotifyEnterZone(unsigned int zone) |
| 707 { | 684 { |
| 708 g_debugZone = zone; | 685 g_debugZone = zone; |
| 709 } | 686 } |
| 710 | 687 |
| 711 void ResourceProvider::debugNotifyLeaveZone() | 688 void ResourceProvider::debugNotifyLeaveZone() |
| 712 { | 689 { |
| 713 g_debugZone = 0; | 690 g_debugZone = 0; |
| 714 } | 691 } |
| 715 | 692 |
| 716 | 693 |
| 717 } // namespace cc | 694 } // namespace cc |
| OLD | NEW |