|
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 |
@@ -380,21 +378,20 @@ void WebGPUGraph::execute() { |
380 | 378 | WGPUCommandEncoder encoder = |
381 | 379 | wgpuDeviceCreateCommandEncoder(device_, &enc_desc); |
382 | 380 |
|
383 | | - WGPUComputePassDescriptor pass_desc = {}; |
384 | | - WGPUComputePassEncoder pass = |
385 | | - wgpuCommandEncoderBeginComputePass(encoder, &pass_desc); |
386 | | - |
| 381 | + // One pass per dispatch: enforces storage RAW ordering across deps. |
387 | 382 | for (const auto& dispatch : dispatches_) { |
| 383 | + WGPUComputePassDescriptor pass_desc = {}; |
| 384 | + WGPUComputePassEncoder pass = |
| 385 | + wgpuCommandEncoderBeginComputePass(encoder, &pass_desc); |
388 | 386 | wgpuComputePassEncoderSetPipeline(pass, dispatch.pipeline); |
389 | 387 | wgpuComputePassEncoderSetBindGroup( |
390 | 388 | pass, 0, dispatch.bind_group, 0, nullptr); |
391 | 389 | wgpuComputePassEncoderDispatchWorkgroups( |
392 | 390 | pass, dispatch.workgroup_count_x, 1, 1); |
| 391 | + wgpuComputePassEncoderEnd(pass); |
| 392 | + wgpuComputePassEncoderRelease(pass); |
393 | 393 | } |
394 | 394 |
|
395 | | - wgpuComputePassEncoderEnd(pass); |
396 | | - wgpuComputePassEncoderRelease(pass); |
397 | | - |
398 | 395 | for (const auto& copy : output_copies_) { |
399 | 396 | wgpuCommandEncoderCopyBufferToBuffer( |
400 | 397 | encoder, copy.src_buffer, 0, copy.staging_buffer, 0, copy.nbytes); |
@@ -423,21 +420,19 @@ void WebGPUGraph::execute() { |
423 | 420 | WGPUCommandEncoder encoder = |
424 | 421 | wgpuDeviceCreateCommandEncoder(device_, &enc_desc); |
425 | 422 |
|
426 | | - WGPUComputePassDescriptor pass_desc = {}; |
427 | | - WGPUComputePassEncoder pass = |
428 | | - wgpuCommandEncoderBeginComputePass(encoder, &pass_desc); |
429 | | - |
430 | 423 | for (size_t i = start; i < end; i++) { |
| 424 | + WGPUComputePassDescriptor pass_desc = {}; |
| 425 | + WGPUComputePassEncoder pass = |
| 426 | + wgpuCommandEncoderBeginComputePass(encoder, &pass_desc); |
431 | 427 | wgpuComputePassEncoderSetPipeline(pass, dispatches_[i].pipeline); |
432 | 428 | wgpuComputePassEncoderSetBindGroup( |
433 | 429 | pass, 0, dispatches_[i].bind_group, 0, nullptr); |
434 | 430 | wgpuComputePassEncoderDispatchWorkgroups( |
435 | 431 | pass, dispatches_[i].workgroup_count_x, 1, 1); |
| 432 | + wgpuComputePassEncoderEnd(pass); |
| 433 | + wgpuComputePassEncoderRelease(pass); |
436 | 434 | } |
437 | 435 |
|
438 | | - wgpuComputePassEncoderEnd(pass); |
439 | | - wgpuComputePassEncoderRelease(pass); |
440 | | - |
441 | 436 | if (end == n) { |
442 | 437 | for (const auto& copy : output_copies_) { |
443 | 438 | wgpuCommandEncoderCopyBufferToBuffer( |
@@ -545,6 +540,4 @@ WebGPUMemoryStats WebGPUGraph::memory_stats() const { |
545 | 540 | return stats; |
546 | 541 | } |
547 | 542 |
|
548 | | -} // namespace webgpu |
549 | | -} // namespace backends |
550 | | -} // namespace executorch |
| 543 | +} // namespace executorch::backends::webgpu |
0 commit comments