no bug - Bumping Firefox l10n changesets r=release a=l10n-bump DONTBUILD CLOSED TREE
[gecko.git] / dom / webgpu / ObjectModel.h
blob59e154bd440b9c8325c223d0376c3f8a208f27aa
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef GPU_OBJECT_MODEL_H_
7 #define GPU_OBJECT_MODEL_H_
9 #include "nsWrapperCache.h"
10 #include "nsString.h"
12 class nsIGlobalObject;
14 namespace mozilla::webgpu {
15 class WebGPUChild;
17 template <typename T>
18 class ChildOf {
19 protected:
20 explicit ChildOf(T* const parent);
21 virtual ~ChildOf();
23 RefPtr<T> mParent;
25 public:
26 nsIGlobalObject* GetParentObject() const;
29 class ObjectBase : public nsWrapperCache {
30 protected:
31 virtual ~ObjectBase() = default;
33 // False if this object is definitely invalid.
35 // See WebGPU ยง3.2, "Invalid Internal Objects & Contagious Invalidity".
37 // There could also be state in the GPU process indicating that our
38 // counterpart object there is invalid; certain GPU process operations will
39 // report an error back to use if we try to use it. But if it's useful to know
40 // whether the object is "definitely invalid", this should suffice.
41 bool mValid = true;
43 public:
44 // Return true if this WebGPU object may be valid.
46 // This is used by methods that want to know whether somebody other than
47 // `this` is valid. Generally, WebGPU object methods check `this->mValid`
48 // directly.
49 bool IsValid() const { return mValid; }
51 void GetLabel(nsAString& aValue) const;
52 void SetLabel(const nsAString& aLabel);
54 auto CLabel() const { return NS_ConvertUTF16toUTF8(mLabel); }
56 protected:
57 // Object label, initialized from GPUObjectDescriptorBase.label.
58 nsString mLabel;
61 } // namespace mozilla::webgpu
63 #define GPU_DECL_JS_WRAP(T) \
64 JSObject* WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto) \
65 override;
67 #define GPU_DECL_CYCLE_COLLECTION(T) \
68 NS_DECL_CYCLE_COLLECTION_NATIVE_WRAPPERCACHE_CLASS(T) \
69 NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(T)
71 #define GPU_IMPL_JS_WRAP(T) \
72 JSObject* T::WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto) { \
73 return dom::GPU##T##_Binding::Wrap(cx, this, givenProto); \
76 // Note: we don't use `NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE` directly
77 // because there is a custom action we need to always do.
78 #define GPU_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(T, ...) \
79 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(T) \
80 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(T) \
81 tmp->Cleanup(); \
82 NS_IMPL_CYCLE_COLLECTION_UNLINK(__VA_ARGS__) \
83 NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \
84 NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
85 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(T) \
86 NS_IMPL_CYCLE_COLLECTION_TRAVERSE(__VA_ARGS__) \
87 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
89 #define GPU_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_WEAK_PTR(T, ...) \
90 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(T) \
91 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(T) \
92 tmp->Cleanup(); \
93 NS_IMPL_CYCLE_COLLECTION_UNLINK(__VA_ARGS__) \
94 NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \
95 NS_IMPL_CYCLE_COLLECTION_UNLINK_WEAK_PTR \
96 NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
97 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(T) \
98 NS_IMPL_CYCLE_COLLECTION_TRAVERSE(__VA_ARGS__) \
99 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
101 #define GPU_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_INHERITED(T, P, ...) \
102 NS_IMPL_CYCLE_COLLECTION_CLASS(T) \
103 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(T, P) \
104 tmp->Cleanup(); \
105 NS_IMPL_CYCLE_COLLECTION_UNLINK(__VA_ARGS__) \
106 NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \
107 NS_IMPL_CYCLE_COLLECTION_UNLINK_WEAK_PTR \
108 NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
109 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(T, P) \
110 NS_IMPL_CYCLE_COLLECTION_TRAVERSE(__VA_ARGS__) \
111 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
113 #define GPU_IMPL_CYCLE_COLLECTION(T, ...) \
114 GPU_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(T, __VA_ARGS__)
116 template <typename T>
117 void ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& callback,
118 nsTArray<RefPtr<const T>>& field,
119 const char* name, uint32_t flags) {
120 for (auto& element : field) {
121 CycleCollectionNoteChild(callback, const_cast<T*>(element.get()), name,
122 flags);
126 template <typename T>
127 void ImplCycleCollectionUnlink(nsTArray<RefPtr<const T>>& field) {
128 for (auto& element : field) {
129 ImplCycleCollectionUnlink(element);
131 field.Clear();
134 #endif // GPU_OBJECT_MODEL_H_