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

Side by Side Diff: cc/resource_provider.cc

Issue 11366123: Uber Comp: never change mailbox name associated with a texture object. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « cc/resource_provider.h ('k') | cc/resource_provider_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 , lockedForWrite(false) 67 , lockedForWrite(false)
68 , external(false) 68 , external(false)
69 , exported(false) 69 , exported(false)
70 , markedForDeletion(false) 70 , markedForDeletion(false)
71 , size() 71 , size()
72 , format(0) 72 , format(0)
73 , type(static_cast<ResourceType>(0)) 73 , type(static_cast<ResourceType>(0))
74 { 74 {
75 } 75 }
76 76
77 ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Si ze& size, GLenum format) 77 ResourceProvider::Resource::Resource(unsigned textureId, const Mailbox& mailbox, int pool, const gfx::Size& size, GLenum format)
78 : glId(textureId) 78 : glId(textureId)
79 , mailbox(mailbox)
79 , pixels(0) 80 , pixels(0)
80 , pool(pool) 81 , pool(pool)
81 , lockForReadCount(0) 82 , lockForReadCount(0)
82 , lockedForWrite(false) 83 , lockedForWrite(false)
83 , external(false) 84 , external(false)
84 , exported(false) 85 , exported(false)
85 , markedForDeletion(false) 86 , markedForDeletion(false)
86 , size(size) 87 , size(size)
87 , format(format) 88 , format(format)
88 , type(GLTexture) 89 , type(GLTexture)
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
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_S, GL _CLAMP_TO_EDGE));
172 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE)); 173 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE));
173 174
174 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) 175 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer)
175 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_ ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); 176 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_ ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE));
176 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) { 177 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) {
177 GLenum storageFormat = textureToStorageFormat(format); 178 GLenum storageFormat = textureToStorageFormat(format);
178 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma t, size.width(), size.height())); 179 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma t, size.width(), size.height()));
179 } else 180 } else
180 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0)); 181 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0));
182
183 Mailbox mailbox;
184 GLC(context3d, context3d->genMailboxCHROMIUM(mailbox.name));
piman 2012/11/07 00:49:55 I've been thinking about this more, and I'm leanin
185
181 ResourceId id = m_nextId++; 186 ResourceId id = m_nextId++;
182 Resource resource(textureId, pool, size, format); 187 Resource resource(textureId, mailbox, pool, size, format);
183 m_resources[id] = resource; 188 m_resources[id] = resource;
184 return id; 189 return id;
185 } 190 }
186 191
187 ResourceProvider::ResourceId ResourceProvider::createBitmap(int pool, const gfx: :Size& size) 192 ResourceProvider::ResourceId ResourceProvider::createBitmap(int pool, const gfx: :Size& size)
188 { 193 {
189 DCHECK(Proxy::isImplThread()); 194 DCHECK(Proxy::isImplThread());
190 195
191 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; 196 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4];
192 197
193 ResourceId id = m_nextId++; 198 ResourceId id = m_nextId++;
194 Resource resource(pixels, pool, size, GL_RGBA); 199 Resource resource(pixels, pool, size, GL_RGBA);
195 m_resources[id] = resource; 200 m_resources[id] = resource;
196 return id; 201 return id;
197 } 202 }
198 203
199 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture (unsigned textureId) 204 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture (unsigned textureId)
200 { 205 {
201 DCHECK(Proxy::isImplThread()); 206 DCHECK(Proxy::isImplThread());
202 DCHECK(m_context->context3D()); 207 WebGraphicsContext3D* context3d = m_context->context3D();
208 DCHECK(context3d);
209
210 Mailbox mailbox;
211 GLC(context3d, context3d->genMailboxCHROMIUM(mailbox.name));
piman 2012/11/07 00:49:55 We don't have to do this at all here, since we won
212
203 ResourceId id = m_nextId++; 213 ResourceId id = m_nextId++;
204 Resource resource(textureId, 0, gfx::Size(), 0); 214 Resource resource(textureId, mailbox, 0, gfx::Size(), 0);
205 resource.external = true; 215 resource.external = true;
206 m_resources[id] = resource; 216 m_resources[id] = resource;
207 return id; 217 return id;
208 } 218 }
209 219
210 void ResourceProvider::deleteResource(ResourceId id) 220 void ResourceProvider::deleteResource(ResourceId id)
211 { 221 {
212 DCHECK(Proxy::isImplThread()); 222 DCHECK(Proxy::isImplThread());
213 ResourceMap::iterator it = m_resources.find(id); 223 ResourceMap::iterator it = m_resources.find(id);
214 CHECK(it != m_resources.end()); 224 CHECK(it != m_resources.end());
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 return child; 541 return child;
532 } 542 }
533 543
534 void ResourceProvider::destroyChild(int child) 544 void ResourceProvider::destroyChild(int child)
535 { 545 {
536 DCHECK(Proxy::isImplThread()); 546 DCHECK(Proxy::isImplThread());
537 ChildMap::iterator it = m_children.find(child); 547 ChildMap::iterator it = m_children.find(child);
538 DCHECK(it != m_children.end()); 548 DCHECK(it != m_children.end());
539 deleteOwnedResources(it->second.pool); 549 deleteOwnedResources(it->second.pool);
540 m_children.erase(it); 550 m_children.erase(it);
541 trimMailboxDeque();
542 } 551 }
543 552
544 const ResourceProvider::ResourceIdMap& ResourceProvider::getChildToParentMap(int child) const 553 const ResourceProvider::ResourceIdMap& ResourceProvider::getChildToParentMap(int child) const
545 { 554 {
546 DCHECK(Proxy::isImplThread()); 555 DCHECK(Proxy::isImplThread());
547 ChildMap::const_iterator it = m_children.find(child); 556 ChildMap::const_iterator it = m_children.find(child);
548 DCHECK(it != m_children.end()); 557 DCHECK(it != m_children.end());
549 return it->second.childToParentMap; 558 return it->second.childToParentMap;
550 } 559 }
551 560
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 // (and is simpler) to wait. 622 // (and is simpler) to wait.
614 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); 623 GLC(context3d, context3d->waitSyncPoint(resources.sync_point));
615 } 624 }
616 Child& childInfo = m_children.find(child)->second; 625 Child& childInfo = m_children.find(child)->second;
617 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) { 626 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) {
618 unsigned textureId; 627 unsigned textureId;
619 GLC(context3d, textureId = context3d->createTexture()); 628 GLC(context3d, textureId = context3d->createTexture());
620 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); 629 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId));
621 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name)); 630 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name));
622 ResourceId id = m_nextId++; 631 ResourceId id = m_nextId++;
623 Resource resource(textureId, childInfo.pool, it->size, it->format); 632 Resource resource(textureId, it->mailbox, childInfo.pool, it->size, it-> format);
624 m_resources[id] = resource; 633 m_resources[id] = resource;
625 m_mailboxes.push_back(it->mailbox);
626 childInfo.parentToChildMap[id] = it->id; 634 childInfo.parentToChildMap[id] = it->id;
627 childInfo.childToParentMap[it->id] = id; 635 childInfo.childToParentMap[it->id] = id;
628 } 636 }
629 } 637 }
630 638
631 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc es) 639 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc es)
632 { 640 {
633 DCHECK(Proxy::isImplThread()); 641 DCHECK(Proxy::isImplThread());
634 WebGraphicsContext3D* context3d = m_context->context3D(); 642 WebGraphicsContext3D* context3d = m_context->context3D();
635 if (!context3d || !context3d->makeContextCurrent()) { 643 if (!context3d || !context3d->makeContextCurrent()) {
636 // FIXME: Implement this path for software compositing. 644 // FIXME: Implement this path for software compositing.
637 return; 645 return;
638 } 646 }
639 if (resources.sync_point) 647 if (resources.sync_point)
640 GLC(context3d, context3d->waitSyncPoint(resources.sync_point)); 648 GLC(context3d, context3d->waitSyncPoint(resources.sync_point));
641 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) { 649 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) {
642 ResourceMap::iterator mapIterator = m_resources.find(it->id); 650 ResourceMap::iterator mapIterator = m_resources.find(it->id);
643 DCHECK(mapIterator != m_resources.end()); 651 DCHECK(mapIterator != m_resources.end());
644 Resource* resource = &mapIterator->second; 652 Resource* resource = &mapIterator->second;
645 DCHECK(resource->exported); 653 DCHECK(resource->exported);
646 resource->exported = false; 654 resource->exported = false;
647 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId)); 655 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId));
648 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name)); 656 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name));
649 m_mailboxes.push_back(it->mailbox);
650 if (resource->markedForDeletion) 657 if (resource->markedForDeletion)
651 deleteResourceInternal(mapIterator); 658 deleteResourceInternal(mapIterator);
652 } 659 }
653 } 660 }
654 661
655 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI d id, TransferableResource* resource) 662 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI d id, TransferableResource* resource)
656 { 663 {
657 DCHECK(Proxy::isImplThread()); 664 DCHECK(Proxy::isImplThread());
658 ResourceMap::const_iterator it = m_resources.find(id); 665 ResourceMap::const_iterator it = m_resources.find(id);
659 CHECK(it != m_resources.end()); 666 CHECK(it != m_resources.end());
660 const Resource* source = &it->second; 667 const Resource* source = &it->second;
661 DCHECK(!source->lockedForWrite); 668 DCHECK(!source->lockedForWrite);
662 DCHECK(!source->lockForReadCount); 669 DCHECK(!source->lockForReadCount);
663 DCHECK(!source->external); 670 DCHECK(!source->external);
664 if (source->exported) 671 if (source->exported)
665 return false; 672 return false;
666 resource->id = id; 673 resource->id = id;
667 resource->format = source->format; 674 resource->format = source->format;
668 resource->size = source->size; 675 resource->size = source->size;
669 if (!m_mailboxes.empty()) { 676 resource->mailbox = source->mailbox;
670 resource->mailbox = m_mailboxes.front();
671 m_mailboxes.pop_front();
672 }
673 else
674 GLC(context, context->genMailboxCHROMIUM(resource->mailbox.name));
675 GLC(context, context->bindTexture(GL_TEXTURE_2D, source->glId)); 677 GLC(context, context->bindTexture(GL_TEXTURE_2D, source->glId));
676 GLC(context, context->produceTextureCHROMIUM(GL_TEXTURE_2D, resource->mailbo x.name)); 678 GLC(context, context->produceTextureCHROMIUM(GL_TEXTURE_2D, resource->mailbo x.name));
677 return true; 679 return true;
678 } 680 }
679 681
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) 682 void ResourceProvider::debugNotifyEnterZone(unsigned int zone)
707 { 683 {
708 g_debugZone = zone; 684 g_debugZone = zone;
709 } 685 }
710 686
711 void ResourceProvider::debugNotifyLeaveZone() 687 void ResourceProvider::debugNotifyLeaveZone()
712 { 688 {
713 g_debugZone = 0; 689 g_debugZone = 0;
714 } 690 }
715 691
716 692
717 } // namespace cc 693 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resource_provider.h ('k') | cc/resource_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698