|
18 | 18 | #include <cstring> |
19 | 19 | #include <stdexcept> |
20 | 20 |
|
21 | | -namespace executorch { |
22 | | -namespace backends { |
23 | | -namespace webgpu { |
| 21 | +namespace executorch::backends::webgpu { |
24 | 22 |
|
25 | 23 | // vkgraph namespace is declared at global scope in the generated FlatBuffer |
26 | 24 | // header |
@@ -396,21 +394,20 @@ void WebGPUGraph::execute() { |
396 | 394 | WGPUCommandEncoder encoder = |
397 | 395 | wgpuDeviceCreateCommandEncoder(device_, &enc_desc); |
398 | 396 |
|
399 | | - WGPUComputePassDescriptor pass_desc = {}; |
400 | | - WGPUComputePassEncoder pass = |
401 | | - wgpuCommandEncoderBeginComputePass(encoder, &pass_desc); |
402 | | - |
| 397 | + // One pass per dispatch: enforces storage RAW ordering across deps. |
403 | 398 | for (const auto& dispatch : dispatches_) { |
| 399 | + WGPUComputePassDescriptor pass_desc = {}; |
| 400 | + WGPUComputePassEncoder pass = |
| 401 | + wgpuCommandEncoderBeginComputePass(encoder, &pass_desc); |
404 | 402 | wgpuComputePassEncoderSetPipeline(pass, dispatch.pipeline); |
405 | 403 | wgpuComputePassEncoderSetBindGroup( |
406 | 404 | pass, 0, dispatch.bind_group, 0, nullptr); |
407 | 405 | wgpuComputePassEncoderDispatchWorkgroups( |
408 | 406 | pass, dispatch.workgroup_count_x, 1, 1); |
| 407 | + wgpuComputePassEncoderEnd(pass); |
| 408 | + wgpuComputePassEncoderRelease(pass); |
409 | 409 | } |
410 | 410 |
|
411 | | - wgpuComputePassEncoderEnd(pass); |
412 | | - wgpuComputePassEncoderRelease(pass); |
413 | | - |
414 | 411 | for (const auto& copy : output_copies_) { |
415 | 412 | wgpuCommandEncoderCopyBufferToBuffer( |
416 | 413 | encoder, copy.src_buffer, 0, copy.staging_buffer, 0, copy.nbytes); |
@@ -439,21 +436,19 @@ void WebGPUGraph::execute() { |
439 | 436 | WGPUCommandEncoder encoder = |
440 | 437 | wgpuDeviceCreateCommandEncoder(device_, &enc_desc); |
441 | 438 |
|
442 | | - WGPUComputePassDescriptor pass_desc = {}; |
443 | | - WGPUComputePassEncoder pass = |
444 | | - wgpuCommandEncoderBeginComputePass(encoder, &pass_desc); |
445 | | - |
446 | 439 | for (size_t i = start; i < end; i++) { |
| 440 | + WGPUComputePassDescriptor pass_desc = {}; |
| 441 | + WGPUComputePassEncoder pass = |
| 442 | + wgpuCommandEncoderBeginComputePass(encoder, &pass_desc); |
447 | 443 | wgpuComputePassEncoderSetPipeline(pass, dispatches_[i].pipeline); |
448 | 444 | wgpuComputePassEncoderSetBindGroup( |
449 | 445 | pass, 0, dispatches_[i].bind_group, 0, nullptr); |
450 | 446 | wgpuComputePassEncoderDispatchWorkgroups( |
451 | 447 | pass, dispatches_[i].workgroup_count_x, 1, 1); |
| 448 | + wgpuComputePassEncoderEnd(pass); |
| 449 | + wgpuComputePassEncoderRelease(pass); |
452 | 450 | } |
453 | 451 |
|
454 | | - wgpuComputePassEncoderEnd(pass); |
455 | | - wgpuComputePassEncoderRelease(pass); |
456 | | - |
457 | 452 | if (end == n) { |
458 | 453 | for (const auto& copy : output_copies_) { |
459 | 454 | wgpuCommandEncoderCopyBufferToBuffer( |
@@ -561,6 +556,4 @@ WebGPUMemoryStats WebGPUGraph::memory_stats() const { |
561 | 556 | return stats; |
562 | 557 | } |
563 | 558 |
|
564 | | -} // namespace webgpu |
565 | | -} // namespace backends |
566 | | -} // namespace executorch |
| 559 | +} // namespace executorch::backends::webgpu |
0 commit comments