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 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 | 388 |
389 ResourceProvider::Child::~Child() {} | 389 ResourceProvider::Child::~Child() {} |
390 | 390 |
391 scoped_ptr<ResourceProvider> ResourceProvider::Create( | 391 scoped_ptr<ResourceProvider> ResourceProvider::Create( |
392 OutputSurface* output_surface, | 392 OutputSurface* output_surface, |
393 SharedBitmapManager* shared_bitmap_manager, | 393 SharedBitmapManager* shared_bitmap_manager, |
394 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 394 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
395 BlockingTaskRunner* blocking_main_thread_task_runner, | 395 BlockingTaskRunner* blocking_main_thread_task_runner, |
396 int highp_threshold_min, | 396 int highp_threshold_min, |
397 bool use_rgba_4444_texture_format, | 397 bool use_rgba_4444_texture_format, |
398 size_t id_allocation_chunk_size) { | 398 size_t id_allocation_chunk_size, |
| 399 bool use_persistent_map_for_gpu_memory_buffers) { |
399 scoped_ptr<ResourceProvider> resource_provider(new ResourceProvider( | 400 scoped_ptr<ResourceProvider> resource_provider(new ResourceProvider( |
400 output_surface, shared_bitmap_manager, gpu_memory_buffer_manager, | 401 output_surface, shared_bitmap_manager, gpu_memory_buffer_manager, |
401 blocking_main_thread_task_runner, highp_threshold_min, | 402 blocking_main_thread_task_runner, highp_threshold_min, |
402 use_rgba_4444_texture_format, id_allocation_chunk_size)); | 403 use_rgba_4444_texture_format, id_allocation_chunk_size, |
| 404 use_persistent_map_for_gpu_memory_buffers)); |
403 resource_provider->Initialize(); | 405 resource_provider->Initialize(); |
404 return resource_provider; | 406 return resource_provider; |
405 } | 407 } |
406 | 408 |
407 ResourceProvider::~ResourceProvider() { | 409 ResourceProvider::~ResourceProvider() { |
408 while (!children_.empty()) | 410 while (!children_.empty()) |
409 DestroyChildInternal(children_.begin(), FOR_SHUTDOWN); | 411 DestroyChildInternal(children_.begin(), FOR_SHUTDOWN); |
410 while (!resources_.empty()) | 412 while (!resources_.empty()) |
411 DeleteResourceInternal(resources_.begin(), FOR_SHUTDOWN); | 413 DeleteResourceInternal(resources_.begin(), FOR_SHUTDOWN); |
412 | 414 |
(...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1072 resource_->dirty_image = true; | 1074 resource_->dirty_image = true; |
1073 | 1075 |
1074 // GpuMemoryBuffer provides direct access to the memory used by the GPU. | 1076 // GpuMemoryBuffer provides direct access to the memory used by the GPU. |
1075 // Read lock fences are required to ensure that we're not trying to map a | 1077 // Read lock fences are required to ensure that we're not trying to map a |
1076 // buffer that is currently in-use by the GPU. | 1078 // buffer that is currently in-use by the GPU. |
1077 resource_->read_lock_fences_enabled = true; | 1079 resource_->read_lock_fences_enabled = true; |
1078 } | 1080 } |
1079 | 1081 |
1080 gfx::GpuMemoryBuffer* | 1082 gfx::GpuMemoryBuffer* |
1081 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { | 1083 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { |
1082 if (!gpu_memory_buffer_) { | 1084 if (gpu_memory_buffer_) |
1083 scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer = | 1085 return gpu_memory_buffer_; |
1084 gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( | 1086 gfx::GpuMemoryBuffer::Usage usage = |
1085 size_, ToGpuMemoryBufferFormat(format_), gfx::GpuMemoryBuffer::MAP); | 1087 resource_provider_->use_persistent_map_for_gpu_memory_buffers() |
1086 gpu_memory_buffer_ = gpu_memory_buffer.release(); | 1088 ? gfx::GpuMemoryBuffer::PERSISTENT_MAP |
1087 } | 1089 : gfx::GpuMemoryBuffer::MAP; |
1088 | 1090 scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer = |
| 1091 gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( |
| 1092 size_, ToGpuMemoryBufferFormat(format_), usage); |
| 1093 gpu_memory_buffer_ = gpu_memory_buffer.release(); |
1089 return gpu_memory_buffer_; | 1094 return gpu_memory_buffer_; |
1090 } | 1095 } |
1091 | 1096 |
1092 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( | 1097 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( |
1093 ResourceProvider* resource_provider, | 1098 ResourceProvider* resource_provider, |
1094 ResourceId resource_id) | 1099 ResourceId resource_id) |
1095 : resource_provider_(resource_provider), | 1100 : resource_provider_(resource_provider), |
1096 resource_(resource_provider->LockForWrite(resource_id)) { | 1101 resource_(resource_provider->LockForWrite(resource_id)) { |
1097 DCHECK(thread_checker_.CalledOnValidThread()); | 1102 DCHECK(thread_checker_.CalledOnValidThread()); |
1098 resource_provider_->LazyAllocate(resource_); | 1103 resource_provider_->LazyAllocate(resource_); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1175 gl_->Finish(); | 1180 gl_->Finish(); |
1176 } | 1181 } |
1177 | 1182 |
1178 ResourceProvider::ResourceProvider( | 1183 ResourceProvider::ResourceProvider( |
1179 OutputSurface* output_surface, | 1184 OutputSurface* output_surface, |
1180 SharedBitmapManager* shared_bitmap_manager, | 1185 SharedBitmapManager* shared_bitmap_manager, |
1181 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 1186 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
1182 BlockingTaskRunner* blocking_main_thread_task_runner, | 1187 BlockingTaskRunner* blocking_main_thread_task_runner, |
1183 int highp_threshold_min, | 1188 int highp_threshold_min, |
1184 bool use_rgba_4444_texture_format, | 1189 bool use_rgba_4444_texture_format, |
1185 size_t id_allocation_chunk_size) | 1190 size_t id_allocation_chunk_size, |
| 1191 bool use_persistent_map_for_gpu_memory_buffers) |
1186 : output_surface_(output_surface), | 1192 : output_surface_(output_surface), |
1187 shared_bitmap_manager_(shared_bitmap_manager), | 1193 shared_bitmap_manager_(shared_bitmap_manager), |
1188 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), | 1194 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
1189 blocking_main_thread_task_runner_(blocking_main_thread_task_runner), | 1195 blocking_main_thread_task_runner_(blocking_main_thread_task_runner), |
1190 lost_output_surface_(false), | 1196 lost_output_surface_(false), |
1191 highp_threshold_min_(highp_threshold_min), | 1197 highp_threshold_min_(highp_threshold_min), |
1192 next_id_(1), | 1198 next_id_(1), |
1193 next_child_(1), | 1199 next_child_(1), |
1194 default_resource_type_(RESOURCE_TYPE_BITMAP), | 1200 default_resource_type_(RESOURCE_TYPE_BITMAP), |
1195 use_texture_storage_ext_(false), | 1201 use_texture_storage_ext_(false), |
1196 use_texture_format_bgra_(false), | 1202 use_texture_format_bgra_(false), |
1197 use_texture_usage_hint_(false), | 1203 use_texture_usage_hint_(false), |
1198 use_compressed_texture_etc1_(false), | 1204 use_compressed_texture_etc1_(false), |
1199 yuv_resource_format_(LUMINANCE_8), | 1205 yuv_resource_format_(LUMINANCE_8), |
1200 max_texture_size_(0), | 1206 max_texture_size_(0), |
1201 best_texture_format_(RGBA_8888), | 1207 best_texture_format_(RGBA_8888), |
1202 use_rgba_4444_texture_format_(use_rgba_4444_texture_format), | 1208 use_rgba_4444_texture_format_(use_rgba_4444_texture_format), |
1203 id_allocation_chunk_size_(id_allocation_chunk_size), | 1209 id_allocation_chunk_size_(id_allocation_chunk_size), |
1204 use_sync_query_(false) { | 1210 use_sync_query_(false), |
| 1211 use_persistent_map_for_gpu_memory_buffers_( |
| 1212 use_persistent_map_for_gpu_memory_buffers) { |
1205 DCHECK(output_surface_->HasClient()); | 1213 DCHECK(output_surface_->HasClient()); |
1206 DCHECK(id_allocation_chunk_size_); | 1214 DCHECK(id_allocation_chunk_size_); |
1207 } | 1215 } |
1208 | 1216 |
1209 void ResourceProvider::Initialize() { | 1217 void ResourceProvider::Initialize() { |
1210 DCHECK(thread_checker_.CalledOnValidThread()); | 1218 DCHECK(thread_checker_.CalledOnValidThread()); |
1211 | 1219 |
1212 GLES2Interface* gl = ContextGL(); | 1220 GLES2Interface* gl = ContextGL(); |
1213 if (!gl) { | 1221 if (!gl) { |
1214 default_resource_type_ = RESOURCE_TYPE_BITMAP; | 1222 default_resource_type_ = RESOURCE_TYPE_BITMAP; |
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2043 } | 2051 } |
2044 | 2052 |
2045 class GrContext* ResourceProvider::GrContext(bool worker_context) const { | 2053 class GrContext* ResourceProvider::GrContext(bool worker_context) const { |
2046 ContextProvider* context_provider = | 2054 ContextProvider* context_provider = |
2047 worker_context ? output_surface_->worker_context_provider() | 2055 worker_context ? output_surface_->worker_context_provider() |
2048 : output_surface_->context_provider(); | 2056 : output_surface_->context_provider(); |
2049 return context_provider ? context_provider->GrContext() : NULL; | 2057 return context_provider ? context_provider->GrContext() : NULL; |
2050 } | 2058 } |
2051 | 2059 |
2052 } // namespace cc | 2060 } // namespace cc |
OLD | NEW |