| 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 "cc/resources/resource_provider.h" | 5 #include "cc/resources/resource_provider.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 1349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1360 DCHECK(!delegated_sync_points_required_ || | 1360 DCHECK(!delegated_sync_points_required_ || |
| 1361 Resource::LOCALLY_USED != resource->synchronization_state()); | 1361 Resource::LOCALLY_USED != resource->synchronization_state()); |
| 1362 | 1362 |
| 1363 resources.push_back(resource); | 1363 resources.push_back(resource); |
| 1364 } | 1364 } |
| 1365 | 1365 |
| 1366 // Lazily create any mailboxes and verify all unverified sync tokens. | 1366 // Lazily create any mailboxes and verify all unverified sync tokens. |
| 1367 std::vector<GLbyte*> unverified_sync_tokens; | 1367 std::vector<GLbyte*> unverified_sync_tokens; |
| 1368 std::vector<Resource*> need_synchronization_resources; | 1368 std::vector<Resource*> need_synchronization_resources; |
| 1369 for (Resource* resource : resources) { | 1369 for (Resource* resource : resources) { |
| 1370 if (!IsGpuResourceType(resource->type)) |
| 1371 continue; |
| 1372 |
| 1370 CreateMailboxAndBindResource(gl, resource); | 1373 CreateMailboxAndBindResource(gl, resource); |
| 1371 | 1374 |
| 1372 if (delegated_sync_points_required_ && resource->needs_sync_token()) { | 1375 if (delegated_sync_points_required_) { |
| 1373 need_synchronization_resources.push_back(resource); | 1376 if (resource->needs_sync_token()) { |
| 1374 } else if (resource->mailbox().HasSyncToken() && | 1377 need_synchronization_resources.push_back(resource); |
| 1375 !resource->mailbox().sync_token().verified_flush()) { | 1378 } else if (resource->mailbox().HasSyncToken() && |
| 1376 unverified_sync_tokens.push_back(resource->GetSyncTokenData()); | 1379 !resource->mailbox().sync_token().verified_flush()) { |
| 1380 unverified_sync_tokens.push_back(resource->GetSyncTokenData()); |
| 1381 } |
| 1377 } | 1382 } |
| 1378 } | 1383 } |
| 1379 | 1384 |
| 1380 // Insert sync point to synchronize the mailbox creation or bound textures. | 1385 // Insert sync point to synchronize the mailbox creation or bound textures. |
| 1381 gpu::SyncToken new_sync_token; | 1386 gpu::SyncToken new_sync_token; |
| 1382 if (gl) { | 1387 if (!need_synchronization_resources.empty()) { |
| 1383 if (!need_synchronization_resources.empty()) { | 1388 DCHECK(delegated_sync_points_required_); |
| 1384 const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); | 1389 DCHECK(gl); |
| 1385 gl->OrderingBarrierCHROMIUM(); | 1390 const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); |
| 1386 gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, new_sync_token.GetData()); | 1391 gl->OrderingBarrierCHROMIUM(); |
| 1387 unverified_sync_tokens.push_back(new_sync_token.GetData()); | 1392 gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, new_sync_token.GetData()); |
| 1388 } | 1393 unverified_sync_tokens.push_back(new_sync_token.GetData()); |
| 1394 } |
| 1389 | 1395 |
| 1390 if (!unverified_sync_tokens.empty()) { | 1396 if (!unverified_sync_tokens.empty()) { |
| 1391 gl->VerifySyncTokensCHROMIUM(unverified_sync_tokens.data(), | 1397 DCHECK(delegated_sync_points_required_); |
| 1392 unverified_sync_tokens.size()); | 1398 DCHECK(gl); |
| 1393 } | 1399 gl->VerifySyncTokensCHROMIUM(unverified_sync_tokens.data(), |
| 1400 unverified_sync_tokens.size()); |
| 1394 } | 1401 } |
| 1402 |
| 1403 // Set sync token after verification. |
| 1395 for (Resource* resource : need_synchronization_resources) { | 1404 for (Resource* resource : need_synchronization_resources) { |
| 1405 DCHECK(IsGpuResourceType(resource->type)); |
| 1396 resource->UpdateSyncToken(new_sync_token); | 1406 resource->UpdateSyncToken(new_sync_token); |
| 1397 resource->SetSynchronized(); | 1407 resource->SetSynchronized(); |
| 1398 } | 1408 } |
| 1399 | 1409 |
| 1400 // Transfer Resources | 1410 // Transfer Resources |
| 1401 DCHECK_EQ(resources.size(), resource_ids.size()); | 1411 DCHECK_EQ(resources.size(), resource_ids.size()); |
| 1402 for (size_t i = 0; i < resources.size(); ++i) { | 1412 for (size_t i = 0; i < resources.size(); ++i) { |
| 1403 Resource* source = resources[i]; | 1413 Resource* source = resources[i]; |
| 1404 const ResourceId id = resource_ids[i]; | 1414 const ResourceId id = resource_ids[i]; |
| 1405 | 1415 |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1543 for (const auto& children : resources_for_child) { | 1553 for (const auto& children : resources_for_child) { |
| 1544 ChildMap::iterator child_it = children_.find(children.first); | 1554 ChildMap::iterator child_it = children_.find(children.first); |
| 1545 DCHECK(child_it != children_.end()); | 1555 DCHECK(child_it != children_.end()); |
| 1546 DeleteAndReturnUnusedResourcesToChild(child_it, NORMAL, children.second); | 1556 DeleteAndReturnUnusedResourcesToChild(child_it, NORMAL, children.second); |
| 1547 } | 1557 } |
| 1548 } | 1558 } |
| 1549 | 1559 |
| 1550 void ResourceProvider::CreateMailboxAndBindResource( | 1560 void ResourceProvider::CreateMailboxAndBindResource( |
| 1551 gpu::gles2::GLES2Interface* gl, | 1561 gpu::gles2::GLES2Interface* gl, |
| 1552 Resource* resource) { | 1562 Resource* resource) { |
| 1553 if (resource->type != RESOURCE_TYPE_BITMAP) { | 1563 DCHECK(IsGpuResourceType(resource->type)); |
| 1554 if (!resource->mailbox().IsValid()) { | 1564 DCHECK(gl); |
| 1555 LazyCreate(resource); | |
| 1556 | 1565 |
| 1557 gpu::MailboxHolder mailbox_holder; | 1566 if (!resource->mailbox().IsValid()) { |
| 1558 mailbox_holder.texture_target = resource->target; | 1567 LazyCreate(resource); |
| 1559 gl->GenMailboxCHROMIUM(mailbox_holder.mailbox.name); | |
| 1560 gl->ProduceTextureDirectCHROMIUM(resource->gl_id, | |
| 1561 mailbox_holder.texture_target, | |
| 1562 mailbox_holder.mailbox.name); | |
| 1563 resource->set_mailbox(TextureMailbox(mailbox_holder)); | |
| 1564 } | |
| 1565 | 1568 |
| 1566 if (resource->image_id && resource->dirty_image) { | 1569 gpu::MailboxHolder mailbox_holder; |
| 1567 DCHECK(resource->gl_id); | 1570 mailbox_holder.texture_target = resource->target; |
| 1568 DCHECK(resource->origin == Resource::INTERNAL); | 1571 gl->GenMailboxCHROMIUM(mailbox_holder.mailbox.name); |
| 1569 BindImageForSampling(resource); | 1572 gl->ProduceTextureDirectCHROMIUM(resource->gl_id, |
| 1570 } | 1573 mailbox_holder.texture_target, |
| 1574 mailbox_holder.mailbox.name); |
| 1575 resource->set_mailbox(TextureMailbox(mailbox_holder)); |
| 1576 } |
| 1577 |
| 1578 if (resource->image_id && resource->dirty_image) { |
| 1579 DCHECK(resource->gl_id); |
| 1580 DCHECK(resource->origin == Resource::INTERNAL); |
| 1581 BindImageForSampling(resource); |
| 1571 } | 1582 } |
| 1572 } | 1583 } |
| 1573 | 1584 |
| 1574 void ResourceProvider::TransferResource(Resource* source, | 1585 void ResourceProvider::TransferResource(Resource* source, |
| 1575 ResourceId id, | 1586 ResourceId id, |
| 1576 TransferableResource* resource) { | 1587 TransferableResource* resource) { |
| 1577 DCHECK(!source->locked_for_write); | 1588 DCHECK(!source->locked_for_write); |
| 1578 DCHECK(!source->lock_for_read_count); | 1589 DCHECK(!source->lock_for_read_count); |
| 1579 DCHECK(source->origin != Resource::EXTERNAL || source->mailbox().IsValid()); | 1590 DCHECK(source->origin != Resource::EXTERNAL || source->mailbox().IsValid()); |
| 1580 DCHECK(source->allocated); | 1591 DCHECK(source->allocated); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1607 const ResourceIdArray& unused) { | 1618 const ResourceIdArray& unused) { |
| 1608 DCHECK(thread_checker_.CalledOnValidThread()); | 1619 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1609 DCHECK(child_it != children_.end()); | 1620 DCHECK(child_it != children_.end()); |
| 1610 Child* child_info = &child_it->second; | 1621 Child* child_info = &child_it->second; |
| 1611 | 1622 |
| 1612 if (unused.empty() && !child_info->marked_for_deletion) | 1623 if (unused.empty() && !child_info->marked_for_deletion) |
| 1613 return; | 1624 return; |
| 1614 | 1625 |
| 1615 ReturnedResourceArray to_return; | 1626 ReturnedResourceArray to_return; |
| 1616 to_return.reserve(unused.size()); | 1627 to_return.reserve(unused.size()); |
| 1628 std::vector<ReturnedResource*> need_synchronization_resources; |
| 1617 std::vector<GLbyte*> unverified_sync_tokens; | 1629 std::vector<GLbyte*> unverified_sync_tokens; |
| 1618 | 1630 |
| 1619 bool need_sync_token = false; | |
| 1620 GLES2Interface* gl = ContextGL(); | 1631 GLES2Interface* gl = ContextGL(); |
| 1632 |
| 1621 for (ResourceId local_id : unused) { | 1633 for (ResourceId local_id : unused) { |
| 1622 ResourceMap::iterator it = resources_.find(local_id); | 1634 ResourceMap::iterator it = resources_.find(local_id); |
| 1623 CHECK(it != resources_.end()); | 1635 CHECK(it != resources_.end()); |
| 1624 Resource& resource = it->second; | 1636 Resource& resource = it->second; |
| 1625 | 1637 |
| 1626 DCHECK(!resource.locked_for_write); | 1638 DCHECK(!resource.locked_for_write); |
| 1627 DCHECK(child_info->parent_to_child_map.count(local_id)); | 1639 DCHECK(child_info->parent_to_child_map.count(local_id)); |
| 1628 | 1640 |
| 1629 ResourceId child_id = child_info->parent_to_child_map[local_id]; | 1641 ResourceId child_id = child_info->parent_to_child_map[local_id]; |
| 1630 DCHECK(child_info->child_to_parent_map.count(child_id)); | 1642 DCHECK(child_info->child_to_parent_map.count(child_id)); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1644 // the branch above too, where the resource is locked or still exported. | 1656 // the branch above too, where the resource is locked or still exported. |
| 1645 if (style != FOR_SHUTDOWN && !child_info->marked_for_deletion) { | 1657 if (style != FOR_SHUTDOWN && !child_info->marked_for_deletion) { |
| 1646 // Defer this resource deletion. | 1658 // Defer this resource deletion. |
| 1647 resource.marked_for_deletion = true; | 1659 resource.marked_for_deletion = true; |
| 1648 continue; | 1660 continue; |
| 1649 } | 1661 } |
| 1650 // We can't postpone the deletion, so we'll have to lose it. | 1662 // We can't postpone the deletion, so we'll have to lose it. |
| 1651 is_lost = true; | 1663 is_lost = true; |
| 1652 } | 1664 } |
| 1653 | 1665 |
| 1654 if (gl && resource.filter != resource.original_filter) { | 1666 if (IsGpuResourceType(resource.type) && |
| 1667 resource.filter != resource.original_filter) { |
| 1655 DCHECK(resource.target); | 1668 DCHECK(resource.target); |
| 1656 DCHECK(resource.gl_id); | 1669 DCHECK(resource.gl_id); |
| 1657 | 1670 DCHECK(gl); |
| 1658 gl->BindTexture(resource.target, resource.gl_id); | 1671 gl->BindTexture(resource.target, resource.gl_id); |
| 1659 gl->TexParameteri(resource.target, GL_TEXTURE_MIN_FILTER, | 1672 gl->TexParameteri(resource.target, GL_TEXTURE_MIN_FILTER, |
| 1660 resource.original_filter); | 1673 resource.original_filter); |
| 1661 gl->TexParameteri(resource.target, GL_TEXTURE_MAG_FILTER, | 1674 gl->TexParameteri(resource.target, GL_TEXTURE_MAG_FILTER, |
| 1662 resource.original_filter); | 1675 resource.original_filter); |
| 1663 resource.SetLocallyUsed(); | 1676 resource.SetLocallyUsed(); |
| 1664 } | 1677 } |
| 1665 | 1678 |
| 1666 ReturnedResource returned; | 1679 ReturnedResource returned; |
| 1667 returned.id = child_id; | 1680 returned.id = child_id; |
| 1668 if (resource.needs_sync_token()) | 1681 returned.sync_token = resource.mailbox().sync_token(); |
| 1669 need_sync_token = true; | |
| 1670 else | |
| 1671 returned.sync_token = resource.mailbox().sync_token(); | |
| 1672 | |
| 1673 returned.count = resource.imported_count; | 1682 returned.count = resource.imported_count; |
| 1674 returned.lost = is_lost; | 1683 returned.lost = is_lost; |
| 1675 to_return.push_back(returned); | 1684 to_return.push_back(returned); |
| 1676 | 1685 |
| 1686 if (IsGpuResourceType(resource.type) && child_info->needs_sync_tokens) { |
| 1687 if (resource.needs_sync_token()) { |
| 1688 need_synchronization_resources.push_back(&to_return.back()); |
| 1689 } else if (returned.sync_token.HasData() && |
| 1690 !returned.sync_token.verified_flush()) { |
| 1691 // Before returning any sync tokens, they must be verified. |
| 1692 unverified_sync_tokens.push_back(returned.sync_token.GetData()); |
| 1693 } |
| 1694 } |
| 1695 |
| 1677 child_info->parent_to_child_map.erase(local_id); | 1696 child_info->parent_to_child_map.erase(local_id); |
| 1678 child_info->child_to_parent_map.erase(child_id); | 1697 child_info->child_to_parent_map.erase(child_id); |
| 1679 resource.imported_count = 0; | 1698 resource.imported_count = 0; |
| 1680 DeleteResourceInternal(it, style); | 1699 DeleteResourceInternal(it, style); |
| 1681 | |
| 1682 // Before returning any sync tokens, they must be verified. Note that we | |
| 1683 // need to verify the sync token inside of the "to_return" array. | |
| 1684 if (to_return.back().sync_token.HasData() && | |
| 1685 !to_return.back().sync_token.verified_flush()) { | |
| 1686 unverified_sync_tokens.push_back(to_return.back().sync_token.GetData()); | |
| 1687 } | |
| 1688 } | 1700 } |
| 1689 | 1701 |
| 1690 gpu::SyncToken new_sync_token; | 1702 gpu::SyncToken new_sync_token; |
| 1691 if (need_sync_token && child_info->needs_sync_tokens) { | 1703 if (!need_synchronization_resources.empty()) { |
| 1704 DCHECK(child_info->needs_sync_tokens); |
| 1692 DCHECK(gl); | 1705 DCHECK(gl); |
| 1693 const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); | 1706 const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); |
| 1694 gl->OrderingBarrierCHROMIUM(); | 1707 gl->OrderingBarrierCHROMIUM(); |
| 1695 gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, new_sync_token.GetData()); | 1708 gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, new_sync_token.GetData()); |
| 1696 unverified_sync_tokens.push_back(new_sync_token.GetData()); | 1709 unverified_sync_tokens.push_back(new_sync_token.GetData()); |
| 1697 } | 1710 } |
| 1698 | 1711 |
| 1699 if (!unverified_sync_tokens.empty()) { | 1712 if (!unverified_sync_tokens.empty()) { |
| 1713 DCHECK(child_info->needs_sync_tokens); |
| 1700 DCHECK(gl); | 1714 DCHECK(gl); |
| 1701 gl->VerifySyncTokensCHROMIUM(unverified_sync_tokens.data(), | 1715 gl->VerifySyncTokensCHROMIUM(unverified_sync_tokens.data(), |
| 1702 unverified_sync_tokens.size()); | 1716 unverified_sync_tokens.size()); |
| 1703 } | 1717 } |
| 1704 | 1718 |
| 1705 if (new_sync_token.HasData()) { | 1719 // Set sync token after verification. |
| 1706 DCHECK(need_sync_token && child_info->needs_sync_tokens); | 1720 for (ReturnedResource* returned : need_synchronization_resources) |
| 1707 for (ReturnedResource& returned_resource : to_return) { | 1721 returned->sync_token = new_sync_token; |
| 1708 if (!returned_resource.sync_token.HasData()) | |
| 1709 returned_resource.sync_token = new_sync_token; | |
| 1710 } | |
| 1711 } | |
| 1712 | 1722 |
| 1713 if (!to_return.empty()) | 1723 if (!to_return.empty()) |
| 1714 child_info->return_callback.Run(to_return, | 1724 child_info->return_callback.Run(to_return, |
| 1715 blocking_main_thread_task_runner_); | 1725 blocking_main_thread_task_runner_); |
| 1716 | 1726 |
| 1717 if (child_info->marked_for_deletion && | 1727 if (child_info->marked_for_deletion && |
| 1718 child_info->parent_to_child_map.empty()) { | 1728 child_info->parent_to_child_map.empty()) { |
| 1719 DCHECK(child_info->child_to_parent_map.empty()); | 1729 DCHECK(child_info->child_to_parent_map.empty()); |
| 1720 children_.erase(child_it); | 1730 children_.erase(child_it); |
| 1721 } | 1731 } |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1977 | 1987 |
| 1978 const int kImportance = 2; | 1988 const int kImportance = 2; |
| 1979 pmd->CreateSharedGlobalAllocatorDump(guid); | 1989 pmd->CreateSharedGlobalAllocatorDump(guid); |
| 1980 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); | 1990 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); |
| 1981 } | 1991 } |
| 1982 | 1992 |
| 1983 return true; | 1993 return true; |
| 1984 } | 1994 } |
| 1985 | 1995 |
| 1986 } // namespace cc | 1996 } // namespace cc |
| OLD | NEW |