| Index: components/exo/buffer.cc
|
| diff --git a/components/exo/buffer.cc b/components/exo/buffer.cc
|
| index 9b1778d989d6c0250efff832d6372f401e15e129..90b6cd9dd745698a00549a2488bcdcc361fc52b8 100644
|
| --- a/components/exo/buffer.cc
|
| +++ b/components/exo/buffer.cc
|
| @@ -24,6 +24,7 @@
|
| #include "cc/output/context_provider.h"
|
| #include "cc/resources/single_release_callback.h"
|
| #include "cc/resources/texture_mailbox.h"
|
| +#include "components/exo/compositor_frame_sink_holder.h"
|
| #include "gpu/command_buffer/client/context_support.h"
|
| #include "gpu/command_buffer/client/gles2_interface.h"
|
| #include "ui/aura/env.h"
|
| @@ -401,7 +402,8 @@ Buffer::~Buffer() {}
|
| std::unique_ptr<cc::SingleReleaseCallback> Buffer::ProduceTextureMailbox(
|
| cc::TextureMailbox* texture_mailbox,
|
| bool secure_output_only,
|
| - bool client_usage) {
|
| + bool client_usage,
|
| + scoped_refptr<CompositorFrameSinkHolder> compositor_frame_sink_holder) {
|
| DCHECK(attach_count_);
|
| DLOG_IF(WARNING, use_count_ && client_usage)
|
| << "Producing a texture mailbox for a buffer that has not been released";
|
| @@ -458,10 +460,11 @@ std::unique_ptr<cc::SingleReleaseCallback> Buffer::ProduceTextureMailbox(
|
| secure_output_only);
|
| // The contents texture will be released when no longer used by the
|
| // compositor.
|
| - return cc::SingleReleaseCallback::Create(
|
| - base::Bind(&Buffer::Texture::ReleaseTexImage, base::Unretained(texture),
|
| - base::Bind(&Buffer::ReleaseContentsTexture, AsWeakPtr(),
|
| - base::Passed(&contents_texture_))));
|
| + return cc::SingleReleaseCallback::Create(base::Bind(
|
| + &Buffer::Texture::ReleaseTexImage, base::Unretained(texture),
|
| + base::Bind(&Buffer::ReleaseContentsTextureAndCompositorFrameSinkHolder,
|
| + AsWeakPtr(), base::Passed(&contents_texture_),
|
| + base::RetainedRef(compositor_frame_sink_holder))));
|
| }
|
|
|
| // Create a mailbox texture that we copy the buffer contents to.
|
| @@ -477,8 +480,9 @@ std::unique_ptr<cc::SingleReleaseCallback> Buffer::ProduceTextureMailbox(
|
|
|
| // The contents texture will be released when copy has completed.
|
| gpu::SyncToken sync_token = contents_texture->CopyTexImage(
|
| - texture, base::Bind(&Buffer::ReleaseContentsTexture, AsWeakPtr(),
|
| - base::Passed(&contents_texture_)));
|
| + texture,
|
| + base::Bind(&Buffer::ReleaseContentsTextureAndCompositorFrameSinkHolder,
|
| + AsWeakPtr(), base::Passed(&contents_texture_), nullptr));
|
| *texture_mailbox =
|
| cc::TextureMailbox(texture->mailbox(), sync_token, GL_TEXTURE_2D,
|
| gpu_memory_buffer_->GetSize(),
|
| @@ -487,8 +491,9 @@ std::unique_ptr<cc::SingleReleaseCallback> Buffer::ProduceTextureMailbox(
|
| // compositor.
|
| return cc::SingleReleaseCallback::Create(
|
| base::Bind(&Buffer::Texture::Release, base::Unretained(texture),
|
| - base::Bind(&Buffer::ReleaseTexture, AsWeakPtr(),
|
| - base::Passed(&texture_))));
|
| + base::Bind(&Buffer::ReleaseTextureAndCompositorFrameSinkHolder,
|
| + AsWeakPtr(), base::Passed(&texture_),
|
| + base::RetainedRef(compositor_frame_sink_holder))));
|
| }
|
|
|
| void Buffer::OnAttach() {
|
| @@ -536,10 +541,22 @@ void Buffer::CheckReleaseCallback() {
|
| release_callback_.Run();
|
| }
|
|
|
| +void Buffer::ReleaseTextureAndCompositorFrameSinkHolder(
|
| + std::unique_ptr<Texture> texture,
|
| + CompositorFrameSinkHolder* compositor_frame_sink_holder) {
|
| + ReleaseTexture(std::move(texture));
|
| +}
|
| +
|
| void Buffer::ReleaseTexture(std::unique_ptr<Texture> texture) {
|
| texture_ = std::move(texture);
|
| }
|
|
|
| +void Buffer::ReleaseContentsTextureAndCompositorFrameSinkHolder(
|
| + std::unique_ptr<Texture> texture,
|
| + CompositorFrameSinkHolder* compositor_frame_sink_holder) {
|
| + ReleaseContentsTexture(std::move(texture));
|
| +}
|
| +
|
| void Buffer::ReleaseContentsTexture(std::unique_ptr<Texture> texture) {
|
| TRACE_EVENT0("exo", "Buffer::ReleaseContentsTexture");
|
|
|
|
|