Chromium Code Reviews| Index: content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.cc |
| diff --git a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.cc b/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.cc |
| index 0c4d066e37895a768142f2491c6e6b1d489ce988..fe289cda9a2f39e43e3a8d1b8eb3a1ac905b45c5 100644 |
| --- a/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.cc |
| +++ b/content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.cc |
| @@ -7,6 +7,8 @@ |
| #include "cc/surfaces/surface.h" |
| #include "cc/surfaces/surface_manager.h" |
| #include "content/browser/compositor/surface_utils.h" |
| +#include "content/browser/renderer_host/offscreen_canvas_surface_impl.h" |
| +#include "content/browser/renderer_host/offscreen_canvas_surface_manager.h" |
| #include "mojo/public/cpp/bindings/strong_binding.h" |
| namespace content { |
| @@ -19,7 +21,6 @@ OffscreenCanvasCompositorFrameSink::OffscreenCanvasCompositorFrameSink( |
| surface_factory_ = base::MakeUnique<cc::SurfaceFactory>( |
| surface_id_.frame_sink_id(), manager, this); |
| manager->RegisterFrameSinkId(surface_id_.frame_sink_id()); |
| - surface_factory_->Create(surface_id_.local_frame_id()); |
| } |
| OffscreenCanvasCompositorFrameSink::~OffscreenCanvasCompositorFrameSink() { |
| @@ -46,6 +47,41 @@ void OffscreenCanvasCompositorFrameSink::Create( |
| void OffscreenCanvasCompositorFrameSink::SubmitCompositorFrame( |
| cc::CompositorFrame frame) { |
| + cc::RenderPass* root_pass = frame.render_pass_list.back().get(); |
| + gfx::Size surface_size = root_pass->output_rect.size(); |
| + |
| + if (!GetSurfaceManager()->GetSurfaceForId(surface_id_)) { |
|
Fady Samuel
2016/11/22 16:04:09
I hate to be overly nitpicky but this flow doesn't
|
| + // If this is the first commit, surface_id_ is not used to create a new |
| + // Surface yet. |
| + surface_factory_->Create(surface_id_.local_frame_id()); |
| + current_surface_size_ = surface_size; |
| + } else if (surface_size != current_surface_size_) { |
| + // If this is not the first commit, we check whether there is a resize |
| + // since the previous commit. |
| + OffscreenCanvasSurfaceImpl* surface_impl = |
| + OffscreenCanvasSurfaceManager::GetInstance()->GetSurfaceInstance( |
| + surface_id_.frame_sink_id()); |
| + if (!surface_impl) { |
| + // We may end up here when the HTMLCanvasElement- |
| + // OffscreenCanvasSurfaceImpl connection is torn down and the |
| + // OffscreenCanvas-CompositorFrameSink connection is still working. In |
| + // this case, we ignore the commit() because it is meaningless to |
| + // process a compositor frame when there is no placeholder canvas for |
| + // this OffscreenCanvas. |
| + LOG(ERROR) << "OffscreenCanvas is submitting frame when its place holder" |
| + << " canvas's browser service-end does no longer exist."; |
| + return; |
| + } |
| + |
| + cc::LocalFrameId new_local_frame_id = surface_impl->GenerateLocalFrameId(); |
| + surface_factory_->Destroy(surface_id_.local_frame_id()); |
| + surface_id_ = |
| + cc::SurfaceId(surface_id_.frame_sink_id(), new_local_frame_id); |
| + surface_factory_->Create(surface_id_.local_frame_id()); |
| + current_surface_size_ = surface_size; |
| + surface_impl->OnSurfaceSizeChanged(surface_id_, current_surface_size_); |
| + } |
| + |
| ++ack_pending_count_; |
| surface_factory_->SubmitCompositorFrame( |
| surface_id_.local_frame_id(), std::move(frame), |