Chromium Code Reviews| Index: cc/resources/resource_provider.cc |
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
| index 0a3f2421e4a67b4c4fd161b09f407d5c5fdd4c54..fd5757b57e733fe79b417e7369b28d3cea4a437b 100644 |
| --- a/cc/resources/resource_provider.cc |
| +++ b/cc/resources/resource_provider.cc |
| @@ -763,11 +763,12 @@ void ResourceProvider::CopyToResource(ResourceId id, |
| SkCanvas dest(lock.sk_bitmap()); |
| dest.writePixels(source_info, image, image_stride, 0, 0); |
| } else { |
| - ScopedWriteLockGL lock(this, id); |
| - DCHECK(lock.texture_id()); |
| + ScopedWriteLockGL lock(this, id, false); |
| + unsigned resource_texture_id = lock.ProduceTextureId(); |
| + DCHECK(resource_texture_id); |
| GLES2Interface* gl = ContextGL(); |
| DCHECK(gl); |
| - gl->BindTexture(resource->target, lock.texture_id()); |
| + gl->BindTexture(resource->target, resource_texture_id); |
| if (resource->format == ETC1) { |
| DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D)); |
| int image_bytes = ResourceUtil::CheckedSizeInBytes<int>(image_size, ETC1); |
| @@ -779,6 +780,7 @@ void ResourceProvider::CopyToResource(ResourceId id, |
| image_size.height(), GLDataFormat(resource->format), |
| GLDataType(resource->format), image); |
| } |
| + lock.ReleaseTextureId(); |
| } |
| } |
| @@ -988,24 +990,54 @@ ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() { |
| ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL( |
| ResourceProvider* resource_provider, |
| - ResourceId resource_id) |
| + ResourceId resource_id, |
| + bool use_mailbox) |
| : resource_provider_(resource_provider), |
| resource_(resource_provider->LockForWrite(resource_id)), |
| + use_mailbox_(use_mailbox), |
| texture_id_(0), |
| set_sync_token_(false) { |
| resource_provider_->LazyAllocate(resource_); |
| - texture_id_ = resource_->gl_id; |
| - DCHECK(texture_id_); |
| if (resource_->image_id && resource_->dirty_image) |
| resource_provider_->BindImageForSampling(resource_); |
| + if (use_mailbox_) { |
| + resource_provider_->CreateMailboxAndBindResource( |
| + resource_provider_->ContextGL(), resource_); |
| + } |
| } |
| ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { |
| + DCHECK_EQ(texture_id_, 0u); |
| if (set_sync_token_) |
| resource_->UpdateSyncToken(sync_token_); |
| resource_provider_->UnlockForWrite(resource_); |
| } |
| +unsigned ResourceProvider::ScopedWriteLockGL::ProduceTextureId() { |
| + if (use_mailbox_) { |
| + if (!texture_id_) { |
| + gpu::gles2::GLES2Interface* gl = resource_provider_->output_surface() |
| + ->worker_context_provider() |
| + ->ContextGL(); |
|
piman
2016/05/06 01:55:30
This path is taken in ResourceProvider::CopyToReso
sunnyps
2016/05/25 02:18:43
Done.
|
| + texture_id_ = gl->CreateAndConsumeTextureCHROMIUM( |
| + resource_->target, resource_->mailbox().name()); |
|
piman
2016/05/06 01:55:30
When called on the worker thread, it's not safe to
sunnyps
2016/05/25 02:18:43
Done.
|
| + DCHECK(texture_id_); |
| + } |
| + return texture_id_; |
| + } |
| + return resource_->gl_id; |
|
piman
2016/05/06 01:55:30
(ditto)
sunnyps
2016/05/25 02:18:43
Done.
|
| +} |
| + |
| +void ResourceProvider::ScopedWriteLockGL::ReleaseTextureId() { |
| + if (use_mailbox_) { |
| + gpu::gles2::GLES2Interface* gl = resource_provider_->output_surface() |
| + ->worker_context_provider() |
| + ->ContextGL(); |
|
piman
2016/05/06 01:55:30
And ditto wrt which context.
sunnyps
2016/05/25 02:18:43
Done.
|
| + gl->DeleteTextures(1, &texture_id_); |
| + texture_id_ = 0; |
| + } |
| +} |
| + |
| void ResourceProvider::PopulateSkBitmapWithResource( |
| SkBitmap* sk_bitmap, const Resource* resource) { |
| DCHECK_EQ(RGBA_8888, resource->format); |
| @@ -1085,19 +1117,27 @@ ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { |
| ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( |
| ResourceProvider* resource_provider, |
| - ResourceId resource_id) |
| + ResourceId resource_id, |
| + bool use_mailbox) |
| : resource_provider_(resource_provider), |
| resource_(resource_provider->LockForWrite(resource_id)), |
| + use_mailbox_(use_mailbox), |
| + texture_id_(0), |
| set_sync_token_(false) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| resource_provider_->LazyAllocate(resource_); |
| if (resource_->image_id && resource_->dirty_image) |
| resource_provider_->BindImageForSampling(resource_); |
| + if (use_mailbox_) { |
| + resource_provider_->CreateMailboxAndBindResource( |
| + resource_provider_->ContextGL(), resource_); |
| + } |
| } |
| ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| DCHECK(resource_->locked_for_write); |
| + DCHECK_EQ(texture_id_, 0u); |
| if (set_sync_token_) |
| resource_->UpdateSyncToken(sync_token_); |
| @@ -1110,8 +1150,16 @@ void ResourceProvider::ScopedWriteLockGr::InitSkSurface( |
| int msaa_sample_count) { |
| DCHECK(resource_->locked_for_write); |
| + if (use_mailbox_) { |
| + gpu::gles2::GLES2Interface* gl = resource_provider_->output_surface() |
| + ->worker_context_provider() |
| + ->ContextGL(); |
| + texture_id_ = gl->CreateAndConsumeTextureCHROMIUM( |
| + resource_->target, resource_->mailbox().name()); |
|
piman
2016/05/06 01:55:30
Same as above, unsafe to access resource_
sunnyps
2016/05/25 02:18:43
Done.
|
| + } |
| + |
| GrGLTextureInfo texture_info; |
| - texture_info.fID = resource_->gl_id; |
| + texture_info.fID = use_mailbox_ ? texture_id_ : resource_->gl_id; |
| texture_info.fTarget = resource_->target; |
| GrBackendTextureDesc desc; |
| desc.fFlags = kRenderTarget_GrBackendTextureFlag; |
| @@ -1136,12 +1184,26 @@ void ResourceProvider::ScopedWriteLockGr::InitSkSurface( |
| } |
| sk_surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget( |
| gr_context, desc, &surface_props); |
| + if (!sk_surface_ && use_mailbox_) { |
| + gpu::gles2::GLES2Interface* gl = resource_provider_->output_surface() |
| + ->worker_context_provider() |
| + ->ContextGL(); |
| + gl->DeleteTextures(1, &texture_id_); |
| + texture_id_ = 0; |
| + } |
| } |
| void ResourceProvider::ScopedWriteLockGr::ReleaseSkSurface() { |
| DCHECK(sk_surface_); |
| sk_surface_->prepareForExternalIO(); |
| sk_surface_.reset(); |
| + if (use_mailbox_) { |
| + gpu::gles2::GLES2Interface* gl = resource_provider_->output_surface() |
| + ->worker_context_provider() |
| + ->ContextGL(); |
| + gl->DeleteTextures(1, &texture_id_); |
| + texture_id_ = 0; |
| + } |
| } |
| ResourceProvider::SynchronousFence::SynchronousFence( |