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(); |