• 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.cpp:
7 //    Implements the class methods for ContextWgpu.
8 //
9 
10 #include "libANGLE/renderer/wgpu/ContextWgpu.h"
11 
12 #include "common/debug.h"
13 
14 #include "libANGLE/Context.h"
15 #include "libANGLE/renderer/OverlayImpl.h"
16 #include "libANGLE/renderer/wgpu/BufferWgpu.h"
17 #include "libANGLE/renderer/wgpu/CompilerWgpu.h"
18 #include "libANGLE/renderer/wgpu/DisplayWgpu.h"
19 #include "libANGLE/renderer/wgpu/FenceNVWgpu.h"
20 #include "libANGLE/renderer/wgpu/FramebufferWgpu.h"
21 #include "libANGLE/renderer/wgpu/ImageWgpu.h"
22 #include "libANGLE/renderer/wgpu/ProgramExecutableWgpu.h"
23 #include "libANGLE/renderer/wgpu/ProgramPipelineWgpu.h"
24 #include "libANGLE/renderer/wgpu/ProgramWgpu.h"
25 #include "libANGLE/renderer/wgpu/QueryWgpu.h"
26 #include "libANGLE/renderer/wgpu/RenderbufferWgpu.h"
27 #include "libANGLE/renderer/wgpu/SamplerWgpu.h"
28 #include "libANGLE/renderer/wgpu/ShaderWgpu.h"
29 #include "libANGLE/renderer/wgpu/SyncWgpu.h"
30 #include "libANGLE/renderer/wgpu/TextureWgpu.h"
31 #include "libANGLE/renderer/wgpu/TransformFeedbackWgpu.h"
32 #include "libANGLE/renderer/wgpu/VertexArrayWgpu.h"
33 #include "libANGLE/renderer/wgpu/wgpu_utils.h"
34 
35 namespace rx
36 {
37 
38 namespace
39 {
40 
41 constexpr angle::PackedEnumMap<webgpu::RenderPassClosureReason, const char *>
42     kRenderPassClosureReason = {{
43         {webgpu::RenderPassClosureReason::NewRenderPass,
44          "Render pass closed due to starting a new render pass"},
45     }};
46 
47 }  // namespace
48 
ContextWgpu(const gl::State & state,gl::ErrorSet * errorSet,DisplayWgpu * display)49 ContextWgpu::ContextWgpu(const gl::State &state, gl::ErrorSet *errorSet, DisplayWgpu *display)
50     : ContextImpl(state, errorSet), mDisplay(display)
51 {
52     mExtensions                               = gl::Extensions();
53     mExtensions.blendEquationAdvancedKHR      = true;
54     mExtensions.blendFuncExtendedEXT          = true;
55     mExtensions.copyCompressedTextureCHROMIUM = true;
56     mExtensions.copyTextureCHROMIUM           = true;
57     mExtensions.debugMarkerEXT                = true;
58     mExtensions.drawBuffersIndexedOES         = true;
59     mExtensions.fenceNV                       = true;
60     mExtensions.framebufferBlitANGLE          = true;
61     mExtensions.framebufferBlitNV             = true;
62     mExtensions.instancedArraysANGLE          = true;
63     mExtensions.instancedArraysEXT            = true;
64     mExtensions.mapBufferRangeEXT             = true;
65     mExtensions.mapbufferOES                  = true;
66     mExtensions.pixelBufferObjectNV           = true;
67     mExtensions.shaderPixelLocalStorageANGLE  = state.getClientVersion() >= gl::Version(3, 0);
68     mExtensions.shaderPixelLocalStorageCoherentANGLE = mExtensions.shaderPixelLocalStorageANGLE;
69     mExtensions.textureRectangleANGLE                = true;
70     mExtensions.textureUsageANGLE                    = true;
71     mExtensions.translatedShaderSourceANGLE          = true;
72     mExtensions.vertexArrayObjectOES                 = true;
73 
74     mExtensions.textureStorageEXT               = true;
75     mExtensions.rgb8Rgba8OES                    = true;
76     mExtensions.textureCompressionDxt1EXT       = true;
77     mExtensions.textureCompressionDxt3ANGLE     = true;
78     mExtensions.textureCompressionDxt5ANGLE     = true;
79     mExtensions.textureCompressionS3tcSrgbEXT   = true;
80     mExtensions.textureCompressionAstcHdrKHR    = true;
81     mExtensions.textureCompressionAstcLdrKHR    = true;
82     mExtensions.textureCompressionAstcOES       = true;
83     mExtensions.compressedETC1RGB8TextureOES    = true;
84     mExtensions.compressedETC1RGB8SubTextureEXT = true;
85     mExtensions.lossyEtcDecodeANGLE             = true;
86     mExtensions.geometryShaderEXT               = true;
87     mExtensions.geometryShaderOES               = true;
88     mExtensions.multiDrawIndirectEXT            = true;
89 
90     mExtensions.EGLImageOES                 = true;
91     mExtensions.EGLImageExternalOES         = true;
92     mExtensions.EGLImageExternalEssl3OES    = true;
93     mExtensions.EGLImageArrayEXT            = true;
94     mExtensions.EGLStreamConsumerExternalNV = true;
95 
96     const gl::Version maxClientVersion(3, 1);
97     mCaps = GenerateMinimumCaps(maxClientVersion, mExtensions);
98 
99     InitMinimumTextureCapsMap(maxClientVersion, mExtensions, &mTextureCaps);
100 
101     webgpu::EnsureCapsInitialized(mDisplay->getDevice(), &mCaps);
102 
103     if (mExtensions.shaderPixelLocalStorageANGLE)
104     {
105         mPLSOptions.type             = ShPixelLocalStorageType::FramebufferFetch;
106         mPLSOptions.fragmentSyncType = ShFragmentSynchronizationType::Automatic;
107     }
108 }
109 
~ContextWgpu()110 ContextWgpu::~ContextWgpu() {}
111 
onDestroy(const gl::Context * context)112 void ContextWgpu::onDestroy(const gl::Context *context)
113 {
114     mImageLoadContext = {};
115 }
116 
initialize(const angle::ImageLoadContext & imageLoadContext)117 angle::Result ContextWgpu::initialize(const angle::ImageLoadContext &imageLoadContext)
118 {
119     mImageLoadContext = imageLoadContext;
120     return angle::Result::Continue;
121 }
122 
flush(const gl::Context * context)123 angle::Result ContextWgpu::flush(const gl::Context *context)
124 {
125     return angle::Result::Continue;
126 }
127 
finish(const gl::Context * context)128 angle::Result ContextWgpu::finish(const gl::Context *context)
129 {
130     return angle::Result::Continue;
131 }
132 
drawArrays(const gl::Context * context,gl::PrimitiveMode mode,GLint first,GLsizei count)133 angle::Result ContextWgpu::drawArrays(const gl::Context *context,
134                                       gl::PrimitiveMode mode,
135                                       GLint first,
136                                       GLsizei count)
137 {
138     return angle::Result::Continue;
139 }
140 
drawArraysInstanced(const gl::Context * context,gl::PrimitiveMode mode,GLint first,GLsizei count,GLsizei instanceCount)141 angle::Result ContextWgpu::drawArraysInstanced(const gl::Context *context,
142                                                gl::PrimitiveMode mode,
143                                                GLint first,
144                                                GLsizei count,
145                                                GLsizei instanceCount)
146 {
147     return angle::Result::Continue;
148 }
149 
drawArraysInstancedBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,GLint first,GLsizei count,GLsizei instanceCount,GLuint baseInstance)150 angle::Result ContextWgpu::drawArraysInstancedBaseInstance(const gl::Context *context,
151                                                            gl::PrimitiveMode mode,
152                                                            GLint first,
153                                                            GLsizei count,
154                                                            GLsizei instanceCount,
155                                                            GLuint baseInstance)
156 {
157     return angle::Result::Continue;
158 }
159 
drawElements(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices)160 angle::Result ContextWgpu::drawElements(const gl::Context *context,
161                                         gl::PrimitiveMode mode,
162                                         GLsizei count,
163                                         gl::DrawElementsType type,
164                                         const void *indices)
165 {
166     return angle::Result::Continue;
167 }
168 
drawElementsBaseVertex(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLint baseVertex)169 angle::Result ContextWgpu::drawElementsBaseVertex(const gl::Context *context,
170                                                   gl::PrimitiveMode mode,
171                                                   GLsizei count,
172                                                   gl::DrawElementsType type,
173                                                   const void *indices,
174                                                   GLint baseVertex)
175 {
176     return angle::Result::Continue;
177 }
178 
drawElementsInstanced(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instances)179 angle::Result ContextWgpu::drawElementsInstanced(const gl::Context *context,
180                                                  gl::PrimitiveMode mode,
181                                                  GLsizei count,
182                                                  gl::DrawElementsType type,
183                                                  const void *indices,
184                                                  GLsizei instances)
185 {
186     return angle::Result::Continue;
187 }
188 
drawElementsInstancedBaseVertex(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instances,GLint baseVertex)189 angle::Result ContextWgpu::drawElementsInstancedBaseVertex(const gl::Context *context,
190                                                            gl::PrimitiveMode mode,
191                                                            GLsizei count,
192                                                            gl::DrawElementsType type,
193                                                            const void *indices,
194                                                            GLsizei instances,
195                                                            GLint baseVertex)
196 {
197     return angle::Result::Continue;
198 }
199 
drawElementsInstancedBaseVertexBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instances,GLint baseVertex,GLuint baseInstance)200 angle::Result ContextWgpu::drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
201                                                                        gl::PrimitiveMode mode,
202                                                                        GLsizei count,
203                                                                        gl::DrawElementsType type,
204                                                                        const void *indices,
205                                                                        GLsizei instances,
206                                                                        GLint baseVertex,
207                                                                        GLuint baseInstance)
208 {
209     return angle::Result::Continue;
210 }
211 
drawRangeElements(const gl::Context * context,gl::PrimitiveMode mode,GLuint start,GLuint end,GLsizei count,gl::DrawElementsType type,const void * indices)212 angle::Result ContextWgpu::drawRangeElements(const gl::Context *context,
213                                              gl::PrimitiveMode mode,
214                                              GLuint start,
215                                              GLuint end,
216                                              GLsizei count,
217                                              gl::DrawElementsType type,
218                                              const void *indices)
219 {
220     return angle::Result::Continue;
221 }
222 
drawRangeElementsBaseVertex(const gl::Context * context,gl::PrimitiveMode mode,GLuint start,GLuint end,GLsizei count,gl::DrawElementsType type,const void * indices,GLint baseVertex)223 angle::Result ContextWgpu::drawRangeElementsBaseVertex(const gl::Context *context,
224                                                        gl::PrimitiveMode mode,
225                                                        GLuint start,
226                                                        GLuint end,
227                                                        GLsizei count,
228                                                        gl::DrawElementsType type,
229                                                        const void *indices,
230                                                        GLint baseVertex)
231 {
232     return angle::Result::Continue;
233 }
234 
drawArraysIndirect(const gl::Context * context,gl::PrimitiveMode mode,const void * indirect)235 angle::Result ContextWgpu::drawArraysIndirect(const gl::Context *context,
236                                               gl::PrimitiveMode mode,
237                                               const void *indirect)
238 {
239     return angle::Result::Continue;
240 }
241 
drawElementsIndirect(const gl::Context * context,gl::PrimitiveMode mode,gl::DrawElementsType type,const void * indirect)242 angle::Result ContextWgpu::drawElementsIndirect(const gl::Context *context,
243                                                 gl::PrimitiveMode mode,
244                                                 gl::DrawElementsType type,
245                                                 const void *indirect)
246 {
247     return angle::Result::Continue;
248 }
249 
multiDrawArrays(const gl::Context * context,gl::PrimitiveMode mode,const GLint * firsts,const GLsizei * counts,GLsizei drawcount)250 angle::Result ContextWgpu::multiDrawArrays(const gl::Context *context,
251                                            gl::PrimitiveMode mode,
252                                            const GLint *firsts,
253                                            const GLsizei *counts,
254                                            GLsizei drawcount)
255 {
256     return angle::Result::Continue;
257 }
258 
multiDrawArraysInstanced(const gl::Context * context,gl::PrimitiveMode mode,const GLint * firsts,const GLsizei * counts,const GLsizei * instanceCounts,GLsizei drawcount)259 angle::Result ContextWgpu::multiDrawArraysInstanced(const gl::Context *context,
260                                                     gl::PrimitiveMode mode,
261                                                     const GLint *firsts,
262                                                     const GLsizei *counts,
263                                                     const GLsizei *instanceCounts,
264                                                     GLsizei drawcount)
265 {
266     return angle::Result::Continue;
267 }
268 
multiDrawArraysIndirect(const gl::Context * context,gl::PrimitiveMode mode,const void * indirect,GLsizei drawcount,GLsizei stride)269 angle::Result ContextWgpu::multiDrawArraysIndirect(const gl::Context *context,
270                                                    gl::PrimitiveMode mode,
271                                                    const void *indirect,
272                                                    GLsizei drawcount,
273                                                    GLsizei stride)
274 {
275     return angle::Result::Continue;
276 }
277 
multiDrawElements(const gl::Context * context,gl::PrimitiveMode mode,const GLsizei * counts,gl::DrawElementsType type,const GLvoid * const * indices,GLsizei drawcount)278 angle::Result ContextWgpu::multiDrawElements(const gl::Context *context,
279                                              gl::PrimitiveMode mode,
280                                              const GLsizei *counts,
281                                              gl::DrawElementsType type,
282                                              const GLvoid *const *indices,
283                                              GLsizei drawcount)
284 {
285     return angle::Result::Continue;
286 }
287 
multiDrawElementsInstanced(const gl::Context * context,gl::PrimitiveMode mode,const GLsizei * counts,gl::DrawElementsType type,const GLvoid * const * indices,const GLsizei * instanceCounts,GLsizei drawcount)288 angle::Result ContextWgpu::multiDrawElementsInstanced(const gl::Context *context,
289                                                       gl::PrimitiveMode mode,
290                                                       const GLsizei *counts,
291                                                       gl::DrawElementsType type,
292                                                       const GLvoid *const *indices,
293                                                       const GLsizei *instanceCounts,
294                                                       GLsizei drawcount)
295 {
296     return angle::Result::Continue;
297 }
298 
multiDrawElementsIndirect(const gl::Context * context,gl::PrimitiveMode mode,gl::DrawElementsType type,const void * indirect,GLsizei drawcount,GLsizei stride)299 angle::Result ContextWgpu::multiDrawElementsIndirect(const gl::Context *context,
300                                                      gl::PrimitiveMode mode,
301                                                      gl::DrawElementsType type,
302                                                      const void *indirect,
303                                                      GLsizei drawcount,
304                                                      GLsizei stride)
305 {
306     return angle::Result::Continue;
307 }
308 
multiDrawArraysInstancedBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,const GLint * firsts,const GLsizei * counts,const GLsizei * instanceCounts,const GLuint * baseInstances,GLsizei drawcount)309 angle::Result ContextWgpu::multiDrawArraysInstancedBaseInstance(const gl::Context *context,
310                                                                 gl::PrimitiveMode mode,
311                                                                 const GLint *firsts,
312                                                                 const GLsizei *counts,
313                                                                 const GLsizei *instanceCounts,
314                                                                 const GLuint *baseInstances,
315                                                                 GLsizei drawcount)
316 {
317     return angle::Result::Continue;
318 }
319 
multiDrawElementsInstancedBaseVertexBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,const GLsizei * counts,gl::DrawElementsType type,const GLvoid * const * indices,const GLsizei * instanceCounts,const GLint * baseVertices,const GLuint * baseInstances,GLsizei drawcount)320 angle::Result ContextWgpu::multiDrawElementsInstancedBaseVertexBaseInstance(
321     const gl::Context *context,
322     gl::PrimitiveMode mode,
323     const GLsizei *counts,
324     gl::DrawElementsType type,
325     const GLvoid *const *indices,
326     const GLsizei *instanceCounts,
327     const GLint *baseVertices,
328     const GLuint *baseInstances,
329     GLsizei drawcount)
330 {
331     return angle::Result::Continue;
332 }
333 
getResetStatus()334 gl::GraphicsResetStatus ContextWgpu::getResetStatus()
335 {
336     return gl::GraphicsResetStatus::NoError;
337 }
338 
insertEventMarker(GLsizei length,const char * marker)339 angle::Result ContextWgpu::insertEventMarker(GLsizei length, const char *marker)
340 {
341     return angle::Result::Continue;
342 }
343 
pushGroupMarker(GLsizei length,const char * marker)344 angle::Result ContextWgpu::pushGroupMarker(GLsizei length, const char *marker)
345 {
346     return angle::Result::Continue;
347 }
348 
popGroupMarker()349 angle::Result ContextWgpu::popGroupMarker()
350 {
351     return angle::Result::Continue;
352 }
353 
pushDebugGroup(const gl::Context * context,GLenum source,GLuint id,const std::string & message)354 angle::Result ContextWgpu::pushDebugGroup(const gl::Context *context,
355                                           GLenum source,
356                                           GLuint id,
357                                           const std::string &message)
358 {
359     return angle::Result::Continue;
360 }
361 
popDebugGroup(const gl::Context * context)362 angle::Result ContextWgpu::popDebugGroup(const gl::Context *context)
363 {
364     return angle::Result::Continue;
365 }
366 
syncState(const gl::Context * context,const gl::state::DirtyBits dirtyBits,const gl::state::DirtyBits bitMask,const gl::state::ExtendedDirtyBits extendedDirtyBits,const gl::state::ExtendedDirtyBits extendedBitMask,gl::Command command)367 angle::Result ContextWgpu::syncState(const gl::Context *context,
368                                      const gl::state::DirtyBits dirtyBits,
369                                      const gl::state::DirtyBits bitMask,
370                                      const gl::state::ExtendedDirtyBits extendedDirtyBits,
371                                      const gl::state::ExtendedDirtyBits extendedBitMask,
372                                      gl::Command command)
373 {
374     return angle::Result::Continue;
375 }
376 
getGPUDisjoint()377 GLint ContextWgpu::getGPUDisjoint()
378 {
379     return 0;
380 }
381 
getTimestamp()382 GLint64 ContextWgpu::getTimestamp()
383 {
384     return 0;
385 }
386 
onMakeCurrent(const gl::Context * context)387 angle::Result ContextWgpu::onMakeCurrent(const gl::Context *context)
388 {
389     return angle::Result::Continue;
390 }
391 
getNativeCaps() const392 gl::Caps ContextWgpu::getNativeCaps() const
393 {
394     return mCaps;
395 }
396 
getNativeTextureCaps() const397 const gl::TextureCapsMap &ContextWgpu::getNativeTextureCaps() const
398 {
399     return mTextureCaps;
400 }
401 
getNativeExtensions() const402 const gl::Extensions &ContextWgpu::getNativeExtensions() const
403 {
404     return mExtensions;
405 }
406 
getNativeLimitations() const407 const gl::Limitations &ContextWgpu::getNativeLimitations() const
408 {
409     return mLimitations;
410 }
411 
getNativePixelLocalStorageOptions() const412 const ShPixelLocalStorageOptions &ContextWgpu::getNativePixelLocalStorageOptions() const
413 {
414     return mPLSOptions;
415 }
416 
createCompiler()417 CompilerImpl *ContextWgpu::createCompiler()
418 {
419     return new CompilerWgpu();
420 }
421 
createShader(const gl::ShaderState & data)422 ShaderImpl *ContextWgpu::createShader(const gl::ShaderState &data)
423 {
424     return new ShaderWgpu(data);
425 }
426 
createProgram(const gl::ProgramState & data)427 ProgramImpl *ContextWgpu::createProgram(const gl::ProgramState &data)
428 {
429     return new ProgramWgpu(data);
430 }
431 
createProgramExecutable(const gl::ProgramExecutable * executable)432 ProgramExecutableImpl *ContextWgpu::createProgramExecutable(const gl::ProgramExecutable *executable)
433 {
434     return new ProgramExecutableWgpu(executable);
435 }
436 
createFramebuffer(const gl::FramebufferState & data)437 FramebufferImpl *ContextWgpu::createFramebuffer(const gl::FramebufferState &data)
438 {
439     return new FramebufferWgpu(data);
440 }
441 
createTexture(const gl::TextureState & state)442 TextureImpl *ContextWgpu::createTexture(const gl::TextureState &state)
443 {
444     return new TextureWgpu(state);
445 }
446 
createRenderbuffer(const gl::RenderbufferState & state)447 RenderbufferImpl *ContextWgpu::createRenderbuffer(const gl::RenderbufferState &state)
448 {
449     return new RenderbufferWgpu(state);
450 }
451 
createBuffer(const gl::BufferState & state)452 BufferImpl *ContextWgpu::createBuffer(const gl::BufferState &state)
453 {
454     return new BufferWgpu(state);
455 }
456 
createVertexArray(const gl::VertexArrayState & data)457 VertexArrayImpl *ContextWgpu::createVertexArray(const gl::VertexArrayState &data)
458 {
459     return new VertexArrayWgpu(data);
460 }
461 
createQuery(gl::QueryType type)462 QueryImpl *ContextWgpu::createQuery(gl::QueryType type)
463 {
464     return new QueryWgpu(type);
465 }
466 
createFenceNV()467 FenceNVImpl *ContextWgpu::createFenceNV()
468 {
469     return new FenceNVWgpu();
470 }
471 
createSync()472 SyncImpl *ContextWgpu::createSync()
473 {
474     return new SyncWgpu();
475 }
476 
createTransformFeedback(const gl::TransformFeedbackState & state)477 TransformFeedbackImpl *ContextWgpu::createTransformFeedback(const gl::TransformFeedbackState &state)
478 {
479     return new TransformFeedbackWgpu(state);
480 }
481 
createSampler(const gl::SamplerState & state)482 SamplerImpl *ContextWgpu::createSampler(const gl::SamplerState &state)
483 {
484     return new SamplerWgpu(state);
485 }
486 
createProgramPipeline(const gl::ProgramPipelineState & state)487 ProgramPipelineImpl *ContextWgpu::createProgramPipeline(const gl::ProgramPipelineState &state)
488 {
489     return new ProgramPipelineWgpu(state);
490 }
491 
createMemoryObject()492 MemoryObjectImpl *ContextWgpu::createMemoryObject()
493 {
494     UNREACHABLE();
495     return nullptr;
496 }
497 
createSemaphore()498 SemaphoreImpl *ContextWgpu::createSemaphore()
499 {
500     UNREACHABLE();
501     return nullptr;
502 }
503 
createOverlay(const gl::OverlayState & state)504 OverlayImpl *ContextWgpu::createOverlay(const gl::OverlayState &state)
505 {
506     return new OverlayImpl(state);
507 }
508 
dispatchCompute(const gl::Context * context,GLuint numGroupsX,GLuint numGroupsY,GLuint numGroupsZ)509 angle::Result ContextWgpu::dispatchCompute(const gl::Context *context,
510                                            GLuint numGroupsX,
511                                            GLuint numGroupsY,
512                                            GLuint numGroupsZ)
513 {
514     return angle::Result::Continue;
515 }
516 
dispatchComputeIndirect(const gl::Context * context,GLintptr indirect)517 angle::Result ContextWgpu::dispatchComputeIndirect(const gl::Context *context, GLintptr indirect)
518 {
519     return angle::Result::Continue;
520 }
521 
memoryBarrier(const gl::Context * context,GLbitfield barriers)522 angle::Result ContextWgpu::memoryBarrier(const gl::Context *context, GLbitfield barriers)
523 {
524     return angle::Result::Continue;
525 }
526 
memoryBarrierByRegion(const gl::Context * context,GLbitfield barriers)527 angle::Result ContextWgpu::memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers)
528 {
529     return angle::Result::Continue;
530 }
531 
handleError(GLenum errorCode,const char * message,const char * file,const char * function,unsigned int line)532 void ContextWgpu::handleError(GLenum errorCode,
533                               const char *message,
534                               const char *file,
535                               const char *function,
536                               unsigned int line)
537 {
538     std::stringstream errorStream;
539     errorStream << "Internal Wgpu back-end error: " << message << ".";
540     mErrors->handleError(errorCode, errorStream.str().c_str(), file, function, line);
541 }
542 
startRenderPass(const wgpu::RenderPassDescriptor & desc)543 angle::Result ContextWgpu::startRenderPass(const wgpu::RenderPassDescriptor &desc)
544 {
545     mCurrentCommandEncoder = getDevice().CreateCommandEncoder(nullptr);
546     mCurrentRenderPass     = mCurrentCommandEncoder.BeginRenderPass(&desc);
547     return angle::Result::Continue;
548 }
549 
endRenderPass(webgpu::RenderPassClosureReason closure_reason)550 angle::Result ContextWgpu::endRenderPass(webgpu::RenderPassClosureReason closure_reason)
551 {
552     if (!mCurrentRenderPass)
553     {
554         return angle::Result::Continue;
555     }
556     const char *reasonText = kRenderPassClosureReason[closure_reason];
557     INFO() << reasonText;
558     mCurrentRenderPass.End();
559     mCurrentRenderPass = nullptr;
560     return angle::Result::Continue;
561 }
562 
flush()563 angle::Result ContextWgpu::flush()
564 {
565     wgpu::CommandBuffer command_buffer = mCurrentCommandEncoder.Finish();
566     getQueue().Submit(1, &command_buffer);
567     mCurrentCommandEncoder = nullptr;
568     return angle::Result::Continue;
569 }
570 
571 }  // namespace rx
572