Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(777)

Unified Diff: cc/resources/resource_provider.cc

Issue 1951193002: cc: Add mailbox support to ResourceProvider write locks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@worker_context_stream
Patch Set: fix gpu Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/video_resource_updater.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/video_resource_updater.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698