| Index: services/ui/ws/frame_generator.cc
|
| diff --git a/services/ui/ws/frame_generator.cc b/services/ui/ws/frame_generator.cc
|
| index c239fb04b26f3a48abd79c1cb60bea3595258662..d9333340ad44ef18123c913388d8d969e8a5c36b 100644
|
| --- a/services/ui/ws/frame_generator.cc
|
| +++ b/services/ui/ws/frame_generator.cc
|
| @@ -30,7 +30,6 @@ FrameGenerator::FrameGenerator(FrameGeneratorDelegate* delegate,
|
| WindowIdToTransportId(root_window->id()),
|
| static_cast<uint32_t>(mojom::CompositorFrameSinkType::DEFAULT)),
|
| root_window_(root_window),
|
| - draw_timer_(false, false),
|
| binding_(this),
|
| weak_factory_(this) {
|
| DCHECK(delegate_);
|
| @@ -58,16 +57,16 @@ void FrameGenerator::OnGpuChannelEstablished(
|
| channel->gpu_memory_buffer_manager(),
|
| new SurfacesContextProvider(widget_, channel), std::move(request),
|
| binding_.CreateInterfacePtrAndBind());
|
| + // TODO(fsamuel): This means we're always requesting a new BeginFrame signal
|
| + // even when we don't need it. Once surface ID propagation work is done,
|
| + // this will not be necessary because FrameGenerator will only need a
|
| + // BeginFrame if the window manager changes.
|
| + compositor_frame_sink_->SetNeedsBeginFrame(true);
|
| } else {
|
| gpu_channel_ = std::move(channel);
|
| }
|
| }
|
|
|
| -void FrameGenerator::RequestRedraw(const gfx::Rect& redraw_region) {
|
| - dirty_rect_.Union(redraw_region);
|
| - WantToDraw();
|
| -}
|
| -
|
| void FrameGenerator::OnAcceleratedWidgetAvailable(
|
| gfx::AcceleratedWidget widget) {
|
| widget_ = widget;
|
| @@ -79,13 +78,24 @@ void FrameGenerator::OnAcceleratedWidgetAvailable(
|
| gpu_channel_->gpu_memory_buffer_manager(),
|
| new SurfacesContextProvider(widget_, std::move(gpu_channel_)),
|
| std::move(request), binding_.CreateInterfacePtrAndBind());
|
| + // TODO(fsamuel): This means we're always requesting a new BeginFrame signal
|
| + // even when we don't need it. Once surface ID propagation work is done,
|
| + // this will not be necessary because FrameGenerator will only need a
|
| + // BeginFrame if the window manager changes.
|
| + compositor_frame_sink_->SetNeedsBeginFrame(true);
|
| }
|
| }
|
|
|
| -void FrameGenerator::DidReceiveCompositorFrameAck() {
|
| - frame_pending_ = false;
|
| - if (!dirty_rect_.IsEmpty())
|
| - WantToDraw();
|
| +void FrameGenerator::DidReceiveCompositorFrameAck() {}
|
| +
|
| +void FrameGenerator::OnBeginFrame(const cc::BeginFrameArgs& begin_frame_arags) {
|
| + if (!root_window_->visible())
|
| + return;
|
| +
|
| + // TODO(fsamuel): We should add a trace for generating a top level frame.
|
| + cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds()));
|
| + if (compositor_frame_sink_)
|
| + compositor_frame_sink_->SubmitCompositorFrame(std::move(frame));
|
| }
|
|
|
| void FrameGenerator::ReclaimResources(
|
| @@ -94,46 +104,20 @@ void FrameGenerator::ReclaimResources(
|
| // any resources.
|
| }
|
|
|
| -void FrameGenerator::WantToDraw() {
|
| - if (draw_timer_.IsRunning() || frame_pending_)
|
| - return;
|
| -
|
| - // TODO(rjkroege): Use vblank to kick off Draw.
|
| - draw_timer_.Start(
|
| - FROM_HERE, base::TimeDelta(),
|
| - base::Bind(&FrameGenerator::Draw, weak_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void FrameGenerator::Draw() {
|
| - if (!delegate_->GetRootWindow()->visible())
|
| - return;
|
| -
|
| - const gfx::Rect output_rect(delegate_->GetViewportMetrics().pixel_size);
|
| - dirty_rect_.Intersect(output_rect);
|
| - // TODO(fsamuel): We should add a trace for generating a top level frame.
|
| - cc::CompositorFrame frame(GenerateCompositorFrame(output_rect));
|
| - if (compositor_frame_sink_) {
|
| - frame_pending_ = true;
|
| - compositor_frame_sink_->SubmitCompositorFrame(std::move(frame));
|
| - }
|
| - dirty_rect_ = gfx::Rect();
|
| -}
|
| -
|
| cc::CompositorFrame FrameGenerator::GenerateCompositorFrame(
|
| const gfx::Rect& output_rect) {
|
| const cc::RenderPassId render_pass_id(1, 1);
|
| std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create();
|
| - render_pass->SetNew(render_pass_id, output_rect, dirty_rect_,
|
| + render_pass->SetNew(render_pass_id, output_rect, output_rect,
|
| gfx::Transform());
|
|
|
| - DrawWindowTree(render_pass.get(), delegate_->GetRootWindow(), gfx::Vector2d(),
|
| - 1.0f);
|
| + DrawWindowTree(render_pass.get(), root_window_, gfx::Vector2d(), 1.0f);
|
|
|
| cc::CompositorFrame frame;
|
| frame.render_pass_list.push_back(std::move(render_pass));
|
| if (delegate_->IsInHighContrastMode()) {
|
| std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create();
|
| - invert_pass->SetNew(cc::RenderPassId(2, 0), output_rect, dirty_rect_,
|
| + invert_pass->SetNew(cc::RenderPassId(2, 0), output_rect, output_rect,
|
| gfx::Transform());
|
| cc::SharedQuadState* shared_state =
|
| invert_pass->CreateAndAppendSharedQuadState();
|
|
|