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

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

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

Powered by Google App Engine
This is Rietveld 408576698