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

Side by Side Diff: cc/resources/resource_provider.cc

Issue 1989453003: cc: Add ScopedReadLockGpuMemoryBuffer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix aura typo Created 4 years, 7 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
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/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 "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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/resource_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698