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

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

Issue 2474113002: Mus+Ash: Unified BeginFrame Skeleton (Closed)
Patch Set: Rebase 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
« no previous file with comments | « services/ui/ws/frame_generator.h ('k') | services/ui/ws/platform_display.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 (!root_window_->visible())
93 return;
94
95 // TODO(fsamuel): We should add a trace for generating a top level frame.
96 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds()));
97 if (compositor_frame_sink_)
98 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame));
89 } 99 }
90 100
91 void FrameGenerator::ReclaimResources( 101 void FrameGenerator::ReclaimResources(
92 const cc::ReturnedResourceArray& resources) { 102 const cc::ReturnedResourceArray& resources) {
93 // Nothing to do here because FrameGenerator CompositorFrames don't reference 103 // Nothing to do here because FrameGenerator CompositorFrames don't reference
94 // any resources. 104 // any resources.
95 } 105 }
96 106
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 (!root_window_->visible())
109 return;
110
111 dirty_rect_.Intersect(root_window_->bounds());
112 // TODO(fsamuel): We should add a trace for generating a top level frame.
113 cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds()));
114 if (compositor_frame_sink_) {
115 frame_pending_ = true;
116 compositor_frame_sink_->SubmitCompositorFrame(std::move(frame));
117 }
118 dirty_rect_ = gfx::Rect();
119 }
120
121 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( 107 cc::CompositorFrame FrameGenerator::GenerateCompositorFrame(
122 const gfx::Rect& output_rect) { 108 const gfx::Rect& output_rect) {
123 const cc::RenderPassId render_pass_id(1, 1); 109 const cc::RenderPassId render_pass_id(1, 1);
124 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); 110 std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
125 render_pass->SetNew(render_pass_id, output_rect, dirty_rect_, 111 render_pass->SetNew(render_pass_id, output_rect, output_rect,
126 gfx::Transform()); 112 gfx::Transform());
127 113
128 DrawWindowTree(render_pass.get(), root_window_, gfx::Vector2d(), 1.0f); 114 DrawWindowTree(render_pass.get(), root_window_, gfx::Vector2d(), 1.0f);
129 115
130 cc::CompositorFrame frame; 116 cc::CompositorFrame frame;
131 frame.render_pass_list.push_back(std::move(render_pass)); 117 frame.render_pass_list.push_back(std::move(render_pass));
132 if (delegate_->IsInHighContrastMode()) { 118 if (delegate_->IsInHighContrastMode()) {
133 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); 119 std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create();
134 invert_pass->SetNew(cc::RenderPassId(2, 0), output_rect, dirty_rect_, 120 invert_pass->SetNew(cc::RenderPassId(2, 0), output_rect, output_rect,
135 gfx::Transform()); 121 gfx::Transform());
136 cc::SharedQuadState* shared_state = 122 cc::SharedQuadState* shared_state =
137 invert_pass->CreateAndAppendSharedQuadState(); 123 invert_pass->CreateAndAppendSharedQuadState();
138 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect, 124 shared_state->SetAll(gfx::Transform(), output_rect.size(), output_rect,
139 output_rect, false, 1.f, SkXfermode::kSrcOver_Mode, 0); 125 output_rect, false, 1.f, SkXfermode::kSrcOver_Mode, 0);
140 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); 126 auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>();
141 cc::FilterOperations filters; 127 cc::FilterOperations filters;
142 filters.Append(cc::FilterOperation::CreateInvertFilter(1.f)); 128 filters.Append(cc::FilterOperation::CreateInvertFilter(1.f));
143 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, 129 quad->SetNew(shared_state, output_rect, output_rect, render_pass_id,
144 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */, 130 0 /* mask_resource_id */, gfx::Vector2dF() /* mask_uv_scale */,
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 cc::SurfaceId underlay_surface_id = 301 cc::SurfaceId underlay_surface_id =
316 window->compositor_frame_sink_manager()->GetLatestSurfaceId( 302 window->compositor_frame_sink_manager()->GetLatestSurfaceId(
317 mojom::CompositorFrameSinkType::UNDERLAY); 303 mojom::CompositorFrameSinkType::UNDERLAY);
318 if (!underlay_surface_id.is_null()) 304 if (!underlay_surface_id.is_null())
319 ReleaseFrameSinkReference(underlay_surface_id.frame_sink_id()); 305 ReleaseFrameSinkReference(underlay_surface_id.frame_sink_id());
320 } 306 }
321 307
322 } // namespace ws 308 } // namespace ws
323 309
324 } // namespace ui 310 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/ws/frame_generator.h ('k') | services/ui/ws/platform_display.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698