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