Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(255)

Side by Side Diff: services/ui/ws/frame_generator.cc

Issue 2474113002: Mus+Ash: Unified BeginFrame Skeleton (Closed)
Patch Set: Removed unnecessary include Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "services/ui/ws/frame_generator.h" 5 #include "services/ui/ws/frame_generator.h"
6 6
7 #include "base/containers/adapters.h" 7 #include "base/containers/adapters.h"
8 #include "cc/output/compositor_frame.h" 8 #include "cc/output/compositor_frame.h"
9 #include "cc/quads/render_pass.h" 9 #include "cc/quads/render_pass.h"
10 #include "cc/quads/render_pass_draw_quad.h" 10 #include "cc/quads/render_pass_draw_quad.h"
(...skipping 12 matching lines...) Expand all
23 23
24 namespace ws { 24 namespace ws {
25 25
26 FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate, 26 FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate,
27 ServerWindow* root_window) 27 ServerWindow* root_window)
28 : delegate_(delegate), 28 : delegate_(delegate),
29 frame_sink_id_( 29 frame_sink_id_(
30 WindowIdToTransportId(root_window->id()), 30 WindowIdToTransportId(root_window->id()),
31 static_cast<uint32_t>(mojom::CompositorFrameSinkType::DEFAULT)), 31 static_cast<uint32_t>(mojom::CompositorFrameSinkType::DEFAULT)),
32 root_window_(root_window), 32 root_window_(root_window),
33 draw_timer_(false, false),
34 binding_(this), 33 binding_(this),
35 weak_factory_(this) { 34 weak_factory_(this) {
36 DCHECK(delegate_); 35 DCHECK(delegate_);
37 surface_sequence_generator_.set_frame_sink_id(frame_sink_id_); 36 surface_sequence_generator_.set_frame_sink_id(frame_sink_id_);
38 } 37 }
39 38
40 FrameGenerator::~FrameGenerator() { 39 FrameGenerator::~FrameGenerator() {
41 ReleaseAllSurfaceReferences(); 40 ReleaseAllSurfaceReferences();
42 // Invalidate WeakPtrs now to avoid callbacks back into the 41 // Invalidate WeakPtrs now to avoid callbacks back into the
43 // FrameGenerator during destruction of |compositor_frame_sink_|. 42 // FrameGenerator during destruction of |compositor_frame_sink_|.
44 weak_factory_.InvalidateWeakPtrs(); 43 weak_factory_.InvalidateWeakPtrs();
45 compositor_frame_sink_.reset(); 44 compositor_frame_sink_.reset();
46 } 45 }
47 46
48 void FrameGenerator::OnGpuChannelEstablished( 47 void FrameGenerator::OnGpuChannelEstablished(
49 scoped_refptr<gpu::GpuChannelHost> channel) { 48 scoped_refptr<gpu::GpuChannelHost> channel) {
50 if (widget_ != gfx::kNullAcceleratedWidget) { 49 if (widget_ != gfx::kNullAcceleratedWidget) {
51 cc::mojom::MojoCompositorFrameSinkRequest request = 50 cc::mojom::MojoCompositorFrameSinkRequest request =
52 mojo::GetProxy(&compositor_frame_sink_); 51 mojo::GetProxy(&compositor_frame_sink_);
53 // TODO(fsamuel): FrameGenerator should not know about 52 // TODO(fsamuel): FrameGenerator should not know about
54 // SurfacesContextProvider. In fact, FrameGenerator should not know 53 // SurfacesContextProvider. In fact, FrameGenerator should not know
55 // about GpuChannelHost. 54 // about GpuChannelHost.
56 root_window_->CreateCompositorFrameSink( 55 root_window_->CreateCompositorFrameSink(
57 mojom::CompositorFrameSinkType::DEFAULT, widget_, 56 mojom::CompositorFrameSinkType::DEFAULT, widget_,
58 channel->gpu_memory_buffer_manager(), 57 channel->gpu_memory_buffer_manager(),
59 new SurfacesContextProvider(widget_, channel), std::move(request), 58 new SurfacesContextProvider(widget_, channel), std::move(request),
60 binding_.CreateInterfacePtrAndBind()); 59 binding_.CreateInterfacePtrAndBind());
60 // TODO(fsamuel): This means we're always requesting a new BeginFrame signal
61 // even when we don't need it. Once surface ID propagation work is done,
62 // this will not be necessary because FrameGenerator will only need a
63 // BeginFrame if the window manager changes.
64 compositor_frame_sink_->SetNeedsBeginFrame(true);
61 } else { 65 } else {
62 gpu_channel_ = std::move(channel); 66 gpu_channel_ = std::move(channel);
63 } 67 }
64 } 68 }
65 69
66 void FrameGenerator::RequestRedraw(const gfx::Rect& redraw_region) {
67 dirty_rect_.Union(redraw_region);
68 WantToDraw();
69 }
70
71 void FrameGenerator::OnAcceleratedWidgetAvailable( 70 void FrameGenerator::OnAcceleratedWidgetAvailable(
72 gfx::AcceleratedWidget widget) { 71 gfx::AcceleratedWidget widget) {
73 widget_ = widget; 72 widget_ = widget;
74 if (gpu_channel_ && widget != gfx::kNullAcceleratedWidget) { 73 if (gpu_channel_ && widget != gfx::kNullAcceleratedWidget) {
75 cc::mojom::MojoCompositorFrameSinkRequest request = 74 cc::mojom::MojoCompositorFrameSinkRequest request =
76 mojo::GetProxy(&compositor_frame_sink_); 75 mojo::GetProxy(&compositor_frame_sink_);
77 root_window_->CreateCompositorFrameSink( 76 root_window_->CreateCompositorFrameSink(
78 mojom::CompositorFrameSinkType::DEFAULT, widget_, 77 mojom::CompositorFrameSinkType::DEFAULT, widget_,
79 gpu_channel_->gpu_memory_buffer_manager(), 78 gpu_channel_->gpu_memory_buffer_manager(),
80 new SurfacesContextProvider(widget_, std::move(gpu_channel_)), 79 new SurfacesContextProvider(widget_, std::move(gpu_channel_)),
81 std::move(request), binding_.CreateInterfacePtrAndBind()); 80 std::move(request), binding_.CreateInterfacePtrAndBind());
81 // TODO(fsamuel): This means we're always requesting a new BeginFrame signal
82 // even when we don't need it. Once surface ID propagation work is done,
83 // this will not be necessary because FrameGenerator will only need a
84 // BeginFrame if the window manager changes.
85 compositor_frame_sink_->SetNeedsBeginFrame(true);
82 } 86 }
83 } 87 }
84 88
85 void FrameGenerator::DidReceiveCompositorFrameAck() { 89 void FrameGenerator::DidReceiveCompositorFrameAck() {}
86 frame_pending_ = false; 90
87 if (!dirty_rect_.IsEmpty()) 91 void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) {
88 WantToDraw(); 92 if (!delegate_->GetRootWindow()->visible())
93 return;
94
95 const gfx::Rect output_rect(delegate_->GetViewportMetrics().pixel_size);
96 // TODO(fsamuel): We should add a trace for generating a top level frame.
97 cc::CompositorFrame frame(GenerateCompositorFrame(output_rect));
98 if (compositor_frame_sink_)
99 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame));
89 } 100 }
90 101
91 void FrameGenerator::ReclaimResources( 102 void FrameGenerator::ReclaimResources(
92 const cc::ReturnedResourceArray& resources) { 103 const cc::ReturnedResourceArray& resources) {
93 // Nothing to do here because FrameGenerator CompositorFrames don't reference 104 // Nothing to do here because FrameGenerator CompositorFrames don't reference
94 // any resources. 105 // any resources.
95 } 106 }
96 107
97 void FrameGenerator::WantToDraw() {
98 if (draw_timer_.IsRunning() || frame_pending_)
99 return;
100
101 // TODO(rjkroege): Use vblank to kick off Draw.
102 draw_timer_.Start(
103 FROM_HERE, base::TimeDelta(),
104 base::Bind(&FrameGenerator::Draw, weak_factory_.GetWeakPtr()));
105 }
106
107 void FrameGenerator::Draw() {
108 if (!delegate_->GetRootWindow()->visible())
109 return;
110
111 const gfx::Rect output_rect(delegate_->GetViewportMetrics().pixel_size);
112 dirty_rect_.Intersect(output_rect);
113 // TODO(fsamuel): We should add a trace for generating a top level frame.
114 cc::CompositorFrame frame(GenerateCompositorFrame(output_rect));
115 if (compositor_frame_sink_) {
116 frame_pending_ = true;
117 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame));
118 }
119 dirty_rect_ = gfx::Rect();
120 }
121
122 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( 108 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame(
123 const gfx::Rect& output_rect) { 109 const gfx::Rect& output_rect) {
124 const cc::RenderPassId render_pass_id(1, 1); 110 const cc::RenderPassId render_pass_id(1, 1);
125 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 111 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
126 render_pass->SetNew(render_pass_id, output_rect, dirty_rect_, 112 render_pass->SetNew(render_pass_id, output_rect, output_rect,
127 gfx::Transform()); 113 gfx::Transform());
128 114
129 DrawWindowTree(render_pass.get(), delegate_->GetRootWindow(), gfx::Vector2d(), 115 DrawWindowTree(render_pass.get(), delegate_->GetRootWindow(), gfx::Vector2d(),
130 1.0f); 116 1.0f);
131 117
132 cc::CompositorFrame frame; 118 cc::CompositorFrame frame;
133 frame.render_pass_list.push_back(std::move(render_pass)); 119 frame.render_pass_list.push_back(std::move(render_pass));
134 if (delegate_->IsInHighContrastMode()) { 120 if (delegate_->IsInHighContrastMode()) {
135 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); 121 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create();
136 invert_pass->SetNew(cc::RenderPassId(2, 0), output_rect, dirty_rect_, 122 invert_pass->SetNew(cc::RenderPassId(2, 0), output_rect, output_rect,
137 gfx::Transform()); 123 gfx::Transform());
138 cc::SharedQuadState* shared_state = 124 cc::SharedQuadState* shared_state =
139 invert_pass->CreateAndAppendSharedQuadState(); 125 invert_pass->CreateAndAppendSharedQuadState();
140 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect, 126 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect,
141 output_rect, false, 1.f, SkXfermode::kSrcOver_Mode, 0); 127 output_rect, false, 1.f, SkXfermode::kSrcOver_Mode, 0);
142 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); 128 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>();
143 cc::FilterOperations filters; 129 cc::FilterOperations filters;
144 filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); 130 filters.Append(cc::FilterOperation::CreateInvertFilter(1.f));
145 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, 131 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id,
146 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */, 132 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */,
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 cc::SurfaceId underlay_surface_id = 303 cc::SurfaceId underlay_surface_id =
318 window->compositor_frame_sink_manager()->GetLatestSurfaceId( 304 window->compositor_frame_sink_manager()->GetLatestSurfaceId(
319 mojom::CompositorFrameSinkType::UNDERLAY); 305 mojom::CompositorFrameSinkType::UNDERLAY);
320 if (!underlay_surface_id.is_null()) 306 if (!underlay_surface_id.is_null())
321 ReleaseFrameSinkReference(underlay_surface_id.frame_sink_id()); 307 ReleaseFrameSinkReference(underlay_surface_id.frame_sink_id());
322 } 308 }
323 309
324 } // namespace ws 310 } // namespace ws
325 311
326 } // namespace ui 312 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698