Index: cc/resources/resource_provider.cc |
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
index 1be0b13564fc2774c44982e9f0bd6b967f5b2138..1483bad9dfb9c5350bf1c70526057a583ff60abb 100644 |
--- a/cc/resources/resource_provider.cc |
+++ b/cc/resources/resource_provider.cc |
@@ -236,6 +236,10 @@ ResourceProvider::Resource::Resource(GLuint texture_id, |
read_lock_fences_enabled(false), |
has_shared_bitmap_id(false), |
is_overlay_candidate(false), |
+#if defined(OS_ANDROID) |
+ is_backed_by_surface_texture(false), |
+ wants_promotion_hint(false), |
+#endif |
read_lock_fence(nullptr), |
size(size), |
origin(origin), |
@@ -248,7 +252,8 @@ ResourceProvider::Resource::Resource(GLuint texture_id, |
type(type), |
usage(gfx::BufferUsage::GPU_READ_CPU_READ_WRITE), |
format(format), |
- shared_bitmap(nullptr) {} |
+ shared_bitmap(nullptr) { |
+} |
ResourceProvider::Resource::Resource(uint8_t* pixels, |
SharedBitmap* bitmap, |
@@ -272,6 +277,10 @@ ResourceProvider::Resource::Resource(uint8_t* pixels, |
read_lock_fences_enabled(false), |
has_shared_bitmap_id(!!bitmap), |
is_overlay_candidate(false), |
+#if defined(OS_ANDROID) |
+ is_backed_by_surface_texture(false), |
+ wants_promotion_hint(false), |
+#endif |
read_lock_fence(nullptr), |
size(size), |
origin(origin), |
@@ -310,6 +319,10 @@ ResourceProvider::Resource::Resource(const SharedBitmapId& bitmap_id, |
read_lock_fences_enabled(false), |
has_shared_bitmap_id(true), |
is_overlay_candidate(false), |
+#if defined(OS_ANDROID) |
+ is_backed_by_surface_texture(false), |
+ wants_promotion_hint(false), |
+#endif |
read_lock_fence(nullptr), |
size(size), |
origin(origin), |
@@ -322,7 +335,8 @@ ResourceProvider::Resource::Resource(const SharedBitmapId& bitmap_id, |
type(RESOURCE_TYPE_BITMAP), |
format(RGBA_8888), |
shared_bitmap_id(bitmap_id), |
- shared_bitmap(nullptr) {} |
+ shared_bitmap(nullptr) { |
+} |
ResourceProvider::Resource::Resource(Resource&& other) = default; |
@@ -687,6 +701,11 @@ ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
base::Owned(release_callback_impl.release())); |
resource->read_lock_fences_enabled = read_lock_fences_enabled; |
resource->is_overlay_candidate = mailbox.is_overlay_candidate(); |
+#if defined(OS_ANDROID) |
+ resource->is_backed_by_surface_texture = |
+ mailbox.is_backed_by_surface_texture(); |
+ resource->wants_promotion_hint = mailbox.wants_promotion_hint(); |
+#endif |
resource->color_space = mailbox.color_space(); |
return id; |
@@ -1051,6 +1070,13 @@ bool ResourceProvider::IsOverlayCandidate(ResourceId id) { |
return resource->is_overlay_candidate; |
} |
+#if defined(OS_ANDROID) |
+bool ResourceProvider::IsBackedBySurfaceTexture(ResourceId id) { |
+ Resource* resource = GetResource(id); |
+ return resource->is_backed_by_surface_texture; |
+} |
+#endif |
+ |
void ResourceProvider::UnlockForWrite(Resource* resource) { |
DCHECK(resource->locked_for_write); |
DCHECK_EQ(resource->exported_count, 0); |
@@ -1538,6 +1564,10 @@ void ResourceProvider::ReceiveFromChild( |
it->mailbox_holder.texture_target)); |
resource->read_lock_fences_enabled = it->read_lock_fences_enabled; |
resource->is_overlay_candidate = it->is_overlay_candidate; |
+#if defined(OS_ANDROID) |
+ resource->is_backed_by_surface_texture = it->is_backed_by_surface_texture; |
+ resource->wants_promotion_hint = it->wants_promotion_hint; |
+#endif |
resource->color_space = it->color_space; |
} |
resource->child_id = child; |
@@ -1626,6 +1656,30 @@ void ResourceProvider::ReceiveReturnsFromParent( |
} |
} |
+#if defined(OS_ANDROID) |
+void ResourceProvider::SendPromotionHints(const ResourceIdSet& promotable_set) { |
+ GLES2Interface* gl = ContextGL(); |
+ DCHECK(gl); |
+ |
+ for (const auto& it : resources_) { |
piman
2016/12/01 21:55:25
This sounds mildly expensive to go over all resour
liberato (no reviews please)
2016/12/05 18:14:01
Done.
|
+ const Resource& resource = it.second; |
+ // The resource must care about promotion hints. |
+ if (!resource.wants_promotion_hint) |
+ continue; |
+ |
+ // Insist that this is backed by a GPU texture. |
+ if (!IsGpuResourceType(resource.type)) |
+ continue; |
+ |
+ // TODO(liberato): I'm unsure why we can assume that |gl_id| is set yet |
+ // without using a read lock. |
piman
2016/12/01 21:55:25
I don't think you can, actually, gl_id is set (and
liberato (no reviews please)
2016/12/05 18:14:01
Done.
|
+ DCHECK(resource.gl_id); |
+ // gl->SetStreamTexturePromotionHintCHROMIUM(resource.gl_id, |
piman
2016/12/01 21:55:25
Do you expect we'll be doing a lot of these every
liberato (no reviews please)
2016/12/05 18:14:01
good question. it'll be one per video element tha
|
+ // promotable_set.count(it->first) > 0); |
+ } |
+} |
+#endif |
+ |
void ResourceProvider::CreateMailboxAndBindResource( |
gpu::gles2::GLES2Interface* gl, |
Resource* resource) { |
@@ -1665,6 +1719,10 @@ void ResourceProvider::TransferResource(Resource* source, |
resource->size = source->size; |
resource->read_lock_fences_enabled = source->read_lock_fences_enabled; |
resource->is_overlay_candidate = source->is_overlay_candidate; |
+#if defined(OS_ANDROID) |
+ resource->is_backed_by_surface_texture = source->is_backed_by_surface_texture; |
+ resource->wants_promotion_hint = source->wants_promotion_hint; |
+#endif |
resource->color_space = source->color_space; |
if (source->type == RESOURCE_TYPE_BITMAP) { |