[emscripten] Add support for immediates

Bug: 507581790
Change-Id: I419b72f503c4bfa054462ffea88723cd1f0aa855
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/305875
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/dawn/dawn.json b/src/dawn/dawn.json
index b9458d6..77f0dd9 100644
--- a/src/dawn/dawn.json
+++ b/src/dawn/dawn.json
@@ -1119,7 +1119,6 @@
             },
             {
                 "name": "set immediates",
-                "tags": ["dawn"],
                 "args": [
                     {"name": "offset", "type": "uint32_t"},
                     {"name": "data", "type": "void", "annotation": "const*", "length": "size"},
@@ -3168,7 +3167,6 @@
             },
             {
                 "name": "set immediates",
-                "tags": ["dawn"],
                 "args": [
                     {"name": "offset", "type": "uint32_t"},
                     {"name": "data", "type": "void", "annotation": "const*", "length": "size"},
@@ -3492,7 +3490,6 @@
             },
             {
                 "name": "set immediates",
-                "tags": ["dawn"],
                 "args": [
                     {"name": "offset", "type": "uint32_t"},
                     {"name": "data", "type": "void", "annotation": "const*", "length": "size"},
diff --git a/third_party/emdawnwebgpu/pkg/webgpu/src/library_webgpu.js b/third_party/emdawnwebgpu/pkg/webgpu/src/library_webgpu.js
index e9740b0..2f6298b 100644
--- a/third_party/emdawnwebgpu/pkg/webgpu/src/library_webgpu.js
+++ b/third_party/emdawnwebgpu/pkg/webgpu/src/library_webgpu.js
@@ -1386,6 +1386,14 @@
     }
   },
 
+  wgpuComputePassEncoderSetImmediates: (passPtr, offset, data, size) => {
+    var pass = WebGPU.getJsObject(passPtr);
+    // There is a size limitation for ArrayBufferView. Work around by passing in a subarray
+    // instead of the whole heap. crbug.com/1201109
+    var subarray = HEAPU8.subarray(data, data + size);
+    pass.setImmediates(offset, subarray, 0, size);
+  },
+
   wgpuComputePassEncoderSetPipeline: (passPtr, pipelinePtr) => {
     var pass = WebGPU.getJsObject(passPtr);
     var pipeline = WebGPU.getJsObject(pipelinePtr);
@@ -1690,6 +1698,7 @@
       "label": WebGPU.makeStringFromOptionalStringView(
         descriptor + {{{ C_STRUCTS.WGPUPipelineLayoutDescriptor.label }}}),
       "bindGroupLayouts": bgls,
+      "immediateSize": {{{ makeGetValue('descriptor', C_STRUCTS.WGPUPipelineLayoutDescriptor.immediateSize, 'u32') }}},
     };
 
     var device = WebGPU.getJsObject(devicePtr);
@@ -2252,6 +2261,14 @@
     }
   },
 
+  wgpuRenderBundleEncoderSetImmediates: (passPtr, offset, data, size) => {
+    var pass = WebGPU.getJsObject(passPtr);
+    // There is a size limitation for ArrayBufferView. Work around by passing in a subarray
+    // instead of the whole heap. crbug.com/1201109
+    var subarray = HEAPU8.subarray(data, data + size);
+    pass.setImmediates(offset, subarray, 0, size);
+  },
+
   wgpuRenderBundleEncoderSetIndexBuffer: (passPtr, bufferPtr, format, offset, size) => {
     var pass = WebGPU.getJsObject(passPtr);
     var buffer = WebGPU.getJsObject(bufferPtr);
@@ -2377,6 +2394,14 @@
     }
   },
 
+  wgpuRenderPassEncoderSetImmediates: (passPtr, offset, data, size) => {
+    var pass = WebGPU.getJsObject(passPtr);
+    // There is a size limitation for ArrayBufferView. Work around by passing in a subarray
+    // instead of the whole heap. crbug.com/1201109
+    var subarray = HEAPU8.subarray(data, data + size);
+    pass.setImmediates(offset, subarray, 0, size);
+  },
+
   wgpuRenderPassEncoderSetBlendConstant: (passPtr, colorPtr) => {
     var pass = WebGPU.getJsObject(passPtr);
     var color = WebGPU.makeColor(colorPtr);
diff --git a/third_party/webgpu-headers/webgpu.h.diff b/third_party/webgpu-headers/webgpu.h.diff
index e69de29..e128d73 100644
--- a/third_party/webgpu-headers/webgpu.h.diff
+++ b/third_party/webgpu-headers/webgpu.h.diff
@@ -0,0 +1,14 @@
+--- webgpu_header
++++ dawn_header
+@@
++typedef void (*WGPUProcComputePassEncoderSetImmediates)(WGPUComputePassEncoder computePassEncoder, uint32_t offset, void const * data, size_t size) WGPU_FUNCTION_ATTRIBUTE;
+@@
++typedef void (*WGPUProcRenderBundleEncoderSetImmediates)(WGPURenderBundleEncoder renderBundleEncoder, uint32_t offset, void const * data, size_t size) WGPU_FUNCTION_ATTRIBUTE;
+@@
++typedef void (*WGPUProcRenderPassEncoderSetImmediates)(WGPURenderPassEncoder renderPassEncoder, uint32_t offset, void const * data, size_t size) WGPU_FUNCTION_ATTRIBUTE;
+@@
++WGPU_EXPORT void wgpuComputePassEncoderSetImmediates(WGPUComputePassEncoder computePassEncoder, uint32_t offset, void const * data, size_t size) WGPU_FUNCTION_ATTRIBUTE;
+@@
++WGPU_EXPORT void wgpuRenderBundleEncoderSetImmediates(WGPURenderBundleEncoder renderBundleEncoder, uint32_t offset, void const * data, size_t size) WGPU_FUNCTION_ATTRIBUTE;
+@@
++WGPU_EXPORT void wgpuRenderPassEncoderSetImmediates(WGPURenderPassEncoder renderPassEncoder, uint32_t offset, void const * data, size_t size) WGPU_FUNCTION_ATTRIBUTE;