• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2024 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // ContextWgpu.h:
7 //    Defines the class interface for ContextWgpu, implementing ContextImpl.
8 //
9 
10 #ifndef LIBANGLE_RENDERER_WGPU_CONTEXTWGPU_H_
11 #define LIBANGLE_RENDERER_WGPU_CONTEXTWGPU_H_
12 
13 #include <dawn/webgpu_cpp.h>
14 
15 #include "image_util/loadimage.h"
16 #include "libANGLE/renderer/ContextImpl.h"
17 #include "libANGLE/renderer/wgpu/DisplayWgpu.h"
18 #include "libANGLE/renderer/wgpu/wgpu_utils.h"
19 
20 namespace rx
21 {
22 
23 class ContextWgpu : public ContextImpl
24 {
25   public:
26     ContextWgpu(const gl::State &state, gl::ErrorSet *errorSet, DisplayWgpu *display);
27     ~ContextWgpu() override;
28 
29     angle::Result initialize(const angle::ImageLoadContext &imageLoadContext) override;
30 
31     void onDestroy(const gl::Context *context) override;
32 
33     // Flush and finish.
34     angle::Result flush(const gl::Context *context) override;
35     angle::Result finish(const gl::Context *context) override;
36 
37     // Drawing methods.
38     angle::Result drawArrays(const gl::Context *context,
39                              gl::PrimitiveMode mode,
40                              GLint first,
41                              GLsizei count) override;
42     angle::Result drawArraysInstanced(const gl::Context *context,
43                                       gl::PrimitiveMode mode,
44                                       GLint first,
45                                       GLsizei count,
46                                       GLsizei instanceCount) override;
47     angle::Result drawArraysInstancedBaseInstance(const gl::Context *context,
48                                                   gl::PrimitiveMode mode,
49                                                   GLint first,
50                                                   GLsizei count,
51                                                   GLsizei instanceCount,
52                                                   GLuint baseInstance) override;
53 
54     angle::Result drawElements(const gl::Context *context,
55                                gl::PrimitiveMode mode,
56                                GLsizei count,
57                                gl::DrawElementsType type,
58                                const void *indices) override;
59     angle::Result drawElementsBaseVertex(const gl::Context *context,
60                                          gl::PrimitiveMode mode,
61                                          GLsizei count,
62                                          gl::DrawElementsType type,
63                                          const void *indices,
64                                          GLint baseVertex) override;
65     angle::Result drawElementsInstanced(const gl::Context *context,
66                                         gl::PrimitiveMode mode,
67                                         GLsizei count,
68                                         gl::DrawElementsType type,
69                                         const void *indices,
70                                         GLsizei instances) override;
71     angle::Result drawElementsInstancedBaseVertex(const gl::Context *context,
72                                                   gl::PrimitiveMode mode,
73                                                   GLsizei count,
74                                                   gl::DrawElementsType type,
75                                                   const void *indices,
76                                                   GLsizei instances,
77                                                   GLint baseVertex) override;
78     angle::Result drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
79                                                               gl::PrimitiveMode mode,
80                                                               GLsizei count,
81                                                               gl::DrawElementsType type,
82                                                               const void *indices,
83                                                               GLsizei instances,
84                                                               GLint baseVertex,
85                                                               GLuint baseInstance) override;
86     angle::Result drawRangeElements(const gl::Context *context,
87                                     gl::PrimitiveMode mode,
88                                     GLuint start,
89                                     GLuint end,
90                                     GLsizei count,
91                                     gl::DrawElementsType type,
92                                     const void *indices) override;
93     angle::Result drawRangeElementsBaseVertex(const gl::Context *context,
94                                               gl::PrimitiveMode mode,
95                                               GLuint start,
96                                               GLuint end,
97                                               GLsizei count,
98                                               gl::DrawElementsType type,
99                                               const void *indices,
100                                               GLint baseVertex) override;
101     angle::Result drawArraysIndirect(const gl::Context *context,
102                                      gl::PrimitiveMode mode,
103                                      const void *indirect) override;
104     angle::Result drawElementsIndirect(const gl::Context *context,
105                                        gl::PrimitiveMode mode,
106                                        gl::DrawElementsType type,
107                                        const void *indirect) override;
108 
109     angle::Result multiDrawArrays(const gl::Context *context,
110                                   gl::PrimitiveMode mode,
111                                   const GLint *firsts,
112                                   const GLsizei *counts,
113                                   GLsizei drawcount) override;
114     angle::Result multiDrawArraysInstanced(const gl::Context *context,
115                                            gl::PrimitiveMode mode,
116                                            const GLint *firsts,
117                                            const GLsizei *counts,
118                                            const GLsizei *instanceCounts,
119                                            GLsizei drawcount) override;
120     angle::Result multiDrawArraysIndirect(const gl::Context *context,
121                                           gl::PrimitiveMode mode,
122                                           const void *indirect,
123                                           GLsizei drawcount,
124                                           GLsizei stride) override;
125     angle::Result multiDrawElements(const gl::Context *context,
126                                     gl::PrimitiveMode mode,
127                                     const GLsizei *counts,
128                                     gl::DrawElementsType type,
129                                     const GLvoid *const *indices,
130                                     GLsizei drawcount) override;
131     angle::Result multiDrawElementsInstanced(const gl::Context *context,
132                                              gl::PrimitiveMode mode,
133                                              const GLsizei *counts,
134                                              gl::DrawElementsType type,
135                                              const GLvoid *const *indices,
136                                              const GLsizei *instanceCounts,
137                                              GLsizei drawcount) override;
138     angle::Result multiDrawElementsIndirect(const gl::Context *context,
139                                             gl::PrimitiveMode mode,
140                                             gl::DrawElementsType type,
141                                             const void *indirect,
142                                             GLsizei drawcount,
143                                             GLsizei stride) override;
144     angle::Result multiDrawArraysInstancedBaseInstance(const gl::Context *context,
145                                                        gl::PrimitiveMode mode,
146                                                        const GLint *firsts,
147                                                        const GLsizei *counts,
148                                                        const GLsizei *instanceCounts,
149                                                        const GLuint *baseInstances,
150                                                        GLsizei drawcount) override;
151     angle::Result multiDrawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
152                                                                    gl::PrimitiveMode mode,
153                                                                    const GLsizei *counts,
154                                                                    gl::DrawElementsType type,
155                                                                    const GLvoid *const *indices,
156                                                                    const GLsizei *instanceCounts,
157                                                                    const GLint *baseVertices,
158                                                                    const GLuint *baseInstances,
159                                                                    GLsizei drawcount) override;
160 
161     // Device loss
162     gl::GraphicsResetStatus getResetStatus() override;
163 
164     // EXT_debug_marker
165     angle::Result insertEventMarker(GLsizei length, const char *marker) override;
166     angle::Result pushGroupMarker(GLsizei length, const char *marker) override;
167     angle::Result popGroupMarker() override;
168 
169     // KHR_debug
170     angle::Result pushDebugGroup(const gl::Context *context,
171                                  GLenum source,
172                                  GLuint id,
173                                  const std::string &message) override;
174     angle::Result popDebugGroup(const gl::Context *context) override;
175 
176     // State sync with dirty bits.
177     angle::Result syncState(const gl::Context *context,
178                             const gl::state::DirtyBits dirtyBits,
179                             const gl::state::DirtyBits bitMask,
180                             const gl::state::ExtendedDirtyBits extendedDirtyBits,
181                             const gl::state::ExtendedDirtyBits extendedBitMask,
182                             gl::Command command) override;
183 
184     // Disjoint timer queries
185     GLint getGPUDisjoint() override;
186     GLint64 getTimestamp() override;
187 
188     // Context switching
189     angle::Result onMakeCurrent(const gl::Context *context) override;
190 
191     // Native capabilities, unmodified by gl::Context.
192     gl::Caps getNativeCaps() const override;
193     const gl::TextureCapsMap &getNativeTextureCaps() const override;
194     const gl::Extensions &getNativeExtensions() const override;
195     const gl::Limitations &getNativeLimitations() const override;
196     const ShPixelLocalStorageOptions &getNativePixelLocalStorageOptions() const override;
197 
198     // Shader creation
199     CompilerImpl *createCompiler() override;
200     ShaderImpl *createShader(const gl::ShaderState &data) override;
201     ProgramImpl *createProgram(const gl::ProgramState &data) override;
202     ProgramExecutableImpl *createProgramExecutable(
203         const gl::ProgramExecutable *executable) override;
204 
205     // Framebuffer creation
206     FramebufferImpl *createFramebuffer(const gl::FramebufferState &data) override;
207 
208     // Texture creation
209     TextureImpl *createTexture(const gl::TextureState &state) override;
210 
211     // Renderbuffer creation
212     RenderbufferImpl *createRenderbuffer(const gl::RenderbufferState &state) override;
213 
214     // Buffer creation
215     BufferImpl *createBuffer(const gl::BufferState &state) override;
216 
217     // Vertex Array creation
218     VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override;
219 
220     // Query and Fence creation
221     QueryImpl *createQuery(gl::QueryType type) override;
222     FenceNVImpl *createFenceNV() override;
223     SyncImpl *createSync() override;
224 
225     // Transform Feedback creation
226     TransformFeedbackImpl *createTransformFeedback(
227         const gl::TransformFeedbackState &state) override;
228 
229     // Sampler object creation
230     SamplerImpl *createSampler(const gl::SamplerState &state) override;
231 
232     // Program Pipeline object creation
233     ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) override;
234 
235     // Memory object creation.
236     MemoryObjectImpl *createMemoryObject() override;
237 
238     // Semaphore creation.
239     SemaphoreImpl *createSemaphore() override;
240 
241     // Overlay creation.
242     OverlayImpl *createOverlay(const gl::OverlayState &state) override;
243 
244     angle::Result dispatchCompute(const gl::Context *context,
245                                   GLuint numGroupsX,
246                                   GLuint numGroupsY,
247                                   GLuint numGroupsZ) override;
248     angle::Result dispatchComputeIndirect(const gl::Context *context, GLintptr indirect) override;
249 
250     angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) override;
251     angle::Result memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers) override;
252 
253     void handleError(GLenum errorCode,
254                      const char *message,
255                      const char *file,
256                      const char *function,
257                      unsigned int line);
258 
getImageLoadContext()259     const angle::ImageLoadContext &getImageLoadContext() const { return mImageLoadContext; }
260 
getDisplay()261     DisplayWgpu *getDisplay() { return mDisplay; }
getDevice()262     wgpu::Device &getDevice() { return mDisplay->getDevice(); }
getQueue()263     wgpu::Queue &getQueue() { return mDisplay->getQueue(); }
getImageLoadContext()264     angle::ImageLoadContext &getImageLoadContext() { return mImageLoadContext; }
265     angle::Result startRenderPass(const wgpu::RenderPassDescriptor &desc);
266     angle::Result endRenderPass(webgpu::RenderPassClosureReason closure_reason);
267 
hasActiveRenderPass()268     bool hasActiveRenderPass() { return mCurrentRenderPass != nullptr; }
269 
270     angle::Result flush();
271 
272   private:
273     gl::Caps mCaps;
274     gl::TextureCapsMap mTextureCaps;
275     gl::Extensions mExtensions;
276     gl::Limitations mLimitations;
277     ShPixelLocalStorageOptions mPLSOptions;
278 
279     angle::ImageLoadContext mImageLoadContext;
280 
281     DisplayWgpu *mDisplay;
282 
283     wgpu::CommandEncoder mCurrentCommandEncoder;
284     wgpu::RenderPassEncoder mCurrentRenderPass;
285 };
286 
287 }  // namespace rx
288 
289 #endif  // LIBANGLE_RENDERER_WGPU_CONTEXTWGPU_H_
290