diff --git a/gfx/webrender_bindings/RenderThread.cpp b/gfx/webrender_bindings/RenderThread.cpp index 5fafda4fb7e8..9c4c6393a8b2 100644 --- a/gfx/webrender_bindings/RenderThread.cpp +++ b/gfx/webrender_bindings/RenderThread.cpp @@ -737,8 +737,17 @@ void RenderThread::AddRenderTextureOp( RefPtr texture = it->second; mRenderTextureOps.emplace_back(aOp, std::move(texture)); - PostRunnable(NewRunnableMethod("RenderThread::HandleRenderTextureOps", this, - &RenderThread::HandleRenderTextureOps)); + + if (mRenderTextureOpsRunnable) { + // Runnable was already triggered + return; + } + + RefPtr runnable = + NewRunnableMethod("RenderThread::HandleRenderTextureOps", this, + &RenderThread::HandleRenderTextureOps); + mRenderTextureOpsRunnable = runnable; + PostRunnable(runnable.forget()); } void RenderThread::HandleRenderTextureOps() { @@ -749,6 +758,7 @@ void RenderThread::HandleRenderTextureOps() { { MutexAutoLock lock(mRenderTextureMapLock); mRenderTextureOps.swap(renderTextureOps); + mRenderTextureOpsRunnable = nullptr; } for (auto& it : renderTextureOps) { diff --git a/gfx/webrender_bindings/RenderThread.h b/gfx/webrender_bindings/RenderThread.h index 0b95ce86e8a3..e371107f2119 100644 --- a/gfx/webrender_bindings/RenderThread.h +++ b/gfx/webrender_bindings/RenderThread.h @@ -375,6 +375,9 @@ class RenderThread final { // callback. On device reset we have to remove all GL related resources right // away. std::list> mRenderTexturesDeferred; + + RefPtr mRenderTextureOpsRunnable; + bool mHasShutdown; bool mHandlingDeviceReset;