GLSL: implement countOneBits().

Bug: tint:1430
Change-Id: I1aa886d1f68e50f0ce6fd5b55d87722742ca5f69
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/82140
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Stephen White <senorblanco@chromium.org>
This commit is contained in:
Stephen White
2022-02-28 17:41:47 +00:00
committed by Tint LUCI CQ
parent 2e6269acb0
commit 10c554ecf4
21 changed files with 61 additions and 340 deletions

View File

@@ -580,6 +580,9 @@ bool GeneratorImpl::EmitBuiltinCall(std::ostream& out,
if (builtin->IsTexture()) {
return EmitTextureCall(out, call, builtin);
}
if (builtin->Type() == sem::BuiltinType::kCountOneBits) {
return EmitCountOneBitsCall(out, expr);
}
if (builtin->Type() == sem::BuiltinType::kSelect) {
return EmitSelectCall(out, expr);
}
@@ -859,6 +862,23 @@ bool GeneratorImpl::EmitInsertBits(std::ostream& out,
return true;
}
bool GeneratorImpl::EmitCountOneBitsCall(std::ostream& out,
const ast::CallExpression* expr) {
// GLSL's bitCount returns an integer type, so cast it to the appropriate
// unsigned type.
if (!EmitType(out, TypeOf(expr)->UnwrapRef(), ast::StorageClass::kNone,
ast::Access::kReadWrite, "")) {
return false;
}
out << "(bitCount(";
if (!EmitExpression(out, expr->args[0])) {
return false;
}
out << "))";
return true;
}
bool GeneratorImpl::EmitSelectCall(std::ostream& out,
const ast::CallExpression* expr) {
auto* expr_false = expr->args[0];
@@ -1589,7 +1609,7 @@ std::string GeneratorImpl::generate_builtin_name(const sem::Builtin* builtin) {
case sem::BuiltinType::kAtan2:
return "atan";
case sem::BuiltinType::kCountOneBits:
return "countbits";
return "bitCount";
case sem::BuiltinType::kDpdx:
return "ddx";
case sem::BuiltinType::kDpdxCoarse:

View File

@@ -194,6 +194,11 @@ class GeneratorImpl : public TextGenerator {
/// @param out the output of the expression stream
/// @param expr the call expression
/// @returns true if the call expression is emitted
bool EmitCountOneBitsCall(std::ostream& out, const ast::CallExpression* expr);
/// Handles generating a call to the `countOneBits()` builtin
/// @param out the output of the expression stream
/// @param expr the call expression
/// @returns true if the call expression is emitted
bool EmitSelectCall(std::ostream& out, const ast::CallExpression* expr);
/// Handles generating a call to the `dot()` builtin
/// @param out the output of the expression stream

View File

@@ -198,7 +198,7 @@ INSTANTIATE_TEST_SUITE_P(
BuiltinData{BuiltinType::kClamp, ParamType::kU32, "clamp"},
BuiltinData{BuiltinType::kCos, ParamType::kF32, "cos"},
BuiltinData{BuiltinType::kCosh, ParamType::kF32, "cosh"},
BuiltinData{BuiltinType::kCountOneBits, ParamType::kU32, "countbits"},
BuiltinData{BuiltinType::kCountOneBits, ParamType::kU32, "bitCount"},
BuiltinData{BuiltinType::kCross, ParamType::kF32, "cross"},
BuiltinData{BuiltinType::kDeterminant, ParamType::kF32, "determinant"},
BuiltinData{BuiltinType::kDistance, ParamType::kF32, "distance"},