{% set Prefix = metadata.proc_table_prefix %} {% set prefix = Prefix.lower() %} #include "dawn/{{prefix}}_thread_dispatch_proc.h" #include <thread> static {{Prefix}}ProcTable nullProcs; thread_local {{Prefix}}ProcTable perThreadProcs; void {{prefix}}ProcSetPerThreadProcs(const {{Prefix}}ProcTable* procs) { if (procs) { perThreadProcs = *procs; } else { perThreadProcs = nullProcs; } } {% for function in by_category["function"] %} static {{as_cType(function.return_type.name)}} ThreadDispatch{{as_cppType(function.name)}}( {%- for arg in function.arguments -%} {% if not loop.first %}, {% endif %}{{as_annotated_cType(arg)}} {%- endfor -%} ) { {% if function.return_type.name.canonical_case() != "void" %}return {% endif %} perThreadProcs.{{as_varName(function.name)}}( {%- for arg in function.arguments -%} {% if not loop.first %}, {% endif %}{{as_varName(arg.name)}} {%- endfor -%} ); } {% endfor %} {% for type in by_category["object"] %} {% for method in c_methods(type) %} static {{as_cType(method.return_type.name)}} ThreadDispatch{{as_MethodSuffix(type.name, method.name)}}( {{-as_cType(type.name)}} {{as_varName(type.name)}} {%- for arg in method.arguments -%} , {{as_annotated_cType(arg)}} {%- endfor -%} ) { {% if method.return_type.name.canonical_case() != "void" %}return {% endif %} perThreadProcs.{{as_varName(type.name, method.name)}}({{as_varName(type.name)}} {%- for arg in method.arguments -%} , {{as_varName(arg.name)}} {%- endfor -%} ); } {% endfor %} {% endfor %} extern "C" { {{Prefix}}ProcTable {{prefix}}ThreadDispatchProcTable = { {% for function in by_category["function"] %} ThreadDispatch{{as_cppType(function.name)}}, {% endfor %} {% for type in by_category["object"] %} {% for method in c_methods(type) %} ThreadDispatch{{as_MethodSuffix(type.name, method.name)}}, {% endfor %} {% endfor %} }; }