| 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..0974cde40fde2bbbcc626caaba7f4b6c6ec9a795 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,18 @@ 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. Unretained is safe here because the callback
|
| + // will be run when |surface_factory_| is destroyed which is owned by this
|
| + // class.
|
| + 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 +153,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() {
|
| // 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() {
|
|
|