| 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 894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 905 } | 905 } |
| 906 | 906 |
| 907 ResourceProvider::Resource* ResourceProvider::GetResource(ResourceId id) { | 907 ResourceProvider::Resource* ResourceProvider::GetResource(ResourceId id) { |
| 908 DCHECK(thread_checker_.CalledOnValidThread()); | 908 DCHECK(thread_checker_.CalledOnValidThread()); |
| 909 DCHECK(id); | 909 DCHECK(id); |
| 910 ResourceMap::iterator it = resources_.find(id); | 910 ResourceMap::iterator it = resources_.find(id); |
| 911 DCHECK(it != resources_.end()); | 911 DCHECK(it != resources_.end()); |
| 912 return &it->second; | 912 return &it->second; |
| 913 } | 913 } |
| 914 | 914 |
| 915 const ResourceProvider::Resource* ResourceProvider::LockForRead( | 915 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { |
| 916 ResourceId id, | |
| 917 bool create_gpu_memory_buffer) { | |
| 918 Resource* resource = GetResource(id); | 916 Resource* resource = GetResource(id); |
| 919 DCHECK(!resource->locked_for_write) << "locked for write: " | 917 DCHECK(!resource->locked_for_write) << "locked for write: " |
| 920 << resource->locked_for_write; | 918 << resource->locked_for_write; |
| 921 DCHECK_EQ(resource->exported_count, 0); | 919 DCHECK_EQ(resource->exported_count, 0); |
| 922 // Uninitialized! Call SetPixels or LockForWrite first. | 920 // Uninitialized! Call SetPixels or LockForWrite first. |
| 923 DCHECK(resource->allocated); | 921 DCHECK(resource->allocated); |
| 924 | 922 |
| 925 // Mailbox sync_tokens must be processed by a call to | 923 // Mailbox sync_tokens must be processed by a call to |
| 926 // WaitSyncTokenIfNeeded() prior to calling LockForRead(). | 924 // WaitSyncTokenIfNeeded() prior to calling LockForRead(). |
| 927 DCHECK_NE(Resource::NEEDS_WAIT, resource->synchronization_state()); | 925 DCHECK_NE(Resource::NEEDS_WAIT, resource->synchronization_state()); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 950 } | 948 } |
| 951 } | 949 } |
| 952 | 950 |
| 953 resource->lock_for_read_count++; | 951 resource->lock_for_read_count++; |
| 954 if (resource->read_lock_fences_enabled) { | 952 if (resource->read_lock_fences_enabled) { |
| 955 if (current_read_lock_fence_.get()) | 953 if (current_read_lock_fence_.get()) |
| 956 current_read_lock_fence_->Set(); | 954 current_read_lock_fence_->Set(); |
| 957 resource->read_lock_fence = current_read_lock_fence_; | 955 resource->read_lock_fence = current_read_lock_fence_; |
| 958 } | 956 } |
| 959 | 957 |
| 960 if (create_gpu_memory_buffer && !resource->gpu_memory_buffer && | |
| 961 resource->child_id) { | |
| 962 ChildMap::iterator child_it = children_.find(resource->child_id); | |
| 963 DCHECK(child_it != children_.end()); | |
| 964 Child& child_info = child_it->second; | |
| 965 if (child_info.gpu_memory_buffer_client_id != -1 && | |
| 966 resource->gpu_memory_buffer_id.id != -1) { | |
| 967 resource->gpu_memory_buffer = | |
| 968 gpu_memory_buffer_manager_->CreateGpuMemoryBufferFromClientId( | |
| 969 child_info.gpu_memory_buffer_client_id, | |
| 970 resource->gpu_memory_buffer_id); | |
| 971 } | |
| 972 } | |
| 973 | |
| 974 return resource; | 958 return resource; |
| 975 } | 959 } |
| 976 | 960 |
| 977 void ResourceProvider::UnlockForRead(ResourceId id) { | 961 void ResourceProvider::UnlockForRead(ResourceId id) { |
| 978 DCHECK(thread_checker_.CalledOnValidThread()); | 962 DCHECK(thread_checker_.CalledOnValidThread()); |
| 979 ResourceMap::iterator it = resources_.find(id); | 963 ResourceMap::iterator it = resources_.find(id); |
| 980 CHECK(it != resources_.end()); | 964 CHECK(it != resources_.end()); |
| 981 | 965 |
| 982 Resource* resource = &it->second; | 966 Resource* resource = &it->second; |
| 983 DCHECK_GT(resource->lock_for_read_count, 0); | 967 DCHECK_GT(resource->lock_for_read_count, 0); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1028 void ResourceProvider::EnableReadLockFencesForTesting(ResourceId id) { | 1012 void ResourceProvider::EnableReadLockFencesForTesting(ResourceId id) { |
| 1029 Resource* resource = GetResource(id); | 1013 Resource* resource = GetResource(id); |
| 1030 DCHECK(resource); | 1014 DCHECK(resource); |
| 1031 resource->read_lock_fences_enabled = true; | 1015 resource->read_lock_fences_enabled = true; |
| 1032 } | 1016 } |
| 1033 | 1017 |
| 1034 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( | 1018 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( |
| 1035 ResourceProvider* resource_provider, | 1019 ResourceProvider* resource_provider, |
| 1036 ResourceId resource_id) | 1020 ResourceId resource_id) |
| 1037 : resource_provider_(resource_provider), resource_id_(resource_id) { | 1021 : resource_provider_(resource_provider), resource_id_(resource_id) { |
| 1038 const Resource* resource = resource_provider->LockForRead(resource_id, false); | 1022 const Resource* resource = resource_provider->LockForRead(resource_id); |
| 1039 texture_id_ = resource->gl_id; | 1023 texture_id_ = resource->gl_id; |
| 1040 target_ = resource->target; | 1024 target_ = resource->target; |
| 1041 size_ = resource->size; | 1025 size_ = resource->size; |
| 1042 } | 1026 } |
| 1043 | 1027 |
| 1044 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { | 1028 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { |
| 1045 resource_provider_->UnlockForRead(resource_id_); | 1029 resource_provider_->UnlockForRead(resource_id_); |
| 1046 } | 1030 } |
| 1047 | 1031 |
| 1048 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( | 1032 ResourceProvider::ScopedSamplerGL::ScopedSamplerGL( |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1165 DCHECK_EQ(RGBA_8888, resource->format); | 1149 DCHECK_EQ(RGBA_8888, resource->format); |
| 1166 SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(), | 1150 SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(), |
| 1167 resource->size.height()); | 1151 resource->size.height()); |
| 1168 sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); | 1152 sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); |
| 1169 } | 1153 } |
| 1170 | 1154 |
| 1171 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( | 1155 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( |
| 1172 ResourceProvider* resource_provider, | 1156 ResourceProvider* resource_provider, |
| 1173 ResourceId resource_id) | 1157 ResourceId resource_id) |
| 1174 : resource_provider_(resource_provider), resource_id_(resource_id) { | 1158 : resource_provider_(resource_provider), resource_id_(resource_id) { |
| 1175 const Resource* resource = resource_provider->LockForRead(resource_id, false); | 1159 const Resource* resource = resource_provider->LockForRead(resource_id); |
| 1176 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource); | 1160 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource); |
| 1177 } | 1161 } |
| 1178 | 1162 |
| 1179 ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() { | 1163 ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() { |
| 1180 resource_provider_->UnlockForRead(resource_id_); | 1164 resource_provider_->UnlockForRead(resource_id_); |
| 1181 } | 1165 } |
| 1182 | 1166 |
| 1183 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( | 1167 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( |
| 1184 ResourceProvider* resource_provider, | 1168 ResourceProvider* resource_provider, |
| 1185 ResourceId resource_id) | 1169 ResourceId resource_id) |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1237 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { | 1221 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { |
| 1238 if (!gpu_memory_buffer_) { | 1222 if (!gpu_memory_buffer_) { |
| 1239 gpu_memory_buffer_ = | 1223 gpu_memory_buffer_ = |
| 1240 resource_provider_->gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( | 1224 resource_provider_->gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( |
| 1241 size_, BufferFormat(format_), | 1225 size_, BufferFormat(format_), |
| 1242 gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gpu::kNullSurfaceHandle); | 1226 gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gpu::kNullSurfaceHandle); |
| 1243 } | 1227 } |
| 1244 return gpu_memory_buffer_.get(); | 1228 return gpu_memory_buffer_.get(); |
| 1245 } | 1229 } |
| 1246 | 1230 |
| 1247 ResourceProvider::ScopedReadLockGpuMemoryBuffer::ScopedReadLockGpuMemoryBuffer( | |
| 1248 ResourceProvider* resource_provider, | |
| 1249 ResourceId resource_id) | |
| 1250 : resource_provider_(resource_provider), resource_id_(resource_id) { | |
| 1251 const Resource* resource = resource_provider->LockForRead(resource_id, true); | |
| 1252 gpu_memory_buffer_ = resource->gpu_memory_buffer.get(); | |
| 1253 texture_id_ = resource->gl_id; | |
| 1254 } | |
| 1255 | |
| 1256 ResourceProvider::ScopedReadLockGpuMemoryBuffer:: | |
| 1257 ~ScopedReadLockGpuMemoryBuffer() { | |
| 1258 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 1259 resource_provider_->UnlockForRead(resource_id_); | |
| 1260 } | |
| 1261 | |
| 1262 ResourceProvider::SynchronousFence::SynchronousFence( | 1231 ResourceProvider::SynchronousFence::SynchronousFence( |
| 1263 gpu::gles2::GLES2Interface* gl) | 1232 gpu::gles2::GLES2Interface* gl) |
| 1264 : gl_(gl), has_synchronized_(true) { | 1233 : gl_(gl), has_synchronized_(true) { |
| 1265 } | 1234 } |
| 1266 | 1235 |
| 1267 ResourceProvider::SynchronousFence::~SynchronousFence() { | 1236 ResourceProvider::SynchronousFence::~SynchronousFence() { |
| 1268 } | 1237 } |
| 1269 | 1238 |
| 1270 void ResourceProvider::SynchronousFence::Set() { | 1239 void ResourceProvider::SynchronousFence::Set() { |
| 1271 has_synchronized_ = false; | 1240 has_synchronized_ = false; |
| (...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1988 | 1957 |
| 1989 const int kImportance = 2; | 1958 const int kImportance = 2; |
| 1990 pmd->CreateSharedGlobalAllocatorDump(guid); | 1959 pmd->CreateSharedGlobalAllocatorDump(guid); |
| 1991 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); | 1960 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); |
| 1992 } | 1961 } |
| 1993 | 1962 |
| 1994 return true; | 1963 return true; |
| 1995 } | 1964 } |
| 1996 | 1965 |
| 1997 } // namespace cc | 1966 } // namespace cc |
| OLD | NEW |