Bug 1477799 - Use the paint thread instead of workers when we only have one worker. r=jrmuizel
MozReview-Commit-ID: 3mR4KrS924N
--- 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);