summaryrefslogtreecommitdiffstats
path: root/gfx/ipc/CanvasRenderThread.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/ipc/CanvasRenderThread.h')
-rw-r--r--gfx/ipc/CanvasRenderThread.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/gfx/ipc/CanvasRenderThread.h b/gfx/ipc/CanvasRenderThread.h
new file mode 100644
index 0000000000..d94b320ad3
--- /dev/null
+++ b/gfx/ipc/CanvasRenderThread.h
@@ -0,0 +1,85 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef _include_gfx_ipc_CanvasRenderThread_h__
+#define _include_gfx_ipc_CanvasRenderThread_h__
+
+#include "mozilla/AlreadyAddRefed.h"
+#include "mozilla/Mutex.h"
+#include "nsCOMPtr.h"
+#include "nsISupportsImpl.h"
+#include "nsTArray.h"
+
+class nsIRunnable;
+class nsIThread;
+class nsIThreadPool;
+
+namespace mozilla {
+class TaskQueue;
+
+namespace gfx {
+
+/**
+ * This class represents the virtual thread for canvas rendering. Depending on
+ * platform requirements and user configuration, canvas rendering may happen on
+ * the Compositor thread, Render thread or the CanvasRender thread.
+ */
+class CanvasRenderThread final {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING_WITH_DELETE_ON_MAIN_THREAD(
+ CanvasRenderThread)
+
+ public:
+ /// Can only be called from the main thread, expected to be called at most
+ /// once during a process' lifetime. Must be called after the Compositor and
+ /// Render threads are initialized.
+ static void Start();
+
+ /// Can only be called from the main thread. Must be called before the
+ /// Compositor and Render threads are shutdown.
+ static void Shutdown();
+
+ /// Can be called from any thread.
+ static bool IsInCanvasRenderThread();
+
+ /// Can be called from any thread.
+ static bool IsInCanvasWorkerThread();
+
+ /// Can be called from any thread.
+ static bool IsInCanvasRenderOrWorkerThread();
+
+ /// Can be called from any thread, may return nullptr late in shutdown.
+ static already_AddRefed<nsIThread> GetCanvasRenderThread();
+
+ static already_AddRefed<TaskQueue> CreateWorkerTaskQueue();
+
+ static void ShutdownWorkerTaskQueue(TaskQueue* aTaskQueue);
+
+ static void FinishShutdownWorkerTaskQueue(TaskQueue* aTaskQueue);
+
+ static void Dispatch(already_AddRefed<nsIRunnable> aRunnable);
+
+ private:
+ CanvasRenderThread(nsCOMPtr<nsIThread>&& aThread,
+ nsCOMPtr<nsIThreadPool>&& aWorkers, bool aCreatedThread);
+ ~CanvasRenderThread();
+
+ Mutex mMutex;
+
+ nsCOMPtr<nsIThread> const mThread;
+
+ nsCOMPtr<nsIThreadPool> const mWorkers;
+
+ nsTArray<RefPtr<TaskQueue>> mPendingShutdownTaskQueues MOZ_GUARDED_BY(mMutex);
+
+ // True if mThread points to CanvasRender thread, false if mThread points to
+ // Compositor/Render thread.
+ const bool mCreatedThread;
+};
+
+} // namespace gfx
+} // namespace mozilla
+
+#endif // _include_gfx_ipc_CanvasRenderThread_h__