Chromium Code Reviews| Index: cc/resources/resource_provider.cc |
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
| index 2f5b0a9d7917ea2fd00472cea2992a0c268b67a2..1a6839be343524318af0d4cbcaee15b63f3cb3de 100644 |
| --- a/cc/resources/resource_provider.cc |
| +++ b/cc/resources/resource_provider.cc |
| @@ -324,11 +324,13 @@ scoped_ptr<ResourceProvider> ResourceProvider::Create( |
| BlockingTaskRunner* blocking_main_thread_task_runner, |
| int highp_threshold_min, |
| size_t id_allocation_chunk_size, |
| + bool use_gpu_memory_buffers_by_default, |
| const std::vector<unsigned>& use_image_texture_targets) { |
| scoped_ptr<ResourceProvider> resource_provider(new ResourceProvider( |
| output_surface, shared_bitmap_manager, gpu_memory_buffer_manager, |
| blocking_main_thread_task_runner, highp_threshold_min, |
| - id_allocation_chunk_size, use_image_texture_targets)); |
| + id_allocation_chunk_size, use_gpu_memory_buffers_by_default, |
| + use_image_texture_targets)); |
| resource_provider->Initialize(); |
| return resource_provider; |
| } |
| @@ -386,10 +388,10 @@ ResourceId ResourceProvider::CreateResource(const gfx::Size& size, |
| DCHECK(!size.IsEmpty()); |
| switch (default_resource_type_) { |
| case RESOURCE_TYPE_GL_TEXTURE: |
| - return CreateGLTexture(size, |
| - GL_TEXTURE_2D, |
| - hint, |
| - format); |
| + return CreateGLTexture(size, use_gpu_memory_buffers_by_default_ |
| + ? GetImageTextureTarget(format) |
| + : GL_TEXTURE_2D, |
| + hint, format); |
| case RESOURCE_TYPE_BITMAP: |
| DCHECK_EQ(RGBA_8888, format); |
| return CreateBitmap(size); |
| @@ -860,13 +862,10 @@ ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: |
| ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, |
| ResourceId resource_id) |
| : resource_provider_(resource_provider), |
| - resource_(resource_provider->LockForWrite(resource_id)), |
| - gpu_memory_buffer_manager_(resource_provider->gpu_memory_buffer_manager_), |
| - gpu_memory_buffer_(nullptr), |
| - size_(resource_->size), |
| - format_(resource_->format) { |
| + resource_(resource_provider->LockForWrite(resource_id)) { |
| DCHECK_EQ(RESOURCE_TYPE_GL_TEXTURE, resource_->type); |
| - std::swap(gpu_memory_buffer_, resource_->gpu_memory_buffer); |
| + gpu_memory_buffer_.reset(resource_->gpu_memory_buffer); |
| + resource_->gpu_memory_buffer = nullptr; |
| } |
| ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: |
| @@ -876,27 +875,7 @@ ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: |
| if (!gpu_memory_buffer_) |
| return; |
| - resource_provider_->LazyCreate(resource_); |
| - |
| - if (!resource_->image_id) { |
| - GLES2Interface* gl = resource_provider_->ContextGL(); |
| - DCHECK(gl); |
| - |
| -#if defined(OS_CHROMEOS) |
| - // TODO(reveman): GL_COMMANDS_ISSUED_CHROMIUM is used for synchronization |
| - // on ChromeOS to avoid some performance issues. This only works with |
| - // shared memory backed buffers. crbug.com/436314 |
| - DCHECK_EQ(gpu_memory_buffer_->GetHandle().type, gfx::SHARED_MEMORY_BUFFER); |
| -#endif |
| - |
| - resource_->image_id = gl->CreateImageCHROMIUM( |
| - gpu_memory_buffer_->AsClientBuffer(), size_.width(), size_.height(), |
| - GLInternalFormat(resource_->format)); |
| - } |
| - |
| - std::swap(resource_->gpu_memory_buffer, gpu_memory_buffer_); |
| - resource_->allocated = true; |
| - resource_->dirty_image = true; |
| + resource_provider_->SetGpuMemoryBuffer(resource_, gpu_memory_buffer_.Pass()); |
| // GpuMemoryBuffer provides direct access to the memory used by the GPU. |
| // Read lock fences are required to ensure that we're not trying to map a |
| @@ -906,14 +885,13 @@ ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: |
| gfx::GpuMemoryBuffer* |
| ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { |
| - if (gpu_memory_buffer_) |
| - return gpu_memory_buffer_; |
| - scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer = |
| - gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( |
| - size_, BufferFormat(format_), |
| - gfx::BufferUsage::GPU_READ_CPU_READ_WRITE); |
| - gpu_memory_buffer_ = gpu_memory_buffer.release(); |
| - return gpu_memory_buffer_; |
| + if (!gpu_memory_buffer_) { |
| + gpu_memory_buffer_ = |
| + resource_provider_->gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( |
| + resource_->size, BufferFormat(resource_->format), |
| + gfx::BufferUsage::GPU_READ_CPU_READ_WRITE); |
| + } |
| + return gpu_memory_buffer_.get(); |
| } |
| ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( |
| @@ -1002,6 +980,7 @@ ResourceProvider::ResourceProvider( |
| BlockingTaskRunner* blocking_main_thread_task_runner, |
| int highp_threshold_min, |
| size_t id_allocation_chunk_size, |
| + bool use_gpu_memory_buffers_by_default, |
| const std::vector<unsigned>& use_image_texture_targets) |
| : output_surface_(output_surface), |
| shared_bitmap_manager_(shared_bitmap_manager), |
| @@ -1012,6 +991,7 @@ ResourceProvider::ResourceProvider( |
| next_id_(1), |
| next_child_(1), |
| default_resource_type_(RESOURCE_TYPE_BITMAP), |
| + use_gpu_memory_buffers_by_default_(use_gpu_memory_buffers_by_default), |
| use_texture_storage_ext_(false), |
| use_texture_format_bgra_(false), |
| use_texture_usage_hint_(false), |
| @@ -1309,8 +1289,7 @@ void ResourceProvider::TransferResource(GLES2Interface* gl, |
| LazyCreate(source); |
| DCHECK(source->gl_id); |
| DCHECK(source->origin == Resource::INTERNAL); |
| - if (source->image_id) { |
| - DCHECK(source->dirty_image); |
| + if (source->image_id && source->dirty_image) { |
| gl->BindTexture(resource->mailbox_holder.texture_target, source->gl_id); |
| BindImageForSampling(source); |
| } |
| @@ -1515,9 +1494,14 @@ void ResourceProvider::LazyAllocate(Resource* resource) { |
| gfx::Size& size = resource->size; |
| ResourceFormat format = resource->format; |
| gl->BindTexture(resource->target, resource->gl_id); |
| - if (use_texture_storage_ext_ && |
| - IsFormatSupportedForStorage(format, use_texture_format_bgra_) && |
| - (resource->hint & TEXTURE_HINT_IMMUTABLE)) { |
| + if (use_gpu_memory_buffers_by_default_) { |
| + SetGpuMemoryBuffer( |
| + resource, gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( |
| + size, BufferFormat(format), gfx::BufferUsage::SCANOUT)); |
| + BindImageForSampling(resource); |
|
reveman
2015/11/02 17:28:53
Why is this BindImageForSampling call needed?
ccameron
2015/11/02 22:07:34
This can be moved to the ScopedWriteLockGL this to
|
| + } else if (use_texture_storage_ext_ && |
| + IsFormatSupportedForStorage(format, use_texture_format_bgra_) && |
| + (resource->hint & TEXTURE_HINT_IMMUTABLE)) { |
| GLenum storage_format = TextureToStorageFormat(format); |
| gl->TexStorage2DEXT(resource->target, 1, storage_format, size.width(), |
| size.height()); |
| @@ -1531,6 +1515,36 @@ void ResourceProvider::LazyAllocate(Resource* resource) { |
| } |
| } |
| +void ResourceProvider::SetGpuMemoryBuffer( |
|
reveman
2015/11/02 17:28:53
hm, this function is marking the image as dirty an
ccameron
2015/11/02 22:07:34
Sounds better --done.
|
| + Resource* resource, |
| + scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer) { |
| + DCHECK(!resource->gpu_memory_buffer); |
|
reveman
2015/11/02 17:28:53
can these 3 lines just become DCHECK(resource->gpu
ccameron
2015/11/02 22:07:34
Yeah, this becomes much simpler this way.
|
| + if (!gpu_memory_buffer) |
| + return; |
| + |
| + LazyCreate(resource); |
|
reveman
2015/11/02 17:28:53
I think this should be moved out of this function
ccameron
2015/11/02 22:07:34
Sg. Added a LazyCreate to the ~ScopedWriteLockGpuM
|
| + |
| + if (!resource->image_id) { |
| + GLES2Interface* gl = ContextGL(); |
| + DCHECK(gl); |
| + |
| +#if defined(OS_CHROMEOS) |
| + // TODO(reveman): GL_COMMANDS_ISSUED_CHROMIUM is used for synchronization |
| + // on ChromeOS to avoid some performance issues. This only works with |
| + // shared memory backed buffers. crbug.com/436314 |
| + DCHECK_EQ(gpu_memory_buffer->GetHandle().type, gfx::SHARED_MEMORY_BUFFER); |
| +#endif |
| + resource->image_id = gl->CreateImageCHROMIUM( |
| + gpu_memory_buffer->AsClientBuffer(), resource->size.width(), |
| + resource->size.height(), GLInternalFormat(resource->format)); |
| + } |
| + |
| + resource->gpu_memory_buffer = gpu_memory_buffer.release(); |
| + resource->allocated = true; |
|
reveman
2015/11/02 17:28:53
hm, this should not be set here as that means sett
ccameron
2015/11/02 22:07:34
Moved up to the caller and added a DCHECK for it.
|
| + resource->dirty_image = true; |
| + resource->is_overlay_candidate = true; |
|
reveman
2015/11/02 17:28:53
might be better to set this by the code that alloc
ccameron
2015/11/02 22:07:34
Done.
|
| +} |
| + |
| void ResourceProvider::BindImageForSampling(Resource* resource) { |
| GLES2Interface* gl = ContextGL(); |
| DCHECK(resource->gl_id); |