Unreviewed, rolling out r250114.
[WebKit-https.git] / Source / WebCore / Modules / webgpu / WebGPUDevice.h
1 /*
2  * Copyright (C) 2018 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(WEBGPU)
29
30 #include "EventTarget.h"
31 #include "GPUDevice.h"
32 #include "GPUErrorScopes.h"
33 #include "JSDOMPromiseDeferred.h"
34 #include "WebGPUAdapter.h"
35 #include "WebGPUQueue.h"
36 #include "WebGPUSwapChainDescriptor.h"
37 #include <wtf/Forward.h>
38 #include <wtf/RefCounted.h>
39 #include <wtf/WeakPtr.h>
40
41 namespace JSC {
42 class ArrayBuffer;
43 class JSValue;
44 }
45
46 namespace WebCore {
47
48 class GPUOutOfMemoryError;
49 class GPUValidationError;
50 class ScriptExecutionContext;
51 class WebGPUBindGroup;
52 class WebGPUBindGroupLayout;
53 class WebGPUBuffer;
54 class WebGPUCommandEncoder;
55 class WebGPUComputePipeline;
56 class WebGPUPipelineLayout;
57 class WebGPURenderPipeline;
58 class WebGPUSampler;
59 class WebGPUShaderModule;
60 class WebGPUSwapChain;
61 class WebGPUTexture;
62
63 struct GPUBindGroupLayoutDescriptor;
64 struct GPUBufferDescriptor;
65 struct GPUSamplerDescriptor;
66 struct GPUTextureDescriptor;
67 struct WebGPUBindGroupDescriptor;
68 struct WebGPUComputePipelineDescriptor;
69 struct WebGPUPipelineLayoutDescriptor;
70 struct WebGPURenderPipelineDescriptor;
71 struct WebGPUShaderModuleDescriptor;
72
73 enum class GPUErrorFilter;
74
75 using ErrorIDLUnion = IDLUnion<IDLInterface<GPUOutOfMemoryError>, IDLInterface<GPUValidationError>>;
76 using ErrorPromise = DOMPromiseDeferred<IDLNullable<ErrorIDLUnion>>;
77
78 class WebGPUDevice : public RefCounted<WebGPUDevice>, public EventTargetWithInlineData, public CanMakeWeakPtr<WebGPUDevice> {
79     WTF_MAKE_ISO_ALLOCATED(WebGPUDevice);
80 public:
81     virtual ~WebGPUDevice();
82
83     static RefPtr<WebGPUDevice> tryCreate(ScriptExecutionContext&, Ref<const WebGPUAdapter>&&);
84
85     static HashSet<WebGPUDevice*>& instances(const LockHolder&);
86     static Lock& instancesMutex();
87
88     const WebGPUAdapter& adapter() const { return m_adapter.get(); }
89     GPUDevice& device() { return m_device.get(); }
90     const GPUDevice& device() const { return m_device.get(); }
91
92     Ref<WebGPUBuffer> createBuffer(const GPUBufferDescriptor&) const;
93     Vector<JSC::JSValue> createBufferMapped(JSC::ExecState&, const GPUBufferDescriptor&) const;
94     Ref<WebGPUTexture> createTexture(const GPUTextureDescriptor&) const;
95     Ref<WebGPUSampler> createSampler(const GPUSamplerDescriptor&) const;
96
97     Ref<WebGPUBindGroupLayout> createBindGroupLayout(const GPUBindGroupLayoutDescriptor&) const;
98     Ref<WebGPUPipelineLayout> createPipelineLayout(const WebGPUPipelineLayoutDescriptor&) const;
99     Ref<WebGPUBindGroup> createBindGroup(const WebGPUBindGroupDescriptor&) const;
100
101     Ref<WebGPUShaderModule> createShaderModule(const WebGPUShaderModuleDescriptor&) const;
102     Ref<WebGPURenderPipeline> createRenderPipeline(const WebGPURenderPipelineDescriptor&) const;
103     Ref<WebGPUComputePipeline> createComputePipeline(const WebGPUComputePipelineDescriptor&) const;
104
105     Ref<WebGPUCommandEncoder> createCommandEncoder() const;
106
107     Ref<WebGPUQueue> getQueue() const;
108
109     void pushErrorScope(GPUErrorFilter filter) { m_errorScopes->pushErrorScope(filter); }
110     void popErrorScope(ErrorPromise&&);
111
112     ScriptExecutionContext* scriptExecutionContext() const final { return &m_scriptExecutionContext; }
113
114     using RefCounted::ref;
115     using RefCounted::deref;
116
117 private:
118     WebGPUDevice(ScriptExecutionContext&, Ref<const WebGPUAdapter>&&, Ref<GPUDevice>&&);
119
120     // EventTarget
121     EventTargetInterface eventTargetInterface() const final { return WebGPUDeviceEventTargetInterfaceType; }
122     void refEventTarget() final { ref(); }
123     void derefEventTarget() final { deref(); }
124
125     void dispatchUncapturedError(GPUError&&);
126
127     ScriptExecutionContext& m_scriptExecutionContext;
128
129     Ref<const WebGPUAdapter> m_adapter;
130     Ref<GPUDevice> m_device;
131     mutable RefPtr<WebGPUQueue> m_queue;
132
133     Ref<GPUErrorScopes> m_errorScopes;
134 };
135
136 } // namespace WebCore
137
138 #endif // ENABLE(WEBGPU)