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

Side by Side Diff: cc/CCResourceProvider.cpp

Issue 10915298: Add CCDelegatingRenderer, and corresponding IPCs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge fix Created 8 years, 2 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 | Annotate | Revision Log
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 "CCResourceProvider.h" 7 #include "CCResourceProvider.h"
8 #ifdef LOG 8 #ifdef LOG
9 #undef LOG 9 #undef LOG
10 #endif 10 #endif
11 11
12 #include <limits.h> 12 #include <limits.h>
13 13
14 #include "base/debug/alias.h" 14 #include "base/debug/alias.h"
15 #include "base/string_split.h" 15 #include "base/string_split.h"
16 #include "base/string_util.h" 16 #include "base/string_util.h"
17 #include "cc/transferable_resource.h"
17 #include "CCProxy.h" 18 #include "CCProxy.h"
18 #include "CCRendererGL.h" // For the GLC() macro. 19 #include "CCRendererGL.h" // For the GLC() macro.
19 #include "Extensions3DChromium.h" 20 #include "Extensions3DChromium.h"
20 #include "IntRect.h" 21 #include "IntRect.h"
21 #include "LayerTextureSubImage.h" 22 #include "LayerTextureSubImage.h"
22 #include "ThrottledTextureUploader.h" 23 #include "ThrottledTextureUploader.h"
23 #include "UnthrottledTextureUploader.h" 24 #include "UnthrottledTextureUploader.h"
24 #include <public/WebGraphicsContext3D.h> 25 #include <public/WebGraphicsContext3D.h>
25 #include <wtf/HashSet.h> 26 #include <wtf/HashSet.h>
26 27
(...skipping 16 matching lines...) Expand all
43 } 44 }
44 45
45 return storageFormat; 46 return storageFormat;
46 } 47 }
47 48
48 static bool isTextureFormatSupportedForStorage(GC3Denum format) 49 static bool isTextureFormatSupportedForStorage(GC3Denum format)
49 { 50 {
50 return (format == GraphicsContext3D::RGBA || format == Extensions3D::BGRA_EX T); 51 return (format == GraphicsContext3D::RGBA || format == Extensions3D::BGRA_EX T);
51 } 52 }
52 53
53 CCResourceProvider::TransferableResourceList::TransferableResourceList()
54 {
55 }
56
57 CCResourceProvider::TransferableResourceList::~TransferableResourceList()
58 {
59 }
60
61 CCResourceProvider::Resource::Resource() 54 CCResourceProvider::Resource::Resource()
62 : glId(0) 55 : glId(0)
63 , pixels(0) 56 , pixels(0)
64 , pool(0) 57 , pool(0)
65 , lockForReadCount(0) 58 , lockForReadCount(0)
66 , lockedForWrite(false) 59 , lockedForWrite(false)
67 , external(false) 60 , external(false)
68 , exported(false) 61 , exported(false)
69 , deleted(false) 62 , deleted(false)
70 , size() 63 , size()
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 ASSERT(CCProxy::isImplThread()); 532 ASSERT(CCProxy::isImplThread());
540 ChildMap::const_iterator it = m_children.find(child); 533 ChildMap::const_iterator it = m_children.find(child);
541 ASSERT(it != m_children.end()); 534 ASSERT(it != m_children.end());
542 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE 535 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE
543 return it->value.childToParentMap; 536 return it->value.childToParentMap;
544 #else 537 #else
545 return it->second.childToParentMap; 538 return it->second.childToParentMap;
546 #endif 539 #endif
547 } 540 }
548 541
549 CCResourceProvider::TransferableResourceList CCResourceProvider::prepareSendToPa rent(const ResourceIdArray& resources) 542 void CCResourceProvider::prepareSendToParent(const ResourceIdArray& resources, T ransferableResourceList* list)
550 { 543 {
551 ASSERT(CCProxy::isImplThread()); 544 ASSERT(CCProxy::isImplThread());
552 TransferableResourceList list; 545 list->sync_point = 0;
553 list.syncPoint = 0; 546 list->resources.clear();
554 WebGraphicsContext3D* context3d = m_context->context3D(); 547 WebGraphicsContext3D* context3d = m_context->context3D();
555 if (!context3d || !context3d->makeContextCurrent()) { 548 if (!context3d || !context3d->makeContextCurrent()) {
556 // FIXME: Implement this path for software compositing. 549 // FIXME: Implement this path for software compositing.
557 return list; 550 return;
558 } 551 }
559 for (ResourceIdArray::const_iterator it = resources.begin(); it != resources .end(); ++it) { 552 for (ResourceIdArray::const_iterator it = resources.begin(); it != resources .end(); ++it) {
560 TransferableResource resource; 553 TransferableResource resource;
561 if (transferResource(context3d, *it, &resource)) { 554 if (transferResource(context3d, *it, &resource)) {
562 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE 555 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE
563 m_resources.find(*it)->value.exported = true; 556 m_resources.find(*it)->value.exported = true;
564 #else 557 #else
565 m_resources.find(*it)->second.exported = true; 558 m_resources.find(*it)->second.exported = true;
566 #endif 559 #endif
567 list.resources.append(resource); 560 list->resources.push_back(resource);
568 } 561 }
569 } 562 }
570 if (list.resources.size()) 563 if (list->resources.size())
571 list.syncPoint = context3d->insertSyncPoint(); 564 list->sync_point = context3d->insertSyncPoint();
572 return list;
573 } 565 }
574 566
575 CCResourceProvider::TransferableResourceList CCResourceProvider::prepareSendToCh ild(int child, const ResourceIdArray& resources) 567 void CCResourceProvider::prepareSendToChild(int child, const ResourceIdArray& re sources, TransferableResourceList* list)
576 { 568 {
577 ASSERT(CCProxy::isImplThread()); 569 ASSERT(CCProxy::isImplThread());
578 TransferableResourceList list; 570 list->sync_point = 0;
579 list.syncPoint = 0; 571 list->resources.clear();
580 WebGraphicsContext3D* context3d = m_context->context3D(); 572 WebGraphicsContext3D* context3d = m_context->context3D();
581 if (!context3d || !context3d->makeContextCurrent()) { 573 if (!context3d || !context3d->makeContextCurrent()) {
582 // FIXME: Implement this path for software compositing. 574 // FIXME: Implement this path for software compositing.
583 return list; 575 return;
584 } 576 }
585 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE 577 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE
586 Child& childInfo = m_children.find(child)->value; 578 Child& childInfo = m_children.find(child)->value;
587 #else 579 #else
588 Child& childInfo = m_children.find(child)->second; 580 Child& childInfo = m_children.find(child)->second;
589 #endif 581 #endif
590 for (ResourceIdArray::const_iterator it = resources.begin(); it != resources .end(); ++it) { 582 for (ResourceIdArray::const_iterator it = resources.begin(); it != resources .end(); ++it) {
591 TransferableResource resource; 583 TransferableResource resource;
592 if (!transferResource(context3d, *it, &resource)) 584 if (!transferResource(context3d, *it, &resource))
593 ASSERT_NOT_REACHED(); 585 ASSERT_NOT_REACHED();
594 resource.id = childInfo.parentToChildMap.get(*it); 586 resource.id = childInfo.parentToChildMap.get(*it);
595 childInfo.parentToChildMap.remove(*it); 587 childInfo.parentToChildMap.remove(*it);
596 childInfo.childToParentMap.remove(resource.id); 588 childInfo.childToParentMap.remove(resource.id);
597 list.resources.append(resource); 589 list->resources.push_back(resource);
598 deleteResource(*it); 590 deleteResource(*it);
599 } 591 }
600 if (list.resources.size()) 592 if (list->resources.size())
601 list.syncPoint = context3d->insertSyncPoint(); 593 list->sync_point = context3d->insertSyncPoint();
602 return list;
603 } 594 }
604 595
605 void CCResourceProvider::receiveFromChild(int child, const TransferableResourceL ist& resources) 596 void CCResourceProvider::receiveFromChild(int child, const TransferableResourceL ist& resources)
606 { 597 {
607 ASSERT(CCProxy::isImplThread()); 598 ASSERT(CCProxy::isImplThread());
608 WebGraphicsContext3D* context3d = m_context->context3D(); 599 WebGraphicsContext3D* context3d = m_context->context3D();
609 if (!context3d || !context3d->makeContextCurrent()) { 600 if (!context3d || !context3d->makeContextCurrent()) {
610 // FIXME: Implement this path for software compositing. 601 // FIXME: Implement this path for software compositing.
611 return; 602 return;
612 } 603 }
613 if (resources.syncPoint) { 604 if (resources.sync_point) {
614 // NOTE: If the parent is a browser and the child a renderer, the parent 605 // NOTE: If the parent is a browser and the child a renderer, the parent
615 // is not supposed to have its context wait, because that could induce 606 // is not supposed to have its context wait, because that could induce
616 // deadlocks and/or security issues. The caller is responsible for 607 // deadlocks and/or security issues. The caller is responsible for
617 // waiting asynchronously, and resetting syncPoint before calling this. 608 // waiting asynchronously, and resetting sync_point before calling this.
618 // However if the parent is a renderer (e.g. browser tag), it may be ok 609 // However if the parent is a renderer (e.g. browser tag), it may be ok
619 // (and is simpler) to wait. 610 // (and is simpler) to wait.
620 GLC(context3d, context3d->waitSyncPoint(resources.syncPoint)); 611 GLC(context3d, context3d->waitSyncPoint(resources.sync_point));
621 } 612 }
622 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE 613 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE
623 Child& childInfo = m_children.find(child)->value; 614 Child& childInfo = m_children.find(child)->value;
624 #else 615 #else
625 Child& childInfo = m_children.find(child)->second; 616 Child& childInfo = m_children.find(child)->second;
626 #endif 617 #endif
627 for (Vector<TransferableResource>::const_iterator it = resources.resources.b egin(); it != resources.resources.end(); ++it) { 618 for (std::vector<TransferableResource>::const_iterator it = resources.resour ces.begin(); it != resources.resources.end(); ++it) {
628 unsigned textureId; 619 unsigned textureId;
629 GLC(context3d, textureId = context3d->createTexture()); 620 GLC(context3d, textureId = context3d->createTexture());
630 GLC(context3d, context3d->bindTexture(GraphicsContext3D::TEXTURE_2D, tex tureId)); 621 GLC(context3d, context3d->bindTexture(GraphicsContext3D::TEXTURE_2D, tex tureId));
631 GLC(context3d, context3d->consumeTextureCHROMIUM(GraphicsContext3D::TEXT URE_2D, it->mailbox.name)); 622 GLC(context3d, context3d->consumeTextureCHROMIUM(GraphicsContext3D::TEXT URE_2D, it->mailbox.name));
632 ResourceId id = m_nextId++; 623 ResourceId id = m_nextId++;
633 Resource resource(textureId, childInfo.pool, it->size, it->format); 624 Resource resource(textureId, childInfo.pool, IntSize(it->size.width(), i t->size.height()), it->format);
634 m_resources.add(id, resource); 625 m_resources.add(id, resource);
635 m_mailboxes.append(it->mailbox); 626 m_mailboxes.append(it->mailbox);
636 childInfo.parentToChildMap.add(id, it->id); 627 childInfo.parentToChildMap.add(id, it->id);
637 childInfo.childToParentMap.add(it->id, id); 628 childInfo.childToParentMap.add(it->id, id);
638 } 629 }
639 } 630 }
640 631
641 void CCResourceProvider::receiveFromParent(const TransferableResourceList& resou rces) 632 void CCResourceProvider::receiveFromParent(const TransferableResourceList& resou rces)
642 { 633 {
643 ASSERT(CCProxy::isImplThread()); 634 ASSERT(CCProxy::isImplThread());
644 WebGraphicsContext3D* context3d = m_context->context3D(); 635 WebGraphicsContext3D* context3d = m_context->context3D();
645 if (!context3d || !context3d->makeContextCurrent()) { 636 if (!context3d || !context3d->makeContextCurrent()) {
646 // FIXME: Implement this path for software compositing. 637 // FIXME: Implement this path for software compositing.
647 return; 638 return;
648 } 639 }
649 if (resources.syncPoint) 640 if (resources.sync_point)
650 GLC(context3d, context3d->waitSyncPoint(resources.syncPoint)); 641 GLC(context3d, context3d->waitSyncPoint(resources.sync_point));
651 for (Vector<TransferableResource>::const_iterator it = resources.resources.b egin(); it != resources.resources.end(); ++it) { 642 for (std::vector<TransferableResource>::const_iterator it = resources.resour ces.begin(); it != resources.resources.end(); ++it) {
652 ResourceMap::iterator mapIterator = m_resources.find(it->id); 643 ResourceMap::iterator mapIterator = m_resources.find(it->id);
653 ASSERT(mapIterator != m_resources.end()); 644 ASSERT(mapIterator != m_resources.end());
654 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE 645 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE
655 Resource* resource = &mapIterator->value; 646 Resource* resource = &mapIterator->value;
656 #else 647 #else
657 Resource* resource = &mapIterator->second; 648 Resource* resource = &mapIterator->second;
658 #endif 649 #endif
659 ASSERT(resource->exported); 650 ASSERT(resource->exported);
660 resource->exported = false; 651 resource->exported = false;
661 GLC(context3d, context3d->bindTexture(GraphicsContext3D::TEXTURE_2D, res ource->glId)); 652 GLC(context3d, context3d->bindTexture(GraphicsContext3D::TEXTURE_2D, res ource->glId));
(...skipping 14 matching lines...) Expand all
676 #else 667 #else
677 const Resource* source = &it->second; 668 const Resource* source = &it->second;
678 #endif 669 #endif
679 ASSERT(!source->lockedForWrite); 670 ASSERT(!source->lockedForWrite);
680 ASSERT(!source->lockForReadCount); 671 ASSERT(!source->lockForReadCount);
681 ASSERT(!source->external); 672 ASSERT(!source->external);
682 if (source->exported) 673 if (source->exported)
683 return false; 674 return false;
684 resource->id = id; 675 resource->id = id;
685 resource->format = source->format; 676 resource->format = source->format;
686 resource->size = source->size; 677 resource->size = gfx::Size(source->size.height(), source->size.width());
687 if (!m_mailboxes.isEmpty()) 678 if (!m_mailboxes.isEmpty())
688 resource->mailbox = m_mailboxes.takeFirst(); 679 resource->mailbox = m_mailboxes.takeFirst();
689 else 680 else
690 GLC(context, context->genMailboxCHROMIUM(resource->mailbox.name)); 681 GLC(context, context->genMailboxCHROMIUM(resource->mailbox.name));
691 GLC(context, context->bindTexture(GraphicsContext3D::TEXTURE_2D, source->glI d)); 682 GLC(context, context->bindTexture(GraphicsContext3D::TEXTURE_2D, source->glI d));
692 GLC(context, context->produceTextureCHROMIUM(GraphicsContext3D::TEXTURE_2D, resource->mailbox.name)); 683 GLC(context, context->produceTextureCHROMIUM(GraphicsContext3D::TEXTURE_2D, resource->mailbox.name));
693 return true; 684 return true;
694 } 685 }
695 686
696 void CCResourceProvider::trimMailboxDeque() 687 void CCResourceProvider::trimMailboxDeque()
(...skipping 28 matching lines...) Expand all
725 if (childPoolSet.contains(it->second.pool)) 716 if (childPoolSet.contains(it->second.pool))
726 #endif 717 #endif
727 ++maxMailboxCount; 718 ++maxMailboxCount;
728 } 719 }
729 } 720 }
730 while (m_mailboxes.size() > maxMailboxCount) 721 while (m_mailboxes.size() > maxMailboxCount)
731 m_mailboxes.removeFirst(); 722 m_mailboxes.removeFirst();
732 } 723 }
733 724
734 } 725 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698