| 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 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 | 368 |
| 369 // In the case of context lost, this sync token may be empty (see comment in | 369 // In the case of context lost, this sync token may be empty (see comment in |
| 370 // the UpdateSyncToken() function). The WaitSyncTokenCHROMIUM() function | 370 // the UpdateSyncToken() function). The WaitSyncTokenCHROMIUM() function |
| 371 // handles empty sync tokens properly so just wait anyways and update the | 371 // handles empty sync tokens properly so just wait anyways and update the |
| 372 // state the synchronized. | 372 // state the synchronized. |
| 373 gl->WaitSyncTokenCHROMIUM(mailbox_.sync_token().GetConstData()); | 373 gl->WaitSyncTokenCHROMIUM(mailbox_.sync_token().GetConstData()); |
| 374 SetSynchronized(); | 374 SetSynchronized(); |
| 375 } | 375 } |
| 376 | 376 |
| 377 ResourceProvider::Child::Child() | 377 ResourceProvider::Child::Child() |
| 378 : marked_for_deletion(false), needs_sync_tokens(true) {} | 378 : gpu_memory_buffer_client_id(-1), |
| 379 marked_for_deletion(false), |
| 380 needs_sync_tokens(true) {} |
| 379 | 381 |
| 380 ResourceProvider::Child::Child(const Child& other) = default; | 382 ResourceProvider::Child::Child(const Child& other) = default; |
| 381 | 383 |
| 382 ResourceProvider::Child::~Child() {} | 384 ResourceProvider::Child::~Child() {} |
| 383 | 385 |
| 384 std::unique_ptr<ResourceProvider> ResourceProvider::Create( | 386 std::unique_ptr<ResourceProvider> ResourceProvider::Create( |
| 385 OutputSurface* output_surface, | 387 OutputSurface* output_surface, |
| 386 SharedBitmapManager* shared_bitmap_manager, | 388 SharedBitmapManager* shared_bitmap_manager, |
| 387 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 389 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| 388 BlockingTaskRunner* blocking_main_thread_task_runner, | 390 BlockingTaskRunner* blocking_main_thread_task_runner, |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 714 DCHECK_EQ(RESOURCE_TYPE_BITMAP, resource->type); | 716 DCHECK_EQ(RESOURCE_TYPE_BITMAP, resource->type); |
| 715 delete resource->shared_bitmap; | 717 delete resource->shared_bitmap; |
| 716 resource->pixels = nullptr; | 718 resource->pixels = nullptr; |
| 717 } | 719 } |
| 718 if (resource->pixels) { | 720 if (resource->pixels) { |
| 719 DCHECK(resource->origin == Resource::INTERNAL); | 721 DCHECK(resource->origin == Resource::INTERNAL); |
| 720 delete[] resource->pixels; | 722 delete[] resource->pixels; |
| 721 resource->pixels = nullptr; | 723 resource->pixels = nullptr; |
| 722 } | 724 } |
| 723 if (resource->gpu_memory_buffer) { | 725 if (resource->gpu_memory_buffer) { |
| 724 DCHECK(resource->origin == Resource::INTERNAL); | 726 DCHECK(resource->origin == Resource::INTERNAL || |
| 727 resource->origin == Resource::DELEGATED); |
| 725 resource->gpu_memory_buffer.reset(); | 728 resource->gpu_memory_buffer.reset(); |
| 726 } | 729 } |
| 727 resources_.erase(it); | 730 resources_.erase(it); |
| 728 } | 731 } |
| 729 | 732 |
| 730 ResourceProvider::ResourceType ResourceProvider::GetResourceType( | 733 ResourceProvider::ResourceType ResourceProvider::GetResourceType( |
| 731 ResourceId id) { | 734 ResourceId id) { |
| 732 return GetResource(id)->type; | 735 return GetResource(id)->type; |
| 733 } | 736 } |
| 734 | 737 |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 832 } | 835 } |
| 833 | 836 |
| 834 ResourceProvider::Resource* ResourceProvider::GetResource(ResourceId id) { | 837 ResourceProvider::Resource* ResourceProvider::GetResource(ResourceId id) { |
| 835 DCHECK(thread_checker_.CalledOnValidThread()); | 838 DCHECK(thread_checker_.CalledOnValidThread()); |
| 836 DCHECK(id); | 839 DCHECK(id); |
| 837 ResourceMap::iterator it = resources_.find(id); | 840 ResourceMap::iterator it = resources_.find(id); |
| 838 DCHECK(it != resources_.end()); | 841 DCHECK(it != resources_.end()); |
| 839 return &it->second; | 842 return &it->second; |
| 840 } | 843 } |
| 841 | 844 |
| 842 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { | 845 const ResourceProvider::Resource* ResourceProvider::LockForRead( |
| 846 ResourceId id, |
| 847 bool create_gpu_memory_buffer) { |
| 843 Resource* resource = GetResource(id); | 848 Resource* resource = GetResource(id); |
| 844 DCHECK(!resource->locked_for_write) << "locked for write: " | 849 DCHECK(!resource->locked_for_write) << "locked for write: " |
| 845 << resource->locked_for_write; | 850 << resource->locked_for_write; |
| 846 DCHECK_EQ(resource->exported_count, 0); | 851 DCHECK_EQ(resource->exported_count, 0); |
| 847 // Uninitialized! Call SetPixels or LockForWrite first. | 852 // Uninitialized! Call SetPixels or LockForWrite first. |
| 848 DCHECK(resource->allocated); | 853 DCHECK(resource->allocated); |
| 849 | 854 |
| 850 // Mailbox sync_tokens must be processed by a call to | 855 // Mailbox sync_tokens must be processed by a call to |
| 851 // WaitSyncTokenIfNeeded() prior to calling LockForRead(). | 856 // WaitSyncTokenIfNeeded() prior to calling LockForRead(). |
| 852 DCHECK_NE(Resource::NEEDS_WAIT, resource->synchronization_state()); | 857 DCHECK_NE(Resource::NEEDS_WAIT, resource->synchronization_state()); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 875 } | 880 } |
| 876 } | 881 } |
| 877 | 882 |
| 878 resource->lock_for_read_count++; | 883 resource->lock_for_read_count++; |
| 879 if (resource->read_lock_fences_enabled) { | 884 if (resource->read_lock_fences_enabled) { |
| 880 if (current_read_lock_fence_.get()) | 885 if (current_read_lock_fence_.get()) |
| 881 current_read_lock_fence_->Set(); | 886 current_read_lock_fence_->Set(); |
| 882 resource->read_lock_fence = current_read_lock_fence_; | 887 resource->read_lock_fence = current_read_lock_fence_; |
| 883 } | 888 } |
| 884 | 889 |
| 890 if (create_gpu_memory_buffer && !resource->gpu_memory_buffer && |
| 891 resource->child_id) { |
| 892 ChildMap::iterator child_it = children_.find(resource->child_id); |
| 893 DCHECK(child_it != children_.end()); |
| 894 Child& child_info = child_it->second; |
| 895 if (child_info.gpu_memory_buffer_client_id != -1 && |
| 896 resource->gpu_memory_buffer_id.id != -1) { |
| 897 resource->gpu_memory_buffer = |
| 898 gpu_memory_buffer_manager_->CreateGpuMemoryBufferFromClientId( |
| 899 child_info.gpu_memory_buffer_client_id, |
| 900 resource->gpu_memory_buffer_id); |
| 901 } |
| 902 } |
| 903 |
| 885 return resource; | 904 return resource; |
| 886 } | 905 } |
| 887 | 906 |
| 888 void ResourceProvider::UnlockForRead(ResourceId id) { | 907 void ResourceProvider::UnlockForRead(ResourceId id) { |
| 889 DCHECK(thread_checker_.CalledOnValidThread()); | 908 DCHECK(thread_checker_.CalledOnValidThread()); |
| 890 ResourceMap::iterator it = resources_.find(id); | 909 ResourceMap::iterator it = resources_.find(id); |
| 891 CHECK(it != resources_.end()); | 910 CHECK(it != resources_.end()); |
| 892 | 911 |
| 893 Resource* resource = &it->second; | 912 Resource* resource = &it->second; |
| 894 DCHECK_GT(resource->lock_for_read_count, 0); | 913 DCHECK_GT(resource->lock_for_read_count, 0); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 951 Resource* resource = GetResource(id); | 970 Resource* resource = GetResource(id); |
| 952 DCHECK(resource); | 971 DCHECK(resource); |
| 953 resource->read_lock_fences_enabled = true; | 972 resource->read_lock_fences_enabled = true; |
| 954 } | 973 } |
| 955 | 974 |
| 956 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( | 975 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( |
| 957 ResourceProvider* resource_provider, | 976 ResourceProvider* resource_provider, |
| 958 ResourceId resource_id) | 977 ResourceId resource_id) |
| 959 : resource_provider_(resource_provider), | 978 : resource_provider_(resource_provider), |
| 960 resource_id_(resource_id), | 979 resource_id_(resource_id), |
| 961 resource_(resource_provider->LockForRead(resource_id)) { | 980 resource_(resource_provider->LockForRead(resource_id, false)) { |
| 962 DCHECK(resource_); | 981 DCHECK(resource_); |
| 963 } | 982 } |
| 964 | 983 |
| 965 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { | 984 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { |
| 966 resource_provider_->UnlockForRead(resource_id_); | 985 resource_provider_->UnlockForRead(resource_id_); |
| 967 } | 986 } |
| 968 | 987 |
| 969 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( | 988 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( |
| 970 ResourceProvider* resource_provider, | 989 ResourceProvider* resource_provider, |
| 971 ResourceId resource_id, | 990 ResourceId resource_id, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1013 DCHECK_EQ(RGBA_8888, resource->format); | 1032 DCHECK_EQ(RGBA_8888, resource->format); |
| 1014 SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(), | 1033 SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(), |
| 1015 resource->size.height()); | 1034 resource->size.height()); |
| 1016 sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); | 1035 sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); |
| 1017 } | 1036 } |
| 1018 | 1037 |
| 1019 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( | 1038 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( |
| 1020 ResourceProvider* resource_provider, | 1039 ResourceProvider* resource_provider, |
| 1021 ResourceId resource_id) | 1040 ResourceId resource_id) |
| 1022 : resource_provider_(resource_provider), resource_id_(resource_id) { | 1041 : resource_provider_(resource_provider), resource_id_(resource_id) { |
| 1023 const Resource* resource = resource_provider->LockForRead(resource_id); | 1042 const Resource* resource = resource_provider->LockForRead(resource_id, false); |
| 1024 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource); | 1043 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource); |
| 1025 } | 1044 } |
| 1026 | 1045 |
| 1027 ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() { | 1046 ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() { |
| 1028 resource_provider_->UnlockForRead(resource_id_); | 1047 resource_provider_->UnlockForRead(resource_id_); |
| 1029 } | 1048 } |
| 1030 | 1049 |
| 1031 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( | 1050 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( |
| 1032 ResourceProvider* resource_provider, | 1051 ResourceProvider* resource_provider, |
| 1033 ResourceId resource_id) | 1052 ResourceId resource_id) |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1080 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { | 1099 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { |
| 1081 if (!gpu_memory_buffer_) { | 1100 if (!gpu_memory_buffer_) { |
| 1082 gpu_memory_buffer_ = | 1101 gpu_memory_buffer_ = |
| 1083 resource_provider_->gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( | 1102 resource_provider_->gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( |
| 1084 resource_->size, BufferFormat(resource_->format), | 1103 resource_->size, BufferFormat(resource_->format), |
| 1085 gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gpu::kNullSurfaceHandle); | 1104 gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gpu::kNullSurfaceHandle); |
| 1086 } | 1105 } |
| 1087 return gpu_memory_buffer_.get(); | 1106 return gpu_memory_buffer_.get(); |
| 1088 } | 1107 } |
| 1089 | 1108 |
| 1109 ResourceProvider::ScopedReadLockGpuMemoryBuffer::ScopedReadLockGpuMemoryBuffer( |
| 1110 ResourceProvider* resource_provider, |
| 1111 ResourceId resource_id) |
| 1112 : resource_provider_(resource_provider), |
| 1113 resource_id_(resource_id), |
| 1114 resource_(resource_provider->LockForRead(resource_id, true)) {} |
| 1115 |
| 1116 ResourceProvider::ScopedReadLockGpuMemoryBuffer:: |
| 1117 ~ScopedReadLockGpuMemoryBuffer() { |
| 1118 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1119 resource_provider_->UnlockForRead(resource_id_); |
| 1120 } |
| 1121 |
| 1122 gfx::GpuMemoryBuffer* |
| 1123 ResourceProvider::ScopedReadLockGpuMemoryBuffer::GetGpuMemoryBuffer() const { |
| 1124 return resource_->gpu_memory_buffer.get(); |
| 1125 } |
| 1126 |
| 1127 unsigned ResourceProvider::ScopedReadLockGpuMemoryBuffer::GetTextureId() const { |
| 1128 return resource_->gl_id; |
| 1129 } |
| 1130 |
| 1090 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( | 1131 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( |
| 1091 ResourceProvider* resource_provider, | 1132 ResourceProvider* resource_provider, |
| 1092 ResourceId resource_id) | 1133 ResourceId resource_id) |
| 1093 : resource_provider_(resource_provider), | 1134 : resource_provider_(resource_provider), |
| 1094 resource_(resource_provider->LockForWrite(resource_id)), | 1135 resource_(resource_provider->LockForWrite(resource_id)), |
| 1095 set_sync_token_(false) { | 1136 set_sync_token_(false) { |
| 1096 DCHECK(thread_checker_.CalledOnValidThread()); | 1137 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1097 resource_provider_->LazyAllocate(resource_); | 1138 resource_provider_->LazyAllocate(resource_); |
| 1098 if (resource_->image_id && resource_->dirty_image) | 1139 if (resource_->image_id && resource_->dirty_image) |
| 1099 resource_provider_->BindImageForSampling(resource_); | 1140 resource_provider_->BindImageForSampling(resource_); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1257 | 1298 |
| 1258 best_render_buffer_format_ = PlatformColor::BestSupportedTextureFormat( | 1299 best_render_buffer_format_ = PlatformColor::BestSupportedTextureFormat( |
| 1259 caps.render_buffer_format_bgra8888); | 1300 caps.render_buffer_format_bgra8888); |
| 1260 | 1301 |
| 1261 texture_id_allocator_.reset( | 1302 texture_id_allocator_.reset( |
| 1262 new TextureIdAllocator(gl, id_allocation_chunk_size_)); | 1303 new TextureIdAllocator(gl, id_allocation_chunk_size_)); |
| 1263 buffer_id_allocator_.reset( | 1304 buffer_id_allocator_.reset( |
| 1264 new BufferIdAllocator(gl, id_allocation_chunk_size_)); | 1305 new BufferIdAllocator(gl, id_allocation_chunk_size_)); |
| 1265 } | 1306 } |
| 1266 | 1307 |
| 1267 int ResourceProvider::CreateChild(const ReturnCallback& return_callback) { | 1308 int ResourceProvider::CreateChild(const ReturnCallback& return_callback, |
| 1309 int gpu_memory_buffer_client_id) { |
| 1268 DCHECK(thread_checker_.CalledOnValidThread()); | 1310 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1269 | 1311 |
| 1270 Child child_info; | 1312 Child child_info; |
| 1271 child_info.return_callback = return_callback; | 1313 child_info.return_callback = return_callback; |
| 1314 child_info.gpu_memory_buffer_client_id = gpu_memory_buffer_client_id; |
| 1272 | 1315 |
| 1273 int child = next_child_++; | 1316 int child = next_child_++; |
| 1274 children_[child] = child_info; | 1317 children_[child] = child_info; |
| 1275 return child; | 1318 return child; |
| 1276 } | 1319 } |
| 1277 | 1320 |
| 1278 void ResourceProvider::SetChildNeedsSyncTokens(int child_id, bool needs) { | 1321 void ResourceProvider::SetChildNeedsSyncTokens(int child_id, bool needs) { |
| 1279 ChildMap::iterator it = children_.find(child_id); | 1322 ChildMap::iterator it = children_.find(child_id); |
| 1280 DCHECK(it != children_.end()); | 1323 DCHECK(it != children_.end()); |
| 1281 it->second.needs_sync_tokens = needs; | 1324 it->second.needs_sync_tokens = needs; |
| (...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1968 | 2011 |
| 1969 const int kImportance = 2; | 2012 const int kImportance = 2; |
| 1970 pmd->CreateSharedGlobalAllocatorDump(guid); | 2013 pmd->CreateSharedGlobalAllocatorDump(guid); |
| 1971 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); | 2014 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); |
| 1972 } | 2015 } |
| 1973 | 2016 |
| 1974 return true; | 2017 return true; |
| 1975 } | 2018 } |
| 1976 | 2019 |
| 1977 } // namespace cc | 2020 } // namespace cc |
| OLD | NEW |