Add support for converting bool to other types

The only non-trivial case is SPIR-V, which generates OpSelect to
choose between 1 or 0.

Fixed: tint:997
Change-Id: Ifda7b3ec1e0a713843a2da7ed59c3449d4eec8bd
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/58521
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
James Price 2021-07-19 17:35:39 +00:00 committed by Tint LUCI CQ
parent 93d4501e67
commit 1fa28acc7a
14 changed files with 279 additions and 157 deletions

View File

@ -2752,11 +2752,7 @@ bool Resolver::ValidateVectorConstructor(
// A mismatch of vector type parameter T is only an error if multiple
// arguments are present. A single argument constructor constitutes a
// type conversion expression.
// NOTE: A conversion expression from a vec<bool> to any other vecN<T>
// is disallowed (see
// https://gpuweb.github.io/gpuweb/wgsl.html#conversion-expr).
if (elem_type != value_elem_type &&
(values.size() > 1u || value_vec->is_bool_vector())) {
if (elem_type != value_elem_type && values.size() > 1u) {
AddError(
"type in vector constructor does not match vector type: "
"expected '" +
@ -2878,11 +2874,10 @@ bool Resolver::ValidateScalarConstructor(
using U32 = sem::U32;
using F32 = sem::F32;
const bool is_valid =
(type->Is<Bool>() && value_type->IsAnyOf<Bool, I32, U32, F32>()) ||
(type->Is<I32>() && value_type->IsAnyOf<I32, U32, F32>()) ||
(type->Is<U32>() && value_type->IsAnyOf<I32, U32, F32>()) ||
(type->Is<F32>() && value_type->IsAnyOf<I32, U32, F32>());
const bool is_valid = (type->Is<Bool>() && value_type->is_scalar()) ||
(type->Is<I32>() && value_type->is_scalar()) ||
(type->Is<U32>() && value_type->is_scalar()) ||
(type->Is<F32>() && value_type->is_scalar());
if (!is_valid) {
AddError("cannot construct '" + type_name + "' with a value of type '" +
TypeNameOf(value) + "'",

View File

@ -255,12 +255,15 @@ static constexpr Params valid_cases[] = {
ParamsFor<bool, i32>(), //
ParamsFor<bool, f32>(), //
ParamsFor<i32, bool>(), //
ParamsFor<i32, u32>(), //
ParamsFor<i32, f32>(), //
ParamsFor<u32, bool>(), //
ParamsFor<u32, i32>(), //
ParamsFor<u32, f32>(), //
ParamsFor<f32, bool>(), //
ParamsFor<f32, u32>(), //
ParamsFor<f32, i32>(), //
@ -268,12 +271,15 @@ static constexpr Params valid_cases[] = {
ParamsFor<vec3<bool>, vec3<i32>>(), //
ParamsFor<vec3<bool>, vec3<f32>>(), //
ParamsFor<vec3<i32>, vec3<bool>>(), //
ParamsFor<vec3<i32>, vec3<u32>>(), //
ParamsFor<vec3<i32>, vec3<f32>>(), //
ParamsFor<vec3<u32>, vec3<bool>>(), //
ParamsFor<vec3<u32>, vec3<i32>>(), //
ParamsFor<vec3<u32>, vec3<f32>>(), //
ParamsFor<vec3<f32>, vec3<bool>>(), //
ParamsFor<vec3<f32>, vec3<u32>>(), //
ParamsFor<vec3<f32>, vec3<i32>>(), //
};
@ -388,13 +394,15 @@ TEST_F(ResolverTypeConstructorValidationTest,
TEST_F(ResolverTypeConstructorValidationTest,
ConversionConstructorInvalid_InvalidInitializer) {
auto* a = Var("a", ty.f32(), ast::StorageClass::kNone,
Construct(Source{{12, 34}}, ty.f32(), Expr(true)));
auto* a =
Var("a", ty.f32(), ast::StorageClass::kNone,
Construct(Source{{12, 34}}, ty.f32(), Construct(ty.array<f32, 4>())));
WrapInFunction(a);
ASSERT_FALSE(r()->Resolve());
ASSERT_EQ(r()->error(),
"12:34 error: cannot construct 'f32' with a value of type 'bool'");
"12:34 error: cannot construct 'f32' with a value of type "
"'array<f32, 4>'");
}
} // namespace ConversionConstructorTest
@ -716,20 +724,6 @@ TEST_F(ResolverTypeConstructorValidationTest,
"12:34 error: attempted to construct 'vec2<f32>' with 3 component(s)");
}
TEST_F(ResolverTypeConstructorValidationTest,
Expr_Constructor_Vec2_Error_InvalidConversionFromVec2Bool) {
SetSource(Source::Location({12, 34}));
auto* tc = vec2<f32>(create<ast::TypeConstructorExpression>(
Source{{12, 34}}, ty.vec2<bool>(), ExprList()));
WrapInFunction(tc);
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(),
"12:34 error: type in vector constructor does not match vector "
"type: expected 'f32', found 'bool'");
}
TEST_F(ResolverTypeConstructorValidationTest,
Expr_Constructor_Vec2_Error_InvalidArgumentType) {
auto* tc = vec2<f32>(create<ast::TypeConstructorExpression>(
@ -986,18 +980,6 @@ TEST_F(ResolverTypeConstructorValidationTest,
"12:34 error: attempted to construct 'vec3<f32>' with 4 component(s)");
}
TEST_F(ResolverTypeConstructorValidationTest,
Expr_Constructor_Vec3_Error_InvalidConversionFromVec3Bool) {
auto* tc = vec3<f32>(create<ast::TypeConstructorExpression>(
Source{{12, 34}}, ty.vec3<bool>(), ExprList()));
WrapInFunction(tc);
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(),
"12:34 error: type in vector constructor does not match vector "
"type: expected 'f32', found 'bool'");
}
TEST_F(ResolverTypeConstructorValidationTest,
Expr_Constructor_Vec3_Error_InvalidArgumentType) {
auto* tc = vec3<f32>(create<ast::TypeConstructorExpression>(
@ -1348,18 +1330,6 @@ TEST_F(ResolverTypeConstructorValidationTest,
"12:34 error: attempted to construct 'vec4<f32>' with 6 component(s)");
}
TEST_F(ResolverTypeConstructorValidationTest,
Expr_Constructor_Vec4_Error_InvalidConversionFromVec4Bool) {
auto* tc = vec4<f32>(create<ast::TypeConstructorExpression>(
Source{{12, 34}}, ty.vec4<bool>(), ExprList()));
WrapInFunction(tc);
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(),
"12:34 error: type in vector constructor does not match vector "
"type: expected 'f32', found 'bool'");
}
TEST_F(ResolverTypeConstructorValidationTest,
Expr_Constructor_Vec4_Error_InvalidArgumentType) {
auto* tc = vec4<f32>(create<ast::TypeConstructorExpression>(

View File

@ -1568,7 +1568,51 @@ uint32_t Builder::GenerateCastOrCopyOrPassthrough(const sem::Type* to_type,
}
return result_id;
} else if (from_type->is_bool_scalar_or_vector() &&
to_type->is_numeric_scalar_or_vector()) {
// Convert bool scalar/vector to numeric scalar/vector.
// Use the bool to select between 1 (if true) and 0 (if false).
const auto* to_elem_type = elem_type_of(to_type);
uint32_t one_id;
uint32_t zero_id;
if (to_elem_type->Is<sem::F32>()) {
ast::FloatLiteral one(ProgramID(), Source{}, 1.0f);
ast::FloatLiteral zero(ProgramID(), Source{}, 0.0f);
one_id = GenerateLiteralIfNeeded(nullptr, &one);
zero_id = GenerateLiteralIfNeeded(nullptr, &zero);
} else if (to_elem_type->Is<sem::U32>()) {
ast::UintLiteral one(ProgramID(), Source{}, 1);
ast::UintLiteral zero(ProgramID(), Source{}, 0);
one_id = GenerateLiteralIfNeeded(nullptr, &one);
zero_id = GenerateLiteralIfNeeded(nullptr, &zero);
} else if (to_elem_type->Is<sem::I32>()) {
ast::SintLiteral one(ProgramID(), Source{}, 1);
ast::SintLiteral zero(ProgramID(), Source{}, 0);
one_id = GenerateLiteralIfNeeded(nullptr, &one);
zero_id = GenerateLiteralIfNeeded(nullptr, &zero);
} else {
error_ = "invalid destination type for bool conversion";
return false;
}
if (auto* to_vec = to_type->As<sem::Vector>()) {
// Splat the scalars into vectors.
one_id = GenerateConstantVectorSplatIfNeeded(to_vec, one_id);
zero_id = GenerateConstantVectorSplatIfNeeded(to_vec, zero_id);
}
if (!one_id || !zero_id) {
return false;
}
op = spv::Op::OpSelect;
if (!push_function_inst(
op, {Operand::Int(result_type_id), Operand::Int(result_id),
Operand::Int(val_id), Operand::Int(one_id),
Operand::Int(zero_id)})) {
return 0;
}
return result_id;
} else {
TINT_ICE(Writer, builder_.Diagnostics()) << "Invalid from_type";
}
@ -1720,6 +1764,31 @@ uint32_t Builder::GenerateConstantNullIfNeeded(const sem::Type* type) {
return result_id;
}
uint32_t Builder::GenerateConstantVectorSplatIfNeeded(const sem::Vector* type,
uint32_t value_id) {
auto type_id = GenerateTypeIfNeeded(type);
if (type_id == 0 || value_id == 0) {
return 0;
}
uint64_t key = (static_cast<uint64_t>(type->size()) << 32) + value_id;
return utils::GetOrCreate(const_splat_to_id_, key, [&] {
auto result = result_op();
auto result_id = result.to_i();
OperandList ops;
ops.push_back(Operand::Int(type_id));
ops.push_back(result);
for (uint32_t i = 0; i < type->size(); i++) {
ops.push_back(Operand::Int(value_id));
}
push_type(spv::Op::OpConstantComposite, ops);
const_splat_to_id_[key] = result_id;
return result_id;
});
}
uint32_t Builder::GenerateShortCircuitBinaryExpression(
ast::BinaryExpression* expr) {
auto lhs_id = GenerateExpression(expr->lhs());

View File

@ -536,7 +536,7 @@ class Builder {
return builder_.TypeOf(expr);
}
/// Generates a constant if needed
/// Generates a scalar constant if needed
/// @param constant the constant to generate.
/// @returns the ID on success or 0 on failure
uint32_t GenerateConstantIfNeeded(const ScalarConstant& constant);
@ -546,6 +546,13 @@ class Builder {
/// @returns the ID on success or 0 on failure
uint32_t GenerateConstantNullIfNeeded(const sem::Type* type);
/// Generates a vector constant splat if needed
/// @param type the type of the vector to generate
/// @param value_id the ID of the scalar value to splat
/// @returns the ID on success or 0 on failure
uint32_t GenerateConstantVectorSplatIfNeeded(const sem::Vector* type,
uint32_t value_id);
ProgramBuilder builder_;
std::string error_;
uint32_t next_id_ = 1;
@ -567,6 +574,7 @@ class Builder {
std::unordered_map<ScalarConstant, uint32_t> const_to_id_;
std::unordered_map<std::string, uint32_t> type_constructor_to_id_;
std::unordered_map<std::string, uint32_t> const_null_to_id_;
std::unordered_map<uint64_t, uint32_t> const_splat_to_id_;
std::unordered_map<std::string, uint32_t>
texture_type_name_to_sampled_image_type_id_;
ScopeStack<uint32_t> scope_stack_;

View File

@ -11,9 +11,11 @@ fn main() {
var i32_var1 : i32 = i32(123u);
var i32_var2 : i32 = i32(123.0);
var i32_var3 : i32 = i32(true);
var u32_var1 : u32 = u32(123);
var u32_var2 : u32 = u32(123.0);
var u32_var3 : u32 = u32(true);
var v3bool_var1 : vec3<bool> = vec3<bool>(vec3<u32>(123u));
var v3bool_var11 : vec3<bool> = vec3<bool>(vec3<u32>(1234u));
@ -22,9 +24,11 @@ fn main() {
var v3i32_var1 : vec3<i32> = vec3<i32>(vec3<u32>(123u));
var v3i32_var2 : vec3<i32> = vec3<i32>(vec3<f32>(123.0));
var v3i32_var3 : vec3<i32> = vec3<i32>(vec3<bool>(true));
var v3u32_var1 : vec3<u32> = vec3<u32>(vec3<i32>(123));
var v3u32_var2 : vec3<u32> = vec3<u32>(vec3<f32>(123.0));
var v3u32_var3 : vec3<u32> = vec3<u32>(vec3<bool>(true));
var v3bool_var4 : vec3<bool> = vec3<bool>(vec2<bool>(vec2<f32>(123.0)), true);
var v4bool_var5 : vec4<bool> = vec4<bool>(vec2<bool>(vec2<f32>(123.0, 0.0)), vec2<bool>(true, bool(f32(0.0))));

View File

@ -10,16 +10,20 @@ void main() {
bool bool_var3 = bool(123.0f);
int i32_var1 = int(123u);
int i32_var2 = int(123.0f);
int i32_var3 = int(true);
uint u32_var1 = uint(123);
uint u32_var2 = uint(123.0f);
uint u32_var3 = uint(true);
bool3 v3bool_var1 = bool3(uint3((123u).xxx));
bool3 v3bool_var11 = bool3(uint3((1234u).xxx));
bool3 v3bool_var2 = bool3(int3((123).xxx));
bool3 v3bool_var3 = bool3(float3((123.0f).xxx));
int3 v3i32_var1 = int3(uint3((123u).xxx));
int3 v3i32_var2 = int3(float3((123.0f).xxx));
int3 v3i32_var3 = int3(bool3((true).xxx));
uint3 v3u32_var1 = uint3(int3((123).xxx));
uint3 v3u32_var2 = uint3(float3((123.0f).xxx));
uint3 v3u32_var3 = uint3(bool3((true).xxx));
bool3 v3bool_var4 = bool3(bool2(float2((123.0f).xx)), true);
bool4 v4bool_var5 = bool4(bool2(float2(123.0f, 0.0f)), bool2(true, bool(float(0.0f))));
return;

View File

@ -12,16 +12,20 @@ kernel void tint_symbol() {
bool bool_var3 = bool(123.0f);
int i32_var1 = int(123u);
int i32_var2 = int(123.0f);
int i32_var3 = int(true);
uint u32_var1 = uint(123);
uint u32_var2 = uint(123.0f);
uint u32_var3 = uint(true);
bool3 v3bool_var1 = bool3(uint3(123u));
bool3 v3bool_var11 = bool3(uint3(1234u));
bool3 v3bool_var2 = bool3(int3(123));
bool3 v3bool_var3 = bool3(float3(123.0f));
int3 v3i32_var1 = int3(uint3(123u));
int3 v3i32_var2 = int3(float3(123.0f));
int3 v3i32_var3 = int3(bool3(true));
uint3 v3u32_var1 = uint3(int3(123));
uint3 v3u32_var2 = uint3(float3(123.0f));
uint3 v3u32_var3 = uint3(bool3(true));
bool3 v3bool_var4 = bool3(bool2(float2(123.0f)), true);
bool4 v4bool_var5 = bool4(bool2(float2(123.0f, 0.0f)), bool2(true, bool(float(0.0f))));
return;

View File

@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 65
; Bound: 73
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@ -16,16 +16,20 @@
OpName %bool_var3 "bool_var3"
OpName %i32_var1 "i32_var1"
OpName %i32_var2 "i32_var2"
OpName %i32_var3 "i32_var3"
OpName %u32_var1 "u32_var1"
OpName %u32_var2 "u32_var2"
OpName %u32_var3 "u32_var3"
OpName %v3bool_var1 "v3bool_var1"
OpName %v3bool_var11 "v3bool_var11"
OpName %v3bool_var2 "v3bool_var2"
OpName %v3bool_var3 "v3bool_var3"
OpName %v3i32_var1 "v3i32_var1"
OpName %v3i32_var2 "v3i32_var2"
OpName %v3i32_var3 "v3i32_var3"
OpName %v3u32_var1 "v3u32_var1"
OpName %v3u32_var2 "v3u32_var2"
OpName %v3u32_var3 "v3u32_var3"
OpName %v3bool_var4 "v3bool_var4"
OpName %v4bool_var5 "v4bool_var5"
%void = OpTypeVoid
@ -45,28 +49,32 @@
%int_123 = OpConstant %int 123
%_ptr_Function_int = OpTypePointer Function %int
%29 = OpConstantNull %int
%int_1 = OpConstant %int 1
%uint = OpTypeInt 32 0
%uint_123 = OpConstant %uint 123
%_ptr_Function_uint = OpTypePointer Function %uint
%35 = OpConstantNull %uint
%37 = OpConstantNull %uint
%uint_1 = OpConstant %uint 1
%v3bool = OpTypeVector %bool 3
%38 = OpConstantComposite %v3bool %true %true %true
%42 = OpConstantComposite %v3bool %true %true %true
%_ptr_Function_v3bool = OpTypePointer Function %v3bool
%41 = OpConstantNull %v3bool
%45 = OpConstantNull %v3bool
%v3int = OpTypeVector %int 3
%46 = OpConstantComposite %v3int %int_123 %int_123 %int_123
%50 = OpConstantComposite %v3int %int_123 %int_123 %int_123
%_ptr_Function_v3int = OpTypePointer Function %v3int
%49 = OpConstantNull %v3int
%53 = OpConstantNull %v3int
%55 = OpConstantComposite %v3int %int_1 %int_1 %int_1
%v3uint = OpTypeVector %uint 3
%52 = OpConstantComposite %v3uint %uint_123 %uint_123 %uint_123
%58 = OpConstantComposite %v3uint %uint_123 %uint_123 %uint_123
%_ptr_Function_v3uint = OpTypePointer Function %v3uint
%55 = OpConstantNull %v3uint
%57 = OpConstantComposite %v3bool %true %true %true
%61 = OpConstantNull %v3uint
%63 = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
%65 = OpConstantComposite %v3bool %true %true %true
%v4bool = OpTypeVector %bool 4
%false = OpConstantFalse %bool
%61 = OpConstantComposite %v4bool %true %false %true %false
%69 = OpConstantComposite %v4bool %true %false %true %false
%_ptr_Function_v4bool = OpTypePointer Function %v4bool
%64 = OpConstantNull %v4bool
%72 = OpConstantNull %v4bool
%constant_with_non_constant = OpFunction %void None %1
%4 = OpLabel
%a = OpVariable %_ptr_Function_float Function %6
@ -84,34 +92,42 @@
%bool_var3 = OpVariable %_ptr_Function_bool Function %22
%i32_var1 = OpVariable %_ptr_Function_int Function %29
%i32_var2 = OpVariable %_ptr_Function_int Function %29
%u32_var1 = OpVariable %_ptr_Function_uint Function %35
%u32_var2 = OpVariable %_ptr_Function_uint Function %35
%v3bool_var1 = OpVariable %_ptr_Function_v3bool Function %41
%v3bool_var11 = OpVariable %_ptr_Function_v3bool Function %41
%v3bool_var2 = OpVariable %_ptr_Function_v3bool Function %41
%v3bool_var3 = OpVariable %_ptr_Function_v3bool Function %41
%v3i32_var1 = OpVariable %_ptr_Function_v3int Function %49
%v3i32_var2 = OpVariable %_ptr_Function_v3int Function %49
%v3u32_var1 = OpVariable %_ptr_Function_v3uint Function %55
%v3u32_var2 = OpVariable %_ptr_Function_v3uint Function %55
%v3bool_var4 = OpVariable %_ptr_Function_v3bool Function %41
%v4bool_var5 = OpVariable %_ptr_Function_v4bool Function %64
%i32_var3 = OpVariable %_ptr_Function_int Function %29
%u32_var1 = OpVariable %_ptr_Function_uint Function %37
%u32_var2 = OpVariable %_ptr_Function_uint Function %37
%u32_var3 = OpVariable %_ptr_Function_uint Function %37
%v3bool_var1 = OpVariable %_ptr_Function_v3bool Function %45
%v3bool_var11 = OpVariable %_ptr_Function_v3bool Function %45
%v3bool_var2 = OpVariable %_ptr_Function_v3bool Function %45
%v3bool_var3 = OpVariable %_ptr_Function_v3bool Function %45
%v3i32_var1 = OpVariable %_ptr_Function_v3int Function %53
%v3i32_var2 = OpVariable %_ptr_Function_v3int Function %53
%v3i32_var3 = OpVariable %_ptr_Function_v3int Function %53
%v3u32_var1 = OpVariable %_ptr_Function_v3uint Function %61
%v3u32_var2 = OpVariable %_ptr_Function_v3uint Function %61
%v3u32_var3 = OpVariable %_ptr_Function_v3uint Function %61
%v3bool_var4 = OpVariable %_ptr_Function_v3bool Function %45
%v4bool_var5 = OpVariable %_ptr_Function_v4bool Function %72
OpStore %bool_var1 %true
OpStore %bool_var2 %true
OpStore %bool_var3 %true
OpStore %i32_var1 %int_123
OpStore %i32_var2 %int_123
OpStore %i32_var3 %int_1
OpStore %u32_var1 %uint_123
OpStore %u32_var2 %uint_123
OpStore %v3bool_var1 %38
OpStore %v3bool_var11 %38
OpStore %v3bool_var2 %38
OpStore %v3bool_var3 %38
OpStore %v3i32_var1 %46
OpStore %v3i32_var2 %46
OpStore %v3u32_var1 %52
OpStore %v3u32_var2 %52
OpStore %v3bool_var4 %57
OpStore %v4bool_var5 %61
OpStore %u32_var3 %uint_1
OpStore %v3bool_var1 %42
OpStore %v3bool_var11 %42
OpStore %v3bool_var2 %42
OpStore %v3bool_var3 %42
OpStore %v3i32_var1 %50
OpStore %v3i32_var2 %50
OpStore %v3i32_var3 %55
OpStore %v3u32_var1 %58
OpStore %v3u32_var2 %58
OpStore %v3u32_var3 %63
OpStore %v3bool_var4 %65
OpStore %v4bool_var5 %69
OpReturn
OpFunctionEnd

View File

@ -10,16 +10,20 @@ fn main() {
var bool_var3 : bool = bool(123.0);
var i32_var1 : i32 = i32(123u);
var i32_var2 : i32 = i32(123.0);
var i32_var3 : i32 = i32(true);
var u32_var1 : u32 = u32(123);
var u32_var2 : u32 = u32(123.0);
var u32_var3 : u32 = u32(true);
var v3bool_var1 : vec3<bool> = vec3<bool>(vec3<u32>(123u));
var v3bool_var11 : vec3<bool> = vec3<bool>(vec3<u32>(1234u));
var v3bool_var2 : vec3<bool> = vec3<bool>(vec3<i32>(123));
var v3bool_var3 : vec3<bool> = vec3<bool>(vec3<f32>(123.0));
var v3i32_var1 : vec3<i32> = vec3<i32>(vec3<u32>(123u));
var v3i32_var2 : vec3<i32> = vec3<i32>(vec3<f32>(123.0));
var v3i32_var3 : vec3<i32> = vec3<i32>(vec3<bool>(true));
var v3u32_var1 : vec3<u32> = vec3<u32>(vec3<i32>(123));
var v3u32_var2 : vec3<u32> = vec3<u32>(vec3<f32>(123.0));
var v3u32_var3 : vec3<u32> = vec3<u32>(vec3<bool>(true));
var v3bool_var4 : vec3<bool> = vec3<bool>(vec2<bool>(vec2<f32>(123.0)), true);
var v4bool_var5 : vec4<bool> = vec4<bool>(vec2<bool>(vec2<f32>(123.0, 0.0)), vec2<bool>(true, bool(f32(0.0))));
}

View File

@ -4,9 +4,11 @@ var<private> bool_var3 : bool = bool(1.0);
var<private> i32_var1 : i32 = i32(1u);
var<private> i32_var2 : i32 = i32(1.0);
var<private> i32_var3 : i32 = i32(true);
var<private> u32_var1 : u32 = u32(1);
var<private> u32_var2 : u32 = u32(1.0);
var<private> u32_var3 : u32 = u32(true);
var<private> v3bool_var1 : vec3<bool> = vec3<bool>(vec3<u32>(1u));
var<private> v3bool_var2 : vec3<bool> = vec3<bool>(vec3<i32>(1));
@ -14,9 +16,11 @@ var<private> v3bool_var3 : vec3<bool> = vec3<bool>(vec3<f32>(1.0));
var<private> v3i32_var1 : vec3<i32> = vec3<i32>(vec3<u32>(1u));
var<private> v3i32_var2 : vec3<i32> = vec3<i32>(vec3<f32>(1.0));
var<private> v3i32_var3 : vec3<i32> = vec3<i32>(vec3<bool>(true));
var<private> v3u32_var1 : vec3<u32> = vec3<u32>(vec3<i32>(1));
var<private> v3u32_var2 : vec3<u32> = vec3<u32>(vec3<f32>(1.0));
var<private> v3u32_var3 : vec3<u32> = vec3<u32>(vec3<bool>(true));
var<private> v3bool_var4 : vec3<bool> = vec3<bool>(vec2<bool>(vec2<f32>(123.0)), true);
var<private> v4bool_var5 : vec4<bool> = vec4<bool>(vec2<bool>(vec2<f32>(123.0, 0.0)), vec2<bool>(true, bool(f32(0.0))));
@ -29,8 +33,10 @@ fn main() {
bool_var3 = bool();
i32_var1 = i32();
i32_var2 = i32();
i32_var3 = i32();
u32_var1 = u32();
u32_var2 = u32();
u32_var3 = u32();
v3bool_var1 = vec3<bool>();
v3bool_var2 = vec3<bool>();
v3bool_var3 = vec3<bool>();
@ -38,6 +44,8 @@ fn main() {
v4bool_var5 = vec4<bool>();
v3i32_var1 = vec3<i32>();
v3i32_var2 = vec3<i32>();
v3i32_var3 = vec3<i32>();
v3u32_var1 = vec3<u32>();
v3u32_var2 = vec3<u32>();
v3u32_var3 = vec3<u32>();
}

View File

@ -3,15 +3,19 @@ static bool bool_var2 = bool(1);
static bool bool_var3 = bool(1.0f);
static int i32_var1 = int(1u);
static int i32_var2 = int(1.0f);
static int i32_var3 = int(true);
static uint u32_var1 = uint(1);
static uint u32_var2 = uint(1.0f);
static uint u32_var3 = uint(true);
static bool3 v3bool_var1 = bool3(uint3((1u).xxx));
static bool3 v3bool_var2 = bool3(int3((1).xxx));
static bool3 v3bool_var3 = bool3(float3((1.0f).xxx));
static int3 v3i32_var1 = int3(uint3((1u).xxx));
static int3 v3i32_var2 = int3(float3((1.0f).xxx));
static int3 v3i32_var3 = int3(bool3((true).xxx));
static uint3 v3u32_var1 = uint3(int3((1).xxx));
static uint3 v3u32_var2 = uint3(float3((1.0f).xxx));
static uint3 v3u32_var3 = uint3(bool3((true).xxx));
static bool3 v3bool_var4 = bool3(bool2(float2((123.0f).xx)), true);
static bool4 v4bool_var5 = bool4(bool2(float2(123.0f, 0.0f)), bool2(true, bool(float(0.0f))));
@ -22,8 +26,10 @@ void main() {
bool_var3 = false;
i32_var1 = 0;
i32_var2 = 0;
i32_var3 = 0;
u32_var1 = 0u;
u32_var2 = 0u;
u32_var3 = 0u;
v3bool_var1 = bool3(false, false, false);
v3bool_var2 = bool3(false, false, false);
v3bool_var3 = bool3(false, false, false);
@ -31,7 +37,9 @@ void main() {
v4bool_var5 = bool4(false, false, false, false);
v3i32_var1 = int3(0, 0, 0);
v3i32_var2 = int3(0, 0, 0);
v3i32_var3 = int3(0, 0, 0);
v3u32_var1 = uint3(0u, 0u, 0u);
v3u32_var2 = uint3(0u, 0u, 0u);
v3u32_var3 = uint3(0u, 0u, 0u);
return;
}

View File

@ -7,33 +7,41 @@ kernel void tint_symbol() {
thread bool tint_symbol_3 = bool(1.0f);
thread int tint_symbol_4 = int(1u);
thread int tint_symbol_5 = int(1.0f);
thread uint tint_symbol_6 = uint(1);
thread uint tint_symbol_7 = uint(1.0f);
thread bool3 tint_symbol_8 = bool3(uint3(1u));
thread bool3 tint_symbol_9 = bool3(int3(1));
thread bool3 tint_symbol_10 = bool3(float3(1.0f));
thread bool3 tint_symbol_11 = bool3(bool2(float2(123.0f)), true);
thread bool4 tint_symbol_12 = bool4(bool2(float2(123.0f, 0.0f)), bool2(true, bool(float(0.0f))));
thread int3 tint_symbol_13 = int3(uint3(1u));
thread int3 tint_symbol_14 = int3(float3(1.0f));
thread uint3 tint_symbol_15 = uint3(int3(1));
thread uint3 tint_symbol_16 = uint3(float3(1.0f));
thread int tint_symbol_6 = int(true);
thread uint tint_symbol_7 = uint(1);
thread uint tint_symbol_8 = uint(1.0f);
thread uint tint_symbol_9 = uint(true);
thread bool3 tint_symbol_10 = bool3(uint3(1u));
thread bool3 tint_symbol_11 = bool3(int3(1));
thread bool3 tint_symbol_12 = bool3(float3(1.0f));
thread bool3 tint_symbol_13 = bool3(bool2(float2(123.0f)), true);
thread bool4 tint_symbol_14 = bool4(bool2(float2(123.0f, 0.0f)), bool2(true, bool(float(0.0f))));
thread int3 tint_symbol_15 = int3(uint3(1u));
thread int3 tint_symbol_16 = int3(float3(1.0f));
thread int3 tint_symbol_17 = int3(bool3(true));
thread uint3 tint_symbol_18 = uint3(int3(1));
thread uint3 tint_symbol_19 = uint3(float3(1.0f));
thread uint3 tint_symbol_20 = uint3(bool3(true));
tint_symbol_1 = bool();
tint_symbol_2 = bool();
tint_symbol_3 = bool();
tint_symbol_4 = int();
tint_symbol_5 = int();
tint_symbol_6 = uint();
tint_symbol_6 = int();
tint_symbol_7 = uint();
tint_symbol_8 = bool3();
tint_symbol_9 = bool3();
tint_symbol_8 = uint();
tint_symbol_9 = uint();
tint_symbol_10 = bool3();
tint_symbol_11 = bool3();
tint_symbol_12 = bool4();
tint_symbol_13 = int3();
tint_symbol_14 = int3();
tint_symbol_15 = uint3();
tint_symbol_16 = uint3();
tint_symbol_12 = bool3();
tint_symbol_13 = bool3();
tint_symbol_14 = bool4();
tint_symbol_15 = int3();
tint_symbol_16 = int3();
tint_symbol_17 = int3();
tint_symbol_18 = uint3();
tint_symbol_19 = uint3();
tint_symbol_20 = uint3();
return;
}

View File

@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 51
; Bound: 55
; Schema: 0
OpCapability Shader
OpMemoryModel Logical GLSL450
@ -12,15 +12,19 @@
OpName %bool_var3 "bool_var3"
OpName %i32_var1 "i32_var1"
OpName %i32_var2 "i32_var2"
OpName %i32_var3 "i32_var3"
OpName %u32_var1 "u32_var1"
OpName %u32_var2 "u32_var2"
OpName %u32_var3 "u32_var3"
OpName %v3bool_var1 "v3bool_var1"
OpName %v3bool_var2 "v3bool_var2"
OpName %v3bool_var3 "v3bool_var3"
OpName %v3i32_var1 "v3i32_var1"
OpName %v3i32_var2 "v3i32_var2"
OpName %v3i32_var3 "v3i32_var3"
OpName %v3u32_var1 "v3u32_var1"
OpName %v3u32_var2 "v3u32_var2"
OpName %v3u32_var3 "v3u32_var3"
OpName %v3bool_var4 "v3bool_var4"
OpName %v4bool_var5 "v4bool_var5"
OpName %main "main"
@ -35,60 +39,68 @@
%_ptr_Private_int = OpTypePointer Private %int
%i32_var1 = OpVariable %_ptr_Private_int Private %int_1
%i32_var2 = OpVariable %_ptr_Private_int Private %int_1
%i32_var3 = OpVariable %_ptr_Private_int Private %int_1
%uint = OpTypeInt 32 0
%uint_1 = OpConstant %uint 1
%_ptr_Private_uint = OpTypePointer Private %uint
%u32_var1 = OpVariable %_ptr_Private_uint Private %uint_1
%u32_var2 = OpVariable %_ptr_Private_uint Private %uint_1
%u32_var3 = OpVariable %_ptr_Private_uint Private %uint_1
%v3bool = OpTypeVector %bool 3
%18 = OpConstantComposite %v3bool %true %true %true
%20 = OpConstantComposite %v3bool %true %true %true
%_ptr_Private_v3bool = OpTypePointer Private %v3bool
%v3bool_var1 = OpVariable %_ptr_Private_v3bool Private %18
%v3bool_var2 = OpVariable %_ptr_Private_v3bool Private %18
%v3bool_var3 = OpVariable %_ptr_Private_v3bool Private %18
%v3bool_var1 = OpVariable %_ptr_Private_v3bool Private %20
%v3bool_var2 = OpVariable %_ptr_Private_v3bool Private %20
%v3bool_var3 = OpVariable %_ptr_Private_v3bool Private %20
%v3int = OpTypeVector %int 3
%24 = OpConstantComposite %v3int %int_1 %int_1 %int_1
%26 = OpConstantComposite %v3int %int_1 %int_1 %int_1
%_ptr_Private_v3int = OpTypePointer Private %v3int
%v3i32_var1 = OpVariable %_ptr_Private_v3int Private %24
%v3i32_var2 = OpVariable %_ptr_Private_v3int Private %24
%v3i32_var1 = OpVariable %_ptr_Private_v3int Private %26
%v3i32_var2 = OpVariable %_ptr_Private_v3int Private %26
%v3i32_var3 = OpVariable %_ptr_Private_v3int Private %26
%v3uint = OpTypeVector %uint 3
%29 = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
%32 = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
%_ptr_Private_v3uint = OpTypePointer Private %v3uint
%v3u32_var1 = OpVariable %_ptr_Private_v3uint Private %29
%v3u32_var2 = OpVariable %_ptr_Private_v3uint Private %29
%33 = OpConstantComposite %v3bool %true %true %true
%v3bool_var4 = OpVariable %_ptr_Private_v3bool Private %33
%v3u32_var1 = OpVariable %_ptr_Private_v3uint Private %32
%v3u32_var2 = OpVariable %_ptr_Private_v3uint Private %32
%v3u32_var3 = OpVariable %_ptr_Private_v3uint Private %32
%37 = OpConstantComposite %v3bool %true %true %true
%v3bool_var4 = OpVariable %_ptr_Private_v3bool Private %37
%v4bool = OpTypeVector %bool 4
%false = OpConstantFalse %bool
%37 = OpConstantComposite %v4bool %true %false %true %false
%41 = OpConstantComposite %v4bool %true %false %true %false
%_ptr_Private_v4bool = OpTypePointer Private %v4bool
%v4bool_var5 = OpVariable %_ptr_Private_v4bool Private %37
%v4bool_var5 = OpVariable %_ptr_Private_v4bool Private %41
%void = OpTypeVoid
%40 = OpTypeFunction %void
%44 = OpConstantNull %bool
%45 = OpConstantNull %int
%46 = OpConstantNull %uint
%47 = OpConstantNull %v3bool
%48 = OpConstantNull %v4bool
%49 = OpConstantNull %v3int
%50 = OpConstantNull %v3uint
%main = OpFunction %void None %40
%43 = OpLabel
OpStore %bool_var1 %44
OpStore %bool_var2 %44
OpStore %bool_var3 %44
OpStore %i32_var1 %45
OpStore %i32_var2 %45
OpStore %u32_var1 %46
OpStore %u32_var2 %46
OpStore %v3bool_var1 %47
OpStore %v3bool_var2 %47
OpStore %v3bool_var3 %47
OpStore %v3bool_var4 %47
OpStore %v4bool_var5 %48
OpStore %v3i32_var1 %49
OpStore %v3i32_var2 %49
OpStore %v3u32_var1 %50
OpStore %v3u32_var2 %50
%44 = OpTypeFunction %void
%48 = OpConstantNull %bool
%49 = OpConstantNull %int
%50 = OpConstantNull %uint
%51 = OpConstantNull %v3bool
%52 = OpConstantNull %v4bool
%53 = OpConstantNull %v3int
%54 = OpConstantNull %v3uint
%main = OpFunction %void None %44
%47 = OpLabel
OpStore %bool_var1 %48
OpStore %bool_var2 %48
OpStore %bool_var3 %48
OpStore %i32_var1 %49
OpStore %i32_var2 %49
OpStore %i32_var3 %49
OpStore %u32_var1 %50
OpStore %u32_var2 %50
OpStore %u32_var3 %50
OpStore %v3bool_var1 %51
OpStore %v3bool_var2 %51
OpStore %v3bool_var3 %51
OpStore %v3bool_var4 %51
OpStore %v4bool_var5 %52
OpStore %v3i32_var1 %53
OpStore %v3i32_var2 %53
OpStore %v3i32_var3 %53
OpStore %v3u32_var1 %54
OpStore %v3u32_var2 %54
OpStore %v3u32_var3 %54
OpReturn
OpFunctionEnd

View File

@ -8,10 +8,14 @@ var<private> i32_var1 : i32 = i32(1u);
var<private> i32_var2 : i32 = i32(1.0);
var<private> i32_var3 : i32 = i32(true);
var<private> u32_var1 : u32 = u32(1);
var<private> u32_var2 : u32 = u32(1.0);
var<private> u32_var3 : u32 = u32(true);
var<private> v3bool_var1 : vec3<bool> = vec3<bool>(vec3<u32>(1u));
var<private> v3bool_var2 : vec3<bool> = vec3<bool>(vec3<i32>(1));
@ -22,10 +26,14 @@ var<private> v3i32_var1 : vec3<i32> = vec3<i32>(vec3<u32>(1u));
var<private> v3i32_var2 : vec3<i32> = vec3<i32>(vec3<f32>(1.0));
var<private> v3i32_var3 : vec3<i32> = vec3<i32>(vec3<bool>(true));
var<private> v3u32_var1 : vec3<u32> = vec3<u32>(vec3<i32>(1));
var<private> v3u32_var2 : vec3<u32> = vec3<u32>(vec3<f32>(1.0));
var<private> v3u32_var3 : vec3<u32> = vec3<u32>(vec3<bool>(true));
var<private> v3bool_var4 : vec3<bool> = vec3<bool>(vec2<bool>(vec2<f32>(123.0)), true);
var<private> v4bool_var5 : vec4<bool> = vec4<bool>(vec2<bool>(vec2<f32>(123.0, 0.0)), vec2<bool>(true, bool(f32(0.0))));
@ -37,8 +45,10 @@ fn main() {
bool_var3 = bool();
i32_var1 = i32();
i32_var2 = i32();
i32_var3 = i32();
u32_var1 = u32();
u32_var2 = u32();
u32_var3 = u32();
v3bool_var1 = vec3<bool>();
v3bool_var2 = vec3<bool>();
v3bool_var3 = vec3<bool>();
@ -46,6 +56,8 @@ fn main() {
v4bool_var5 = vec4<bool>();
v3i32_var1 = vec3<i32>();
v3i32_var2 = vec3<i32>();
v3i32_var3 = vec3<i32>();
v3u32_var1 = vec3<u32>();
v3u32_var2 = vec3<u32>();
v3u32_var3 = vec3<u32>();
}