[dawn][emscripten] Updates AdapterInfo to use StringViews.
- Updates generators, templates, and includes so that
webgpu_cpp_print.h appears correctly for Emscripten builds.
- Note that CompilationInfo is not updated to use StringView
it yet and is broken, however, AdapterInfo update is needed
earlier because it blocks google3 roll. CompilationInfo and
labels will be updated in follow up changes.
Bug: 42241188
Change-Id: I85954725262a4e29148b181624fc8b3636c44b1b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/210374
Commit-Queue: Loko Kung <lokokung@google.com>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/generator/dawn_json_generator.py b/generator/dawn_json_generator.py
index 45be92d..e2b3bdb 100644
--- a/generator/dawn_json_generator.py
+++ b/generator/dawn_json_generator.py
@@ -1237,6 +1237,10 @@
'api_cpp_chained_struct.h',
'src/emdawnwebgpu/include/webgpu/webgpu_cpp_chained_struct.h',
[RENDER_PARAMS_BASE, params_emscripten]))
+ renders.append(
+ FileRender('api_cpp_print.h',
+ 'src/emdawnwebgpu/include/dawn/webgpu_cpp_print.h',
+ [RENDER_PARAMS_BASE, params_emscripten]))
if 'emdawnwebgpu_js' in targets:
assert api == 'webgpu'
diff --git a/generator/templates/api_cpp_print.h b/generator/templates/api_cpp_print.h
index e2c9961..fc7a841 100644
--- a/generator/templates/api_cpp_print.h
+++ b/generator/templates/api_cpp_print.h
@@ -30,7 +30,7 @@
#ifndef {{API}}_CPP_PRINT_H_
#define {{API}}_CPP_PRINT_H_
-#include "dawn/{{api}}_cpp.h"
+#include "{{api}}/{{api}}_cpp.h"
#include <iomanip>
#include <ios>
diff --git a/src/emdawnwebgpu/BUILD.gn b/src/emdawnwebgpu/BUILD.gn
index c04a39a..134b349 100644
--- a/src/emdawnwebgpu/BUILD.gn
+++ b/src/emdawnwebgpu/BUILD.gn
@@ -32,6 +32,7 @@
dawn_json_generator("emdawnwebgpu_headers_gen") {
target = "emdawnwebgpu_headers"
outputs = [
+ "src/emdawnwebgpu/include/dawn/webgpu_cpp_print.h",
"src/emdawnwebgpu/include/webgpu/webgpu.h",
"src/emdawnwebgpu/include/webgpu/webgpu_cpp.h",
"src/emdawnwebgpu/include/webgpu/webgpu_cpp_chained_struct.h",
diff --git a/third_party/emdawnwebgpu/library_webgpu.js b/third_party/emdawnwebgpu/library_webgpu.js
index 5efc983..a6e04b4 100644
--- a/third_party/emdawnwebgpu/library_webgpu.js
+++ b/third_party/emdawnwebgpu/library_webgpu.js
@@ -107,6 +107,11 @@
stackRestore(sp);
},
+ setStringView: (ptr, data, length) => {
+ {{{ makeSetValue('ptr', C_STRUCTS.WGPUStringView.data, 'data', '*') }}};
+ {{{ makeSetValue('ptr', C_STRUCTS.WGPUStringView.length, 'length', '*') }}};
+ },
+
makeColor: (ptr) => {
return {
"r": {{{ makeGetValue('ptr', 0, 'double') }}},
@@ -561,19 +566,31 @@
return adapter.features.size;
},
- wgpuAdapterGetInfo__deps: ['$stringToNewUTF8'],
+ wgpuAdapterGetInfo__deps: ['$stringToNewUTF8', '$lengthBytesUTF8'],
wgpuAdapterGetInfo: (adapterPtr, info) => {
var adapter = WebGPU._tableGet(adapterPtr);
{{{ gpu.makeCheckDescriptor('info') }}}
- var vendorPtr = stringToNewUTF8(adapter.info.vendor);
- {{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.vendor, 'vendorPtr', '*') }}};
- var architecturePtr = stringToNewUTF8(adapter.info.architecture);
- {{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.architecture, 'architecturePtr', '*') }}};
- var devicePtr = stringToNewUTF8(adapter.info.device);
- {{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.device, 'devicePtr', '*') }}};
- var descriptionPtr = stringToNewUTF8(adapter.info.description);
- {{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.description, 'descriptionPtr', '*') }}};
+ // Append all the strings together to condense into a single malloc.
+ var strs = adapter.info.vendor + adapter.info.architecture + adapter.info.device + adapter.info.description;
+ var strPtr = stringToNewUTF8(strs);
+
+ var vendorLen = lengthBytesUTF8(adapter.info.vendor);
+ WebGPU.setStringView(info + {{{ C_STRUCTS.WGPUAdapterInfo.vendor }}}, strPtr, vendorLen);
+ strPtr += vendorLen;
+
+ var architectureLen = lengthBytesUTF8(adapter.info.architecture);
+ WebGPU.setStringView(info + {{{ C_STRUCTS.WGPUAdapterInfo.architecture }}}, strPtr, architectureLen);
+ strPtr += architectureLen;
+
+ var deviceLen = lengthBytesUTF8(adapter.info.device);
+ WebGPU.setStringView(info + {{{ C_STRUCTS.WGPUAdapterInfo.device }}}, strPtr, deviceLen);
+ strPtr += deviceLen;
+
+ var descriptionLen = lengthBytesUTF8(adapter.info.description);
+ WebGPU.setStringView(info + {{{ C_STRUCTS.WGPUAdapterInfo.description }}}, strPtr, descriptionLen);
+ strPtr += descriptionLen;
+
{{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.backendType, gpu.BackendType.WebGPU, 'i32') }}};
var adapterType = adapter.isFallbackAdapter ? {{{ gpu.AdapterType.CPU }}} : {{{ gpu.AdapterType.Unknown }}};
{{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.adapterType, 'adapterType', 'i32') }}};
diff --git a/third_party/emdawnwebgpu/webgpu.cpp b/third_party/emdawnwebgpu/webgpu.cpp
index 55f714c..1f1a362 100644
--- a/third_party/emdawnwebgpu/webgpu.cpp
+++ b/third_party/emdawnwebgpu/webgpu.cpp
@@ -1233,10 +1233,9 @@
// ----------------------------------------------------------------------------
void wgpuAdapterInfoFreeMembers(WGPUAdapterInfo value) {
- free(const_cast<char*>(value.vendor));
- free(const_cast<char*>(value.architecture));
- free(const_cast<char*>(value.device));
- free(const_cast<char*>(value.description));
+ // The strings are allocated via a single malloc, so freeing the first pointer
+ // frees all of the strings in the struct.
+ free(const_cast<char*>(value.vendor.data));
}
WGPUInstance wgpuCreateInstance([[maybe_unused]] const WGPUInstanceDescriptor* descriptor) {