Generators for Emscripten
api_struct_info.json: //* This generator is used to produce part of Emscripten's struct_info.json, //* which is a list of struct fields that it uses to generate field offset //* information for its own code generators. //* https://github.com/emscripten-core/emscripten/blob/master/src/struct_info.json library_webgpu_enum_tables.js: //* This generator is used to produce the number-to-string mappings for //* Emscripten's library_webgpu.js. //* https://github.com/emscripten-core/emscripten/blob/master/src/library_webgpu.js Change-Id: I4704509737cde4685a093eb484dd977e5a106d19 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/15240 Commit-Queue: Kai Ninomiya <kainino@chromium.org> Reviewed-by: Austin Eng <enga@chromium.org>
This commit is contained in:
parent
74f5054ec9
commit
7b6246a2ad
10
dawn.json
10
dawn.json
|
@ -27,6 +27,7 @@
|
|||
},
|
||||
"adapter type": {
|
||||
"category": "enum",
|
||||
"javascript": false,
|
||||
"values": [
|
||||
{"value": 0, "name": "discrete GPU"},
|
||||
{"value": 1, "name": "integrated GPU"},
|
||||
|
@ -44,6 +45,7 @@
|
|||
},
|
||||
"backend type": {
|
||||
"category": "enum",
|
||||
"javascript": false,
|
||||
"values": [
|
||||
{"value": 0, "name": "null"},
|
||||
{"value": 1, "name": "D3D11"},
|
||||
|
@ -1314,6 +1316,7 @@
|
|||
"surface descriptor from metal layer": {
|
||||
"category": "structure",
|
||||
"chained": true,
|
||||
"javascript": false,
|
||||
"members": [
|
||||
{"name": "layer", "type": "void", "annotation": "*"}
|
||||
]
|
||||
|
@ -1321,6 +1324,7 @@
|
|||
"surface descriptor from windows HWND": {
|
||||
"category": "structure",
|
||||
"chained": true,
|
||||
"javascript": false,
|
||||
"members": [
|
||||
{"name": "hinstance", "type": "void", "annotation": "*"},
|
||||
{"name": "hwnd", "type": "void", "annotation": "*"}
|
||||
|
@ -1329,6 +1333,7 @@
|
|||
"surface descriptor from xlib": {
|
||||
"category": "structure",
|
||||
"chained": true,
|
||||
"javascript": false,
|
||||
"members": [
|
||||
{"name": "display", "type": "void", "annotation": "*"},
|
||||
{"name": "window", "type": "uint32_t"}
|
||||
|
@ -1365,6 +1370,7 @@
|
|||
},
|
||||
"s type": {
|
||||
"category": "enum",
|
||||
"javascript": false,
|
||||
"values": [
|
||||
{"value": 0, "name": "invalid"},
|
||||
{"value": 1, "name": "surface descriptor from metal layer"},
|
||||
|
@ -1439,7 +1445,7 @@
|
|||
"texture format": {
|
||||
"category": "enum",
|
||||
"values": [
|
||||
{"value": 0, "name": "undefined", "valid": false},
|
||||
{"value": 0, "name": "undefined", "valid": false, "jsrepr": "undefined"},
|
||||
{"value": 1, "name": "R8 unorm"},
|
||||
{"value": 2, "name": "R8 snorm"},
|
||||
{"value": 3, "name": "R8 uint"},
|
||||
|
@ -1535,7 +1541,7 @@
|
|||
"texture view dimension": {
|
||||
"category": "enum",
|
||||
"values": [
|
||||
{"value": 0, "name": "undefined", "valid": false},
|
||||
{"value": 0, "name": "undefined", "valid": false, "jsrepr": "undefined"},
|
||||
{"value": 1, "name": "1D"},
|
||||
{"value": 2, "name": "2D"},
|
||||
{"value": 3, "name": "2D array"},
|
||||
|
|
|
@ -51,6 +51,14 @@ class Name:
|
|||
def snake_case(self):
|
||||
return '_'.join(self.chunks)
|
||||
|
||||
def js_enum_case(self):
|
||||
result = self.chunks[0].lower()
|
||||
for chunk in self.chunks[1:]:
|
||||
if not result[-1].isdigit():
|
||||
result += '-'
|
||||
result += chunk.lower()
|
||||
return result
|
||||
|
||||
def concat_names(*names):
|
||||
return ' '.join([name.canonical_case() for name in names])
|
||||
|
||||
|
@ -60,12 +68,26 @@ class Type:
|
|||
self.dict_name = name
|
||||
self.name = Name(name, native=native)
|
||||
self.category = json_data['category']
|
||||
self.javascript = self.json_data.get('javascript', True)
|
||||
|
||||
EnumValue = namedtuple('EnumValue', ['name', 'value', 'valid'])
|
||||
EnumValue = namedtuple('EnumValue', ['name', 'value', 'valid', 'jsrepr'])
|
||||
class EnumType(Type):
|
||||
def __init__(self, name, json_data):
|
||||
Type.__init__(self, name, json_data)
|
||||
self.values = [EnumValue(Name(m['name']), m['value'], m.get('valid', True)) for m in self.json_data['values']]
|
||||
|
||||
self.values = []
|
||||
self.contiguousFromZero = True
|
||||
lastValue = -1
|
||||
for m in self.json_data['values']:
|
||||
value = m['value']
|
||||
if value != lastValue + 1:
|
||||
self.contiguousFromZero = False
|
||||
lastValue = value
|
||||
self.values.append(EnumValue(
|
||||
Name(m['name']),
|
||||
value,
|
||||
m.get('valid', True),
|
||||
m.get('jsrepr', None)))
|
||||
|
||||
# Assert that all values are unique in enums
|
||||
all_values = set()
|
||||
|
@ -377,6 +399,10 @@ def as_cppType(name):
|
|||
else:
|
||||
return name.CamelCase()
|
||||
|
||||
def as_jsEnumValue(value):
|
||||
if value.jsrepr: return value.jsrepr
|
||||
return "'" + value.name.js_enum_case() + "'"
|
||||
|
||||
def convert_cType_to_cppType(typ, annotation, arg, indent=0):
|
||||
if typ.category == 'native':
|
||||
return arg
|
||||
|
@ -522,6 +548,7 @@ class MultiGeneratorFromDawnJSON(Generator):
|
|||
'as_cType': as_cType,
|
||||
'as_cTypeDawn': as_cTypeDawn,
|
||||
'as_cppType': as_cppType,
|
||||
'as_jsEnumValue': as_jsEnumValue,
|
||||
'convert_cType_to_cppType': convert_cType_to_cppType,
|
||||
'as_varName': as_varName,
|
||||
'decorate': decorate,
|
||||
|
@ -544,6 +571,10 @@ class MultiGeneratorFromDawnJSON(Generator):
|
|||
if 'dawncpp' in targets:
|
||||
renders.append(FileRender('webgpu_cpp.cpp', 'src/dawn/webgpu_cpp.cpp', [base_params, api_params]))
|
||||
|
||||
if 'emscripten_bits' in targets:
|
||||
renders.append(FileRender('webgpu_struct_info.json', 'src/dawn/webgpu_struct_info.json', [base_params, api_params]))
|
||||
renders.append(FileRender('library_webgpu_enum_tables.js', 'src/dawn/library_webgpu_enum_tables.js', [base_params, api_params]))
|
||||
|
||||
if 'mock_webgpu' in targets:
|
||||
mock_params = [
|
||||
base_params,
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
//* Copyright 2020 The Dawn Authors
|
||||
//*
|
||||
//* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
//* you may not use this file except in compliance with the License.
|
||||
//* You may obtain a copy of the License at
|
||||
//*
|
||||
//* http://www.apache.org/licenses/LICENSE-2.0
|
||||
//*
|
||||
//* Unless required by applicable law or agreed to in writing, software
|
||||
//* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
//* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
//* See the License for the specific language governing permissions and
|
||||
//* limitations under the License.
|
||||
//*
|
||||
//*
|
||||
//* This generator is used to produce the number-to-string mappings for
|
||||
//* Emscripten's library_webgpu.js.
|
||||
//* https://github.com/emscripten-core/emscripten/blob/master/src/library_webgpu.js
|
||||
//*
|
||||
{% for type in by_category["enum"] if type.javascript %}
|
||||
{{type.name.CamelCase()}}: {% if type.contiguousFromZero -%}
|
||||
[
|
||||
{% for value in type.values %}
|
||||
{{as_jsEnumValue(value)}},
|
||||
{% endfor %}
|
||||
]
|
||||
{%- else -%}
|
||||
{
|
||||
{% for value in type.values %}
|
||||
{{value.value}}: {{as_jsEnumValue(value)}},
|
||||
{% endfor %}
|
||||
}
|
||||
{%- endif -%}
|
||||
,
|
||||
{% endfor %}
|
|
@ -0,0 +1,51 @@
|
|||
//* Copyright 2020 The Dawn Authors
|
||||
//*
|
||||
//* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
//* you may not use this file except in compliance with the License.
|
||||
//* You may obtain a copy of the License at
|
||||
//*
|
||||
//* http://www.apache.org/licenses/LICENSE-2.0
|
||||
//*
|
||||
//* Unless required by applicable law or agreed to in writing, software
|
||||
//* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
//* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
//* See the License for the specific language governing permissions and
|
||||
//* limitations under the License.
|
||||
//*
|
||||
//*
|
||||
//* This generator is used to produce part of Emscripten's struct_info.json,
|
||||
//* which is a list of struct fields that it uses to generate field offset
|
||||
//* information for its own code generators.
|
||||
//* https://github.com/emscripten-core/emscripten/blob/master/src/struct_info.json
|
||||
//*
|
||||
{
|
||||
"file": "webgpu/webgpu.h",
|
||||
"defines": [],
|
||||
"structs": {
|
||||
"WGPUChainedStruct": [
|
||||
"nextInChain",
|
||||
"sType"
|
||||
],
|
||||
{% for type in by_category["structure"] if type.javascript %}
|
||||
"{{as_cType(type.name)}}": [
|
||||
{% if type.chained %}
|
||||
"nextInChain",
|
||||
"sType"
|
||||
{%- elif type.extensible %}
|
||||
"nextInChain"
|
||||
{%- endif %}
|
||||
{% for member in type.members -%}
|
||||
{%- if (type.chained or type.extensible) or not loop.first -%}
|
||||
,
|
||||
{% endif %}
|
||||
"{{as_varName(member.name)}}"
|
||||
{%- endfor %}
|
||||
|
||||
]
|
||||
{%- if not loop.last -%}
|
||||
,
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
}
|
||||
}
|
|
@ -37,6 +37,14 @@ dawn_json_generator("dawn_headers_gen") {
|
|||
]
|
||||
}
|
||||
|
||||
dawn_json_generator("emscripten_bits_gen") {
|
||||
target = "emscripten_bits"
|
||||
outputs = [
|
||||
"src/dawn/webgpu_struct_info.json",
|
||||
"src/dawn/library_webgpu_enum_tables.js",
|
||||
]
|
||||
}
|
||||
|
||||
source_set("dawn_headers") {
|
||||
all_dependent_configs = [ "${dawn_root}/src/common:dawn_public_include_dirs" ]
|
||||
public_deps = [
|
||||
|
|
Loading…
Reference in New Issue