tint: Add _tint_materialize internal builtin

Returns a materialization of the given argument.

Bug: tint:1697
Change-Id: Id25f7e10baa884047af21f89245884c551560f7b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/104822
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
Ben Clayton 2022-10-06 19:54:07 +00:00 committed by Dawn LUCI CQ
parent 73683027a3
commit 933eb5159e
8 changed files with 2360 additions and 2292 deletions

View File

@ -963,3 +963,8 @@ op || (bool, bool) -> bool
op >> <T: iu32>(T, u32) -> T
op >> <T: iu32, N: num> (vec<N, T>, vec<N, u32>) -> vec<N, T>
////////////////////////////////////////////////////////////////////////////////
// Tint internal builtins //
////////////////////////////////////////////////////////////////////////////////
@const("Identity") fn _tint_materialize<T>(T) -> T

File diff suppressed because it is too large Load Diff

View File

@ -795,6 +795,9 @@ enum class Method {
// abstract_expr[runtime-index]
kRuntimeIndex,
// _tint_materialize()
kTintMaterializeBuiltin,
};
static std::ostream& operator<<(std::ostream& o, Method m) {
@ -819,6 +822,8 @@ static std::ostream& operator<<(std::ostream& o, Method m) {
return o << "index";
case Method::kRuntimeIndex:
return o << "runtime-index";
case Method::kTintMaterializeBuiltin:
return o << "_tint_materialize";
}
return o << "<unknown>";
}
@ -873,43 +878,58 @@ TEST_P(MaterializeAbstractNumericToDefaultType, Test) {
return expr;
};
switch (method) {
case Method::kVar:
case Method::kVar: {
WrapInFunction(Decl(Var("a", abstract_expr())));
break;
case Method::kLet:
}
case Method::kLet: {
WrapInFunction(Decl(Let("a", abstract_expr())));
break;
case Method::kBuiltinArg:
}
case Method::kBuiltinArg: {
WrapInFunction(CallStmt(Call("min", abstract_expr(), abstract_expr())));
break;
case Method::kBitcastF32Arg:
}
case Method::kBitcastF32Arg: {
WrapInFunction(Bitcast<f32>(abstract_expr()));
break;
case Method::kBitcastVec3F32Arg:
}
case Method::kBitcastVec3F32Arg: {
WrapInFunction(Bitcast(ty.vec3<f32>(), abstract_expr()));
break;
case Method::kArrayLength:
}
case Method::kArrayLength: {
WrapInFunction(Construct(ty.array(ty.i32(), abstract_expr())));
break;
case Method::kSwitch:
}
case Method::kSwitch: {
WrapInFunction(Switch(abstract_expr(),
Case(abstract_expr()->As<ast::IntLiteralExpression>()),
DefaultCase()));
break;
case Method::kWorkgroupSize:
}
case Method::kWorkgroupSize: {
Func(
"f", utils::Empty, ty.void_(), utils::Empty,
utils::Vector{WorkgroupSize(abstract_expr()), Stage(ast::PipelineStage::kCompute)});
break;
case Method::kIndex:
}
case Method::kIndex: {
GlobalVar("arr", ty.array<i32, 4>(), ast::AddressSpace::kPrivate);
WrapInFunction(IndexAccessor("arr", abstract_expr()));
break;
case Method::kRuntimeIndex:
}
case Method::kRuntimeIndex: {
auto* runtime_index = Var("runtime_index", Expr(1_i));
WrapInFunction(runtime_index, IndexAccessor(abstract_expr(), runtime_index));
break;
}
case Method::kTintMaterializeBuiltin: {
auto* call = Call(sem::str(sem::BuiltinType::kTintMaterialize), abstract_expr());
WrapInFunction(Decl(Const("c", call)));
break;
}
}
switch (expectation) {
case Expectation::kMaterialize: {
@ -954,24 +974,28 @@ constexpr Method kScalarMethods[] = {
Method::kVar,
Method::kBuiltinArg,
Method::kBitcastF32Arg,
Method::kTintMaterializeBuiltin,
};
/// Methods that support vector materialization
constexpr Method kVectorMethods[] = {
Method::kLet, Method::kVar, Method::kBuiltinArg, Method::kBitcastVec3F32Arg,
Method::kRuntimeIndex,
Method::kLet, Method::kVar,
Method::kBuiltinArg, Method::kBitcastVec3F32Arg,
Method::kRuntimeIndex, Method::kTintMaterializeBuiltin,
};
/// Methods that support matrix materialization
constexpr Method kMatrixMethods[] = {
Method::kLet,
Method::kVar,
Method::kTintMaterializeBuiltin,
};
/// Methods that support array materialization
constexpr Method kArrayMethods[] = {
Method::kLet,
Method::kVar,
Method::kTintMaterializeBuiltin,
};
INSTANTIATE_TEST_SUITE_P(

View File

@ -1546,7 +1546,7 @@ const sem::Expression* Resolver::Materialize(const sem::Expression* expr,
}
template <size_t N>
bool Resolver::MaterializeArguments(utils::Vector<const sem::Expression*, N>& args,
bool Resolver::MaybeMaterializeArguments(utils::Vector<const sem::Expression*, N>& args,
const sem::CallTarget* target) {
for (size_t i = 0, n = std::min(args.Length(), target->Parameters().Length()); i < n; i++) {
const auto* param_ty = target->Parameters()[i]->Type();
@ -1712,7 +1712,7 @@ sem::Call* Resolver::Call(const ast::CallExpression* expr) {
if (!ctor_or_conv.target) {
return nullptr;
}
if (!MaterializeArguments(args, ctor_or_conv.target)) {
if (!MaybeMaterializeArguments(args, ctor_or_conv.target)) {
return nullptr;
}
const sem::Constant* value = nullptr;
@ -1737,7 +1737,7 @@ sem::Call* Resolver::Call(const ast::CallExpression* expr) {
// constructor call target.
auto arr_or_str_ctor = [&](const sem::Type* ty,
const sem::CallTarget* call_target) -> sem::Call* {
if (!MaterializeArguments(args, call_target)) {
if (!MaybeMaterializeArguments(args, call_target)) {
return nullptr;
}
@ -2013,9 +2013,17 @@ sem::Call* Resolver::BuiltinCall(const ast::CallExpression* expr,
}
}
if (!MaterializeArguments(args, builtin.sem)) {
if (builtin_type == sem::BuiltinType::kTintMaterialize) {
args[0] = Materialize(args[0]);
if (!args[0]) {
return nullptr;
}
} else {
// Materialize arguments if the parameter type is not abstract
if (!MaybeMaterializeArguments(args, builtin.sem)) {
return nullptr;
}
}
if (builtin.sem->IsDeprecated()) {
AddWarning("use of deprecated builtin", expr->source);
@ -2093,7 +2101,7 @@ sem::Call* Resolver::FunctionCall(const ast::CallExpression* expr,
auto sym = expr->target.name->symbol;
auto name = builder_->Symbols().NameFor(sym);
if (!MaterializeArguments(args, target)) {
if (!MaybeMaterializeArguments(args, target)) {
return nullptr;
}

View File

@ -174,7 +174,7 @@ class Resolver {
/// Materializes all the arguments in `args` to the parameter types of `target`.
/// @returns true on success, false on failure.
template <size_t N>
bool MaterializeArguments(utils::Vector<const sem::Expression*, N>& args,
bool MaybeMaterializeArguments(utils::Vector<const sem::Expression*, N>& args,
const sem::CallTarget* target);
/// @returns true if an argument of an abstract numeric type, passed to a parameter of type

View File

@ -360,6 +360,9 @@ BuiltinType ParseBuiltinType(const std::string& name) {
if (name == "atomicCompareExchangeWeak") {
return BuiltinType::kAtomicCompareExchangeWeak;
}
if (name == "_tint_materialize") {
return BuiltinType::kTintMaterialize;
}
return BuiltinType::kNone;
}
@ -589,6 +592,8 @@ const char* str(BuiltinType i) {
return "atomicExchange";
case BuiltinType::kAtomicCompareExchangeWeak:
return "atomicCompareExchangeWeak";
case BuiltinType::kTintMaterialize:
return "_tint_materialize";
}
return "<unknown>";
}

View File

@ -142,6 +142,7 @@ enum class BuiltinType {
kAtomicXor,
kAtomicExchange,
kAtomicCompareExchangeWeak,
kTintMaterialize,
};
/// Matches the BuiltinType by name

View File

@ -11,6 +11,7 @@ See:
{{- /* For each permutation of each overload of each function... */ -}}
{{- range Sem.Builtins -}}
{{ if not (HasPrefix .Name "_") }}
{{- range .Overloads -}}
{{- range Permute . -}}
{{- /* Generate a ./literal/<function>/<permuataion-hash>.wgsl file using
@ -26,6 +27,7 @@ See:
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- /* ------------------------------------------------------------------ */ -}}
{{- define "Permutation" -}}