Index: content/browser/compositor/gpu_browser_compositor_output_surface.cc |
diff --git a/content/browser/compositor/gpu_browser_compositor_output_surface.cc b/content/browser/compositor/gpu_browser_compositor_output_surface.cc |
index 114a84f33b4195425bff6edfa041af21c5e07876..ee666790bfb5f4e76bbf87f3781940e5f00b2f53 100644 |
--- a/content/browser/compositor/gpu_browser_compositor_output_surface.cc |
+++ b/content/browser/compositor/gpu_browser_compositor_output_surface.cc |
@@ -7,9 +7,11 @@ |
#include "cc/output/compositor_frame.h" |
#include "cc/output/output_surface_client.h" |
#include "content/browser/compositor/browser_compositor_overlay_candidate_validator.h" |
+#include "content/browser/compositor/owned_mailbox.h" |
#include "content/browser/compositor/reflector_impl.h" |
#include "content/browser/renderer_host/render_widget_host_impl.h" |
#include "content/common/gpu/client/context_provider_command_buffer.h" |
+#include "content/common/gpu/client/gl_helper.h" |
#include "content/public/browser/browser_thread.h" |
#include "gpu/command_buffer/client/context_support.h" |
#include "gpu/command_buffer/client/gles2_interface.h" |
@@ -32,10 +34,14 @@ GpuBrowserCompositorOutputSurface::GpuBrowserCompositorOutputSurface( |
base::Unretained(this))), |
update_vsync_parameters_callback_(base::Bind( |
&BrowserCompositorOutputSurface::OnUpdateVSyncParametersFromGpu, |
- base::Unretained(this))) { |
+ base::Unretained(this))), |
+ mirrored_compositor_gl_helper_texture_id_(0) { |
} |
-GpuBrowserCompositorOutputSurface::~GpuBrowserCompositorOutputSurface() {} |
+GpuBrowserCompositorOutputSurface::~GpuBrowserCompositorOutputSurface() { |
+ DCHECK(!reflector_); |
+ DeleteTexture(); |
+} |
CommandBufferProxyImpl* |
GpuBrowserCompositorOutputSurface::GetCommandBufferProxy() { |
@@ -60,6 +66,37 @@ bool GpuBrowserCompositorOutputSurface::BindToClient( |
return true; |
} |
+void GpuBrowserCompositorOutputSurface::DeleteTexture() { |
+ if (mirrored_compositor_gl_helper_.get()) { |
+ mirrored_compositor_gl_helper_->DeleteTexture( |
+ mirrored_compositor_gl_helper_texture_id_); |
+ mailbox_ = nullptr; |
+ mirrored_compositor_gl_helper_texture_id_ = 0; |
+ mirrored_compositor_gl_helper_ = nullptr; |
+ } |
+} |
+ |
+void GpuBrowserCompositorOutputSurface::OnReflectorChanged() { |
+ if (!reflector_) { |
+ DeleteTexture(); |
+ } else { |
+ GLHelper* shared_helper = |
+ ImageTransportFactory::GetInstance()->GetGLHelper(); |
+ mailbox_ = new OwnedMailbox(shared_helper); |
+ |
+ // Create a GLHelper attached to the mirrored compositor's output |
+ // surface for copying the output of the mirrored compositor. |
+ mirrored_compositor_gl_helper_.reset(new GLHelper( |
+ context_provider()->ContextGL(), context_provider()->ContextSupport())); |
+ // Create a texture id in the name space of the new GLHelper to update the |
+ // mailbox being held by the |mirroring_layer_|. |
piman
2015/05/13 19:46:23
can you add a DCHECK(!mirrored_compositor_gl_helpe
oshima
2015/05/14 14:44:58
Done.
|
+ mirrored_compositor_gl_helper_texture_id_ = |
+ mirrored_compositor_gl_helper_->ConsumeMailboxToTexture( |
+ mailbox_->mailbox(), mailbox_->sync_point()); |
+ reflector_->OnSourceTextureMailboxUpdated(mailbox_); |
+ } |
+} |
+ |
void GpuBrowserCompositorOutputSurface::SwapBuffers( |
cc::CompositorFrame* frame) { |
DCHECK(frame->gl_frame_data); |
@@ -68,10 +105,28 @@ void GpuBrowserCompositorOutputSurface::SwapBuffers( |
if (reflector_) { |
if (frame->gl_frame_data->sub_buffer_rect == |
- gfx::Rect(frame->gl_frame_data->size)) |
+ gfx::Rect(frame->gl_frame_data->size)) { |
+ gfx::Size size = SurfaceSize(); |
+ mirrored_compositor_gl_helper_->CopyTextureFullImage( |
+ mirrored_compositor_gl_helper_texture_id_, size); |
+ // Insert a barrier to make the copy show up in the mirroring compositor's |
+ // mailbox. Since the the compositor contexts and the |
+ // ImageTransportFactory's |
+ // GLHelper are all on the same GPU channel, this is sufficient instead of |
+ // plumbing through a sync point. |
+ mirrored_compositor_gl_helper_->InsertOrderingBarrier(); |
+ |
reflector_->OnSourceSwapBuffers(); |
- else |
- reflector_->OnSourcePostSubBuffer(frame->gl_frame_data->sub_buffer_rect); |
+ } else { |
+ const gfx::Rect& rect = frame->gl_frame_data->sub_buffer_rect; |
+ |
+ mirrored_compositor_gl_helper_->CopyTextureSubImage( |
+ mirrored_compositor_gl_helper_texture_id_, rect); |
+ // Insert a barrier for the same reason above. |
+ mirrored_compositor_gl_helper_->InsertOrderingBarrier(); |
+ |
+ reflector_->OnSourcePostSubBuffer(rect); |
+ } |
} |
if (frame->gl_frame_data->sub_buffer_rect == |