| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.h
" | 5 #include "content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.h
" |
| 6 | 6 |
| 7 #include "cc/surfaces/surface.h" | 7 #include "cc/surfaces/surface.h" |
| 8 #include "cc/surfaces/surface_manager.h" | 8 #include "cc/surfaces/surface_manager.h" |
| 9 #include "content/browser/compositor/surface_utils.h" | |
| 10 #include "mojo/public/cpp/bindings/strong_binding.h" | 9 #include "mojo/public/cpp/bindings/strong_binding.h" |
| 11 | 10 |
| 12 namespace content { | 11 namespace content { |
| 13 | 12 |
| 14 OffscreenCanvasCompositorFrameSink::OffscreenCanvasCompositorFrameSink( | 13 // static |
| 15 const cc::SurfaceId& surface_id, | 14 void OffscreenCanvasCompositorFrameSink::Create( |
| 16 cc::mojom::MojoCompositorFrameSinkClientPtr client) | 15 const cc::FrameSinkId& frame_sink_id, |
| 17 : surface_id_(surface_id), client_(std::move(client)) { | 16 cc::SurfaceManager* surface_manager, |
| 18 cc::SurfaceManager* manager = GetSurfaceManager(); | 17 cc::mojom::MojoCompositorFrameSinkClientPtr client, |
| 19 surface_factory_ = base::MakeUnique<cc::SurfaceFactory>( | 18 cc::mojom::MojoCompositorFrameSinkRequest request) { |
| 20 surface_id_.frame_sink_id(), manager, this); | 19 std::unique_ptr<OffscreenCanvasCompositorFrameSink> impl = |
| 21 manager->RegisterFrameSinkId(surface_id_.frame_sink_id()); | 20 base::MakeUnique<OffscreenCanvasCompositorFrameSink>( |
| 21 frame_sink_id, surface_manager, std::move(client)); |
| 22 OffscreenCanvasCompositorFrameSink* compositor_frame_sink = impl.get(); |
| 23 compositor_frame_sink->binding_ = |
| 24 mojo::MakeStrongBinding(std::move(impl), std::move(request)); |
| 22 } | 25 } |
| 23 | 26 |
| 24 OffscreenCanvasCompositorFrameSink::~OffscreenCanvasCompositorFrameSink() { | 27 OffscreenCanvasCompositorFrameSink::OffscreenCanvasCompositorFrameSink( |
| 25 cc::SurfaceManager* manager = GetSurfaceManager(); | 28 const cc::FrameSinkId& frame_sink_id, |
| 26 if (!manager) { | 29 cc::SurfaceManager* surface_manager, |
| 27 // Inform SurfaceFactory that SurfaceManager's no longer alive to | 30 cc::mojom::MojoCompositorFrameSinkClientPtr client) |
| 28 // avoid its destruction error. | 31 : support_(this, surface_manager, frame_sink_id, nullptr, nullptr), |
| 29 surface_factory_->DidDestroySurfaceManager(); | 32 client_(std::move(client)) {} |
| 30 } else { | |
| 31 manager->InvalidateFrameSinkId(surface_id_.frame_sink_id()); | |
| 32 } | |
| 33 surface_factory_->EvictSurface(); | |
| 34 } | |
| 35 | 33 |
| 36 // static | 34 OffscreenCanvasCompositorFrameSink::~OffscreenCanvasCompositorFrameSink() {} |
| 37 void OffscreenCanvasCompositorFrameSink::Create( | 35 |
| 38 const cc::SurfaceId& surface_id, | 36 void OffscreenCanvasCompositorFrameSink::SetNeedsBeginFrame( |
| 39 cc::mojom::MojoCompositorFrameSinkClientPtr client, | 37 bool needs_begin_frame) { |
| 40 cc::mojom::MojoCompositorFrameSinkRequest request) { | 38 support_.SetNeedsBeginFrame(needs_begin_frame); |
| 41 mojo::MakeStrongBinding(base::MakeUnique<OffscreenCanvasCompositorFrameSink>( | |
| 42 surface_id, std::move(client)), | |
| 43 std::move(request)); | |
| 44 } | 39 } |
| 45 | 40 |
| 46 void OffscreenCanvasCompositorFrameSink::SubmitCompositorFrame( | 41 void OffscreenCanvasCompositorFrameSink::SubmitCompositorFrame( |
| 47 const cc::LocalFrameId& local_frame_id, | 42 const cc::LocalFrameId& local_frame_id, |
| 48 cc::CompositorFrame frame) { | 43 cc::CompositorFrame frame) { |
| 49 ++ack_pending_count_; | 44 support_.SubmitCompositorFrame(local_frame_id, std::move(frame)); |
| 50 surface_factory_->SubmitCompositorFrame( | |
| 51 surface_id_.local_frame_id(), std::move(frame), | |
| 52 base::Bind( | |
| 53 &OffscreenCanvasCompositorFrameSink::DidReceiveCompositorFrameAck, | |
| 54 base::Unretained(this))); | |
| 55 } | |
| 56 | |
| 57 void OffscreenCanvasCompositorFrameSink::SetNeedsBeginFrame( | |
| 58 bool needs_begin_frame) { | |
| 59 NOTIMPLEMENTED(); | |
| 60 } | 45 } |
| 61 | 46 |
| 62 void OffscreenCanvasCompositorFrameSink::AddSurfaceReferences( | 47 void OffscreenCanvasCompositorFrameSink::AddSurfaceReferences( |
| 63 const std::vector<cc::SurfaceReference>& references) { | 48 const std::vector<cc::SurfaceReference>& references) { |
| 49 // TODO(fsamuel, staraz): Implement this. |
| 64 NOTIMPLEMENTED(); | 50 NOTIMPLEMENTED(); |
| 65 } | 51 } |
| 66 | 52 |
| 67 void OffscreenCanvasCompositorFrameSink::RemoveSurfaceReferences( | 53 void OffscreenCanvasCompositorFrameSink::RemoveSurfaceReferences( |
| 68 const std::vector<cc::SurfaceReference>& references) { | 54 const std::vector<cc::SurfaceReference>& references) { |
| 55 // TODO(fsamuel, staraz): Implement this. |
| 69 NOTIMPLEMENTED(); | 56 NOTIMPLEMENTED(); |
| 70 } | 57 } |
| 71 | 58 |
| 72 void OffscreenCanvasCompositorFrameSink::EvictFrame() { | 59 void OffscreenCanvasCompositorFrameSink::EvictFrame() { |
| 73 // TODO(fsamuel, staraz): Implement this | 60 support_.EvictFrame(); |
| 74 NOTIMPLEMENTED(); | |
| 75 } | 61 } |
| 76 | 62 |
| 77 void OffscreenCanvasCompositorFrameSink::Require( | 63 void OffscreenCanvasCompositorFrameSink::Require( |
| 78 const cc::LocalFrameId& local_frame_id, | 64 const cc::LocalFrameId& local_frame_id, |
| 79 const cc::SurfaceSequence& sequence) { | 65 const cc::SurfaceSequence& sequence) { |
| 80 // TODO(staraz): Implement this. | 66 support_.Require(local_frame_id, sequence); |
| 81 NOTIMPLEMENTED(); | |
| 82 } | 67 } |
| 83 | 68 |
| 84 void OffscreenCanvasCompositorFrameSink::Satisfy( | 69 void OffscreenCanvasCompositorFrameSink::Satisfy( |
| 85 const cc::SurfaceSequence& sequence) { | 70 const cc::SurfaceSequence& sequence) { |
| 86 // TODO(staraz): Implement this. | 71 support_.Satisfy(sequence); |
| 87 NOTIMPLEMENTED(); | |
| 88 } | 72 } |
| 89 | 73 |
| 90 void OffscreenCanvasCompositorFrameSink::ReturnResources( | 74 void OffscreenCanvasCompositorFrameSink::DidReceiveCompositorFrameAck() { |
| 91 const cc::ReturnedResourceArray& resources) { | 75 if (client_) |
| 92 if (resources.empty()) | 76 client_->DidReceiveCompositorFrameAck(); |
| 93 return; | |
| 94 | |
| 95 if (!ack_pending_count_ && client_) { | |
| 96 client_->ReclaimResources(resources); | |
| 97 return; | |
| 98 } | |
| 99 | |
| 100 std::copy(resources.begin(), resources.end(), | |
| 101 std::back_inserter(surface_returned_resources_)); | |
| 102 } | 77 } |
| 103 | 78 |
| 104 void OffscreenCanvasCompositorFrameSink::WillDrawSurface( | 79 void OffscreenCanvasCompositorFrameSink::OnBeginFrame( |
| 105 const cc::LocalFrameId& id, | 80 const cc::BeginFrameArgs& args) { |
| 106 const gfx::Rect& damage_rect) {} | 81 if (client_) |
| 82 client_->OnBeginFrame(args); |
| 83 } |
| 107 | 84 |
| 108 void OffscreenCanvasCompositorFrameSink::SetBeginFrameSource( | 85 void OffscreenCanvasCompositorFrameSink::ReclaimResources( |
| 109 cc::BeginFrameSource* begin_frame_source) {} | 86 const cc::ReturnedResourceArray& resources) { |
| 87 if (client_) |
| 88 client_->ReclaimResources(resources); |
| 89 } |
| 110 | 90 |
| 111 void OffscreenCanvasCompositorFrameSink::DidReceiveCompositorFrameAck() { | 91 void OffscreenCanvasCompositorFrameSink::WillDrawSurface() { |
| 112 if (!client_) | 92 if (client_) |
| 113 return; | 93 client_->WillDrawSurface(); |
| 114 client_->DidReceiveCompositorFrameAck(); | |
| 115 DCHECK_GT(ack_pending_count_, 0); | |
| 116 if (!surface_returned_resources_.empty()) { | |
| 117 client_->ReclaimResources(surface_returned_resources_); | |
| 118 surface_returned_resources_.clear(); | |
| 119 } | |
| 120 ack_pending_count_--; | |
| 121 } | 94 } |
| 122 | 95 |
| 123 } // namespace content | 96 } // namespace content |
| OLD | NEW |