Example #1
0
void
PaintThread::QueuePaintTask(UniquePtr<PaintTask>&& aTask)
{
  MOZ_ASSERT(NS_IsMainThread());
  MOZ_ASSERT(aTask);

  if (gfxPrefs::LayersOMTPDumpCapture() && aTask->mCapture) {
    aTask->mCapture->Dump();
  }

  MOZ_RELEASE_ASSERT(aTask->mCapture->hasOneRef());

  RefPtr<CompositorBridgeChild> cbc(CompositorBridgeChild::Get());
  cbc->NotifyBeginAsyncPaint(aTask.get());

  RefPtr<PaintThread> self = this;
  RefPtr<Runnable> task = NS_NewRunnableFunction("PaintThread::AsyncPaintTask",
    [self, cbc, task = std::move(aTask)]() -> void
  {
    self->AsyncPaintTask(cbc, task.get());
  });

  nsIEventTarget* paintThread = mPaintWorkers ?
    static_cast<nsIEventTarget*>(mPaintWorkers.get()) :
    static_cast<nsIEventTarget*>(sThread.get());

#ifndef OMTP_FORCE_SYNC
  paintThread->Dispatch(task.forget());
#else
  SyncRunnable::DispatchToThread(paintThread, task);
#endif
}