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 |