node: Support sparse vertex buffer layouts

Bug: dawn:1000
Change-Id: I616369acdf5c9d883da8d0da292aa1b3f4a77250
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/112021
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/dawn/node/binding/Converter.cpp b/src/dawn/node/binding/Converter.cpp
index 6ec7778..b42a8ea 100644
--- a/src/dawn/node/binding/Converter.cpp
+++ b/src/dawn/node/binding/Converter.cpp
@@ -1148,9 +1148,25 @@
 
 bool Converter::Convert(wgpu::VertexState& out, const interop::GPUVertexState& in) {
     out = {};
-    return Convert(out.module, in.module) && Convert(out.buffers, out.bufferCount, in.buffers) &&
-           Convert(out.entryPoint, in.entryPoint) &&
-           Convert(out.constants, out.constantCount, in.constants);
+    wgpu::VertexBufferLayout* outBuffers = nullptr;
+    if (!Convert(out.module, in.module) ||                    //
+        !Convert(outBuffers, out.bufferCount, in.buffers) ||  //
+        !Convert(out.entryPoint, in.entryPoint) ||            //
+        !Convert(out.constants, out.constantCount, in.constants)) {
+        return false;
+    }
+
+    // Patch up the unused vertex buffer layouts to use wgpu::VertexStepMode::VertexBufferNotUsed.
+    // The converter for optional value will have put the default value of wgpu::VertexBufferLayout
+    // that has wgpu::VertexStepMode::Vertex.
+    out.buffers = outBuffers;
+    for (size_t i = 0; i < in.buffers.size(); i++) {
+        if (!in.buffers[i].has_value()) {
+            outBuffers[i].stepMode = wgpu::VertexStepMode::VertexBufferNotUsed;
+        }
+    }
+
+    return true;
 }
 
 bool Converter::Convert(wgpu::VertexStepMode& out, const interop::GPUVertexStepMode& in) {