tint: const eval of bitcast operator
Bug: tint:1581 Change-Id: Ida43b34118282eeb99ae099c91a6465eb3040ca6 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/115080 Reviewed-by: James Price <jrprice@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Antonio Maiorano <amaiorano@google.com>
This commit is contained in:
parent
ffa83ad1f7
commit
056618541f
|
@ -1186,6 +1186,7 @@ if (tint_build_unittests) {
|
||||||
"resolver/compound_assignment_validation_test.cc",
|
"resolver/compound_assignment_validation_test.cc",
|
||||||
"resolver/compound_statement_test.cc",
|
"resolver/compound_statement_test.cc",
|
||||||
"resolver/const_eval_binary_op_test.cc",
|
"resolver/const_eval_binary_op_test.cc",
|
||||||
|
"resolver/const_eval_bitcast_test.cc",
|
||||||
"resolver/const_eval_builtin_test.cc",
|
"resolver/const_eval_builtin_test.cc",
|
||||||
"resolver/const_eval_construction_test.cc",
|
"resolver/const_eval_construction_test.cc",
|
||||||
"resolver/const_eval_conversion_test.cc",
|
"resolver/const_eval_conversion_test.cc",
|
||||||
|
|
|
@ -894,6 +894,7 @@ if(TINT_BUILD_TESTS)
|
||||||
resolver/compound_assignment_validation_test.cc
|
resolver/compound_assignment_validation_test.cc
|
||||||
resolver/compound_statement_test.cc
|
resolver/compound_statement_test.cc
|
||||||
resolver/const_eval_binary_op_test.cc
|
resolver/const_eval_binary_op_test.cc
|
||||||
|
resolver/const_eval_bitcast_test.cc
|
||||||
resolver/const_eval_builtin_test.cc
|
resolver/const_eval_builtin_test.cc
|
||||||
resolver/const_eval_construction_test.cc
|
resolver/const_eval_construction_test.cc
|
||||||
resolver/const_eval_conversion_test.cc
|
resolver/const_eval_conversion_test.cc
|
||||||
|
|
|
@ -68,6 +68,17 @@ auto Dispatch_iu32(F&& f, CONSTANTS&&... cs) {
|
||||||
[&](const type::U32*) { return f(cs->template ValueAs<u32>()...); });
|
[&](const type::U32*) { return f(cs->template ValueAs<u32>()...); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Helper that calls `f` passing in the value of all `cs`.
|
||||||
|
/// Calls `f` with all constants cast to the type of the first `cs` argument.
|
||||||
|
template <typename F, typename... CONSTANTS>
|
||||||
|
auto Dispatch_fiu32(F&& f, CONSTANTS&&... cs) {
|
||||||
|
return Switch(
|
||||||
|
First(cs...)->Type(), //
|
||||||
|
[&](const type::F32*) { return f(cs->template ValueAs<f32>()...); },
|
||||||
|
[&](const type::I32*) { return f(cs->template ValueAs<i32>()...); },
|
||||||
|
[&](const type::U32*) { return f(cs->template ValueAs<u32>()...); });
|
||||||
|
}
|
||||||
|
|
||||||
/// Helper that calls `f` passing in the value of all `cs`.
|
/// Helper that calls `f` passing in the value of all `cs`.
|
||||||
/// Calls `f` with all constants cast to the type of the first `cs` argument.
|
/// Calls `f` with all constants cast to the type of the first `cs` argument.
|
||||||
template <typename F, typename... CONSTANTS>
|
template <typename F, typename... CONSTANTS>
|
||||||
|
@ -1319,9 +1330,33 @@ ConstEval::Result ConstEval::Swizzle(const type::Type* ty,
|
||||||
return builder.create<constant::Composite>(ty, std::move(values));
|
return builder.create<constant::Composite>(ty, std::move(values));
|
||||||
}
|
}
|
||||||
|
|
||||||
ConstEval::Result ConstEval::Bitcast(const type::Type*, const sem::Expression*) {
|
ConstEval::Result ConstEval::Bitcast(const type::Type* ty, const sem::Expression* expr) {
|
||||||
// TODO(crbug.com/tint/1581): Implement @const intrinsics
|
auto* value = expr->ConstantValue();
|
||||||
|
if (!value) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
}
|
||||||
|
auto* el_ty = type::Type::DeepestElementOf(ty);
|
||||||
|
auto& source = expr->Declaration()->source;
|
||||||
|
auto transform = [&](const constant::Value* c0) {
|
||||||
|
auto create = [&](auto e) {
|
||||||
|
return Switch(
|
||||||
|
el_ty,
|
||||||
|
[&](const type::U32*) { //
|
||||||
|
auto r = utils::Bitcast<u32>(e);
|
||||||
|
return CreateScalar(builder, source, el_ty, r);
|
||||||
|
},
|
||||||
|
[&](const type::I32*) { //
|
||||||
|
auto r = utils::Bitcast<i32>(e);
|
||||||
|
return CreateScalar(builder, source, el_ty, r);
|
||||||
|
},
|
||||||
|
[&](const type::F32*) { //
|
||||||
|
auto r = utils::Bitcast<f32>(e);
|
||||||
|
return CreateScalar(builder, source, el_ty, r);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
return Dispatch_fiu32(create, c0);
|
||||||
|
};
|
||||||
|
return TransformElements(builder, ty, transform, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
ConstEval::Result ConstEval::OpComplement(const type::Type* ty,
|
ConstEval::Result ConstEval::OpComplement(const type::Type* ty,
|
||||||
|
|
|
@ -0,0 +1,192 @@
|
||||||
|
// Copyright 2022 The Tint Authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include "src/tint/resolver/const_eval_test.h"
|
||||||
|
|
||||||
|
using namespace tint::number_suffixes; // NOLINT
|
||||||
|
|
||||||
|
namespace tint::resolver {
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
struct Case {
|
||||||
|
Value input;
|
||||||
|
struct Success {
|
||||||
|
Value value;
|
||||||
|
};
|
||||||
|
struct Failure {
|
||||||
|
builder::CreatePtrs create_ptrs;
|
||||||
|
};
|
||||||
|
utils::Result<Success, Failure> expected;
|
||||||
|
};
|
||||||
|
|
||||||
|
static std::ostream& operator<<(std::ostream& o, const Case& c) {
|
||||||
|
o << "input: " << c.input;
|
||||||
|
if (c.expected) {
|
||||||
|
o << ", expected: " << c.expected.Get().value;
|
||||||
|
} else {
|
||||||
|
o << ", expected failed bitcast to " << c.expected.Failure().create_ptrs;
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename TO, typename FROM>
|
||||||
|
Case Success(FROM input, TO expected) {
|
||||||
|
return Case{input, Case::Success{expected}};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename TO, typename FROM>
|
||||||
|
Case Failure(FROM input) {
|
||||||
|
return Case{input, Case::Failure{builder::CreatePtrsFor<TO>()}};
|
||||||
|
}
|
||||||
|
|
||||||
|
using ResolverConstEvalBitcastTest = ResolverTestWithParam<Case>;
|
||||||
|
|
||||||
|
TEST_P(ResolverConstEvalBitcastTest, Test) {
|
||||||
|
const auto& input = GetParam().input;
|
||||||
|
const auto& expected = GetParam().expected;
|
||||||
|
|
||||||
|
// Get the target type CreatePtrs
|
||||||
|
builder::CreatePtrs target_create_ptrs;
|
||||||
|
if (expected) {
|
||||||
|
target_create_ptrs = expected.Get().value.create_ptrs;
|
||||||
|
} else {
|
||||||
|
target_create_ptrs = expected.Failure().create_ptrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* target_ty = target_create_ptrs.ast(*this);
|
||||||
|
ASSERT_NE(target_ty, nullptr);
|
||||||
|
auto* input_val = input.Expr(*this);
|
||||||
|
const ast::Expression* expr = Bitcast(target_ty, input_val);
|
||||||
|
|
||||||
|
WrapInFunction(expr);
|
||||||
|
|
||||||
|
auto* target_sem_ty = target_create_ptrs.sem(*this);
|
||||||
|
|
||||||
|
if (expected) {
|
||||||
|
EXPECT_TRUE(r()->Resolve()) << r()->error();
|
||||||
|
|
||||||
|
auto* sem = Sem().Get(expr);
|
||||||
|
ASSERT_NE(sem, nullptr);
|
||||||
|
EXPECT_TYPE(sem->Type(), target_sem_ty);
|
||||||
|
ASSERT_NE(sem->ConstantValue(), nullptr);
|
||||||
|
EXPECT_TYPE(sem->ConstantValue()->Type(), target_sem_ty);
|
||||||
|
|
||||||
|
auto expected_values = expected.Get().value.args;
|
||||||
|
auto got_values = ScalarsFrom(sem->ConstantValue());
|
||||||
|
EXPECT_EQ(expected_values, got_values);
|
||||||
|
} else {
|
||||||
|
ASSERT_FALSE(r()->Resolve());
|
||||||
|
EXPECT_THAT(r()->error(), testing::HasSubstr("cannot be represented as"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const u32 nan_as_u32 = utils::Bitcast<u32>(std::numeric_limits<float>::quiet_NaN());
|
||||||
|
const i32 nan_as_i32 = utils::Bitcast<i32>(std::numeric_limits<float>::quiet_NaN());
|
||||||
|
const u32 inf_as_u32 = utils::Bitcast<u32>(std::numeric_limits<float>::infinity());
|
||||||
|
const i32 inf_as_i32 = utils::Bitcast<i32>(std::numeric_limits<float>::infinity());
|
||||||
|
const u32 neg_inf_as_u32 = utils::Bitcast<u32>(-std::numeric_limits<float>::infinity());
|
||||||
|
const i32 neg_inf_as_i32 = utils::Bitcast<i32>(-std::numeric_limits<float>::infinity());
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_SUITE_P(Bitcast,
|
||||||
|
ResolverConstEvalBitcastTest,
|
||||||
|
testing::ValuesIn({
|
||||||
|
// Bitcast to same (concrete) type, no change
|
||||||
|
Success(Val(0_u), Val(0_u)), //
|
||||||
|
Success(Val(0_i), Val(0_i)), //
|
||||||
|
Success(Val(0_f), Val(0_f)), //
|
||||||
|
Success(Val(123_u), Val(123_u)), //
|
||||||
|
Success(Val(123_i), Val(123_i)), //
|
||||||
|
Success(Val(123.456_f), Val(123.456_f)), //
|
||||||
|
Success(Val(u32::Highest()), Val(u32::Highest())), //
|
||||||
|
Success(Val(u32::Lowest()), Val(u32::Lowest())), //
|
||||||
|
Success(Val(i32::Highest()), Val(i32::Highest())), //
|
||||||
|
Success(Val(i32::Lowest()), Val(i32::Lowest())), //
|
||||||
|
Success(Val(f32::Highest()), Val(f32::Highest())), //
|
||||||
|
Success(Val(f32::Lowest()), Val(f32::Lowest())), //
|
||||||
|
|
||||||
|
// Bitcast to different type
|
||||||
|
Success(Val(0_u), Val(0_i)), //
|
||||||
|
Success(Val(0_u), Val(0_f)), //
|
||||||
|
Success(Val(0_i), Val(0_u)), //
|
||||||
|
Success(Val(0_i), Val(0_f)), //
|
||||||
|
Success(Val(0.0_f), Val(0_i)), //
|
||||||
|
Success(Val(0.0_f), Val(0_u)), //
|
||||||
|
Success(Val(1_u), Val(1_i)), //
|
||||||
|
Success(Val(1_u), Val(1.4013e-45_f)), //
|
||||||
|
Success(Val(1_i), Val(1_u)), //
|
||||||
|
Success(Val(1_i), Val(1.4013e-45_f)), //
|
||||||
|
Success(Val(1.0_f), Val(0x3F800000_u)), //
|
||||||
|
Success(Val(1.0_f), Val(0x3F800000_i)), //
|
||||||
|
Success(Val(123_u), Val(123_i)), //
|
||||||
|
Success(Val(123_u), Val(1.7236e-43_f)), //
|
||||||
|
Success(Val(123_i), Val(123_u)), //
|
||||||
|
Success(Val(123_i), Val(1.7236e-43_f)), //
|
||||||
|
Success(Val(123.0_f), Val(0x42F60000_u)), //
|
||||||
|
Success(Val(123.0_f), Val(0x42F60000_i)), //
|
||||||
|
|
||||||
|
// Bitcast from abstract materializes lhs first,
|
||||||
|
// so same results as above.
|
||||||
|
Success(Val(0_a), Val(0_i)), //
|
||||||
|
Success(Val(0_a), Val(0_f)), //
|
||||||
|
Success(Val(0_a), Val(0_u)), //
|
||||||
|
Success(Val(0_a), Val(0_f)), //
|
||||||
|
Success(Val(0_a), Val(0_i)), //
|
||||||
|
Success(Val(0_a), Val(0_u)), //
|
||||||
|
Success(Val(1_a), Val(1_i)), //
|
||||||
|
Success(Val(1_a), Val(1.4013e-45_f)), //
|
||||||
|
Success(Val(1_a), Val(1_u)), //
|
||||||
|
Success(Val(1_a), Val(1.4013e-45_f)), //
|
||||||
|
Success(Val(1.0_a), Val(0x3F800000_u)), //
|
||||||
|
Success(Val(1.0_a), Val(0x3F800000_i)), //
|
||||||
|
Success(Val(123_a), Val(123_i)), //
|
||||||
|
Success(Val(123_a), Val(1.7236e-43_f)), //
|
||||||
|
Success(Val(123_a), Val(123_u)), //
|
||||||
|
Success(Val(123_a), Val(1.7236e-43_f)), //
|
||||||
|
Success(Val(123.0_a), Val(0x42F60000_u)), //
|
||||||
|
Success(Val(123.0_a), Val(0x42F60000_i)), //
|
||||||
|
|
||||||
|
// u32 <-> i32 sign bit
|
||||||
|
Success(Val(0xFFFFFFFF_u), Val(-1_i)), //
|
||||||
|
Success(Val(-1_i), Val(0xFFFFFFFF_u)), //
|
||||||
|
Success(Val(0x80000000_u), Val(i32::Lowest())), //
|
||||||
|
Success(Val(i32::Lowest()), Val(0x80000000_u)), //
|
||||||
|
|
||||||
|
// Vector tests
|
||||||
|
Success(Vec(0_u, 1_u, 123_u), Vec(0_i, 1_i, 123_i)),
|
||||||
|
Success(Vec(0.0_f, 1.0_f, 123.0_f),
|
||||||
|
Vec(0_i, 0x3F800000_i, 0x42F60000_i)),
|
||||||
|
|
||||||
|
// Unrepresentable
|
||||||
|
Failure<f32>(Val(nan_as_u32)), //
|
||||||
|
Failure<f32>(Val(nan_as_i32)), //
|
||||||
|
Failure<f32>(Val(inf_as_u32)), //
|
||||||
|
Failure<f32>(Val(inf_as_i32)), //
|
||||||
|
Failure<f32>(Val(neg_inf_as_u32)), //
|
||||||
|
Failure<f32>(Val(neg_inf_as_i32)), //
|
||||||
|
Failure<builder::vec2<f32>>(Vec(nan_as_u32, 0_u)), //
|
||||||
|
Failure<builder::vec2<f32>>(Vec(nan_as_i32, 0_i)), //
|
||||||
|
Failure<builder::vec2<f32>>(Vec(inf_as_u32, 0_u)), //
|
||||||
|
Failure<builder::vec2<f32>>(Vec(inf_as_i32, 0_i)), //
|
||||||
|
Failure<builder::vec2<f32>>(Vec(neg_inf_as_u32, 0_u)), //
|
||||||
|
Failure<builder::vec2<f32>>(Vec(neg_inf_as_i32, 0_i)), //
|
||||||
|
Failure<builder::vec2<f32>>(Vec(0_u, nan_as_u32)), //
|
||||||
|
Failure<builder::vec2<f32>>(Vec(0_i, nan_as_i32)), //
|
||||||
|
Failure<builder::vec2<f32>>(Vec(0_u, inf_as_u32)), //
|
||||||
|
Failure<builder::vec2<f32>>(Vec(0_i, inf_as_i32)), //
|
||||||
|
Failure<builder::vec2<f32>>(Vec(0_u, neg_inf_as_u32)), //
|
||||||
|
Failure<builder::vec2<f32>>(Vec(0_i, neg_inf_as_i32)), //
|
||||||
|
}));
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
} // namespace tint::resolver
|
|
@ -789,11 +789,11 @@ enum class Method {
|
||||||
// let a = abstract_expr;
|
// let a = abstract_expr;
|
||||||
kLet,
|
kLet,
|
||||||
|
|
||||||
// bitcast<f32>(abstract_expr)
|
// bitcast<i32>(abstract_expr)
|
||||||
kBitcastF32Arg,
|
kBitcastI32Arg,
|
||||||
|
|
||||||
// bitcast<vec3<f32>>(abstract_expr)
|
// bitcast<vec3<i32>>(abstract_expr)
|
||||||
kBitcastVec3F32Arg,
|
kBitcastVec3I32Arg,
|
||||||
|
|
||||||
// array<i32, abstract_expr>()
|
// array<i32, abstract_expr>()
|
||||||
kArrayLength,
|
kArrayLength,
|
||||||
|
@ -825,10 +825,10 @@ static std::ostream& operator<<(std::ostream& o, Method m) {
|
||||||
return o << "var";
|
return o << "var";
|
||||||
case Method::kLet:
|
case Method::kLet:
|
||||||
return o << "let";
|
return o << "let";
|
||||||
case Method::kBitcastF32Arg:
|
case Method::kBitcastI32Arg:
|
||||||
return o << "bitcast-f32-arg";
|
return o << "bitcast-i32-arg";
|
||||||
case Method::kBitcastVec3F32Arg:
|
case Method::kBitcastVec3I32Arg:
|
||||||
return o << "bitcast-vec3-f32-arg";
|
return o << "bitcast-vec3-i32-arg";
|
||||||
case Method::kArrayLength:
|
case Method::kArrayLength:
|
||||||
return o << "array-length";
|
return o << "array-length";
|
||||||
case Method::kSwitch:
|
case Method::kSwitch:
|
||||||
|
@ -903,12 +903,12 @@ TEST_P(MaterializeAbstractNumericToDefaultType, Test) {
|
||||||
WrapInFunction(Decl(Let("a", abstract_expr())));
|
WrapInFunction(Decl(Let("a", abstract_expr())));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Method::kBitcastF32Arg: {
|
case Method::kBitcastI32Arg: {
|
||||||
WrapInFunction(Bitcast<f32>(abstract_expr()));
|
WrapInFunction(Bitcast<i32>(abstract_expr()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Method::kBitcastVec3F32Arg: {
|
case Method::kBitcastVec3I32Arg: {
|
||||||
WrapInFunction(Bitcast(ty.vec3<f32>(), abstract_expr()));
|
WrapInFunction(Bitcast(ty.vec3<i32>(), abstract_expr()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Method::kArrayLength: {
|
case Method::kArrayLength: {
|
||||||
|
@ -977,7 +977,7 @@ TEST_P(MaterializeAbstractNumericToDefaultType, Test) {
|
||||||
constexpr Method kScalarMethods[] = {
|
constexpr Method kScalarMethods[] = {
|
||||||
Method::kLet,
|
Method::kLet,
|
||||||
Method::kVar,
|
Method::kVar,
|
||||||
Method::kBitcastF32Arg,
|
Method::kBitcastI32Arg,
|
||||||
Method::kTintMaterializeBuiltin,
|
Method::kTintMaterializeBuiltin,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -985,7 +985,7 @@ constexpr Method kScalarMethods[] = {
|
||||||
constexpr Method kVectorMethods[] = {
|
constexpr Method kVectorMethods[] = {
|
||||||
Method::kLet,
|
Method::kLet,
|
||||||
Method::kVar,
|
Method::kVar,
|
||||||
Method::kBitcastVec3F32Arg,
|
Method::kBitcastVec3I32Arg,
|
||||||
Method::kRuntimeIndex,
|
Method::kRuntimeIndex,
|
||||||
Method::kTintMaterializeBuiltin,
|
Method::kTintMaterializeBuiltin,
|
||||||
};
|
};
|
||||||
|
|
|
@ -1957,24 +1957,27 @@ sem::Expression* Resolver::Bitcast(const ast::BitcastExpression* expr) {
|
||||||
if (!ty) {
|
if (!ty) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
if (!validator_.Bitcast(expr, ty)) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
|
||||||
const constant::Value* val = nullptr;
|
const constant::Value* val = nullptr;
|
||||||
|
sem::EvaluationStage stage = sem::EvaluationStage::kRuntime;
|
||||||
// TODO(crbug.com/tint/1582): short circuit 'expr' once const eval of Bitcast is implemented.
|
// TODO(crbug.com/tint/1582): short circuit 'expr' once const eval of Bitcast is implemented.
|
||||||
if (auto r = const_eval_.Bitcast(ty, inner)) {
|
if (auto r = const_eval_.Bitcast(ty, inner)) {
|
||||||
val = r.Get();
|
val = r.Get();
|
||||||
|
if (val) {
|
||||||
|
stage = sem::EvaluationStage::kConstant;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
auto stage = sem::EvaluationStage::kRuntime; // TODO(crbug.com/tint/1581)
|
|
||||||
auto* sem = builder_->create<sem::Expression>(expr, ty, stage, current_statement_,
|
auto* sem = builder_->create<sem::Expression>(expr, ty, stage, current_statement_,
|
||||||
std::move(val), inner->HasSideEffects());
|
std::move(val), inner->HasSideEffects());
|
||||||
|
|
||||||
sem->Behaviors() = inner->Behaviors();
|
sem->Behaviors() = inner->Behaviors();
|
||||||
|
|
||||||
if (!validator_.Bitcast(expr, ty)) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sem;
|
return sem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -755,15 +755,18 @@ struct Value {
|
||||||
static_assert(IsDataTypeSpecializedFor<T>, "No DataType<T> specialization exists");
|
static_assert(IsDataTypeSpecializedFor<T>, "No DataType<T> specialization exists");
|
||||||
using EL_TY = typename builder::DataType<T>::ElementType;
|
using EL_TY = typename builder::DataType<T>::ElementType;
|
||||||
return Value{
|
return Value{
|
||||||
std::move(args), CreatePtrsFor<T>().expr, tint::IsAbstract<EL_TY>,
|
std::move(args), //
|
||||||
tint::IsIntegral<EL_TY>, tint::FriendlyName<EL_TY>(),
|
CreatePtrsFor<T>(), //
|
||||||
|
tint::IsAbstract<EL_TY>, //
|
||||||
|
tint::IsIntegral<EL_TY>, //
|
||||||
|
tint::FriendlyName<EL_TY>(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates an `ast::Expression` for the type T passing in previously stored args
|
/// Creates an `ast::Expression` for the type T passing in previously stored args
|
||||||
/// @param b the ProgramBuilder
|
/// @param b the ProgramBuilder
|
||||||
/// @returns an expression node
|
/// @returns an expression node
|
||||||
const ast::Expression* Expr(ProgramBuilder& b) const { return (*create)(b, args); }
|
const ast::Expression* Expr(ProgramBuilder& b) const { return (*create_ptrs.expr)(b, args); }
|
||||||
|
|
||||||
/// Prints this value to the output stream
|
/// Prints this value to the output stream
|
||||||
/// @param o the output stream
|
/// @param o the output stream
|
||||||
|
@ -782,8 +785,8 @@ struct Value {
|
||||||
|
|
||||||
/// The arguments used to construct the value
|
/// The arguments used to construct the value
|
||||||
utils::Vector<Scalar, 4> args;
|
utils::Vector<Scalar, 4> args;
|
||||||
/// Function used to construct an expression with the given value
|
/// CreatePtrs for value's type used to create an expression with `args`
|
||||||
builder::ast_expr_func_ptr create;
|
builder::CreatePtrs create_ptrs;
|
||||||
/// True if the element type is abstract
|
/// True if the element type is abstract
|
||||||
bool is_abstract = false;
|
bool is_abstract = false;
|
||||||
/// True if the element type is an integer
|
/// True if the element type is an integer
|
||||||
|
@ -809,9 +812,11 @@ Value Val(T v) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a Value of DataType<vec<N, T>> from N scalar `args`
|
/// Creates a Value of DataType<vec<N, T>> from N scalar `args`
|
||||||
template <typename... T>
|
template <typename... Ts>
|
||||||
Value Vec(T... args) {
|
Value Vec(Ts... args) {
|
||||||
using FirstT = std::tuple_element_t<0, std::tuple<T...>>;
|
using FirstT = std::tuple_element_t<0, std::tuple<Ts...>>;
|
||||||
|
static_assert(std::conjunction_v<std::is_same<FirstT, Ts>...>,
|
||||||
|
"Vector args must all be the same type");
|
||||||
constexpr size_t N = sizeof...(args);
|
constexpr size_t N = sizeof...(args);
|
||||||
utils::Vector<Scalar, sizeof...(args)> v{args...};
|
utils::Vector<Scalar, sizeof...(args)> v{args...};
|
||||||
return Value::Create<vec<N, FirstT>>(std::move(v));
|
return Value::Create<vec<N, FirstT>>(std::move(v));
|
||||||
|
|
|
@ -22,36 +22,39 @@ namespace {
|
||||||
using GlslGeneratorImplTest_Bitcast = TestHelper;
|
using GlslGeneratorImplTest_Bitcast = TestHelper;
|
||||||
|
|
||||||
TEST_F(GlslGeneratorImplTest_Bitcast, EmitExpression_Bitcast_Float) {
|
TEST_F(GlslGeneratorImplTest_Bitcast, EmitExpression_Bitcast_Float) {
|
||||||
auto* bitcast = create<ast::BitcastExpression>(ty.f32(), Expr(1_i));
|
auto* a = Let("a", Expr(1_i));
|
||||||
WrapInFunction(bitcast);
|
auto* bitcast = create<ast::BitcastExpression>(ty.f32(), Expr("a"));
|
||||||
|
WrapInFunction(a, bitcast);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
||||||
EXPECT_EQ(out.str(), "intBitsToFloat(1)");
|
EXPECT_EQ(out.str(), "intBitsToFloat(a)");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(GlslGeneratorImplTest_Bitcast, EmitExpression_Bitcast_Int) {
|
TEST_F(GlslGeneratorImplTest_Bitcast, EmitExpression_Bitcast_Int) {
|
||||||
auto* bitcast = create<ast::BitcastExpression>(ty.i32(), Expr(1_u));
|
auto* a = Let("a", Expr(1_u));
|
||||||
WrapInFunction(bitcast);
|
auto* bitcast = create<ast::BitcastExpression>(ty.i32(), Expr("a"));
|
||||||
|
WrapInFunction(a, bitcast);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
||||||
EXPECT_EQ(out.str(), "int(1u)");
|
EXPECT_EQ(out.str(), "int(a)");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(GlslGeneratorImplTest_Bitcast, EmitExpression_Bitcast_Uint) {
|
TEST_F(GlslGeneratorImplTest_Bitcast, EmitExpression_Bitcast_Uint) {
|
||||||
auto* bitcast = create<ast::BitcastExpression>(ty.u32(), Expr(1_i));
|
auto* a = Let("a", Expr(1_i));
|
||||||
WrapInFunction(bitcast);
|
auto* bitcast = create<ast::BitcastExpression>(ty.u32(), Expr("a"));
|
||||||
|
WrapInFunction(a, bitcast);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
||||||
EXPECT_EQ(out.str(), "uint(1)");
|
EXPECT_EQ(out.str(), "uint(a)");
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -22,36 +22,39 @@ namespace {
|
||||||
using HlslGeneratorImplTest_Bitcast = TestHelper;
|
using HlslGeneratorImplTest_Bitcast = TestHelper;
|
||||||
|
|
||||||
TEST_F(HlslGeneratorImplTest_Bitcast, EmitExpression_Bitcast_Float) {
|
TEST_F(HlslGeneratorImplTest_Bitcast, EmitExpression_Bitcast_Float) {
|
||||||
auto* bitcast = create<ast::BitcastExpression>(ty.f32(), Expr(1_i));
|
auto* a = Let("a", Expr(1_i));
|
||||||
WrapInFunction(bitcast);
|
auto* bitcast = create<ast::BitcastExpression>(ty.f32(), Expr("a"));
|
||||||
|
WrapInFunction(a, bitcast);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
||||||
EXPECT_EQ(out.str(), "asfloat(1)");
|
EXPECT_EQ(out.str(), "asfloat(a)");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(HlslGeneratorImplTest_Bitcast, EmitExpression_Bitcast_Int) {
|
TEST_F(HlslGeneratorImplTest_Bitcast, EmitExpression_Bitcast_Int) {
|
||||||
auto* bitcast = create<ast::BitcastExpression>(ty.i32(), Expr(1_u));
|
auto* a = Let("a", Expr(1_u));
|
||||||
WrapInFunction(bitcast);
|
auto* bitcast = create<ast::BitcastExpression>(ty.i32(), Expr("a"));
|
||||||
|
WrapInFunction(a, bitcast);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
||||||
EXPECT_EQ(out.str(), "asint(1u)");
|
EXPECT_EQ(out.str(), "asint(a)");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(HlslGeneratorImplTest_Bitcast, EmitExpression_Bitcast_Uint) {
|
TEST_F(HlslGeneratorImplTest_Bitcast, EmitExpression_Bitcast_Uint) {
|
||||||
auto* bitcast = create<ast::BitcastExpression>(ty.u32(), Expr(1_i));
|
auto* a = Let("a", Expr(1_i));
|
||||||
WrapInFunction(bitcast);
|
auto* bitcast = create<ast::BitcastExpression>(ty.u32(), Expr("a"));
|
||||||
|
WrapInFunction(a, bitcast);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
||||||
EXPECT_EQ(out.str(), "asuint(1)");
|
EXPECT_EQ(out.str(), "asuint(a)");
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -22,14 +22,15 @@ namespace {
|
||||||
using MslGeneratorImplTest = TestHelper;
|
using MslGeneratorImplTest = TestHelper;
|
||||||
|
|
||||||
TEST_F(MslGeneratorImplTest, EmitExpression_Bitcast) {
|
TEST_F(MslGeneratorImplTest, EmitExpression_Bitcast) {
|
||||||
auto* bitcast = create<ast::BitcastExpression>(ty.f32(), Expr(1_i));
|
auto* a = Let("a", Expr(1_i));
|
||||||
WrapInFunction(bitcast);
|
auto* bitcast = create<ast::BitcastExpression>(ty.f32(), Expr("a"));
|
||||||
|
WrapInFunction(a, bitcast);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
std::stringstream out;
|
std::stringstream out;
|
||||||
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
ASSERT_TRUE(gen.EmitExpression(out, bitcast)) << gen.error();
|
||||||
EXPECT_EQ(out.str(), "as_type<float>(1)");
|
EXPECT_EQ(out.str(), "as_type<float>(a)");
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -6,7 +6,7 @@ void main_1() {
|
||||||
const uint4 x_18 = Src.Load(int3(0, 0, 0));
|
const uint4 x_18 = Src.Load(int3(0, 0, 0));
|
||||||
srcValue = x_18;
|
srcValue = x_18;
|
||||||
const uint x_22 = srcValue.x;
|
const uint x_22 = srcValue.x;
|
||||||
srcValue.x = (x_22 + asuint(1));
|
srcValue.x = (x_22 + 1u);
|
||||||
const uint4 x_27 = srcValue;
|
const uint4 x_27 = srcValue;
|
||||||
Dst[(0).xx] = x_27;
|
Dst[(0).xx] = x_27;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -6,7 +6,7 @@ void main_1() {
|
||||||
const uint4 x_18 = Src.Load(int3(0, 0, 0));
|
const uint4 x_18 = Src.Load(int3(0, 0, 0));
|
||||||
srcValue = x_18;
|
srcValue = x_18;
|
||||||
const uint x_22 = srcValue.x;
|
const uint x_22 = srcValue.x;
|
||||||
srcValue.x = (x_22 + asuint(1));
|
srcValue.x = (x_22 + 1u);
|
||||||
const uint4 x_27 = srcValue;
|
const uint4 x_27 = srcValue;
|
||||||
Dst[(0).xx] = x_27;
|
Dst[(0).xx] = x_27;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -7,7 +7,7 @@ void main_1() {
|
||||||
uvec4 x_18 = texelFetch(Src_1, ivec2(0), 0);
|
uvec4 x_18 = texelFetch(Src_1, ivec2(0), 0);
|
||||||
srcValue = x_18;
|
srcValue = x_18;
|
||||||
uint x_22 = srcValue.x;
|
uint x_22 = srcValue.x;
|
||||||
srcValue.x = (x_22 + uint(1));
|
srcValue.x = (x_22 + 1u);
|
||||||
uvec4 x_27 = srcValue;
|
uvec4 x_27 = srcValue;
|
||||||
imageStore(Dst, ivec2(0), x_27);
|
imageStore(Dst, ivec2(0), x_27);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -6,7 +6,7 @@ void main_1(texture2d<uint, access::sample> tint_symbol_1, texture2d<uint, acces
|
||||||
uint4 const x_18 = tint_symbol_1.read(uint2(int2(0)), 0);
|
uint4 const x_18 = tint_symbol_1.read(uint2(int2(0)), 0);
|
||||||
srcValue = x_18;
|
srcValue = x_18;
|
||||||
uint const x_22 = srcValue[0];
|
uint const x_22 = srcValue[0];
|
||||||
srcValue[0] = (x_22 + as_type<uint>(1));
|
srcValue[0] = (x_22 + 1u);
|
||||||
uint4 const x_27 = srcValue;
|
uint4 const x_27 = srcValue;
|
||||||
tint_symbol_2.write(x_27, uint2(int2(0)));
|
tint_symbol_2.write(x_27, uint2(int2(0)));
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 36
|
; Bound: 35
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
%21 = OpConstantNull %int
|
%21 = OpConstantNull %int
|
||||||
%uint_0 = OpConstant %uint 0
|
%uint_0 = OpConstant %uint 0
|
||||||
%_ptr_Function_uint = OpTypePointer Function %uint
|
%_ptr_Function_uint = OpTypePointer Function %uint
|
||||||
%int_1 = OpConstant %int 1
|
%uint_1 = OpConstant %uint 1
|
||||||
%main_1 = OpFunction %void None %8
|
%main_1 = OpFunction %void None %8
|
||||||
%11 = OpLabel
|
%11 = OpLabel
|
||||||
%srcValue = OpVariable %_ptr_Function_v4uint Function %15
|
%srcValue = OpVariable %_ptr_Function_v4uint Function %15
|
||||||
|
@ -45,16 +45,15 @@
|
||||||
%24 = OpAccessChain %_ptr_Function_uint %srcValue %uint_0
|
%24 = OpAccessChain %_ptr_Function_uint %srcValue %uint_0
|
||||||
%25 = OpLoad %uint %24
|
%25 = OpLoad %uint %24
|
||||||
%26 = OpAccessChain %_ptr_Function_uint %srcValue %uint_0
|
%26 = OpAccessChain %_ptr_Function_uint %srcValue %uint_0
|
||||||
%27 = OpBitcast %uint %int_1
|
%28 = OpIAdd %uint %25 %uint_1
|
||||||
%29 = OpIAdd %uint %25 %27
|
OpStore %26 %28
|
||||||
OpStore %26 %29
|
%29 = OpLoad %v4uint %srcValue
|
||||||
%30 = OpLoad %v4uint %srcValue
|
%31 = OpLoad %7 %Dst
|
||||||
%32 = OpLoad %7 %Dst
|
OpImageWrite %31 %20 %29
|
||||||
OpImageWrite %32 %20 %30
|
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
%main = OpFunction %void None %8
|
%main = OpFunction %void None %8
|
||||||
%34 = OpLabel
|
%33 = OpLabel
|
||||||
%35 = OpFunctionCall %void %main_1
|
%34 = OpFunctionCall %void %main_1
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void f() {
|
void f() {
|
||||||
const uint b = asuint(-2147483648);
|
const uint b = 2147483648u;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void f() {
|
void f() {
|
||||||
const uint b = asuint(-2147483648);
|
const uint b = 2147483648u;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
void f() {
|
void f() {
|
||||||
uint b = uint(-2147483648);
|
uint b = 2147483648u;
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
kernel void f() {
|
kernel void f() {
|
||||||
uint const b = as_type<uint>((-2147483647 - 1));
|
uint const b = 2147483648u;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 9
|
; Bound: 7
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
|
@ -11,10 +11,8 @@
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%1 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%uint = OpTypeInt 32 0
|
%uint = OpTypeInt 32 0
|
||||||
%int = OpTypeInt 32 1
|
%uint_2147483648 = OpConstant %uint 2147483648
|
||||||
%int_n2147483648 = OpConstant %int -2147483648
|
|
||||||
%f = OpFunction %void None %1
|
%f = OpFunction %void None %1
|
||||||
%4 = OpLabel
|
%4 = OpLabel
|
||||||
%5 = OpBitcast %uint %int_n2147483648
|
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
|
|
@ -15,6 +15,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%float = OpTypeFloat 32
|
%float = OpTypeFloat 32
|
||||||
%uint_10 = OpConstant %uint 10
|
%uint_10 = OpConstant %uint 10
|
||||||
%uint_20 = OpConstant %uint 20
|
%uint_20 = OpConstant %uint 20
|
||||||
|
%int_1 = OpConstant %int 1
|
||||||
%int_30 = OpConstant %int 30
|
%int_30 = OpConstant %int 30
|
||||||
%int_40 = OpConstant %int 40
|
%int_40 = OpConstant %int 40
|
||||||
%float_50 = OpConstant %float 50
|
%float_50 = OpConstant %float 50
|
||||||
|
@ -33,7 +34,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%24 = OpConstantComposite %v2float %float_60 %float_50
|
%24 = OpConstantComposite %v2float %float_60 %float_50
|
||||||
%100 = OpFunction %void None %3
|
%100 = OpFunction %void None %3
|
||||||
%25 = OpLabel
|
%25 = OpLabel
|
||||||
%1 = OpShiftLeftLogical %int %int_30 %int_40
|
%1 = OpShiftLeftLogical %int %int_30 %int_1
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%float = OpTypeFloat 32
|
%float = OpTypeFloat 32
|
||||||
%uint_10 = OpConstant %uint 10
|
%uint_10 = OpConstant %uint 10
|
||||||
%uint_20 = OpConstant %uint 20
|
%uint_20 = OpConstant %uint 20
|
||||||
|
%int_1 = OpConstant %int 1
|
||||||
%int_30 = OpConstant %int 30
|
%int_30 = OpConstant %int 30
|
||||||
%int_40 = OpConstant %int 40
|
%int_40 = OpConstant %int 40
|
||||||
%float_50 = OpConstant %float 50
|
%float_50 = OpConstant %float 50
|
||||||
|
@ -33,7 +34,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%24 = OpConstantComposite %v2float %float_60 %float_50
|
%24 = OpConstantComposite %v2float %float_60 %float_50
|
||||||
%100 = OpFunction %void None %3
|
%100 = OpFunction %void None %3
|
||||||
%25 = OpLabel
|
%25 = OpLabel
|
||||||
%1 = OpShiftLeftLogical %uint %uint_10 %int_40
|
%1 = OpShiftLeftLogical %uint %uint_10 %int_1
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%float = OpTypeFloat 32
|
%float = OpTypeFloat 32
|
||||||
%uint_10 = OpConstant %uint 10
|
%uint_10 = OpConstant %uint 10
|
||||||
%uint_20 = OpConstant %uint 20
|
%uint_20 = OpConstant %uint 20
|
||||||
|
%int_1 = OpConstant %int 1
|
||||||
%int_30 = OpConstant %int 30
|
%int_30 = OpConstant %int 30
|
||||||
%int_40 = OpConstant %int 40
|
%int_40 = OpConstant %int 40
|
||||||
%float_50 = OpConstant %float 50
|
%float_50 = OpConstant %float 50
|
||||||
|
@ -28,7 +29,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%19 = OpConstantComposite %v2uint %uint_10 %uint_20
|
%19 = OpConstantComposite %v2uint %uint_10 %uint_20
|
||||||
%20 = OpConstantComposite %v2uint %uint_20 %uint_10
|
%20 = OpConstantComposite %v2uint %uint_20 %uint_10
|
||||||
%21 = OpConstantComposite %v2int %int_30 %int_40
|
%21 = OpConstantComposite %v2int %int_30 %int_40
|
||||||
%22 = OpConstantComposite %v2int %int_40 %int_30
|
%22 = OpConstantComposite %v2int %int_1 %int_1
|
||||||
%23 = OpConstantComposite %v2float %float_50 %float_60
|
%23 = OpConstantComposite %v2float %float_50 %float_60
|
||||||
%24 = OpConstantComposite %v2float %float_60 %float_50
|
%24 = OpConstantComposite %v2float %float_60 %float_50
|
||||||
%100 = OpFunction %void None %3
|
%100 = OpFunction %void None %3
|
||||||
|
|
|
@ -15,6 +15,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%float = OpTypeFloat 32
|
%float = OpTypeFloat 32
|
||||||
%uint_10 = OpConstant %uint 10
|
%uint_10 = OpConstant %uint 10
|
||||||
%uint_20 = OpConstant %uint 20
|
%uint_20 = OpConstant %uint 20
|
||||||
|
%int_1 = OpConstant %int 1
|
||||||
%int_30 = OpConstant %int 30
|
%int_30 = OpConstant %int 30
|
||||||
%int_40 = OpConstant %int 40
|
%int_40 = OpConstant %int 40
|
||||||
%float_50 = OpConstant %float 50
|
%float_50 = OpConstant %float 50
|
||||||
|
@ -33,7 +34,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%24 = OpConstantComposite %v2float %float_60 %float_50
|
%24 = OpConstantComposite %v2float %float_60 %float_50
|
||||||
%100 = OpFunction %void None %3
|
%100 = OpFunction %void None %3
|
||||||
%25 = OpLabel
|
%25 = OpLabel
|
||||||
%1 = OpShiftRightArithmetic %int %int_30 %int_40
|
%1 = OpShiftRightArithmetic %int %int_30 %int_1
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%float = OpTypeFloat 32
|
%float = OpTypeFloat 32
|
||||||
%uint_10 = OpConstant %uint 10
|
%uint_10 = OpConstant %uint 10
|
||||||
%uint_20 = OpConstant %uint 20
|
%uint_20 = OpConstant %uint 20
|
||||||
|
%int_1 = OpConstant %int 1
|
||||||
%int_30 = OpConstant %int 30
|
%int_30 = OpConstant %int 30
|
||||||
%int_40 = OpConstant %int 40
|
%int_40 = OpConstant %int 40
|
||||||
%float_50 = OpConstant %float 50
|
%float_50 = OpConstant %float 50
|
||||||
|
@ -27,7 +28,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%v2float = OpTypeVector %float 2
|
%v2float = OpTypeVector %float 2
|
||||||
%19 = OpConstantComposite %v2uint %uint_10 %uint_20
|
%19 = OpConstantComposite %v2uint %uint_10 %uint_20
|
||||||
%20 = OpConstantComposite %v2uint %uint_20 %uint_10
|
%20 = OpConstantComposite %v2uint %uint_20 %uint_10
|
||||||
%21 = OpConstantComposite %v2int %int_30 %int_40
|
%21 = OpConstantComposite %v2int %int_1 %int_1
|
||||||
%22 = OpConstantComposite %v2int %int_40 %int_30
|
%22 = OpConstantComposite %v2int %int_40 %int_30
|
||||||
%23 = OpConstantComposite %v2float %float_50 %float_60
|
%23 = OpConstantComposite %v2float %float_50 %float_60
|
||||||
%24 = OpConstantComposite %v2float %float_60 %float_50
|
%24 = OpConstantComposite %v2float %float_60 %float_50
|
||||||
|
|
|
@ -15,6 +15,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%float = OpTypeFloat 32
|
%float = OpTypeFloat 32
|
||||||
%uint_10 = OpConstant %uint 10
|
%uint_10 = OpConstant %uint 10
|
||||||
%uint_20 = OpConstant %uint 20
|
%uint_20 = OpConstant %uint 20
|
||||||
|
%int_1 = OpConstant %int 1
|
||||||
%int_30 = OpConstant %int 30
|
%int_30 = OpConstant %int 30
|
||||||
%int_40 = OpConstant %int 40
|
%int_40 = OpConstant %int 40
|
||||||
%float_50 = OpConstant %float 50
|
%float_50 = OpConstant %float 50
|
||||||
|
@ -27,7 +28,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%v2float = OpTypeVector %float 2
|
%v2float = OpTypeVector %float 2
|
||||||
%19 = OpConstantComposite %v2uint %uint_10 %uint_20
|
%19 = OpConstantComposite %v2uint %uint_10 %uint_20
|
||||||
%20 = OpConstantComposite %v2uint %uint_20 %uint_10
|
%20 = OpConstantComposite %v2uint %uint_20 %uint_10
|
||||||
%21 = OpConstantComposite %v2int %int_30 %int_40
|
%21 = OpConstantComposite %v2int %int_1 %int_1
|
||||||
%22 = OpConstantComposite %v2int %int_40 %int_30
|
%22 = OpConstantComposite %v2int %int_40 %int_30
|
||||||
%23 = OpConstantComposite %v2float %float_50 %float_60
|
%23 = OpConstantComposite %v2float %float_50 %float_60
|
||||||
%24 = OpConstantComposite %v2float %float_60 %float_50
|
%24 = OpConstantComposite %v2float %float_60 %float_50
|
||||||
|
|
|
@ -15,6 +15,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%float = OpTypeFloat 32
|
%float = OpTypeFloat 32
|
||||||
%uint_10 = OpConstant %uint 10
|
%uint_10 = OpConstant %uint 10
|
||||||
%uint_20 = OpConstant %uint 20
|
%uint_20 = OpConstant %uint 20
|
||||||
|
%int_1 = OpConstant %int 1
|
||||||
%int_30 = OpConstant %int 30
|
%int_30 = OpConstant %int 30
|
||||||
%int_40 = OpConstant %int 40
|
%int_40 = OpConstant %int 40
|
||||||
%float_50 = OpConstant %float 50
|
%float_50 = OpConstant %float 50
|
||||||
|
@ -33,7 +34,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%24 = OpConstantComposite %v2float %float_60 %float_50
|
%24 = OpConstantComposite %v2float %float_60 %float_50
|
||||||
%100 = OpFunction %void None %3
|
%100 = OpFunction %void None %3
|
||||||
%25 = OpLabel
|
%25 = OpLabel
|
||||||
%1 = OpShiftRightLogical %int %int_30 %int_40
|
%1 = OpShiftRightLogical %int %int_30 %int_1
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%float = OpTypeFloat 32
|
%float = OpTypeFloat 32
|
||||||
%uint_10 = OpConstant %uint 10
|
%uint_10 = OpConstant %uint 10
|
||||||
%uint_20 = OpConstant %uint 20
|
%uint_20 = OpConstant %uint 20
|
||||||
|
%int_1 = OpConstant %int 1
|
||||||
%int_30 = OpConstant %int 30
|
%int_30 = OpConstant %int 30
|
||||||
%int_40 = OpConstant %int 40
|
%int_40 = OpConstant %int 40
|
||||||
%float_50 = OpConstant %float 50
|
%float_50 = OpConstant %float 50
|
||||||
|
@ -27,7 +28,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%v2float = OpTypeVector %float 2
|
%v2float = OpTypeVector %float 2
|
||||||
%19 = OpConstantComposite %v2uint %uint_10 %uint_20
|
%19 = OpConstantComposite %v2uint %uint_10 %uint_20
|
||||||
%20 = OpConstantComposite %v2uint %uint_20 %uint_10
|
%20 = OpConstantComposite %v2uint %uint_20 %uint_10
|
||||||
%21 = OpConstantComposite %v2int %int_30 %int_40
|
%21 = OpConstantComposite %v2int %int_1 %int_1
|
||||||
%22 = OpConstantComposite %v2int %int_40 %int_30
|
%22 = OpConstantComposite %v2int %int_40 %int_30
|
||||||
%23 = OpConstantComposite %v2float %float_50 %float_60
|
%23 = OpConstantComposite %v2float %float_50 %float_60
|
||||||
%24 = OpConstantComposite %v2float %float_60 %float_50
|
%24 = OpConstantComposite %v2float %float_60 %float_50
|
||||||
|
|
|
@ -15,6 +15,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%float = OpTypeFloat 32
|
%float = OpTypeFloat 32
|
||||||
%uint_10 = OpConstant %uint 10
|
%uint_10 = OpConstant %uint 10
|
||||||
%uint_20 = OpConstant %uint 20
|
%uint_20 = OpConstant %uint 20
|
||||||
|
%int_1 = OpConstant %int 1
|
||||||
%int_30 = OpConstant %int 30
|
%int_30 = OpConstant %int 30
|
||||||
%int_40 = OpConstant %int 40
|
%int_40 = OpConstant %int 40
|
||||||
%float_50 = OpConstant %float 50
|
%float_50 = OpConstant %float 50
|
||||||
|
@ -27,7 +28,7 @@ OpExecutionMode %100 OriginUpperLeft
|
||||||
%v2float = OpTypeVector %float 2
|
%v2float = OpTypeVector %float 2
|
||||||
%19 = OpConstantComposite %v2uint %uint_10 %uint_20
|
%19 = OpConstantComposite %v2uint %uint_10 %uint_20
|
||||||
%20 = OpConstantComposite %v2uint %uint_20 %uint_10
|
%20 = OpConstantComposite %v2uint %uint_20 %uint_10
|
||||||
%21 = OpConstantComposite %v2int %int_30 %int_40
|
%21 = OpConstantComposite %v2int %int_1 %int_1
|
||||||
%22 = OpConstantComposite %v2int %int_40 %int_30
|
%22 = OpConstantComposite %v2int %int_40 %int_30
|
||||||
%23 = OpConstantComposite %v2float %float_50 %float_60
|
%23 = OpConstantComposite %v2float %float_50 %float_60
|
||||||
%24 = OpConstantComposite %v2float %float_60 %float_50
|
%24 = OpConstantComposite %v2float %float_60 %float_50
|
||||||
|
|
|
@ -1,143 +0,0 @@
|
||||||
OpCapability Shader
|
|
||||||
%1 = OpExtInstImport "GLSL.std.450"
|
|
||||||
OpMemoryModel Logical GLSL450
|
|
||||||
OpEntryPoint Fragment %main "main" %_GLF_color
|
|
||||||
OpExecutionMode %main OriginUpperLeft
|
|
||||||
OpSource ESSL 310
|
|
||||||
OpName %main "main"
|
|
||||||
OpName %nan "nan"
|
|
||||||
OpName %undefined "undefined"
|
|
||||||
OpName %buf1 "buf1"
|
|
||||||
OpMemberName %buf1 0 "_GLF_uniform_int_values"
|
|
||||||
OpName %_ ""
|
|
||||||
OpName %buf0 "buf0"
|
|
||||||
OpMemberName %buf0 0 "_GLF_uniform_float_values"
|
|
||||||
OpName %__0 ""
|
|
||||||
OpName %_GLF_color "_GLF_color"
|
|
||||||
OpDecorate %_arr_int_uint_10 ArrayStride 16
|
|
||||||
OpMemberDecorate %buf1 0 Offset 0
|
|
||||||
OpDecorate %buf1 Block
|
|
||||||
OpDecorate %_ DescriptorSet 0
|
|
||||||
OpDecorate %_ Binding 1
|
|
||||||
OpDecorate %_arr_float_uint_1 ArrayStride 16
|
|
||||||
OpMemberDecorate %buf0 0 Offset 0
|
|
||||||
OpDecorate %buf0 Block
|
|
||||||
OpDecorate %__0 DescriptorSet 0
|
|
||||||
OpDecorate %__0 Binding 0
|
|
||||||
OpDecorate %_GLF_color Location 0
|
|
||||||
%void = OpTypeVoid
|
|
||||||
%13 = OpTypeFunction %void
|
|
||||||
%float = OpTypeFloat 32
|
|
||||||
%_ptr_Function_float = OpTypePointer Function %float
|
|
||||||
%int = OpTypeInt 32 1
|
|
||||||
%int_n1 = OpConstant %int -1
|
|
||||||
%v4float = OpTypeVector %float 4
|
|
||||||
%_ptr_Function_v4float = OpTypePointer Function %v4float
|
|
||||||
%uint = OpTypeInt 32 0
|
|
||||||
%uint_10 = OpConstant %uint 10
|
|
||||||
%_arr_int_uint_10 = OpTypeArray %int %uint_10
|
|
||||||
%buf1 = OpTypeStruct %_arr_int_uint_10
|
|
||||||
%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
|
|
||||||
%_ = OpVariable %_ptr_Uniform_buf1 Uniform
|
|
||||||
%int_0 = OpConstant %int 0
|
|
||||||
%_ptr_Uniform_int = OpTypePointer Uniform %int
|
|
||||||
%int_1 = OpConstant %int 1
|
|
||||||
%int_2 = OpConstant %int 2
|
|
||||||
%int_3 = OpConstant %int 3
|
|
||||||
%int_4 = OpConstant %int 4
|
|
||||||
%int_5 = OpConstant %int 5
|
|
||||||
%int_6 = OpConstant %int 6
|
|
||||||
%int_7 = OpConstant %int 7
|
|
||||||
%bool = OpTypeBool
|
|
||||||
%int_9 = OpConstant %int 9
|
|
||||||
%uint_0 = OpConstant %uint 0
|
|
||||||
%uint_1 = OpConstant %uint 1
|
|
||||||
%_arr_float_uint_1 = OpTypeArray %float %uint_1
|
|
||||||
%buf0 = OpTypeStruct %_arr_float_uint_1
|
|
||||||
%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
|
|
||||||
%__0 = OpVariable %_ptr_Uniform_buf0 Uniform
|
|
||||||
%_ptr_Uniform_float = OpTypePointer Uniform %float
|
|
||||||
%_ptr_Output_v4float = OpTypePointer Output %v4float
|
|
||||||
%_GLF_color = OpVariable %_ptr_Output_v4float Output
|
|
||||||
%int_8 = OpConstant %int 8
|
|
||||||
%main = OpFunction %void None %13
|
|
||||||
%40 = OpLabel
|
|
||||||
%nan = OpVariable %_ptr_Function_float Function
|
|
||||||
%undefined = OpVariable %_ptr_Function_v4float Function
|
|
||||||
%41 = OpBitcast %float %int_n1
|
|
||||||
OpStore %nan %41
|
|
||||||
%42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
|
|
||||||
%43 = OpLoad %int %42
|
|
||||||
%44 = OpConvertSToF %float %43
|
|
||||||
%45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
|
|
||||||
%46 = OpLoad %int %45
|
|
||||||
%47 = OpConvertSToF %float %46
|
|
||||||
%48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
|
|
||||||
%49 = OpLoad %int %48
|
|
||||||
%50 = OpConvertSToF %float %49
|
|
||||||
%51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
|
|
||||||
%52 = OpLoad %int %51
|
|
||||||
%53 = OpConvertSToF %float %52
|
|
||||||
%54 = OpCompositeConstruct %v4float %44 %47 %50 %53
|
|
||||||
%55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
|
|
||||||
%56 = OpLoad %int %55
|
|
||||||
%57 = OpConvertSToF %float %56
|
|
||||||
%58 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
|
|
||||||
%59 = OpLoad %int %58
|
|
||||||
%60 = OpConvertSToF %float %59
|
|
||||||
%61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
|
|
||||||
%62 = OpLoad %int %61
|
|
||||||
%63 = OpConvertSToF %float %62
|
|
||||||
%64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_7
|
|
||||||
%65 = OpLoad %int %64
|
|
||||||
%66 = OpConvertSToF %float %65
|
|
||||||
%67 = OpCompositeConstruct %v4float %57 %60 %63 %66
|
|
||||||
%68 = OpLoad %float %nan
|
|
||||||
%69 = OpCompositeConstruct %v4float %68 %68 %68 %68
|
|
||||||
%70 = OpExtInst %v4float %1 FMix %54 %67 %69
|
|
||||||
OpStore %undefined %70
|
|
||||||
%71 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
|
|
||||||
%72 = OpLoad %int %71
|
|
||||||
%73 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_9
|
|
||||||
%74 = OpLoad %int %73
|
|
||||||
%75 = OpIEqual %bool %72 %74
|
|
||||||
%76 = OpLogicalNot %bool %75
|
|
||||||
OpSelectionMerge %77 None
|
|
||||||
OpBranchConditional %76 %78 %77
|
|
||||||
%78 = OpLabel
|
|
||||||
%79 = OpAccessChain %_ptr_Function_float %undefined %uint_0
|
|
||||||
%80 = OpLoad %float %79
|
|
||||||
%81 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
|
|
||||||
%82 = OpLoad %float %81
|
|
||||||
%83 = OpFOrdGreaterThan %bool %80 %82
|
|
||||||
OpBranch %77
|
|
||||||
%77 = OpLabel
|
|
||||||
%84 = OpPhi %bool %75 %40 %83 %78
|
|
||||||
OpSelectionMerge %85 None
|
|
||||||
OpBranchConditional %84 %86 %87
|
|
||||||
%86 = OpLabel
|
|
||||||
%88 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
|
|
||||||
%89 = OpLoad %int %88
|
|
||||||
%90 = OpConvertSToF %float %89
|
|
||||||
%91 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
|
|
||||||
%92 = OpLoad %int %91
|
|
||||||
%93 = OpConvertSToF %float %92
|
|
||||||
%94 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
|
|
||||||
%95 = OpLoad %int %94
|
|
||||||
%96 = OpConvertSToF %float %95
|
|
||||||
%97 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
|
|
||||||
%98 = OpLoad %int %97
|
|
||||||
%99 = OpConvertSToF %float %98
|
|
||||||
%100 = OpCompositeConstruct %v4float %90 %93 %96 %99
|
|
||||||
OpStore %_GLF_color %100
|
|
||||||
OpBranch %85
|
|
||||||
%87 = OpLabel
|
|
||||||
%101 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
|
|
||||||
%102 = OpLoad %int %101
|
|
||||||
%103 = OpConvertSToF %float %102
|
|
||||||
%104 = OpCompositeConstruct %v4float %103 %103 %103 %103
|
|
||||||
OpStore %_GLF_color %104
|
|
||||||
OpBranch %85
|
|
||||||
%85 = OpLabel
|
|
||||||
OpReturn
|
|
||||||
OpFunctionEnd
|
|
|
@ -1,79 +0,0 @@
|
||||||
struct strided_arr {
|
|
||||||
@size(16)
|
|
||||||
el : i32,
|
|
||||||
}
|
|
||||||
|
|
||||||
type Arr = array<strided_arr, 10u>;
|
|
||||||
|
|
||||||
struct buf1 {
|
|
||||||
x_GLF_uniform_int_values : Arr,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct strided_arr_1 {
|
|
||||||
@size(16)
|
|
||||||
el : f32,
|
|
||||||
}
|
|
||||||
|
|
||||||
type Arr_1 = array<strided_arr_1, 1u>;
|
|
||||||
|
|
||||||
struct buf0 {
|
|
||||||
x_GLF_uniform_float_values : Arr_1,
|
|
||||||
}
|
|
||||||
|
|
||||||
@group(0) @binding(1) var<uniform> x_7 : buf1;
|
|
||||||
|
|
||||||
@group(0) @binding(0) var<uniform> x_9 : buf0;
|
|
||||||
|
|
||||||
var<private> x_GLF_color : vec4<f32>;
|
|
||||||
|
|
||||||
fn main_1() {
|
|
||||||
var nan : f32;
|
|
||||||
var undefined : vec4<f32>;
|
|
||||||
var x_83 : bool;
|
|
||||||
var x_84_phi : bool;
|
|
||||||
nan = bitcast<f32>(-1);
|
|
||||||
let x_43 : i32 = x_7.x_GLF_uniform_int_values[0].el;
|
|
||||||
let x_46 : i32 = x_7.x_GLF_uniform_int_values[1].el;
|
|
||||||
let x_49 : i32 = x_7.x_GLF_uniform_int_values[2].el;
|
|
||||||
let x_52 : i32 = x_7.x_GLF_uniform_int_values[3].el;
|
|
||||||
let x_56 : i32 = x_7.x_GLF_uniform_int_values[4].el;
|
|
||||||
let x_59 : i32 = x_7.x_GLF_uniform_int_values[5].el;
|
|
||||||
let x_62 : i32 = x_7.x_GLF_uniform_int_values[6].el;
|
|
||||||
let x_65 : i32 = x_7.x_GLF_uniform_int_values[7].el;
|
|
||||||
let x_68 : f32 = nan;
|
|
||||||
undefined = mix(vec4<f32>(f32(x_43), f32(x_46), f32(x_49), f32(x_52)), vec4<f32>(f32(x_56), f32(x_59), f32(x_62), f32(x_65)), vec4<f32>(x_68, x_68, x_68, x_68));
|
|
||||||
let x_72 : i32 = x_7.x_GLF_uniform_int_values[0].el;
|
|
||||||
let x_74 : i32 = x_7.x_GLF_uniform_int_values[9].el;
|
|
||||||
let x_75 : bool = (x_72 == x_74);
|
|
||||||
x_84_phi = x_75;
|
|
||||||
if (!(x_75)) {
|
|
||||||
let x_80 : f32 = undefined.x;
|
|
||||||
let x_82 : f32 = x_9.x_GLF_uniform_float_values[0].el;
|
|
||||||
x_83 = (x_80 > x_82);
|
|
||||||
x_84_phi = x_83;
|
|
||||||
}
|
|
||||||
let x_84 : bool = x_84_phi;
|
|
||||||
if (x_84) {
|
|
||||||
let x_89 : i32 = x_7.x_GLF_uniform_int_values[0].el;
|
|
||||||
let x_92 : i32 = x_7.x_GLF_uniform_int_values[8].el;
|
|
||||||
let x_95 : i32 = x_7.x_GLF_uniform_int_values[8].el;
|
|
||||||
let x_98 : i32 = x_7.x_GLF_uniform_int_values[0].el;
|
|
||||||
x_GLF_color = vec4<f32>(f32(x_89), f32(x_92), f32(x_95), f32(x_98));
|
|
||||||
} else {
|
|
||||||
let x_102 : i32 = x_7.x_GLF_uniform_int_values[8].el;
|
|
||||||
let x_103 : f32 = f32(x_102);
|
|
||||||
x_GLF_color = vec4<f32>(x_103, x_103, x_103, x_103);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct main_out {
|
|
||||||
@location(0)
|
|
||||||
x_GLF_color_1 : vec4<f32>,
|
|
||||||
}
|
|
||||||
|
|
||||||
@fragment
|
|
||||||
fn main() -> main_out {
|
|
||||||
main_1();
|
|
||||||
return main_out(x_GLF_color);
|
|
||||||
}
|
|
|
@ -1,95 +0,0 @@
|
||||||
OpCapability Shader
|
|
||||||
%1 = OpExtInstImport "GLSL.std.450"
|
|
||||||
OpMemoryModel Logical GLSL450
|
|
||||||
OpEntryPoint Fragment %main "main" %_GLF_color
|
|
||||||
OpExecutionMode %main OriginUpperLeft
|
|
||||||
OpSource ESSL 320
|
|
||||||
OpName %main "main"
|
|
||||||
OpName %a "a"
|
|
||||||
OpName %i "i"
|
|
||||||
OpName %buf0 "buf0"
|
|
||||||
OpMemberName %buf0 0 "one"
|
|
||||||
OpName %_ ""
|
|
||||||
OpName %_GLF_color "_GLF_color"
|
|
||||||
OpMemberDecorate %buf0 0 Offset 0
|
|
||||||
OpDecorate %buf0 Block
|
|
||||||
OpDecorate %_ DescriptorSet 0
|
|
||||||
OpDecorate %_ Binding 0
|
|
||||||
OpDecorate %_GLF_color Location 0
|
|
||||||
%void = OpTypeVoid
|
|
||||||
%9 = OpTypeFunction %void
|
|
||||||
%int = OpTypeInt 32 1
|
|
||||||
%_ptr_Function_int = OpTypePointer Function %int
|
|
||||||
%int_0 = OpConstant %int 0
|
|
||||||
%int_5 = OpConstant %int 5
|
|
||||||
%bool = OpTypeBool
|
|
||||||
%buf0 = OpTypeStruct %int
|
|
||||||
%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
|
|
||||||
%_ = OpVariable %_ptr_Uniform_buf0 Uniform
|
|
||||||
%_ptr_Uniform_int = OpTypePointer Uniform %int
|
|
||||||
%int_n4194304 = OpConstant %int -4194304
|
|
||||||
%float = OpTypeFloat 32
|
|
||||||
%float_0 = OpConstant %float 0
|
|
||||||
%int_n1 = OpConstant %int -1
|
|
||||||
%int_1 = OpConstant %int 1
|
|
||||||
%v4float = OpTypeVector %float 4
|
|
||||||
%_ptr_Output_v4float = OpTypePointer Output %v4float
|
|
||||||
%_GLF_color = OpVariable %_ptr_Output_v4float Output
|
|
||||||
%float_1 = OpConstant %float 1
|
|
||||||
%25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
|
|
||||||
%26 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
|
|
||||||
%main = OpFunction %void None %9
|
|
||||||
%27 = OpLabel
|
|
||||||
%a = OpVariable %_ptr_Function_int Function
|
|
||||||
%i = OpVariable %_ptr_Function_int Function
|
|
||||||
OpStore %a %int_0
|
|
||||||
OpStore %i %int_0
|
|
||||||
OpBranch %28
|
|
||||||
%28 = OpLabel
|
|
||||||
OpLoopMerge %29 %30 None
|
|
||||||
OpBranch %31
|
|
||||||
%31 = OpLabel
|
|
||||||
%32 = OpLoad %int %i
|
|
||||||
%33 = OpSLessThan %bool %32 %int_5
|
|
||||||
OpBranchConditional %33 %34 %29
|
|
||||||
%34 = OpLabel
|
|
||||||
%35 = OpAccessChain %_ptr_Uniform_int %_ %int_0
|
|
||||||
%36 = OpLoad %int %35
|
|
||||||
%37 = OpIEqual %bool %36 %int_0
|
|
||||||
OpSelectionMerge %38 None
|
|
||||||
OpBranchConditional %37 %39 %38
|
|
||||||
%39 = OpLabel
|
|
||||||
%40 = OpBitcast %float %int_n4194304
|
|
||||||
%41 = OpExtInst %float %1 Floor %40
|
|
||||||
%42 = OpFOrdGreaterThan %bool %41 %float_0
|
|
||||||
OpSelectionMerge %43 None
|
|
||||||
OpBranchConditional %42 %44 %43
|
|
||||||
%44 = OpLabel
|
|
||||||
OpStore %a %int_n1
|
|
||||||
OpBranch %29
|
|
||||||
%43 = OpLabel
|
|
||||||
OpBranch %38
|
|
||||||
%38 = OpLabel
|
|
||||||
%45 = OpLoad %int %a
|
|
||||||
%46 = OpIAdd %int %45 %int_1
|
|
||||||
OpStore %a %46
|
|
||||||
OpBranch %30
|
|
||||||
%30 = OpLabel
|
|
||||||
%47 = OpLoad %int %i
|
|
||||||
%48 = OpIAdd %int %47 %int_1
|
|
||||||
OpStore %i %48
|
|
||||||
OpBranch %28
|
|
||||||
%29 = OpLabel
|
|
||||||
%49 = OpLoad %int %a
|
|
||||||
%50 = OpIEqual %bool %49 %int_5
|
|
||||||
OpSelectionMerge %51 None
|
|
||||||
OpBranchConditional %50 %52 %53
|
|
||||||
%52 = OpLabel
|
|
||||||
OpStore %_GLF_color %25
|
|
||||||
OpBranch %51
|
|
||||||
%53 = OpLabel
|
|
||||||
OpStore %_GLF_color %26
|
|
||||||
OpBranch %51
|
|
||||||
%51 = OpLabel
|
|
||||||
OpReturn
|
|
||||||
OpFunctionEnd
|
|
|
@ -1,53 +0,0 @@
|
||||||
struct buf0 {
|
|
||||||
one : i32,
|
|
||||||
}
|
|
||||||
|
|
||||||
@group(0) @binding(0) var<uniform> x_7 : buf0;
|
|
||||||
|
|
||||||
var<private> x_GLF_color : vec4<f32>;
|
|
||||||
|
|
||||||
fn main_1() {
|
|
||||||
var a : i32;
|
|
||||||
var i : i32;
|
|
||||||
a = 0;
|
|
||||||
i = 0;
|
|
||||||
loop {
|
|
||||||
let x_32 : i32 = i;
|
|
||||||
if ((x_32 < 5)) {
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
let x_36 : i32 = x_7.one;
|
|
||||||
if ((x_36 == 0)) {
|
|
||||||
if ((floor(bitcast<f32>(-4194304)) > 0.0)) {
|
|
||||||
a = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let x_45 : i32 = a;
|
|
||||||
a = (x_45 + 1);
|
|
||||||
|
|
||||||
continuing {
|
|
||||||
let x_47 : i32 = i;
|
|
||||||
i = (x_47 + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let x_49 : i32 = a;
|
|
||||||
if ((x_49 == 5)) {
|
|
||||||
x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
|
|
||||||
} else {
|
|
||||||
x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct main_out {
|
|
||||||
@location(0)
|
|
||||||
x_GLF_color_1 : vec4<f32>,
|
|
||||||
}
|
|
||||||
|
|
||||||
@fragment
|
|
||||||
fn main() -> main_out {
|
|
||||||
main_1();
|
|
||||||
return main_out(x_GLF_color);
|
|
||||||
}
|
|
|
@ -1,95 +0,0 @@
|
||||||
OpCapability Shader
|
|
||||||
%1 = OpExtInstImport "GLSL.std.450"
|
|
||||||
OpMemoryModel Logical GLSL450
|
|
||||||
OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
|
|
||||||
OpExecutionMode %main OriginUpperLeft
|
|
||||||
OpSource ESSL 320
|
|
||||||
OpName %main "main"
|
|
||||||
OpName %f "f"
|
|
||||||
OpName %gl_FragCoord "gl_FragCoord"
|
|
||||||
OpName %buf0 "buf0"
|
|
||||||
OpMemberName %buf0 0 "_GLF_uniform_float_values"
|
|
||||||
OpName %_ ""
|
|
||||||
OpName %_GLF_color "_GLF_color"
|
|
||||||
OpName %buf1 "buf1"
|
|
||||||
OpMemberName %buf1 0 "_GLF_uniform_int_values"
|
|
||||||
OpName %__0 ""
|
|
||||||
OpDecorate %gl_FragCoord BuiltIn FragCoord
|
|
||||||
OpDecorate %_arr_float_uint_1 ArrayStride 16
|
|
||||||
OpMemberDecorate %buf0 0 Offset 0
|
|
||||||
OpDecorate %buf0 Block
|
|
||||||
OpDecorate %_ DescriptorSet 0
|
|
||||||
OpDecorate %_ Binding 0
|
|
||||||
OpDecorate %_GLF_color Location 0
|
|
||||||
OpDecorate %_arr_int_uint_2 ArrayStride 16
|
|
||||||
OpMemberDecorate %buf1 0 Offset 0
|
|
||||||
OpDecorate %buf1 Block
|
|
||||||
OpDecorate %__0 DescriptorSet 0
|
|
||||||
OpDecorate %__0 Binding 1
|
|
||||||
%void = OpTypeVoid
|
|
||||||
%13 = OpTypeFunction %void
|
|
||||||
%float = OpTypeFloat 32
|
|
||||||
%_ptr_Function_float = OpTypePointer Function %float
|
|
||||||
%int = OpTypeInt 32 1
|
|
||||||
%int_n1 = OpConstant %int -1
|
|
||||||
%float_1 = OpConstant %float 1
|
|
||||||
%v4float = OpTypeVector %float 4
|
|
||||||
%_ptr_Input_v4float = OpTypePointer Input %v4float
|
|
||||||
%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
|
|
||||||
%uint = OpTypeInt 32 0
|
|
||||||
%uint_0 = OpConstant %uint 0
|
|
||||||
%_ptr_Input_float = OpTypePointer Input %float
|
|
||||||
%uint_1 = OpConstant %uint 1
|
|
||||||
%_arr_float_uint_1 = OpTypeArray %float %uint_1
|
|
||||||
%buf0 = OpTypeStruct %_arr_float_uint_1
|
|
||||||
%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
|
|
||||||
%_ = OpVariable %_ptr_Uniform_buf0 Uniform
|
|
||||||
%int_0 = OpConstant %int 0
|
|
||||||
%_ptr_Uniform_float = OpTypePointer Uniform %float
|
|
||||||
%bool = OpTypeBool
|
|
||||||
%_ptr_Output_v4float = OpTypePointer Output %v4float
|
|
||||||
%_GLF_color = OpVariable %_ptr_Output_v4float Output
|
|
||||||
%uint_2 = OpConstant %uint 2
|
|
||||||
%_arr_int_uint_2 = OpTypeArray %int %uint_2
|
|
||||||
%buf1 = OpTypeStruct %_arr_int_uint_2
|
|
||||||
%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
|
|
||||||
%__0 = OpVariable %_ptr_Uniform_buf1 Uniform
|
|
||||||
%int_1 = OpConstant %int 1
|
|
||||||
%_ptr_Uniform_int = OpTypePointer Uniform %int
|
|
||||||
%main = OpFunction %void None %13
|
|
||||||
%34 = OpLabel
|
|
||||||
%f = OpVariable %_ptr_Function_float Function
|
|
||||||
%35 = OpBitcast %float %int_n1
|
|
||||||
%36 = OpExtInst %float %1 FMin %35 %float_1
|
|
||||||
OpStore %f %36
|
|
||||||
%37 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
|
|
||||||
%38 = OpLoad %float %37
|
|
||||||
%39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
|
|
||||||
%40 = OpLoad %float %39
|
|
||||||
%41 = OpFOrdGreaterThan %bool %38 %40
|
|
||||||
OpSelectionMerge %42 None
|
|
||||||
OpBranchConditional %41 %43 %44
|
|
||||||
%43 = OpLabel
|
|
||||||
%45 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
|
|
||||||
%46 = OpLoad %int %45
|
|
||||||
%47 = OpConvertSToF %float %46
|
|
||||||
%48 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
|
|
||||||
%49 = OpLoad %int %48
|
|
||||||
%50 = OpConvertSToF %float %49
|
|
||||||
%51 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
|
|
||||||
%52 = OpLoad %int %51
|
|
||||||
%53 = OpConvertSToF %float %52
|
|
||||||
%54 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
|
|
||||||
%55 = OpLoad %int %54
|
|
||||||
%56 = OpConvertSToF %float %55
|
|
||||||
%57 = OpCompositeConstruct %v4float %47 %50 %53 %56
|
|
||||||
OpStore %_GLF_color %57
|
|
||||||
OpBranch %42
|
|
||||||
%44 = OpLabel
|
|
||||||
%58 = OpLoad %float %f
|
|
||||||
%59 = OpCompositeConstruct %v4float %58 %58 %58 %58
|
|
||||||
OpStore %_GLF_color %59
|
|
||||||
OpBranch %42
|
|
||||||
%42 = OpLabel
|
|
||||||
OpReturn
|
|
||||||
OpFunctionEnd
|
|
|
@ -1,59 +0,0 @@
|
||||||
struct strided_arr {
|
|
||||||
@size(16)
|
|
||||||
el : f32,
|
|
||||||
}
|
|
||||||
|
|
||||||
type Arr = array<strided_arr, 1u>;
|
|
||||||
|
|
||||||
struct buf0 {
|
|
||||||
x_GLF_uniform_float_values : Arr,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct strided_arr_1 {
|
|
||||||
@size(16)
|
|
||||||
el : i32,
|
|
||||||
}
|
|
||||||
|
|
||||||
type Arr_1 = array<strided_arr_1, 2u>;
|
|
||||||
|
|
||||||
struct buf1 {
|
|
||||||
x_GLF_uniform_int_values : Arr_1,
|
|
||||||
}
|
|
||||||
|
|
||||||
var<private> gl_FragCoord : vec4<f32>;
|
|
||||||
|
|
||||||
@group(0) @binding(0) var<uniform> x_7 : buf0;
|
|
||||||
|
|
||||||
var<private> x_GLF_color : vec4<f32>;
|
|
||||||
|
|
||||||
@group(0) @binding(1) var<uniform> x_9 : buf1;
|
|
||||||
|
|
||||||
fn main_1() {
|
|
||||||
var f : f32;
|
|
||||||
f = min(bitcast<f32>(-1), 1.0);
|
|
||||||
let x_38 : f32 = gl_FragCoord.x;
|
|
||||||
let x_40 : f32 = x_7.x_GLF_uniform_float_values[0].el;
|
|
||||||
if ((x_38 > x_40)) {
|
|
||||||
let x_46 : i32 = x_9.x_GLF_uniform_int_values[1].el;
|
|
||||||
let x_49 : i32 = x_9.x_GLF_uniform_int_values[0].el;
|
|
||||||
let x_52 : i32 = x_9.x_GLF_uniform_int_values[0].el;
|
|
||||||
let x_55 : i32 = x_9.x_GLF_uniform_int_values[1].el;
|
|
||||||
x_GLF_color = vec4<f32>(f32(x_46), f32(x_49), f32(x_52), f32(x_55));
|
|
||||||
} else {
|
|
||||||
let x_58 : f32 = f;
|
|
||||||
x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct main_out {
|
|
||||||
@location(0)
|
|
||||||
x_GLF_color_1 : vec4<f32>,
|
|
||||||
}
|
|
||||||
|
|
||||||
@fragment
|
|
||||||
fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
|
|
||||||
gl_FragCoord = gl_FragCoord_param;
|
|
||||||
main_1();
|
|
||||||
return main_out(x_GLF_color);
|
|
||||||
}
|
|
Loading…
Reference in New Issue