Make the templates of native struct flexible

Rename wgpu_structs.cpp/h to api_structs.cpp/h and replace hardcode contents
with metadata.

BUG=dawn:1201

Change-Id: I4f2978c6abec7b492da142499890733567e2cec3
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/73300
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Junwei Fu <junwei.fu@intel.com>
This commit is contained in:
fujunwei 2021-12-21 03:27:34 +00:00 committed by Dawn LUCI CQ
parent f30f3a912d
commit 7f3f8ac004
3 changed files with 35 additions and 22 deletions

View File

@ -860,6 +860,7 @@ class MultiGeneratorFromDawnJSON(Generator):
impl_dir = metadata.impl_dir + '/' if metadata.impl_dir else '' impl_dir = metadata.impl_dir + '/' if metadata.impl_dir else ''
native_dir = impl_dir + Name(metadata.native_namespace).snake_case() native_dir = impl_dir + Name(metadata.native_namespace).snake_case()
namespace = metadata.namespace
renders.append( renders.append(
FileRender('dawn_native/ValidationUtils.h', FileRender('dawn_native/ValidationUtils.h',
'src/' + native_dir + '/ValidationUtils_autogen.h', 'src/' + native_dir + '/ValidationUtils_autogen.h',
@ -873,12 +874,12 @@ class MultiGeneratorFromDawnJSON(Generator):
'src/' + native_dir + '/' + prefix + '_platform_autogen.h', 'src/' + native_dir + '/' + prefix + '_platform_autogen.h',
frontend_params)) frontend_params))
renders.append( renders.append(
FileRender('dawn_native/wgpu_structs.h', FileRender('dawn_native/api_structs.h',
'src/dawn_native/wgpu_structs_autogen.h', 'src/' + native_dir + '/' + namespace + '_structs_autogen.h',
frontend_params)) frontend_params))
renders.append( renders.append(
FileRender('dawn_native/wgpu_structs.cpp', FileRender('dawn_native/api_structs.cpp',
'src/dawn_native/wgpu_structs_autogen.cpp', 'src/' + native_dir + '/' + namespace + '_structs_autogen.cpp',
frontend_params)) frontend_params))
renders.append( renders.append(
FileRender('dawn_native/ProcTable.cpp', FileRender('dawn_native/ProcTable.cpp',

View File

@ -12,24 +12,29 @@
//* See the License for the specific language governing permissions and //* See the License for the specific language governing permissions and
//* limitations under the License. //* limitations under the License.
#include "dawn_native/wgpu_structs_autogen.h" {% set native_namespace = Name(metadata.native_namespace).snake_case() %}
{% set impl_dir = metadata.impl_dir + "/" if metadata.impl_dir else "" %}
{% set native_dir = impl_dir + native_namespace %}
{% set namespace = metadata.namespace %}
#include "{{native_dir}}/{{namespace}}_structs_autogen.h"
#include <tuple> #include <tuple>
#ifdef __GNUC__ #ifdef __GNUC__
// error: 'offsetof' within non-standard-layout type 'wgpu::XXX' is conditionally-supported // error: 'offsetof' within non-standard-layout type '{{namespace}}::XXX' is conditionally-supported
#pragma GCC diagnostic ignored "-Winvalid-offsetof" #pragma GCC diagnostic ignored "-Winvalid-offsetof"
#endif #endif
namespace dawn_native { namespace {{native_namespace}} {
static_assert(sizeof(ChainedStruct) == sizeof(WGPUChainedStruct), {% set c_prefix = metadata.c_prefix %}
static_assert(sizeof(ChainedStruct) == sizeof({{c_prefix}}ChainedStruct),
"sizeof mismatch for ChainedStruct"); "sizeof mismatch for ChainedStruct");
static_assert(alignof(ChainedStruct) == alignof(WGPUChainedStruct), static_assert(alignof(ChainedStruct) == alignof({{c_prefix}}ChainedStruct),
"alignof mismatch for ChainedStruct"); "alignof mismatch for ChainedStruct");
static_assert(offsetof(ChainedStruct, nextInChain) == offsetof(WGPUChainedStruct, next), static_assert(offsetof(ChainedStruct, nextInChain) == offsetof({{c_prefix}}ChainedStruct, next),
"offsetof mismatch for ChainedStruct::nextInChain"); "offsetof mismatch for ChainedStruct::nextInChain");
static_assert(offsetof(ChainedStruct, sType) == offsetof(WGPUChainedStruct, sType), static_assert(offsetof(ChainedStruct, sType) == offsetof({{c_prefix}}ChainedStruct, sType),
"offsetof mismatch for ChainedStruct::sType"); "offsetof mismatch for ChainedStruct::sType");
{% for type in by_category["structure"] %} {% for type in by_category["structure"] %}
@ -66,4 +71,4 @@ namespace dawn_native {
} }
{% endfor %} {% endfor %}
} } // namespace {{native_namespace}}

View File

@ -12,13 +12,20 @@
//* See the License for the specific language governing permissions and //* See the License for the specific language governing permissions and
//* limitations under the License. //* limitations under the License.
#ifndef DAWNNATIVE_WGPU_STRUCTS_H_ {% set namespace_name = Name(metadata.native_namespace) %}
#define DAWNNATIVE_WGPU_STRUCTS_H_ {% set DIR = namespace_name.concatcase().upper() %}
{% set namespace = metadata.namespace %}
#ifndef {{DIR}}_{{namespace.upper()}}_STRUCTS_H_
#define {{DIR}}_{{namespace.upper()}}_STRUCTS_H_
#include "dawn/webgpu_cpp.h" {% set api = metadata.api.lower() %}
#include "dawn_native/Forward.h" #include "dawn/{{api}}_cpp.h"
{% set impl_dir = metadata.impl_dir + "/" if metadata.impl_dir else "" %}
{% set native_namespace = namespace_name.snake_case() %}
{% set native_dir = impl_dir + native_namespace %}
#include "{{native_dir}}/Forward.h"
namespace dawn_native { namespace {{native_namespace}} {
{% macro render_cpp_default_value(member) -%} {% macro render_cpp_default_value(member) -%}
{%- if member.annotation in ["*", "const*"] and member.optional or member.default_value == "nullptr" -%} {%- if member.annotation in ["*", "const*"] and member.optional or member.default_value == "nullptr" -%}
@ -26,7 +33,7 @@ namespace dawn_native {
{%- elif member.type.category == "object" and member.optional -%} {%- elif member.type.category == "object" and member.optional -%}
{{" "}}= nullptr {{" "}}= nullptr
{%- elif member.type.category in ["enum", "bitmask"] and member.default_value != None -%} {%- elif member.type.category in ["enum", "bitmask"] and member.default_value != None -%}
{{" "}}= wgpu::{{as_cppType(member.type.name)}}::{{as_cppEnum(Name(member.default_value))}} {{" "}}= {{namespace}}::{{as_cppType(member.type.name)}}::{{as_cppEnum(Name(member.default_value))}}
{%- elif member.type.category == "native" and member.default_value != None -%} {%- elif member.type.category == "native" and member.default_value != None -%}
{{" "}}= {{member.default_value}} {{" "}}= {{member.default_value}}
{%- else -%} {%- else -%}
@ -36,14 +43,14 @@ namespace dawn_native {
struct ChainedStruct { struct ChainedStruct {
ChainedStruct const * nextInChain = nullptr; ChainedStruct const * nextInChain = nullptr;
wgpu::SType sType = wgpu::SType::Invalid; {{namespace}}::SType sType = {{namespace}}::SType::Invalid;
}; };
{% for type in by_category["structure"] %} {% for type in by_category["structure"] %}
{% if type.chained %} {% if type.chained %}
struct {{as_cppType(type.name)}} : ChainedStruct { struct {{as_cppType(type.name)}} : ChainedStruct {
{{as_cppType(type.name)}}() { {{as_cppType(type.name)}}() {
sType = wgpu::SType::{{type.name.CamelCase()}}; sType = {{namespace}}::SType::{{type.name.CamelCase()}};
} }
{% else %} {% else %}
struct {{as_cppType(type.name)}} { struct {{as_cppType(type.name)}} {
@ -72,6 +79,6 @@ namespace dawn_native {
using {{as_cppType(typeDef.name)}} = {{as_cppType(typeDef.type.name)}}; using {{as_cppType(typeDef.name)}} = {{as_cppType(typeDef.type.name)}};
{% endfor %} {% endfor %}
} // namespace dawn_native } // namespace {{native_namespace}}
#endif // DAWNNATIVE_WGPU_STRUCTS_H_ #endif // {{DIR}}_{{namespace.upper()}}_STRUCTS_H_