Bug 1477799 - Use the paint thread instead of workers when we only have one worker. r=jrmuizel draft
authorRyan Hunt <rhunt@eqrion.net>
Thu, 19 Jul 2018 12:41:34 -0500
changeset 821627 3075243361b7f1772854c85336e7d75a207b8cb6
parent 816164 9302fd8c95c05e5a5cd295dde3bbdac2d58d6256
push id117156
push userbmo:rhunt@eqrion.net
push dateMon, 23 Jul 2018 19:03:30 +0000
reviewersjrmuizel
bugs1477799
milestone63.0a1
Bug 1477799 - Use the paint thread instead of workers when we only have one worker. r=jrmuizel MozReview-Commit-ID: 3mR4KrS924N
gfx/layers/PaintThread.cpp
--- a/gfx/layers/PaintThread.cpp
+++ b/gfx/layers/PaintThread.cpp
@@ -185,17 +185,19 @@ PaintThread::InitOnPaintThread()
   sThreadId = PlatformThread::CurrentId();
 }
 
 void
 PaintThread::InitPaintWorkers()
 {
   MOZ_ASSERT(NS_IsMainThread());
   int32_t count = PaintThread::CalculatePaintWorkerCount();
-  mPaintWorkers = SharedThreadPool::Get(NS_LITERAL_CSTRING("PaintWorker"), count);
+  if (count != 1) {
+    mPaintWorkers = SharedThreadPool::Get(NS_LITERAL_CSTRING("PaintWorker"), count);
+  }
 }
 
 void
 DestroyPaintThread(UniquePtr<PaintThread>&& pt)
 {
   MOZ_ASSERT(PaintThread::IsOnPaintThread());
   pt->ShutdownOnPaintThread();
 }
@@ -234,17 +236,18 @@ PaintThread::Get()
 PaintThread::IsOnPaintThread()
 {
   return sThreadId == PlatformThread::CurrentId();
 }
 
 bool
 PaintThread::IsOnPaintWorkerThread()
 {
-  return mPaintWorkers && mPaintWorkers->IsOnCurrentThread();
+  return (mPaintWorkers && mPaintWorkers->IsOnCurrentThread()) ||
+    (sThreadId == PlatformThread::CurrentId());
 }
 
 void
 PaintThread::UpdateRenderMode()
 {
   if (!!mPaintWorkers != gfxPlatform::GetPlatform()->UsesTiling()) {
     if (mPaintWorkers) {
       mPaintWorkers = nullptr;
@@ -380,17 +383,16 @@ PaintThread::AsyncPaintContents(Composit
   }
 }
 
 void
 PaintThread::PaintTiledContents(CapturedTiledPaintState* aState)
 {
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(aState);
-  MOZ_ASSERT(mPaintWorkers);
 
   if (gfxPrefs::LayersOMTPDumpCapture() && aState->mCapture) {
     aState->mCapture->Dump();
   }
 
   RefPtr<CompositorBridgeChild> cbc(CompositorBridgeChild::Get());
   RefPtr<CapturedTiledPaintState> state(aState);
 
@@ -398,20 +400,24 @@ PaintThread::PaintTiledContents(Captured
 
   RefPtr<PaintThread> self = this;
   RefPtr<Runnable> task = NS_NewRunnableFunction("PaintThread::PaintTiledContents",
     [self, cbc, state]() -> void
   {
     self->AsyncPaintTiledContents(cbc, state);
   });
 
+  nsIEventTarget* paintThread = mPaintWorkers ?
+    static_cast<nsIEventTarget*>(mPaintWorkers.get()) :
+    static_cast<nsIEventTarget*>(sThread.get());
+
 #ifndef OMTP_FORCE_SYNC
-  mPaintWorkers->Dispatch(task.forget());
+  paintThread->Dispatch(task.forget());
 #else
-  SyncRunnable::DispatchToThread(mPaintWorkers, task);
+  SyncRunnable::DispatchToThread(paintThread, task);
 #endif
 }
 
 void
 PaintThread::AsyncPaintTiledContents(CompositorBridgeChild* aBridge,
                                      CapturedTiledPaintState* aState)
 {
   AUTO_PROFILER_LABEL("PaintThread::AsyncPaintTiledContents", GRAPHICS);