Chromium Code Reviews| Index: cc/resources/resource_provider.cc |
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
| index f081f6236f87a36410537af4a9c0e570f1191510..f529196aca98714e8201676bb5246988edbed13d 100644 |
| --- a/cc/resources/resource_provider.cc |
| +++ b/cc/resources/resource_provider.cc |
| @@ -29,7 +29,6 @@ |
| #include "third_party/skia/include/gpu/GrTextureProvider.h" |
| #include "ui/gfx/geometry/rect.h" |
| #include "ui/gfx/geometry/vector2d.h" |
| -#include "ui/gfx/gpu_memory_buffer.h" |
| using gpu::gles2::GLES2Interface; |
| @@ -994,6 +993,124 @@ ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { |
| return gpu_memory_buffer_; |
| } |
| +ResourceProvider::ScopedWriteLockGpuMemoryBufferForThread:: |
| + ScopedWriteLockGpuMemoryBufferForThread(ResourceProvider* resource_provider, |
| + ResourceId resource_id) |
| + : resource_provider_(resource_provider), |
| + resource_(resource_provider_->GetResource(resource_id)), |
| + gpu_memory_buffer_manager_(resource_provider->gpu_memory_buffer_manager_), |
| + gpu_memory_buffer_(nullptr), |
| + size_(resource_->size), |
| + format_(resource_->format) { |
| + DCHECK_EQ(RESOURCE_TYPE_GL_TEXTURE, resource_->type); |
| + resource_provider_->LazyCreate(resource_); |
| + worker_context_ = |
| + resource_provider_->output_surface()->worker_context_provider(); |
| + image_id_ = resource_->image_id; |
| + did_bind_image_ = false; |
| + internal_format_ = GLInternalFormat(resource_->format); |
| + source_gl_id_ = resource_->gl_id; |
| + query_id_ = resource_->gl_read_lock_query_id; |
| + using_sync_query_ = resource_provider_->use_sync_query_; |
| + |
| + usage_ = resource_provider_->use_persistent_map_for_gpu_memory_buffers() |
| + ? gfx::GpuMemoryBuffer::PERSISTENT_MAP |
| + : gfx::GpuMemoryBuffer::MAP; |
| + std::swap(gpu_memory_buffer_, resource_->gpu_memory_buffer); |
| +} |
| + |
| +ResourceProvider::ScopedWriteLockGpuMemoryBufferForThread:: |
| + ~ScopedWriteLockGpuMemoryBufferForThread() { |
| + GLES2Interface* gl = |
| + resource_provider_->output_surface()->context_provider()->ContextGL(); |
| + if (!gpu_memory_buffer_) |
| + return; |
| + |
| + if (using_sync_query_ && query_id_) { |
| + resource_->gl_read_lock_query_id = query_id_; |
| + resource_->read_lock_fence = |
| + make_scoped_refptr(new CopyTextureFence(gl, query_id_)); |
| + } else { |
| + // Create a SynchronousFence when CHROMIUM_sync_query extension is missing. |
| + // Try to use one synchronous fence for as many CopyResource operations as |
| + // possible as that reduce the number of times we have to synchronize with |
| + // the GL. |
| + if (!resource_provider_->synchronous_fence_.get() || |
| + resource_provider_->synchronous_fence_->has_synchronized()) { |
| + resource_provider_->synchronous_fence_ = |
| + make_scoped_refptr(new SynchronousFence(gl)); |
| + } |
| + resource_->read_lock_fence = resource_provider_->synchronous_fence_; |
| + resource_->read_lock_fence->Set(); |
| + } |
| + |
| + std::swap(resource_->gpu_memory_buffer, gpu_memory_buffer_); |
| + if (did_bind_image_) { |
| + resource_->image_id = image_id_; |
| + resource_->allocated = true; |
| + resource_->dirty_image = true; |
|
piman
2015/07/10 02:25:09
= false
sohanjg
2015/07/10 13:34:31
Acknowledged.
|
| + resource_->bound_image_id = bound_image_id_; |
| + resource_->read_lock_fences_enabled = true; |
| + } |
| +} |
| + |
| +gfx::GpuMemoryBuffer* ResourceProvider:: |
| + ScopedWriteLockGpuMemoryBufferForThread::GetGpuMemoryBuffer() { |
| + if (gpu_memory_buffer_) |
| + return gpu_memory_buffer_; |
| + scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer = |
| + gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( |
| + size_, ToGpuMemoryBufferFormat(format_), usage_); |
| + gpu_memory_buffer_ = gpu_memory_buffer.release(); |
| + return gpu_memory_buffer_; |
| +} |
| + |
| +void ResourceProvider::ScopedWriteLockGpuMemoryBufferForThread:: |
| + CreateAndBindImage() { |
| + GLES2Interface* gl = worker_context_->ContextGL(); |
| + image_id_ = |
| + gl->CreateImageCHROMIUM(gpu_memory_buffer_->AsClientBuffer(), |
| + size_.width(), size_.height(), internal_format_); |
| + |
| + gl->BindTexture(GL_TEXTURE_2D, source_gl_id_); |
| + if (bound_image_id_) |
| + gl->ReleaseTexImage2DCHROMIUM(GL_TEXTURE_2D, bound_image_id_); |
| + gl->BindTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id_); |
| + bound_image_id_ = image_id_; |
| + did_bind_image_ = true; |
| +} |
| + |
| +void ResourceProvider::ScopedWriteLockGpuMemoryBufferForThread:: |
| + BeginCopyTexture() { |
| + GLES2Interface* gl = worker_context_->ContextGL(); |
| + if (using_sync_query_) { |
| + if (!query_id_) |
| + gl->GenQueriesEXT(1, &query_id_); |
| +#if defined(OS_CHROMEOS) |
| + // TODO(reveman): This avoids a performance problem on some ChromeOS |
| + // devices. This needs to be removed to support native GpuMemoryBuffer |
| + // implementations. crbug.com/436314 |
| + gl->BeginQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM, query_id_); |
| +#else |
| + gl->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, query_id_); |
| +#endif |
| + } |
| +} |
| + |
| +void ResourceProvider::ScopedWriteLockGpuMemoryBufferForThread:: |
| + EndCopyTexture() { |
| + GLES2Interface* gl = worker_context_->ContextGL(); |
| + if (using_sync_query_ && query_id_) { |
| +// End query and create a read lock fence that will prevent access to |
| +// source resource until CopySubTextureCHROMIUM command has completed. |
| +#if defined(OS_CHROMEOS) |
| + gl->EndQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM); |
| +#else |
| + gl->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM); |
| +#endif |
| + } |
| +} |
| + |
| ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( |
| ResourceProvider* resource_provider, |
| ResourceId resource_id) |
| @@ -1879,8 +1996,8 @@ void ResourceProvider::CopyResource(ResourceId source_id, |
| dest_resource->allocated = true; |
| gl->CopySubTextureCHROMIUM(dest_resource->target, source_resource->gl_id, |
| dest_resource->gl_id, rect.x(), rect.y(), rect.x(), |
| - rect.y(), rect.width(), rect.height(), |
| - false, false, false); |
| + rect.y(), rect.width(), rect.height(), false, |
| + false, false); |
| if (source_resource->gl_read_lock_query_id) { |
| // End query and create a read lock fence that will prevent access to |
| // source resource until CopySubTextureCHROMIUM command has completed. |