Chromium Code Reviews| Index: cc/test/test_compositor_frame_sink.cc |
| diff --git a/cc/test/test_compositor_frame_sink.cc b/cc/test/test_compositor_frame_sink.cc |
| index 2800db713edb14d0b66fefa06edda68488133901..98c6e11cb65a562a95a6eff92a4a11eb903db253 100644 |
| --- a/cc/test/test_compositor_frame_sink.cc |
| +++ b/cc/test/test_compositor_frame_sink.cc |
| @@ -25,40 +25,42 @@ TestCompositorFrameSink::TestCompositorFrameSink( |
| SharedBitmapManager* shared_bitmap_manager, |
| gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| const RendererSettings& renderer_settings, |
| - base::SingleThreadTaskRunner* task_runner, |
| + scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| bool synchronous_composite, |
| bool force_disable_reclaim_resources) |
| : CompositorFrameSink(std::move(compositor_context_provider), |
| std::move(worker_context_provider)), |
| + task_runner_(std::move(task_runner)), |
| frame_sink_id_(kCompositorFrameSinkId), |
| surface_manager_(new SurfaceManager), |
| surface_id_allocator_(new SurfaceIdAllocator()), |
| surface_factory_( |
| new SurfaceFactory(frame_sink_id_, surface_manager_.get(), this)), |
| display_context_shared_with_compositor_( |
| - display_output_surface->context_provider() == context_provider()) { |
| + display_output_surface->context_provider() == context_provider()), |
| + weak_ptr_factory_(this) { |
| std::unique_ptr<SyntheticBeginFrameSource> begin_frame_source; |
| std::unique_ptr<DisplayScheduler> scheduler; |
| if (!synchronous_composite) { |
| if (renderer_settings.disable_display_vsync) { |
| begin_frame_source.reset(new BackToBackBeginFrameSource( |
| - base::MakeUnique<DelayBasedTimeSource>(task_runner))); |
| + base::MakeUnique<DelayBasedTimeSource>(task_runner_.get()))); |
| } else { |
| begin_frame_source.reset(new DelayBasedBeginFrameSource( |
| - base::MakeUnique<DelayBasedTimeSource>(task_runner))); |
| + base::MakeUnique<DelayBasedTimeSource>(task_runner_.get()))); |
| begin_frame_source->SetAuthoritativeVSyncInterval( |
| base::TimeDelta::FromMilliseconds(1000.f / |
| renderer_settings.refresh_rate)); |
| } |
| scheduler.reset(new DisplayScheduler( |
| - begin_frame_source.get(), task_runner, |
| + begin_frame_source.get(), task_runner_.get(), |
| display_output_surface->capabilities().max_frames_pending)); |
| } |
| display_.reset( |
| new Display(shared_bitmap_manager, gpu_memory_buffer_manager, |
| renderer_settings, std::move(begin_frame_source), |
| std::move(display_output_surface), std::move(scheduler), |
| - base::MakeUnique<TextureMailboxDeleter>(task_runner))); |
| + base::MakeUnique<TextureMailboxDeleter>(task_runner_.get()))); |
| // Since this CompositorFrameSink and the Display are tightly coupled and in |
| // the same process/thread, the LayerTreeHostImpl can reclaim resources from |
| @@ -132,10 +134,16 @@ void TestCompositorFrameSink::SwapBuffers(CompositorFrame frame) { |
| bool synchronous = !display_->has_scheduler(); |
| - surface_factory_->SubmitCompositorFrame( |
| - delegated_local_frame_id_, std::move(frame), |
| - base::Bind(&TestCompositorFrameSink::DidDrawCallback, |
| - base::Unretained(this))); |
| + SurfaceFactory::DrawCallback draw_callback; |
| + if (!synchronous) { |
| + // For async draws, we use a callback tell when it is done, but for sync |
| + // draws we don't need one. |
|
sunnyps
2016/10/10 20:58:15
nit: Make a note that weak ptr is not required for
danakj
2016/10/10 21:02:11
Done.
|
| + draw_callback = base::Bind(&TestCompositorFrameSink::DidDrawCallback, |
| + base::Unretained(this)); |
| + } |
| + |
| + surface_factory_->SubmitCompositorFrame(delegated_local_frame_id_, |
| + std::move(frame), draw_callback); |
| for (std::unique_ptr<CopyOutputRequest>& copy_request : copy_requests_) { |
| surface_factory_->RequestCopyOfSurface(delegated_local_frame_id_, |
| @@ -143,14 +151,20 @@ void TestCompositorFrameSink::SwapBuffers(CompositorFrame frame) { |
| } |
| copy_requests_.clear(); |
| - if (synchronous) |
| + if (synchronous) { |
| display_->DrawAndSwap(); |
| + // Post this to get a new stack frame so that we exit this function before |
| + // calling the client to tell it that it is done. |
| + task_runner_->PostTask(FROM_HERE, |
| + base::Bind(&TestCompositorFrameSink::DidDrawCallback, |
| + weak_ptr_factory_.GetWeakPtr())); |
| + } |
| } |
| void TestCompositorFrameSink::DidDrawCallback() { |
|
sunnyps
2016/10/10 20:58:15
nit: DCHECK(!display_->has_scheduler())?
danakj
2016/10/10 21:02:11
Inverted but done. use callback => not synchronous
danakj
2016/10/10 21:32:29
Wait both paths to use this function but one posts
|
| // This is the frame ack to unthrottle the next frame, not actually a notice |
| // that drawing is done. |
| - CompositorFrameSink::PostSwapBuffersComplete(); |
| + client_->DidSwapBuffersComplete(); |
| } |
| void TestCompositorFrameSink::ForceReclaimResources() { |