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"
12 class nsIGlobalObject
;
14 namespace mozilla::webgpu
{
20 explicit ChildOf(T
* const parent
);
26 nsIGlobalObject
* GetParentObject() const;
29 class ObjectBase
: public nsWrapperCache
{
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.
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`
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
); }
57 // Object label, initialized from GPUObjectDescriptorBase.label.
61 } // namespace mozilla::webgpu
63 #define GPU_DECL_JS_WRAP(T) \
64 JSObject* WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto) \
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) \
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) \
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) \
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
,
126 template <typename T
>
127 void ImplCycleCollectionUnlink(nsTArray
<RefPtr
<const T
>>& field
) {
128 for (auto& element
: field
) {
129 ImplCycleCollectionUnlink(element
);
134 #endif // GPU_OBJECT_MODEL_H_