| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
| (...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 792 base::Owned(release_callback.release())); | 792 base::Owned(release_callback.release())); |
| 793 resource.allow_overlay = mailbox.allow_overlay(); | 793 resource.allow_overlay = mailbox.allow_overlay(); |
| 794 return id; | 794 return id; |
| 795 } | 795 } |
| 796 | 796 |
| 797 void ResourceProvider::DeleteResource(ResourceId id) { | 797 void ResourceProvider::DeleteResource(ResourceId id) { |
| 798 DCHECK(thread_checker_.CalledOnValidThread()); | 798 DCHECK(thread_checker_.CalledOnValidThread()); |
| 799 ResourceMap::iterator it = resources_.find(id); | 799 ResourceMap::iterator it = resources_.find(id); |
| 800 CHECK(it != resources_.end()); | 800 CHECK(it != resources_.end()); |
| 801 Resource* resource = &it->second; | 801 Resource* resource = &it->second; |
| 802 DCHECK(!resource->lock_for_read_count); | |
| 803 DCHECK(!resource->marked_for_deletion); | 802 DCHECK(!resource->marked_for_deletion); |
| 804 DCHECK_EQ(resource->imported_count, 0); | 803 DCHECK_EQ(resource->imported_count, 0); |
| 805 DCHECK(resource->pending_set_pixels || !resource->locked_for_write); | 804 DCHECK(resource->pending_set_pixels || !resource->locked_for_write); |
| 806 | 805 |
| 807 if (resource->exported_count > 0) { | 806 if (resource->exported_count > 0 || resource->lock_for_read_count > 0) { |
| 808 resource->marked_for_deletion = true; | 807 resource->marked_for_deletion = true; |
| 809 return; | 808 return; |
| 810 } else { | 809 } else { |
| 811 DeleteResourceInternal(it, Normal); | 810 DeleteResourceInternal(it, Normal); |
| 812 } | 811 } |
| 813 } | 812 } |
| 814 | 813 |
| 815 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, | 814 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, |
| 816 DeleteStyle style) { | 815 DeleteStyle style) { |
| 817 TRACE_EVENT0("cc", "ResourceProvider::DeleteResourceInternal"); | 816 TRACE_EVENT0("cc", "ResourceProvider::DeleteResourceInternal"); |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1080 } | 1079 } |
| 1081 | 1080 |
| 1082 resource->lock_for_read_count++; | 1081 resource->lock_for_read_count++; |
| 1083 if (resource->enable_read_lock_fences) | 1082 if (resource->enable_read_lock_fences) |
| 1084 resource->read_lock_fence = current_read_lock_fence_; | 1083 resource->read_lock_fence = current_read_lock_fence_; |
| 1085 | 1084 |
| 1086 return resource; | 1085 return resource; |
| 1087 } | 1086 } |
| 1088 | 1087 |
| 1089 void ResourceProvider::UnlockForRead(ResourceId id) { | 1088 void ResourceProvider::UnlockForRead(ResourceId id) { |
| 1090 Resource* resource = GetResource(id); | 1089 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1090 ResourceMap::iterator it = resources_.find(id); |
| 1091 CHECK(it != resources_.end()); |
| 1092 |
| 1093 Resource* resource = &it->second; |
| 1091 DCHECK_GT(resource->lock_for_read_count, 0); | 1094 DCHECK_GT(resource->lock_for_read_count, 0); |
| 1092 DCHECK_EQ(resource->exported_count, 0); | 1095 DCHECK_EQ(resource->exported_count, 0); |
| 1093 resource->lock_for_read_count--; | 1096 resource->lock_for_read_count--; |
| 1097 if (resource->marked_for_deletion && !resource->lock_for_read_count) { |
| 1098 if (!resource->child_id) { |
| 1099 // The resource belongs to this ResourceProvider, so it can be destroyed. |
| 1100 DeleteResourceInternal(it, Normal); |
| 1101 } else { |
| 1102 ChildMap::iterator child_it = children_.find(resource->child_id); |
| 1103 ResourceIdArray unused; |
| 1104 unused.push_back(id); |
| 1105 DeleteAndReturnUnusedResourcesToChild(child_it, Normal, unused); |
| 1106 } |
| 1107 } |
| 1094 } | 1108 } |
| 1095 | 1109 |
| 1096 const ResourceProvider::Resource* ResourceProvider::LockForWrite( | 1110 const ResourceProvider::Resource* ResourceProvider::LockForWrite( |
| 1097 ResourceId id) { | 1111 ResourceId id) { |
| 1098 Resource* resource = GetResource(id); | 1112 Resource* resource = GetResource(id); |
| 1099 DCHECK(!resource->locked_for_write); | 1113 DCHECK(!resource->locked_for_write); |
| 1100 DCHECK(!resource->lock_for_read_count); | 1114 DCHECK(!resource->lock_for_read_count); |
| 1101 DCHECK_EQ(resource->exported_count, 0); | 1115 DCHECK_EQ(resource->exported_count, 0); |
| 1102 DCHECK(resource->origin == Resource::Internal); | 1116 DCHECK(resource->origin == Resource::Internal); |
| 1103 DCHECK(!resource->lost); | 1117 DCHECK(!resource->lost); |
| (...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1640 GLES2Interface* gl = ContextGL(); | 1654 GLES2Interface* gl = ContextGL(); |
| 1641 bool need_sync_point = false; | 1655 bool need_sync_point = false; |
| 1642 for (size_t i = 0; i < unused.size(); ++i) { | 1656 for (size_t i = 0; i < unused.size(); ++i) { |
| 1643 ResourceId local_id = unused[i]; | 1657 ResourceId local_id = unused[i]; |
| 1644 | 1658 |
| 1645 ResourceMap::iterator it = resources_.find(local_id); | 1659 ResourceMap::iterator it = resources_.find(local_id); |
| 1646 CHECK(it != resources_.end()); | 1660 CHECK(it != resources_.end()); |
| 1647 Resource& resource = it->second; | 1661 Resource& resource = it->second; |
| 1648 | 1662 |
| 1649 DCHECK(!resource.locked_for_write); | 1663 DCHECK(!resource.locked_for_write); |
| 1650 DCHECK(!resource.lock_for_read_count); | |
| 1651 DCHECK_EQ(0u, child_info->in_use_resources.count(local_id)); | 1664 DCHECK_EQ(0u, child_info->in_use_resources.count(local_id)); |
| 1652 DCHECK(child_info->parent_to_child_map.count(local_id)); | 1665 DCHECK(child_info->parent_to_child_map.count(local_id)); |
| 1653 | 1666 |
| 1654 ResourceId child_id = child_info->parent_to_child_map[local_id]; | 1667 ResourceId child_id = child_info->parent_to_child_map[local_id]; |
| 1655 DCHECK(child_info->child_to_parent_map.count(child_id)); | 1668 DCHECK(child_info->child_to_parent_map.count(child_id)); |
| 1656 | 1669 |
| 1657 bool is_lost = | 1670 bool is_lost = |
| 1658 resource.lost || (resource.type == GLTexture && lost_output_surface_); | 1671 resource.lost || (resource.type == GLTexture && lost_output_surface_); |
| 1659 if (resource.exported_count > 0) { | 1672 if (resource.exported_count > 0 || resource.lock_for_read_count > 0) { |
| 1660 if (style != ForShutdown) { | 1673 if (style != ForShutdown) { |
| 1661 // Defer this until we receive the resource back from the parent. | 1674 // Defer this until we receive the resource back from the parent or |
| 1675 // the read lock is released. |
| 1662 resource.marked_for_deletion = true; | 1676 resource.marked_for_deletion = true; |
| 1663 continue; | 1677 continue; |
| 1664 } | 1678 } |
| 1665 | 1679 |
| 1666 // We still have an exported_count, so we'll have to lose it. | 1680 // We still have an exported_count, so we'll have to lose it. |
| 1667 is_lost = true; | 1681 is_lost = true; |
| 1668 } | 1682 } |
| 1669 | 1683 |
| 1670 if (gl && resource.filter != resource.original_filter) { | 1684 if (gl && resource.filter != resource.original_filter) { |
| 1671 DCHECK(resource.target); | 1685 DCHECK(resource.target); |
| (...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2213 ContextProvider* context_provider = output_surface_->context_provider(); | 2227 ContextProvider* context_provider = output_surface_->context_provider(); |
| 2214 return context_provider ? context_provider->ContextGL() : NULL; | 2228 return context_provider ? context_provider->ContextGL() : NULL; |
| 2215 } | 2229 } |
| 2216 | 2230 |
| 2217 class GrContext* ResourceProvider::GrContext() const { | 2231 class GrContext* ResourceProvider::GrContext() const { |
| 2218 ContextProvider* context_provider = output_surface_->context_provider(); | 2232 ContextProvider* context_provider = output_surface_->context_provider(); |
| 2219 return context_provider ? context_provider->GrContext() : NULL; | 2233 return context_provider ? context_provider->GrContext() : NULL; |
| 2220 } | 2234 } |
| 2221 | 2235 |
| 2222 } // namespace cc | 2236 } // namespace cc |
| OLD | NEW |