summaryrefslogtreecommitdiffstats
path: root/dom/canvas/WebGLCrossProcessCommandQueue.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/canvas/WebGLCrossProcessCommandQueue.h')
-rw-r--r--dom/canvas/WebGLCrossProcessCommandQueue.h97
1 files changed, 97 insertions, 0 deletions
diff --git a/dom/canvas/WebGLCrossProcessCommandQueue.h b/dom/canvas/WebGLCrossProcessCommandQueue.h
new file mode 100644
index 0000000000..fef72ea752
--- /dev/null
+++ b/dom/canvas/WebGLCrossProcessCommandQueue.h
@@ -0,0 +1,97 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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 WEBGLCROSSPROCESSCOMMANDQUEUE_H_
+#define WEBGLCROSSPROCESSCOMMANDQUEUE_H_
+
+#include "mozilla/dom/WebGLCommandQueue.h"
+#include "ProducerConsumerQueue.h"
+#include "IpdlQueue.h"
+
+namespace mozilla {
+
+namespace dom {
+class WebGLParent;
+class WebGLChild;
+} // namespace dom
+
+namespace layers {
+class PCompositorBridgeParent;
+}
+
+class HostWebGLContext;
+
+using mozilla::webgl::ProducerConsumerQueue;
+
+/**
+ * The source for the WebGL Command Queue.
+ */
+using ClientWebGLCommandSourceP =
+ SyncCommandSource<size_t, mozilla::webgl::PcqProducer,
+ mozilla::webgl::ProducerConsumerQueue>;
+
+/**
+ * The sink for the WebGL Command Queue. This object is created in the client
+ * and sent to the host, where it needs to be given a HostWebGLContext that it
+ * then uses for executing methods. Add new commands to DispatchCommand using
+ * the WEBGL_SYNC_COMMAND and WEBGL_ASYNC_COMMAND macros.
+ */
+template <typename Consumer, typename Queue>
+class HostWebGLCommandSink final
+ : public SyncCommandSink<size_t, Consumer, Queue> {
+ public:
+ HostWebGLCommandSink(UniquePtr<Consumer>&& aConsumer,
+ UniquePtr<typename Queue::Producer>&& aResponseProducer)
+ : SyncCommandSink<size_t, Consumer, Queue>(
+ std::move(aConsumer), std::move(aResponseProducer)) {}
+
+ HostWebGLContext* mHostContext = nullptr;
+
+ // For IPDL:
+ HostWebGLCommandSink() = default;
+
+ protected:
+ friend struct mozilla::ipc::IPDLParamTraits<HostWebGLCommandSink>;
+ friend class mozilla::layers::PCompositorBridgeParent;
+
+ bool DispatchCommand(size_t command) override {
+ MOZ_CRASH("TODO:");
+ return false;
+ }
+};
+
+using HostWebGLCommandSinkP =
+ HostWebGLCommandSink<mozilla::webgl::PcqConsumer,
+ mozilla::webgl::ProducerConsumerQueue>;
+
+using IpdlWebGLCommandQueue =
+ mozilla::dom::IpdlQueue<mozilla::dom::WebGLChild,
+ mozilla::dom::WebGLParent>;
+using IpdlWebGLResponseQueue =
+ mozilla::dom::IpdlQueue<mozilla::dom::WebGLParent,
+ mozilla::dom::WebGLChild>;
+
+using ClientWebGLCommandSourceI =
+ SyncCommandSource<size_t, typename IpdlWebGLCommandQueue::Producer,
+ IpdlWebGLResponseQueue>;
+using HostWebGLCommandSinkI =
+ HostWebGLCommandSink<typename IpdlWebGLCommandQueue::Consumer,
+ IpdlWebGLResponseQueue>;
+
+namespace ipc {
+
+template <typename Consumer, typename Queue>
+struct IPDLParamTraits<mozilla::HostWebGLCommandSink<Consumer, Queue>>
+ : public IPDLParamTraits<
+ mozilla::SyncCommandSink<size_t, Consumer, Queue>> {
+ public:
+ typedef mozilla::HostWebGLCommandSink<Consumer, Queue> paramType;
+};
+
+} // namespace ipc
+
+} // namespace mozilla
+
+#endif // WEBGLCROSSPROCESSCOMMANDQUEUE_H_