tint: Flip evaluation order of assignment statements
Evaluate the LHS before the RHS. Fixed: tint:1867 Change-Id: Ib63903ed4b1425007197a6da37f3bf54a495d88a Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/123120 Commit-Queue: Ben Clayton <bclayton@chromium.org> Commit-Queue: Ben Clayton <bclayton@google.com> Reviewed-by: James Price <jrprice@google.com> Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
parent
43c5efa7e8
commit
da353b4b39
|
@ -45,6 +45,10 @@
|
||||||
// Set to `1` to dump the uniformity graph for each function in graphviz format.
|
// Set to `1` to dump the uniformity graph for each function in graphviz format.
|
||||||
#define TINT_DUMP_UNIFORMITY_GRAPH 0
|
#define TINT_DUMP_UNIFORMITY_GRAPH 0
|
||||||
|
|
||||||
|
#if TINT_DUMP_UNIFORMITY_GRAPH
|
||||||
|
#include <iostream>
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace tint::resolver {
|
namespace tint::resolver {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -123,7 +127,7 @@ struct Node {
|
||||||
const ast::Node* ast = nullptr;
|
const ast::Node* ast = nullptr;
|
||||||
|
|
||||||
/// The function call argument index, if applicable.
|
/// The function call argument index, if applicable.
|
||||||
uint32_t arg_index;
|
uint32_t arg_index = 0xffffffffu;
|
||||||
|
|
||||||
/// The set of edges from this node to other nodes in the graph.
|
/// The set of edges from this node to other nodes in the graph.
|
||||||
utils::UniqueVector<Node*, 4> edges;
|
utils::UniqueVector<Node*, 4> edges;
|
||||||
|
@ -547,14 +551,15 @@ class UniformityGraph {
|
||||||
stmt,
|
stmt,
|
||||||
|
|
||||||
[&](const ast::AssignmentStatement* a) {
|
[&](const ast::AssignmentStatement* a) {
|
||||||
auto [cf1, v1] = ProcessExpression(cf, a->rhs);
|
|
||||||
if (a->lhs->Is<ast::PhonyExpression>()) {
|
if (a->lhs->Is<ast::PhonyExpression>()) {
|
||||||
return cf1;
|
auto [cf_r, _] = ProcessExpression(cf, a->rhs);
|
||||||
} else {
|
return cf_r;
|
||||||
auto [cf2, l2] = ProcessLValueExpression(cf1, a->lhs);
|
|
||||||
l2->AddEdge(v1);
|
|
||||||
return cf2;
|
|
||||||
}
|
}
|
||||||
|
auto [cf_l, v_l, apply] = ProcessLValueExpression(cf, a->lhs);
|
||||||
|
auto [cf_r, v_r] = ProcessExpression(cf_l, a->rhs);
|
||||||
|
v_l->AddEdge(v_r);
|
||||||
|
apply();
|
||||||
|
return cf_r;
|
||||||
},
|
},
|
||||||
|
|
||||||
[&](const ast::BlockStatement* b) {
|
[&](const ast::BlockStatement* b) {
|
||||||
|
@ -696,17 +701,20 @@ class UniformityGraph {
|
||||||
},
|
},
|
||||||
|
|
||||||
[&](const ast::CompoundAssignmentStatement* c) {
|
[&](const ast::CompoundAssignmentStatement* c) {
|
||||||
// The compound assignment statement `a += b` is equivalent to `a = a + b`.
|
// The compound assignment statement `a += b` is equivalent to:
|
||||||
// Note: we set load_rule=true when evaluating the LHS the first time, as the
|
// let p = &a;
|
||||||
// resolver does not add a load node for it.
|
// *p = *p + b;
|
||||||
auto [cf1, v1] = ProcessExpression(cf, c->lhs, /* load_rule */ true);
|
// Note: we set load_rule=true when evaluating the LHS, as the resolver does not add
|
||||||
auto [cf2, v2] = ProcessExpression(cf1, c->rhs);
|
// a load node for it.
|
||||||
|
auto [cf1, l1, apply] = ProcessLValueExpression(cf, c->lhs);
|
||||||
|
auto [cf2, v2] = ProcessExpression(cf1, c->lhs, /* load_rule */ true);
|
||||||
|
auto [cf3, v3] = ProcessExpression(cf2, c->rhs);
|
||||||
auto* result = CreateNode({"binary_expr_result"});
|
auto* result = CreateNode({"binary_expr_result"});
|
||||||
result->AddEdge(v1);
|
|
||||||
result->AddEdge(v2);
|
result->AddEdge(v2);
|
||||||
|
result->AddEdge(v3);
|
||||||
|
|
||||||
auto [cf3, l3] = ProcessLValueExpression(cf2, c->lhs);
|
l1->AddEdge(result);
|
||||||
l3->AddEdge(result);
|
apply();
|
||||||
return cf3;
|
return cf3;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -965,8 +973,9 @@ class UniformityGraph {
|
||||||
result->AddEdge(v1);
|
result->AddEdge(v1);
|
||||||
result->AddEdge(cf1);
|
result->AddEdge(cf1);
|
||||||
|
|
||||||
auto [cf2, l2] = ProcessLValueExpression(cf1, i->lhs);
|
auto [cf2, l2, apply] = ProcessLValueExpression(cf1, i->lhs);
|
||||||
l2->AddEdge(result);
|
l2->AddEdge(result);
|
||||||
|
apply();
|
||||||
return cf2;
|
return cf2;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1365,48 +1374,62 @@ class UniformityGraph {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// LValue holds the Nodes returned by ProcessLValueExpression()
|
||||||
|
struct LValue {
|
||||||
|
/// The control-flow node for an LValue expression
|
||||||
|
Node* cf = nullptr;
|
||||||
|
|
||||||
|
/// The new value node for an LValue expression
|
||||||
|
Node* new_val = nullptr;
|
||||||
|
|
||||||
|
/// Updates the value node of the LValue expression to be #new_val.
|
||||||
|
std::function<void()> apply;
|
||||||
|
};
|
||||||
|
|
||||||
/// Process an LValue expression.
|
/// Process an LValue expression.
|
||||||
/// @param cf the input control flow node
|
/// @param cf the input control flow node
|
||||||
/// @param expr the expression to process
|
/// @param expr the expression to process
|
||||||
/// @returns a pair of (control flow node, variable node)
|
/// @returns a pair of (control flow node, variable node)
|
||||||
std::pair<Node*, Node*> ProcessLValueExpression(Node* cf,
|
LValue ProcessLValueExpression(Node* cf,
|
||||||
const ast::Expression* expr,
|
const ast::Expression* expr,
|
||||||
bool is_partial_reference = false) {
|
bool is_partial_reference = false) {
|
||||||
return Switch(
|
return Switch(
|
||||||
expr,
|
expr,
|
||||||
|
|
||||||
[&](const ast::IdentifierExpression* i) {
|
[&](const ast::IdentifierExpression* i) {
|
||||||
auto* sem = sem_.GetVal(i)->UnwrapLoad()->As<sem::VariableUser>();
|
auto* sem = sem_.GetVal(i)->UnwrapLoad()->As<sem::VariableUser>();
|
||||||
if (sem->Variable()->Is<sem::GlobalVariable>()) {
|
if (sem->Variable()->Is<sem::GlobalVariable>()) {
|
||||||
return std::make_pair(cf, current_function_->may_be_non_uniform);
|
return LValue{cf, current_function_->may_be_non_uniform, [] {}};
|
||||||
} else if (auto* local = sem->Variable()->As<sem::LocalVariable>()) {
|
} else if (auto* local = sem->Variable()->As<sem::LocalVariable>()) {
|
||||||
// Create a new value node for this variable.
|
// Create a new value node for this variable.
|
||||||
auto* value = CreateNode({NameFor(i), "_lvalue"});
|
auto* value = CreateNode({NameFor(i), "_lvalue"});
|
||||||
auto* old_value = current_function_->variables.Set(local, value);
|
|
||||||
|
auto apply = [=] { current_function_->variables.Set(local, value); };
|
||||||
|
|
||||||
// If i is part of an expression that is a partial reference to a variable (e.g.
|
// If i is part of an expression that is a partial reference to a variable (e.g.
|
||||||
// index or member access), we link back to the variable's previous value. If
|
// index or member access), we link back to the variable's previous value. If
|
||||||
// the previous value was non-uniform, a partial assignment will not make it
|
// the previous value was non-uniform, a partial assignment will not make it
|
||||||
// uniform.
|
// uniform.
|
||||||
|
auto* old_value = current_function_->variables.Get(local);
|
||||||
if (is_partial_reference && old_value) {
|
if (is_partial_reference && old_value) {
|
||||||
value->AddEdge(old_value);
|
value->AddEdge(old_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::make_pair(cf, value);
|
return LValue{cf, value, apply};
|
||||||
} else {
|
} else {
|
||||||
TINT_ICE(Resolver, diagnostics_)
|
TINT_ICE(Resolver, diagnostics_)
|
||||||
<< "unknown lvalue identifier expression type: "
|
<< "unknown lvalue identifier expression type: "
|
||||||
<< std::string(sem->Variable()->TypeInfo().name);
|
<< std::string(sem->Variable()->TypeInfo().name);
|
||||||
return std::pair<Node*, Node*>(nullptr, nullptr);
|
return LValue{};
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
[&](const ast::IndexAccessorExpression* i) {
|
[&](const ast::IndexAccessorExpression* i) {
|
||||||
auto [cf1, l1] =
|
auto [cf1, l1, apply] =
|
||||||
ProcessLValueExpression(cf, i->object, /*is_partial_reference*/ true);
|
ProcessLValueExpression(cf, i->object, /*is_partial_reference*/ true);
|
||||||
auto [cf2, v2] = ProcessExpression(cf1, i->index);
|
auto [cf2, v2] = ProcessExpression(cf1, i->index);
|
||||||
l1->AddEdge(v2);
|
l1->AddEdge(v2);
|
||||||
return std::pair<Node*, Node*>(cf2, l1);
|
return LValue{cf2, l1, apply};
|
||||||
},
|
},
|
||||||
|
|
||||||
[&](const ast::MemberAccessorExpression* m) {
|
[&](const ast::MemberAccessorExpression* m) {
|
||||||
|
@ -1419,17 +1442,18 @@ class UniformityGraph {
|
||||||
// that is being written to.
|
// that is being written to.
|
||||||
auto* root_ident = sem_.Get(u)->RootIdentifier();
|
auto* root_ident = sem_.Get(u)->RootIdentifier();
|
||||||
auto* deref = CreateNode({NameFor(root_ident), "_deref"});
|
auto* deref = CreateNode({NameFor(root_ident), "_deref"});
|
||||||
auto* old_value = current_function_->variables.Set(root_ident, deref);
|
|
||||||
|
|
||||||
if (old_value) {
|
auto apply = [=] { current_function_->variables.Set(root_ident, deref); };
|
||||||
// If derefercing a partial reference or partial pointer, we link back to
|
|
||||||
|
if (auto* old_value = current_function_->variables.Get(root_ident)) {
|
||||||
|
// If dereferencing a partial reference or partial pointer, we link back to
|
||||||
// the variable's previous value. If the previous value was non-uniform, a
|
// the variable's previous value. If the previous value was non-uniform, a
|
||||||
// partial assignment will not make it uniform.
|
// partial assignment will not make it uniform.
|
||||||
if (is_partial_reference || IsDerefOfPartialPointer(u)) {
|
if (is_partial_reference || IsDerefOfPartialPointer(u)) {
|
||||||
deref->AddEdge(old_value);
|
deref->AddEdge(old_value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return std::pair<Node*, Node*>(cf, deref);
|
return LValue{cf, deref, apply};
|
||||||
}
|
}
|
||||||
return ProcessLValueExpression(cf, u->expr, is_partial_reference);
|
return ProcessLValueExpression(cf, u->expr, is_partial_reference);
|
||||||
},
|
},
|
||||||
|
@ -1437,7 +1461,7 @@ class UniformityGraph {
|
||||||
[&](Default) {
|
[&](Default) {
|
||||||
TINT_ICE(Resolver, diagnostics_)
|
TINT_ICE(Resolver, diagnostics_)
|
||||||
<< "unknown lvalue expression type: " << std::string(expr->TypeInfo().name);
|
<< "unknown lvalue expression type: " << std::string(expr->TypeInfo().name);
|
||||||
return std::pair<Node*, Node*>(nullptr, nullptr);
|
return LValue{};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8503,5 +8503,151 @@ test:11:7 note: reading from read_write storage buffer 'non_uniform' may result
|
||||||
)");
|
)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(UniformityAnalysisTest, AssignmentEval_LHS_Then_RHS_Pass) {
|
||||||
|
std::string src = R"(
|
||||||
|
@group(0) @binding(0) var<storage, read_write> non_uniform : i32;
|
||||||
|
|
||||||
|
fn b(p : ptr<function, i32>) -> i32 {
|
||||||
|
*p = non_uniform;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn a(p : ptr<function, i32>) -> i32 {
|
||||||
|
if (*p == 0) {
|
||||||
|
workgroupBarrier();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn foo() {
|
||||||
|
var i = 0;
|
||||||
|
var arr : array<i32, 4>;
|
||||||
|
arr[a(&i)] = arr[b(&i)];
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
RunTest(src, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(UniformityAnalysisTest, AssignmentEval_LHS_Then_RHS_Fail) {
|
||||||
|
std::string src = R"(
|
||||||
|
@group(0) @binding(0) var<storage, read_write> non_uniform : i32;
|
||||||
|
|
||||||
|
fn a(p : ptr<function, i32>) -> i32 {
|
||||||
|
*p = non_uniform;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn b(p : ptr<function, i32>) -> i32 {
|
||||||
|
if (*p == 0) {
|
||||||
|
workgroupBarrier();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn foo() {
|
||||||
|
var i = 0;
|
||||||
|
var arr : array<i32, 4>;
|
||||||
|
arr[a(&i)] = arr[b(&i)];
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
RunTest(src, false);
|
||||||
|
EXPECT_EQ(error_,
|
||||||
|
R"(test:11:5 error: 'workgroupBarrier' must only be called from uniform control flow
|
||||||
|
workgroupBarrier();
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
test:10:3 note: control flow depends on possibly non-uniform value
|
||||||
|
if (*p == 0) {
|
||||||
|
^^
|
||||||
|
|
||||||
|
test:10:8 note: parameter 'p' of 'b' may be non-uniform
|
||||||
|
if (*p == 0) {
|
||||||
|
^
|
||||||
|
|
||||||
|
test:19:22 note: possibly non-uniform value passed via pointer here
|
||||||
|
arr[a(&i)] = arr[b(&i)];
|
||||||
|
^
|
||||||
|
|
||||||
|
test:19:9 note: contents of pointer may become non-uniform after calling 'a'
|
||||||
|
arr[a(&i)] = arr[b(&i)];
|
||||||
|
^
|
||||||
|
)");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(UniformityAnalysisTest, CompoundAssignmentEval_LHS_Then_RHS_Pass) {
|
||||||
|
std::string src = R"(
|
||||||
|
@group(0) @binding(0) var<storage, read_write> non_uniform : i32;
|
||||||
|
|
||||||
|
fn b(p : ptr<function, i32>) -> i32 {
|
||||||
|
*p = non_uniform;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn a(p : ptr<function, i32>) -> i32 {
|
||||||
|
if (*p == 0) {
|
||||||
|
workgroupBarrier();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn foo() {
|
||||||
|
var i = 0;
|
||||||
|
var arr : array<i32, 4>;
|
||||||
|
arr[a(&i)] += arr[b(&i)];
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
RunTest(src, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(UniformityAnalysisTest, CompoundAssignmentEval_LHS_Then_RHS_Fail) {
|
||||||
|
std::string src = R"(
|
||||||
|
@group(0) @binding(0) var<storage, read_write> non_uniform : i32;
|
||||||
|
|
||||||
|
fn a(p : ptr<function, i32>) -> i32 {
|
||||||
|
*p = non_uniform;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn b(p : ptr<function, i32>) -> i32 {
|
||||||
|
if (*p == 0) {
|
||||||
|
workgroupBarrier();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn foo() {
|
||||||
|
var i = 0;
|
||||||
|
var arr : array<i32, 4>;
|
||||||
|
arr[a(&i)] += arr[b(&i)];
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
RunTest(src, false);
|
||||||
|
EXPECT_EQ(error_,
|
||||||
|
R"(test:11:5 error: 'workgroupBarrier' must only be called from uniform control flow
|
||||||
|
workgroupBarrier();
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
test:10:3 note: control flow depends on possibly non-uniform value
|
||||||
|
if (*p == 0) {
|
||||||
|
^^
|
||||||
|
|
||||||
|
test:10:8 note: parameter 'p' of 'b' may be non-uniform
|
||||||
|
if (*p == 0) {
|
||||||
|
^
|
||||||
|
|
||||||
|
test:19:23 note: possibly non-uniform value passed via pointer here
|
||||||
|
arr[a(&i)] += arr[b(&i)];
|
||||||
|
^
|
||||||
|
|
||||||
|
test:19:9 note: contents of pointer may become non-uniform after calling 'a'
|
||||||
|
arr[a(&i)] += arr[b(&i)];
|
||||||
|
^
|
||||||
|
)");
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace tint::resolver
|
} // namespace tint::resolver
|
||||||
|
|
|
@ -337,9 +337,8 @@ class DecomposeSideEffects::CollectHoistsState : public StateBase {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Starts the recursive processing of a statement's expression(s) to hoist
|
// Starts the recursive processing of a statement's expression(s) to hoist side-effects to lets.
|
||||||
// side-effects to lets.
|
void ProcessExpression(const ast::Expression* expr) {
|
||||||
void ProcessStatement(const ast::Expression* expr) {
|
|
||||||
if (!expr) {
|
if (!expr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -348,31 +347,6 @@ class DecomposeSideEffects::CollectHoistsState : public StateBase {
|
||||||
ProcessExpression(expr, maybe_hoist);
|
ProcessExpression(expr, maybe_hoist);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Special case for processing assignment statement expressions, as we must
|
|
||||||
// evaluate the rhs before the lhs, and possibly hoist the rhs expression.
|
|
||||||
void ProcessAssignment(const ast::Expression* lhs, const ast::Expression* rhs) {
|
|
||||||
// Evaluate rhs before lhs
|
|
||||||
tint::utils::Vector<const ast::Expression*, 8> maybe_hoist;
|
|
||||||
if (ProcessExpression(rhs, maybe_hoist)) {
|
|
||||||
maybe_hoist.Push(rhs);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the rhs has side-effects, it may affect the lhs, so hoist it right
|
|
||||||
// away. e.g. "b[c] = a(0);"
|
|
||||||
if (HasSideEffects(rhs)) {
|
|
||||||
// Technically, we can always hoist rhs, but don't bother doing so when
|
|
||||||
// the lhs is just a variable or phony.
|
|
||||||
if (!lhs->IsAnyOf<ast::IdentifierExpression, ast::PhonyExpression>()) {
|
|
||||||
Flush(maybe_hoist);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If maybe_hoist still has values, it means they are potential side-effect
|
|
||||||
// receivers. We pass this in while processing the lhs, in which case they
|
|
||||||
// may get hoisted if the lhs has side-effects. E.g. "b[a(0)] = c;".
|
|
||||||
ProcessExpression(lhs, maybe_hoist);
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit CollectHoistsState(CloneContext& ctx_in) : StateBase(ctx_in) {}
|
explicit CollectHoistsState(CloneContext& ctx_in) : StateBase(ctx_in) {}
|
||||||
|
|
||||||
|
@ -386,21 +360,26 @@ class DecomposeSideEffects::CollectHoistsState : public StateBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
Switch(
|
Switch(
|
||||||
stmt, [&](const ast::AssignmentStatement* s) { ProcessAssignment(s->lhs, s->rhs); },
|
stmt, //
|
||||||
[&](const ast::CallStatement* s) { //
|
[&](const ast::AssignmentStatement* s) {
|
||||||
ProcessStatement(s->expr);
|
tint::utils::Vector<const ast::Expression*, 8> maybe_hoist;
|
||||||
|
ProcessExpression(s->lhs, maybe_hoist);
|
||||||
|
ProcessExpression(s->rhs, maybe_hoist);
|
||||||
},
|
},
|
||||||
[&](const ast::ForLoopStatement* s) { ProcessStatement(s->condition); },
|
[&](const ast::CallStatement* s) { //
|
||||||
[&](const ast::WhileStatement* s) { ProcessStatement(s->condition); },
|
ProcessExpression(s->expr);
|
||||||
|
},
|
||||||
|
[&](const ast::ForLoopStatement* s) { ProcessExpression(s->condition); },
|
||||||
|
[&](const ast::WhileStatement* s) { ProcessExpression(s->condition); },
|
||||||
[&](const ast::IfStatement* s) { //
|
[&](const ast::IfStatement* s) { //
|
||||||
ProcessStatement(s->condition);
|
ProcessExpression(s->condition);
|
||||||
},
|
},
|
||||||
[&](const ast::ReturnStatement* s) { //
|
[&](const ast::ReturnStatement* s) { //
|
||||||
ProcessStatement(s->value);
|
ProcessExpression(s->value);
|
||||||
},
|
},
|
||||||
[&](const ast::SwitchStatement* s) { ProcessStatement(s->condition); },
|
[&](const ast::SwitchStatement* s) { ProcessExpression(s->condition); },
|
||||||
[&](const ast::VariableDeclStatement* s) {
|
[&](const ast::VariableDeclStatement* s) {
|
||||||
ProcessStatement(s->variable->initializer);
|
ProcessExpression(s->variable->initializer);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -563,10 +542,10 @@ class DecomposeSideEffects::DecomposeState : public StateBase {
|
||||||
!sem.GetVal(s->rhs)->HasSideEffects()) {
|
!sem.GetVal(s->rhs)->HasSideEffects()) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
// rhs before lhs
|
// lhs before rhs
|
||||||
tint::utils::Vector<const ast::Statement*, 8> stmts;
|
tint::utils::Vector<const ast::Statement*, 8> stmts;
|
||||||
ctx.Replace(s->rhs, Decompose(s->rhs, &stmts));
|
|
||||||
ctx.Replace(s->lhs, Decompose(s->lhs, &stmts));
|
ctx.Replace(s->lhs, Decompose(s->lhs, &stmts));
|
||||||
|
ctx.Replace(s->rhs, Decompose(s->rhs, &stmts));
|
||||||
InsertBefore(stmts, s);
|
InsertBefore(stmts, s);
|
||||||
return ctx.CloneWithoutTransform(s);
|
return ctx.CloneWithoutTransform(s);
|
||||||
},
|
},
|
||||||
|
|
|
@ -2830,9 +2830,8 @@ fn a(i : i32) -> i32 {
|
||||||
|
|
||||||
fn f() {
|
fn f() {
|
||||||
var b = array<i32, 10>();
|
var b = array<i32, 10>();
|
||||||
let tint_symbol = a(1);
|
let tint_symbol = a(0);
|
||||||
let tint_symbol_1 = a(0);
|
b[tint_symbol] = a(1);
|
||||||
b[tint_symbol_1] = tint_symbol;
|
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
|
@ -2861,10 +2860,9 @@ fn a(i : i32) -> i32 {
|
||||||
|
|
||||||
fn f() {
|
fn f() {
|
||||||
var b = array<array<i32, 10>, 10>();
|
var b = array<array<i32, 10>, 10>();
|
||||||
let tint_symbol = a(2);
|
let tint_symbol = a(0);
|
||||||
let tint_symbol_1 = a(0);
|
let tint_symbol_1 = a(1);
|
||||||
let tint_symbol_2 = a(1);
|
b[tint_symbol][tint_symbol_1] = a(2);
|
||||||
b[tint_symbol_1][tint_symbol_2] = tint_symbol;
|
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
|
@ -2893,11 +2891,10 @@ fn a(i : i32) -> i32 {
|
||||||
|
|
||||||
fn f() {
|
fn f() {
|
||||||
var b = array<array<array<i32, 10>, 10>, 10>();
|
var b = array<array<array<i32, 10>, 10>, 10>();
|
||||||
let tint_symbol = a(3);
|
let tint_symbol = a(0);
|
||||||
let tint_symbol_1 = a(0);
|
let tint_symbol_1 = a(1);
|
||||||
let tint_symbol_2 = a(1);
|
let tint_symbol_2 = a(2);
|
||||||
let tint_symbol_3 = a(2);
|
b[tint_symbol][tint_symbol_1][tint_symbol_2] = a(3);
|
||||||
b[tint_symbol_1][tint_symbol_2][tint_symbol_3] = tint_symbol;
|
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
|
@ -2930,11 +2927,9 @@ fn f() {
|
||||||
var b = array<i32, 3>();
|
var b = array<i32, 3>();
|
||||||
var d = array<array<i32, 3>, 3>();
|
var d = array<array<i32, 3>, 3>();
|
||||||
var a_1 = 0;
|
var a_1 = 0;
|
||||||
let tint_symbol = a(0);
|
let tint_symbol = a(2);
|
||||||
let tint_symbol_1 = a_1;
|
let tint_symbol_1 = a(0);
|
||||||
let tint_symbol_2 = d[tint_symbol][tint_symbol_1];
|
b[tint_symbol] = d[tint_symbol_1][a_1];
|
||||||
let tint_symbol_3 = a(2);
|
|
||||||
b[tint_symbol_3] = tint_symbol_2;
|
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
|
@ -2963,9 +2958,8 @@ fn a(i : i32) -> i32 {
|
||||||
|
|
||||||
fn f() {
|
fn f() {
|
||||||
var b = vec3<i32>();
|
var b = vec3<i32>();
|
||||||
let tint_symbol = a(1);
|
let tint_symbol = a(0);
|
||||||
let tint_symbol_1 = a(0);
|
b[tint_symbol] = a(1);
|
||||||
b[tint_symbol_1] = tint_symbol;
|
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
|
@ -2996,9 +2990,8 @@ fn a(i : i32) -> i32 {
|
||||||
fn f() {
|
fn f() {
|
||||||
var b = vec3<i32>();
|
var b = vec3<i32>();
|
||||||
var c = 0;
|
var c = 0;
|
||||||
let tint_symbol = c;
|
let tint_symbol = a(0);
|
||||||
let tint_symbol_1 = a(0);
|
b[tint_symbol] = c;
|
||||||
b[tint_symbol_1] = tint_symbol;
|
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
|
@ -3029,8 +3022,8 @@ fn a(i : i32) -> i32 {
|
||||||
fn f() {
|
fn f() {
|
||||||
var b = vec3<i32>();
|
var b = vec3<i32>();
|
||||||
var c = 0;
|
var c = 0;
|
||||||
let tint_symbol = a(0);
|
let tint_symbol = c;
|
||||||
b[c] = tint_symbol;
|
b[tint_symbol] = a(0);
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
|
|
|
@ -18,13 +18,13 @@ RWByteAddressBuffer dst_nested : register(u3, space0);
|
||||||
|
|
||||||
typedef int4 ret_arr_ret[4];
|
typedef int4 ret_arr_ret[4];
|
||||||
ret_arr_ret ret_arr() {
|
ret_arr_ret ret_arr() {
|
||||||
const int4 tint_symbol_3[4] = (int4[4])0;
|
const int4 tint_symbol_2[4] = (int4[4])0;
|
||||||
return tint_symbol_3;
|
return tint_symbol_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
S ret_struct_arr() {
|
S ret_struct_arr() {
|
||||||
const S tint_symbol_4 = (S)0;
|
const S tint_symbol_3 = (S)0;
|
||||||
return tint_symbol_4;
|
return tint_symbol_3;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tint_symbol_store(uint offset, int4 value[4]) {
|
void tint_symbol_store(uint offset, int4 value[4]) {
|
||||||
|
@ -88,18 +88,17 @@ void dst_nested_store(uint offset, int value[4][3][2]) {
|
||||||
|
|
||||||
void foo(int4 src_param[4]) {
|
void foo(int4 src_param[4]) {
|
||||||
int4 src_function[4] = (int4[4])0;
|
int4 src_function[4] = (int4[4])0;
|
||||||
const int4 tint_symbol_5[4] = {(1).xxxx, (2).xxxx, (3).xxxx, (3).xxxx};
|
const int4 tint_symbol_4[4] = {(1).xxxx, (2).xxxx, (3).xxxx, (3).xxxx};
|
||||||
tint_symbol_store(0u, tint_symbol_5);
|
tint_symbol_store(0u, tint_symbol_4);
|
||||||
tint_symbol_store(0u, src_param);
|
tint_symbol_store(0u, src_param);
|
||||||
const int4 tint_symbol_1[4] = ret_arr();
|
tint_symbol_store(0u, ret_arr());
|
||||||
tint_symbol_store(0u, tint_symbol_1);
|
|
||||||
const int4 src_let[4] = (int4[4])0;
|
const int4 src_let[4] = (int4[4])0;
|
||||||
tint_symbol_store(0u, src_let);
|
tint_symbol_store(0u, src_let);
|
||||||
tint_symbol_store(0u, src_function);
|
tint_symbol_store(0u, src_function);
|
||||||
tint_symbol_store(0u, src_private);
|
tint_symbol_store(0u, src_private);
|
||||||
tint_symbol_store(0u, src_workgroup);
|
tint_symbol_store(0u, src_workgroup);
|
||||||
const S tint_symbol_2 = ret_struct_arr();
|
const S tint_symbol_1 = ret_struct_arr();
|
||||||
tint_symbol_store(0u, tint_symbol_2.arr);
|
tint_symbol_store(0u, tint_symbol_1.arr);
|
||||||
tint_symbol_store(0u, src_uniform_load(0u));
|
tint_symbol_store(0u, src_uniform_load(0u));
|
||||||
tint_symbol_store(0u, src_storage_load(0u));
|
tint_symbol_store(0u, src_storage_load(0u));
|
||||||
int src_nested[4][3][2] = (int[4][3][2])0;
|
int src_nested[4][3][2] = (int[4][3][2])0;
|
||||||
|
|
|
@ -18,13 +18,13 @@ RWByteAddressBuffer dst_nested : register(u3, space0);
|
||||||
|
|
||||||
typedef int4 ret_arr_ret[4];
|
typedef int4 ret_arr_ret[4];
|
||||||
ret_arr_ret ret_arr() {
|
ret_arr_ret ret_arr() {
|
||||||
const int4 tint_symbol_3[4] = (int4[4])0;
|
const int4 tint_symbol_2[4] = (int4[4])0;
|
||||||
return tint_symbol_3;
|
return tint_symbol_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
S ret_struct_arr() {
|
S ret_struct_arr() {
|
||||||
const S tint_symbol_4 = (S)0;
|
const S tint_symbol_3 = (S)0;
|
||||||
return tint_symbol_4;
|
return tint_symbol_3;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tint_symbol_store(uint offset, int4 value[4]) {
|
void tint_symbol_store(uint offset, int4 value[4]) {
|
||||||
|
@ -88,18 +88,17 @@ void dst_nested_store(uint offset, int value[4][3][2]) {
|
||||||
|
|
||||||
void foo(int4 src_param[4]) {
|
void foo(int4 src_param[4]) {
|
||||||
int4 src_function[4] = (int4[4])0;
|
int4 src_function[4] = (int4[4])0;
|
||||||
const int4 tint_symbol_5[4] = {(1).xxxx, (2).xxxx, (3).xxxx, (3).xxxx};
|
const int4 tint_symbol_4[4] = {(1).xxxx, (2).xxxx, (3).xxxx, (3).xxxx};
|
||||||
tint_symbol_store(0u, tint_symbol_5);
|
tint_symbol_store(0u, tint_symbol_4);
|
||||||
tint_symbol_store(0u, src_param);
|
tint_symbol_store(0u, src_param);
|
||||||
const int4 tint_symbol_1[4] = ret_arr();
|
tint_symbol_store(0u, ret_arr());
|
||||||
tint_symbol_store(0u, tint_symbol_1);
|
|
||||||
const int4 src_let[4] = (int4[4])0;
|
const int4 src_let[4] = (int4[4])0;
|
||||||
tint_symbol_store(0u, src_let);
|
tint_symbol_store(0u, src_let);
|
||||||
tint_symbol_store(0u, src_function);
|
tint_symbol_store(0u, src_function);
|
||||||
tint_symbol_store(0u, src_private);
|
tint_symbol_store(0u, src_private);
|
||||||
tint_symbol_store(0u, src_workgroup);
|
tint_symbol_store(0u, src_workgroup);
|
||||||
const S tint_symbol_2 = ret_struct_arr();
|
const S tint_symbol_1 = ret_struct_arr();
|
||||||
tint_symbol_store(0u, tint_symbol_2.arr);
|
tint_symbol_store(0u, tint_symbol_1.arr);
|
||||||
tint_symbol_store(0u, src_uniform_load(0u));
|
tint_symbol_store(0u, src_uniform_load(0u));
|
||||||
tint_symbol_store(0u, src_storage_load(0u));
|
tint_symbol_store(0u, src_storage_load(0u));
|
||||||
int src_nested[4][3][2] = (int[4][3][2])0;
|
int src_nested[4][3][2] = (int[4][3][2])0;
|
||||||
|
|
|
@ -31,29 +31,28 @@ layout(binding = 3, std430) buffer dst_nested_block_ssbo {
|
||||||
} dst_nested;
|
} dst_nested;
|
||||||
|
|
||||||
ivec4[4] ret_arr() {
|
ivec4[4] ret_arr() {
|
||||||
ivec4 tint_symbol_2[4] = ivec4[4](ivec4(0), ivec4(0), ivec4(0), ivec4(0));
|
ivec4 tint_symbol_1[4] = ivec4[4](ivec4(0), ivec4(0), ivec4(0), ivec4(0));
|
||||||
return tint_symbol_2;
|
return tint_symbol_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
S ret_struct_arr() {
|
S ret_struct_arr() {
|
||||||
S tint_symbol_3 = S(ivec4[4](ivec4(0), ivec4(0), ivec4(0), ivec4(0)));
|
S tint_symbol_2 = S(ivec4[4](ivec4(0), ivec4(0), ivec4(0), ivec4(0)));
|
||||||
return tint_symbol_3;
|
return tint_symbol_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void foo(ivec4 src_param[4]) {
|
void foo(ivec4 src_param[4]) {
|
||||||
ivec4 src_function[4] = ivec4[4](ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0));
|
ivec4 src_function[4] = ivec4[4](ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0), ivec4(0, 0, 0, 0));
|
||||||
ivec4 tint_symbol_4[4] = ivec4[4](ivec4(1), ivec4(2), ivec4(3), ivec4(3));
|
ivec4 tint_symbol_3[4] = ivec4[4](ivec4(1), ivec4(2), ivec4(3), ivec4(3));
|
||||||
dst.inner.arr = tint_symbol_4;
|
dst.inner.arr = tint_symbol_3;
|
||||||
dst.inner.arr = src_param;
|
dst.inner.arr = src_param;
|
||||||
ivec4 tint_symbol[4] = ret_arr();
|
dst.inner.arr = ret_arr();
|
||||||
dst.inner.arr = tint_symbol;
|
|
||||||
ivec4 src_let[4] = ivec4[4](ivec4(0), ivec4(0), ivec4(0), ivec4(0));
|
ivec4 src_let[4] = ivec4[4](ivec4(0), ivec4(0), ivec4(0), ivec4(0));
|
||||||
dst.inner.arr = src_let;
|
dst.inner.arr = src_let;
|
||||||
dst.inner.arr = src_function;
|
dst.inner.arr = src_function;
|
||||||
dst.inner.arr = src_private;
|
dst.inner.arr = src_private;
|
||||||
dst.inner.arr = src_workgroup;
|
dst.inner.arr = src_workgroup;
|
||||||
S tint_symbol_1 = ret_struct_arr();
|
S tint_symbol = ret_struct_arr();
|
||||||
dst.inner.arr = tint_symbol_1.arr;
|
dst.inner.arr = tint_symbol.arr;
|
||||||
dst.inner.arr = src_uniform.inner.arr;
|
dst.inner.arr = src_uniform.inner.arr;
|
||||||
dst.inner.arr = src_storage.inner.arr;
|
dst.inner.arr = src_storage.inner.arr;
|
||||||
int src_nested[4][3][2] = int[4][3][2](int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)));
|
int src_nested[4][3][2] = int[4][3][2](int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)), int[3][2](int[2](0, 0), int[2](0, 0), int[2](0, 0)));
|
||||||
|
|
|
@ -23,33 +23,32 @@ struct S_nested {
|
||||||
};
|
};
|
||||||
|
|
||||||
tint_array<int4, 4> ret_arr() {
|
tint_array<int4, 4> ret_arr() {
|
||||||
tint_array<int4, 4> const tint_symbol_2 = tint_array<int4, 4>{};
|
tint_array<int4, 4> const tint_symbol_1 = tint_array<int4, 4>{};
|
||||||
return tint_symbol_2;
|
return tint_symbol_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
S ret_struct_arr() {
|
S ret_struct_arr() {
|
||||||
S const tint_symbol_3 = S{};
|
S const tint_symbol_2 = S{};
|
||||||
return tint_symbol_3;
|
return tint_symbol_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void foo(tint_array<int4, 4> src_param, device S* const tint_symbol_5, threadgroup tint_array<int4, 4>* const tint_symbol_7, const constant S* const tint_symbol_8, device S* const tint_symbol_9, device S_nested* const tint_symbol_10) {
|
void foo(tint_array<int4, 4> src_param, device S* const tint_symbol_4, threadgroup tint_array<int4, 4>* const tint_symbol_6, const constant S* const tint_symbol_7, device S* const tint_symbol_8, device S_nested* const tint_symbol_9) {
|
||||||
thread tint_array<int4, 4> tint_symbol_6 = {};
|
thread tint_array<int4, 4> tint_symbol_5 = {};
|
||||||
tint_array<int4, 4> src_function = {};
|
tint_array<int4, 4> src_function = {};
|
||||||
tint_array<int4, 4> const tint_symbol_4 = tint_array<int4, 4>{int4(1), int4(2), int4(3), int4(3)};
|
tint_array<int4, 4> const tint_symbol_3 = tint_array<int4, 4>{int4(1), int4(2), int4(3), int4(3)};
|
||||||
(*(tint_symbol_5)).arr = tint_symbol_4;
|
(*(tint_symbol_4)).arr = tint_symbol_3;
|
||||||
(*(tint_symbol_5)).arr = src_param;
|
(*(tint_symbol_4)).arr = src_param;
|
||||||
tint_array<int4, 4> const tint_symbol = ret_arr();
|
(*(tint_symbol_4)).arr = ret_arr();
|
||||||
(*(tint_symbol_5)).arr = tint_symbol;
|
|
||||||
tint_array<int4, 4> const src_let = tint_array<int4, 4>{};
|
tint_array<int4, 4> const src_let = tint_array<int4, 4>{};
|
||||||
(*(tint_symbol_5)).arr = src_let;
|
(*(tint_symbol_4)).arr = src_let;
|
||||||
(*(tint_symbol_5)).arr = src_function;
|
(*(tint_symbol_4)).arr = src_function;
|
||||||
(*(tint_symbol_5)).arr = tint_symbol_6;
|
(*(tint_symbol_4)).arr = tint_symbol_5;
|
||||||
(*(tint_symbol_5)).arr = *(tint_symbol_7);
|
(*(tint_symbol_4)).arr = *(tint_symbol_6);
|
||||||
S const tint_symbol_1 = ret_struct_arr();
|
S const tint_symbol = ret_struct_arr();
|
||||||
(*(tint_symbol_5)).arr = tint_symbol_1.arr;
|
(*(tint_symbol_4)).arr = tint_symbol.arr;
|
||||||
(*(tint_symbol_5)).arr = (*(tint_symbol_8)).arr;
|
(*(tint_symbol_4)).arr = (*(tint_symbol_7)).arr;
|
||||||
(*(tint_symbol_5)).arr = (*(tint_symbol_9)).arr;
|
(*(tint_symbol_4)).arr = (*(tint_symbol_8)).arr;
|
||||||
tint_array<tint_array<tint_array<int, 2>, 3>, 4> src_nested = {};
|
tint_array<tint_array<tint_array<int, 2>, 3>, 4> src_nested = {};
|
||||||
(*(tint_symbol_10)).arr = src_nested;
|
(*(tint_symbol_9)).arr = src_nested;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -114,9 +114,9 @@
|
||||||
OpStore %46 %53
|
OpStore %46 %53
|
||||||
%54 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
|
%54 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
|
||||||
OpStore %54 %src_param
|
OpStore %54 %src_param
|
||||||
%55 = OpFunctionCall %_arr_v4int_uint_4 %ret_arr
|
%55 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
|
||||||
%56 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
|
%56 = OpFunctionCall %_arr_v4int_uint_4 %ret_arr
|
||||||
OpStore %56 %55
|
OpStore %55 %56
|
||||||
%57 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
|
%57 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
|
||||||
OpStore %57 %8
|
OpStore %57 %8
|
||||||
%58 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
|
%58 = OpAccessChain %_ptr_StorageBuffer__arr_v4int_uint_4 %dst %uint_0 %uint_0
|
||||||
|
|
|
@ -33,8 +33,8 @@ void main_inner(uint3 GlobalInvocationID) {
|
||||||
uint4 dstColorBits = uint4(dstColor);
|
uint4 dstColorBits = uint4(dstColor);
|
||||||
{
|
{
|
||||||
for(uint i = 0u; (i < uniforms[0].w); i = (i + 1u)) {
|
for(uint i = 0u; (i < uniforms[0].w); i = (i + 1u)) {
|
||||||
const uint tint_symbol_1 = ConvertToFp16FloatValue(srcColor[i]);
|
const uint tint_symbol_1 = i;
|
||||||
set_uint4(srcColorBits, i, tint_symbol_1);
|
set_uint4(srcColorBits, tint_symbol_1, ConvertToFp16FloatValue(srcColor[i]));
|
||||||
bool tint_tmp_1 = success;
|
bool tint_tmp_1 = success;
|
||||||
if (tint_tmp_1) {
|
if (tint_tmp_1) {
|
||||||
tint_tmp_1 = (srcColorBits[i] == dstColorBits[i]);
|
tint_tmp_1 = (srcColorBits[i] == dstColorBits[i]);
|
||||||
|
|
|
@ -33,8 +33,8 @@ void main_inner(uint3 GlobalInvocationID) {
|
||||||
uint4 dstColorBits = uint4(dstColor);
|
uint4 dstColorBits = uint4(dstColor);
|
||||||
{
|
{
|
||||||
for(uint i = 0u; (i < uniforms[0].w); i = (i + 1u)) {
|
for(uint i = 0u; (i < uniforms[0].w); i = (i + 1u)) {
|
||||||
const uint tint_symbol_1 = ConvertToFp16FloatValue(srcColor[i]);
|
const uint tint_symbol_1 = i;
|
||||||
set_uint4(srcColorBits, i, tint_symbol_1);
|
set_uint4(srcColorBits, tint_symbol_1, ConvertToFp16FloatValue(srcColor[i]));
|
||||||
bool tint_tmp_1 = success;
|
bool tint_tmp_1 = success;
|
||||||
if (tint_tmp_1) {
|
if (tint_tmp_1) {
|
||||||
tint_tmp_1 = (srcColorBits[i] == dstColorBits[i]);
|
tint_tmp_1 = (srcColorBits[i] == dstColorBits[i]);
|
||||||
|
|
|
@ -35,8 +35,8 @@ void tint_symbol_1(uvec3 GlobalInvocationID) {
|
||||||
uvec4 dstColorBits = uvec4(dstColor);
|
uvec4 dstColorBits = uvec4(dstColor);
|
||||||
{
|
{
|
||||||
for(uint i = 0u; (i < uniforms.inner.channelCount); i = (i + 1u)) {
|
for(uint i = 0u; (i < uniforms.inner.channelCount); i = (i + 1u)) {
|
||||||
uint tint_symbol_2 = ConvertToFp16FloatValue(srcColor[i]);
|
uint tint_symbol_2 = i;
|
||||||
srcColorBits[i] = tint_symbol_2;
|
srcColorBits[tint_symbol_2] = ConvertToFp16FloatValue(srcColor[i]);
|
||||||
bool tint_tmp = success;
|
bool tint_tmp = success;
|
||||||
if (tint_tmp) {
|
if (tint_tmp) {
|
||||||
tint_tmp = (srcColorBits[i] == dstColorBits[i]);
|
tint_tmp = (srcColorBits[i] == dstColorBits[i]);
|
||||||
|
|
|
@ -42,8 +42,8 @@ void tint_symbol_inner(uint3 GlobalInvocationID, texture2d<float, access::sample
|
||||||
uint4 srcColorBits = 0u;
|
uint4 srcColorBits = 0u;
|
||||||
uint4 dstColorBits = uint4(dstColor);
|
uint4 dstColorBits = uint4(dstColor);
|
||||||
for(uint i = 0u; (i < (*(tint_symbol_3)).channelCount); i = (i + 1u)) {
|
for(uint i = 0u; (i < (*(tint_symbol_3)).channelCount); i = (i + 1u)) {
|
||||||
uint const tint_symbol_1 = ConvertToFp16FloatValue(srcColor[i]);
|
uint const tint_symbol_1 = i;
|
||||||
srcColorBits[i] = tint_symbol_1;
|
srcColorBits[tint_symbol_1] = ConvertToFp16FloatValue(srcColor[i]);
|
||||||
success = (success && (srcColorBits[i] == dstColorBits[i]));
|
success = (success && (srcColorBits[i] == dstColorBits[i]));
|
||||||
}
|
}
|
||||||
uint outputIndex = ((GlobalInvocationID[1] * uint(size[0])) + GlobalInvocationID[0]);
|
uint outputIndex = ((GlobalInvocationID[1] * uint(size[0])) + GlobalInvocationID[0]);
|
||||||
|
|
|
@ -170,13 +170,13 @@
|
||||||
%92 = OpLabel
|
%92 = OpLabel
|
||||||
OpBranch %82
|
OpBranch %82
|
||||||
%91 = OpLabel
|
%91 = OpLabel
|
||||||
%94 = OpLoad %uint %i
|
%93 = OpLoad %uint %i
|
||||||
%96 = OpAccessChain %_ptr_Function_float %srcColor %94
|
%94 = OpAccessChain %_ptr_Function_uint %srcColorBits %93
|
||||||
%97 = OpLoad %float %96
|
%96 = OpLoad %uint %i
|
||||||
%93 = OpFunctionCall %uint %ConvertToFp16FloatValue %97
|
%98 = OpAccessChain %_ptr_Function_float %srcColor %96
|
||||||
%98 = OpLoad %uint %i
|
%99 = OpLoad %float %98
|
||||||
%99 = OpAccessChain %_ptr_Function_uint %srcColorBits %98
|
%95 = OpFunctionCall %uint %ConvertToFp16FloatValue %99
|
||||||
OpStore %99 %93
|
OpStore %94 %95
|
||||||
%100 = OpLoad %bool %success
|
%100 = OpLoad %bool %success
|
||||||
OpSelectionMerge %101 None
|
OpSelectionMerge %101 None
|
||||||
OpBranchConditional %100 %102 %101
|
OpBranchConditional %100 %102 %101
|
||||||
|
|
|
@ -47,7 +47,7 @@ uint tint_div(uint lhs, uint rhs) {
|
||||||
return (lhs / ((rhs == 0u) ? 1u : rhs));
|
return (lhs / ((rhs == 0u) ? 1u : rhs));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct tint_symbol_3 {
|
struct tint_symbol_5 {
|
||||||
uint3 local_id : SV_GroupThreadID;
|
uint3 local_id : SV_GroupThreadID;
|
||||||
uint local_invocation_index : SV_GroupIndex;
|
uint local_invocation_index : SV_GroupIndex;
|
||||||
uint3 global_id : SV_DispatchThreadID;
|
uint3 global_id : SV_DispatchThreadID;
|
||||||
|
@ -88,8 +88,9 @@ void main_inner(uint3 local_id, uint3 global_id, uint local_invocation_index) {
|
||||||
for(uint innerCol = 0u; (innerCol < ColPerThreadA); innerCol = (innerCol + 1u)) {
|
for(uint innerCol = 0u; (innerCol < ColPerThreadA); innerCol = (innerCol + 1u)) {
|
||||||
const uint inputRow = (tileRow + innerRow);
|
const uint inputRow = (tileRow + innerRow);
|
||||||
const uint inputCol = (tileColA + innerCol);
|
const uint inputCol = (tileColA + innerCol);
|
||||||
const float tint_symbol = mm_readA((globalRow + innerRow), ((t * 64u) + inputCol));
|
const uint tint_symbol = inputRow;
|
||||||
mm_Asub[inputRow][inputCol] = tint_symbol;
|
const uint tint_symbol_1 = inputCol;
|
||||||
|
mm_Asub[tint_symbol][tint_symbol_1] = mm_readA((globalRow + innerRow), ((t * 64u) + inputCol));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,8 +101,9 @@ void main_inner(uint3 local_id, uint3 global_id, uint local_invocation_index) {
|
||||||
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
|
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
|
||||||
const uint inputRow = (tileRowB + innerRow);
|
const uint inputRow = (tileRowB + innerRow);
|
||||||
const uint inputCol = (tileCol + innerCol);
|
const uint inputCol = (tileCol + innerCol);
|
||||||
const float tint_symbol_1 = mm_readB(((t * 64u) + inputRow), (globalCol + innerCol));
|
const uint tint_symbol_2 = innerCol;
|
||||||
mm_Bsub[innerCol][inputCol] = tint_symbol_1;
|
const uint tint_symbol_3 = inputCol;
|
||||||
|
mm_Bsub[tint_symbol_2][tint_symbol_3] = mm_readB(((t * 64u) + inputRow), (globalCol + innerCol));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -143,7 +145,7 @@ void main_inner(uint3 local_id, uint3 global_id, uint local_invocation_index) {
|
||||||
}
|
}
|
||||||
|
|
||||||
[numthreads(16, 16, 1)]
|
[numthreads(16, 16, 1)]
|
||||||
void main(tint_symbol_3 tint_symbol_2) {
|
void main(tint_symbol_5 tint_symbol_4) {
|
||||||
main_inner(tint_symbol_2.local_id, tint_symbol_2.global_id, tint_symbol_2.local_invocation_index);
|
main_inner(tint_symbol_4.local_id, tint_symbol_4.global_id, tint_symbol_4.local_invocation_index);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ uint tint_div(uint lhs, uint rhs) {
|
||||||
return (lhs / ((rhs == 0u) ? 1u : rhs));
|
return (lhs / ((rhs == 0u) ? 1u : rhs));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct tint_symbol_3 {
|
struct tint_symbol_5 {
|
||||||
uint3 local_id : SV_GroupThreadID;
|
uint3 local_id : SV_GroupThreadID;
|
||||||
uint local_invocation_index : SV_GroupIndex;
|
uint local_invocation_index : SV_GroupIndex;
|
||||||
uint3 global_id : SV_DispatchThreadID;
|
uint3 global_id : SV_DispatchThreadID;
|
||||||
|
@ -88,8 +88,9 @@ void main_inner(uint3 local_id, uint3 global_id, uint local_invocation_index) {
|
||||||
for(uint innerCol = 0u; (innerCol < ColPerThreadA); innerCol = (innerCol + 1u)) {
|
for(uint innerCol = 0u; (innerCol < ColPerThreadA); innerCol = (innerCol + 1u)) {
|
||||||
const uint inputRow = (tileRow + innerRow);
|
const uint inputRow = (tileRow + innerRow);
|
||||||
const uint inputCol = (tileColA + innerCol);
|
const uint inputCol = (tileColA + innerCol);
|
||||||
const float tint_symbol = mm_readA((globalRow + innerRow), ((t * 64u) + inputCol));
|
const uint tint_symbol = inputRow;
|
||||||
mm_Asub[inputRow][inputCol] = tint_symbol;
|
const uint tint_symbol_1 = inputCol;
|
||||||
|
mm_Asub[tint_symbol][tint_symbol_1] = mm_readA((globalRow + innerRow), ((t * 64u) + inputCol));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,8 +101,9 @@ void main_inner(uint3 local_id, uint3 global_id, uint local_invocation_index) {
|
||||||
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
|
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
|
||||||
const uint inputRow = (tileRowB + innerRow);
|
const uint inputRow = (tileRowB + innerRow);
|
||||||
const uint inputCol = (tileCol + innerCol);
|
const uint inputCol = (tileCol + innerCol);
|
||||||
const float tint_symbol_1 = mm_readB(((t * 64u) + inputRow), (globalCol + innerCol));
|
const uint tint_symbol_2 = innerCol;
|
||||||
mm_Bsub[innerCol][inputCol] = tint_symbol_1;
|
const uint tint_symbol_3 = inputCol;
|
||||||
|
mm_Bsub[tint_symbol_2][tint_symbol_3] = mm_readB(((t * 64u) + inputRow), (globalCol + innerCol));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -143,7 +145,7 @@ void main_inner(uint3 local_id, uint3 global_id, uint local_invocation_index) {
|
||||||
}
|
}
|
||||||
|
|
||||||
[numthreads(16, 16, 1)]
|
[numthreads(16, 16, 1)]
|
||||||
void main(tint_symbol_3 tint_symbol_2) {
|
void main(tint_symbol_5 tint_symbol_4) {
|
||||||
main_inner(tint_symbol_2.local_id, tint_symbol_2.global_id, tint_symbol_2.local_invocation_index);
|
main_inner(tint_symbol_4.local_id, tint_symbol_4.global_id, tint_symbol_4.local_invocation_index);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,8 +99,9 @@ void tint_symbol(uvec3 local_id, uvec3 global_id, uint local_invocation_index) {
|
||||||
for(uint innerCol = 0u; (innerCol < ColPerThreadA); innerCol = (innerCol + 1u)) {
|
for(uint innerCol = 0u; (innerCol < ColPerThreadA); innerCol = (innerCol + 1u)) {
|
||||||
uint inputRow = (tileRow + innerRow);
|
uint inputRow = (tileRow + innerRow);
|
||||||
uint inputCol = (tileColA + innerCol);
|
uint inputCol = (tileColA + innerCol);
|
||||||
float tint_symbol_1 = mm_readA((globalRow + innerRow), ((t * 64u) + inputCol));
|
uint tint_symbol_1 = inputRow;
|
||||||
mm_Asub[inputRow][inputCol] = tint_symbol_1;
|
uint tint_symbol_2 = inputCol;
|
||||||
|
mm_Asub[tint_symbol_1][tint_symbol_2] = mm_readA((globalRow + innerRow), ((t * 64u) + inputCol));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,8 +112,9 @@ void tint_symbol(uvec3 local_id, uvec3 global_id, uint local_invocation_index) {
|
||||||
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
|
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
|
||||||
uint inputRow = (tileRowB + innerRow);
|
uint inputRow = (tileRowB + innerRow);
|
||||||
uint inputCol = (tileCol + innerCol);
|
uint inputCol = (tileCol + innerCol);
|
||||||
float tint_symbol_2 = mm_readB(((t * 64u) + inputRow), (globalCol + innerCol));
|
uint tint_symbol_3 = innerCol;
|
||||||
mm_Bsub[innerCol][inputCol] = tint_symbol_2;
|
uint tint_symbol_4 = inputCol;
|
||||||
|
mm_Bsub[tint_symbol_3][tint_symbol_4] = mm_readB(((t * 64u) + inputRow), (globalCol + innerCol));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,26 +24,26 @@ struct Matrix {
|
||||||
/* 0x0000 */ tint_array<float, 1> numbers;
|
/* 0x0000 */ tint_array<float, 1> numbers;
|
||||||
};
|
};
|
||||||
|
|
||||||
float mm_readA(uint row, uint col, const constant Uniforms* const tint_symbol_3, const device Matrix* const tint_symbol_4) {
|
float mm_readA(uint row, uint col, const constant Uniforms* const tint_symbol_5, const device Matrix* const tint_symbol_6) {
|
||||||
if (((row < (*(tint_symbol_3)).dimAOuter) && (col < (*(tint_symbol_3)).dimInner))) {
|
if (((row < (*(tint_symbol_5)).dimAOuter) && (col < (*(tint_symbol_5)).dimInner))) {
|
||||||
float const result = (*(tint_symbol_4)).numbers[((row * (*(tint_symbol_3)).dimInner) + col)];
|
float const result = (*(tint_symbol_6)).numbers[((row * (*(tint_symbol_5)).dimInner) + col)];
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
float mm_readB(uint row, uint col, const constant Uniforms* const tint_symbol_5, const device Matrix* const tint_symbol_6) {
|
float mm_readB(uint row, uint col, const constant Uniforms* const tint_symbol_7, const device Matrix* const tint_symbol_8) {
|
||||||
if (((row < (*(tint_symbol_5)).dimInner) && (col < (*(tint_symbol_5)).dimBOuter))) {
|
if (((row < (*(tint_symbol_7)).dimInner) && (col < (*(tint_symbol_7)).dimBOuter))) {
|
||||||
float const result = (*(tint_symbol_6)).numbers[((row * (*(tint_symbol_5)).dimBOuter) + col)];
|
float const result = (*(tint_symbol_8)).numbers[((row * (*(tint_symbol_7)).dimBOuter) + col)];
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mm_write(uint row, uint col, float value, const constant Uniforms* const tint_symbol_7, device Matrix* const tint_symbol_8) {
|
void mm_write(uint row, uint col, float value, const constant Uniforms* const tint_symbol_9, device Matrix* const tint_symbol_10) {
|
||||||
if (((row < (*(tint_symbol_7)).dimAOuter) && (col < (*(tint_symbol_7)).dimBOuter))) {
|
if (((row < (*(tint_symbol_9)).dimAOuter) && (col < (*(tint_symbol_9)).dimBOuter))) {
|
||||||
uint const index = (col + (row * (*(tint_symbol_7)).dimBOuter));
|
uint const index = (col + (row * (*(tint_symbol_9)).dimBOuter));
|
||||||
(*(tint_symbol_8)).numbers[index] = value;
|
(*(tint_symbol_10)).numbers[index] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,19 +51,19 @@ uint tint_div(uint lhs, uint rhs) {
|
||||||
return (lhs / select(rhs, 1u, (rhs == 0u)));
|
return (lhs / select(rhs, 1u, (rhs == 0u)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void tint_symbol_inner(uint3 local_id, uint3 global_id, uint local_invocation_index, threadgroup tint_array<tint_array<float, 64>, 64>* const tint_symbol_9, threadgroup tint_array<tint_array<float, 64>, 64>* const tint_symbol_10, const constant Uniforms* const tint_symbol_11, const device Matrix* const tint_symbol_12, const device Matrix* const tint_symbol_13, device Matrix* const tint_symbol_14) {
|
void tint_symbol_inner(uint3 local_id, uint3 global_id, uint local_invocation_index, threadgroup tint_array<tint_array<float, 64>, 64>* const tint_symbol_11, threadgroup tint_array<tint_array<float, 64>, 64>* const tint_symbol_12, const constant Uniforms* const tint_symbol_13, const device Matrix* const tint_symbol_14, const device Matrix* const tint_symbol_15, device Matrix* const tint_symbol_16) {
|
||||||
for(uint idx = local_invocation_index; (idx < 4096u); idx = (idx + 256u)) {
|
for(uint idx = local_invocation_index; (idx < 4096u); idx = (idx + 256u)) {
|
||||||
uint const i = (idx / 64u);
|
uint const i = (idx / 64u);
|
||||||
uint const i_1 = (idx % 64u);
|
uint const i_1 = (idx % 64u);
|
||||||
(*(tint_symbol_9))[i][i_1] = 0.0f;
|
(*(tint_symbol_11))[i][i_1] = 0.0f;
|
||||||
(*(tint_symbol_10))[i][i_1] = 0.0f;
|
(*(tint_symbol_12))[i][i_1] = 0.0f;
|
||||||
}
|
}
|
||||||
threadgroup_barrier(mem_flags::mem_threadgroup);
|
threadgroup_barrier(mem_flags::mem_threadgroup);
|
||||||
uint const tileRow = (local_id[1] * 4u);
|
uint const tileRow = (local_id[1] * 4u);
|
||||||
uint const tileCol = (local_id[0] * 4u);
|
uint const tileCol = (local_id[0] * 4u);
|
||||||
uint const globalRow = (global_id[1] * 4u);
|
uint const globalRow = (global_id[1] * 4u);
|
||||||
uint const globalCol = (global_id[0] * 4u);
|
uint const globalCol = (global_id[0] * 4u);
|
||||||
uint const numTiles = (tint_div(((*(tint_symbol_11)).dimInner - 1u), 64u) + 1u);
|
uint const numTiles = (tint_div(((*(tint_symbol_13)).dimInner - 1u), 64u) + 1u);
|
||||||
tint_array<float, 16> acc = {};
|
tint_array<float, 16> acc = {};
|
||||||
float ACached = 0.0f;
|
float ACached = 0.0f;
|
||||||
tint_array<float, 4> BCached = {};
|
tint_array<float, 4> BCached = {};
|
||||||
|
@ -79,25 +79,27 @@ void tint_symbol_inner(uint3 local_id, uint3 global_id, uint local_invocation_in
|
||||||
for(uint innerCol = 0u; (innerCol < ColPerThreadA); innerCol = (innerCol + 1u)) {
|
for(uint innerCol = 0u; (innerCol < ColPerThreadA); innerCol = (innerCol + 1u)) {
|
||||||
uint const inputRow = (tileRow + innerRow);
|
uint const inputRow = (tileRow + innerRow);
|
||||||
uint const inputCol = (tileColA + innerCol);
|
uint const inputCol = (tileColA + innerCol);
|
||||||
float const tint_symbol_1 = mm_readA((globalRow + innerRow), ((t * 64u) + inputCol), tint_symbol_11, tint_symbol_12);
|
uint const tint_symbol_1 = inputRow;
|
||||||
(*(tint_symbol_9))[inputRow][inputCol] = tint_symbol_1;
|
uint const tint_symbol_2 = inputCol;
|
||||||
|
(*(tint_symbol_11))[tint_symbol_1][tint_symbol_2] = mm_readA((globalRow + innerRow), ((t * 64u) + inputCol), tint_symbol_13, tint_symbol_14);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(uint innerRow = 0u; (innerRow < RowPerThreadB); innerRow = (innerRow + 1u)) {
|
for(uint innerRow = 0u; (innerRow < RowPerThreadB); innerRow = (innerRow + 1u)) {
|
||||||
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
|
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
|
||||||
uint const inputRow = (tileRowB + innerRow);
|
uint const inputRow = (tileRowB + innerRow);
|
||||||
uint const inputCol = (tileCol + innerCol);
|
uint const inputCol = (tileCol + innerCol);
|
||||||
float const tint_symbol_2 = mm_readB(((t * 64u) + inputRow), (globalCol + innerCol), tint_symbol_11, tint_symbol_13);
|
uint const tint_symbol_3 = innerCol;
|
||||||
(*(tint_symbol_10))[innerCol][inputCol] = tint_symbol_2;
|
uint const tint_symbol_4 = inputCol;
|
||||||
|
(*(tint_symbol_12))[tint_symbol_3][tint_symbol_4] = mm_readB(((t * 64u) + inputRow), (globalCol + innerCol), tint_symbol_13, tint_symbol_15);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
threadgroup_barrier(mem_flags::mem_threadgroup);
|
threadgroup_barrier(mem_flags::mem_threadgroup);
|
||||||
for(uint k = 0u; (k < 64u); k = (k + 1u)) {
|
for(uint k = 0u; (k < 64u); k = (k + 1u)) {
|
||||||
for(uint inner = 0u; (inner < 4u); inner = (inner + 1u)) {
|
for(uint inner = 0u; (inner < 4u); inner = (inner + 1u)) {
|
||||||
BCached[inner] = (*(tint_symbol_10))[k][(tileCol + inner)];
|
BCached[inner] = (*(tint_symbol_12))[k][(tileCol + inner)];
|
||||||
}
|
}
|
||||||
for(uint innerRow = 0u; (innerRow < 4u); innerRow = (innerRow + 1u)) {
|
for(uint innerRow = 0u; (innerRow < 4u); innerRow = (innerRow + 1u)) {
|
||||||
ACached = (*(tint_symbol_9))[(tileRow + innerRow)][k];
|
ACached = (*(tint_symbol_11))[(tileRow + innerRow)][k];
|
||||||
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
|
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
|
||||||
uint const index = ((innerRow * 4u) + innerCol);
|
uint const index = ((innerRow * 4u) + innerCol);
|
||||||
acc[index] = (acc[index] + (ACached * BCached[innerCol]));
|
acc[index] = (acc[index] + (ACached * BCached[innerCol]));
|
||||||
|
@ -109,15 +111,15 @@ void tint_symbol_inner(uint3 local_id, uint3 global_id, uint local_invocation_in
|
||||||
for(uint innerRow = 0u; (innerRow < 4u); innerRow = (innerRow + 1u)) {
|
for(uint innerRow = 0u; (innerRow < 4u); innerRow = (innerRow + 1u)) {
|
||||||
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
|
for(uint innerCol = 0u; (innerCol < 4u); innerCol = (innerCol + 1u)) {
|
||||||
uint const index = ((innerRow * 4u) + innerCol);
|
uint const index = ((innerRow * 4u) + innerCol);
|
||||||
mm_write((globalRow + innerRow), (globalCol + innerCol), acc[index], tint_symbol_11, tint_symbol_14);
|
mm_write((globalRow + innerRow), (globalCol + innerCol), acc[index], tint_symbol_13, tint_symbol_16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
kernel void tint_symbol(const constant Uniforms* tint_symbol_17 [[buffer(0)]], const device Matrix* tint_symbol_18 [[buffer(2)]], const device Matrix* tint_symbol_19 [[buffer(3)]], device Matrix* tint_symbol_20 [[buffer(1)]], uint3 local_id [[thread_position_in_threadgroup]], uint3 global_id [[thread_position_in_grid]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
|
kernel void tint_symbol(const constant Uniforms* tint_symbol_19 [[buffer(0)]], const device Matrix* tint_symbol_20 [[buffer(2)]], const device Matrix* tint_symbol_21 [[buffer(3)]], device Matrix* tint_symbol_22 [[buffer(1)]], uint3 local_id [[thread_position_in_threadgroup]], uint3 global_id [[thread_position_in_grid]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
|
||||||
threadgroup tint_array<tint_array<float, 64>, 64> tint_symbol_15;
|
threadgroup tint_array<tint_array<float, 64>, 64> tint_symbol_17;
|
||||||
threadgroup tint_array<tint_array<float, 64>, 64> tint_symbol_16;
|
threadgroup tint_array<tint_array<float, 64>, 64> tint_symbol_18;
|
||||||
tint_symbol_inner(local_id, global_id, local_invocation_index, &(tint_symbol_15), &(tint_symbol_16), tint_symbol_17, tint_symbol_18, tint_symbol_19, tint_symbol_20);
|
tint_symbol_inner(local_id, global_id, local_invocation_index, &(tint_symbol_17), &(tint_symbol_18), tint_symbol_19, tint_symbol_20, tint_symbol_21, tint_symbol_22);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -406,14 +406,14 @@
|
||||||
%228 = OpIAdd %uint %157 %227
|
%228 = OpIAdd %uint %157 %227
|
||||||
%229 = OpLoad %uint %innerCol
|
%229 = OpLoad %uint %innerCol
|
||||||
%230 = OpIAdd %uint %194 %229
|
%230 = OpIAdd %uint %194 %229
|
||||||
%232 = OpLoad %uint %innerRow
|
%231 = OpAccessChain %_ptr_Workgroup_float %mm_Asub %228 %230
|
||||||
%233 = OpIAdd %uint %161 %232
|
%233 = OpLoad %uint %innerRow
|
||||||
%234 = OpLoad %uint %t
|
%234 = OpIAdd %uint %161 %233
|
||||||
%235 = OpIMul %uint %234 %uint_64
|
%235 = OpLoad %uint %t
|
||||||
%236 = OpIAdd %uint %235 %230
|
%236 = OpIMul %uint %235 %uint_64
|
||||||
%231 = OpFunctionCall %float %mm_readA %233 %236
|
%237 = OpIAdd %uint %236 %230
|
||||||
%237 = OpAccessChain %_ptr_Workgroup_float %mm_Asub %228 %230
|
%232 = OpFunctionCall %float %mm_readA %234 %237
|
||||||
OpStore %237 %231
|
OpStore %231 %232
|
||||||
OpBranch %220
|
OpBranch %220
|
||||||
%220 = OpLabel
|
%220 = OpLabel
|
||||||
%238 = OpLoad %uint %innerCol
|
%238 = OpLoad %uint %innerCol
|
||||||
|
@ -460,15 +460,15 @@
|
||||||
%263 = OpIAdd %uint %196 %262
|
%263 = OpIAdd %uint %196 %262
|
||||||
%264 = OpLoad %uint %innerCol_0
|
%264 = OpLoad %uint %innerCol_0
|
||||||
%265 = OpIAdd %uint %159 %264
|
%265 = OpIAdd %uint %159 %264
|
||||||
%267 = OpLoad %uint %t
|
%266 = OpLoad %uint %innerCol_0
|
||||||
%268 = OpIMul %uint %267 %uint_64
|
%267 = OpAccessChain %_ptr_Workgroup_float %mm_Bsub %266 %265
|
||||||
%269 = OpIAdd %uint %268 %263
|
%269 = OpLoad %uint %t
|
||||||
%270 = OpLoad %uint %innerCol_0
|
%270 = OpIMul %uint %269 %uint_64
|
||||||
%271 = OpIAdd %uint %163 %270
|
%271 = OpIAdd %uint %270 %263
|
||||||
%266 = OpFunctionCall %float %mm_readB %269 %271
|
|
||||||
%272 = OpLoad %uint %innerCol_0
|
%272 = OpLoad %uint %innerCol_0
|
||||||
%273 = OpAccessChain %_ptr_Workgroup_float %mm_Bsub %272 %265
|
%273 = OpIAdd %uint %163 %272
|
||||||
OpStore %273 %266
|
%268 = OpFunctionCall %float %mm_readB %271 %273
|
||||||
|
OpStore %267 %268
|
||||||
OpBranch %255
|
OpBranch %255
|
||||||
%255 = OpLabel
|
%255 = OpLabel
|
||||||
%274 = OpLoad %uint %innerCol_0
|
%274 = OpLoad %uint %innerCol_0
|
||||||
|
|
|
@ -10,17 +10,16 @@ float3 Bad(uint index, float3 rd) {
|
||||||
|
|
||||||
RWByteAddressBuffer io : register(u0, space0);
|
RWByteAddressBuffer io : register(u0, space0);
|
||||||
|
|
||||||
struct tint_symbol_2 {
|
struct tint_symbol_1 {
|
||||||
uint idx : SV_GroupIndex;
|
uint idx : SV_GroupIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
void main_inner(uint idx) {
|
void main_inner(uint idx) {
|
||||||
const float3 tint_symbol = Bad(io.Load(12u), asfloat(io.Load3(0u)));
|
io.Store3(0u, asuint(Bad(io.Load(12u), asfloat(io.Load3(0u)))));
|
||||||
io.Store3(0u, asuint(tint_symbol));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main(tint_symbol_2 tint_symbol_1) {
|
void main(tint_symbol_1 tint_symbol) {
|
||||||
main_inner(tint_symbol_1.idx);
|
main_inner(tint_symbol.idx);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,17 +10,16 @@ float3 Bad(uint index, float3 rd) {
|
||||||
|
|
||||||
RWByteAddressBuffer io : register(u0, space0);
|
RWByteAddressBuffer io : register(u0, space0);
|
||||||
|
|
||||||
struct tint_symbol_2 {
|
struct tint_symbol_1 {
|
||||||
uint idx : SV_GroupIndex;
|
uint idx : SV_GroupIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
void main_inner(uint idx) {
|
void main_inner(uint idx) {
|
||||||
const float3 tint_symbol = Bad(io.Load(12u), asfloat(io.Load3(0u)));
|
io.Store3(0u, asuint(Bad(io.Load(12u), asfloat(io.Load3(0u)))));
|
||||||
io.Store3(0u, asuint(tint_symbol));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main(tint_symbol_2 tint_symbol_1) {
|
void main(tint_symbol_1 tint_symbol) {
|
||||||
main_inner(tint_symbol_1.idx);
|
main_inner(tint_symbol.idx);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,8 +16,7 @@ layout(binding = 0, std430) buffer io_block_ssbo {
|
||||||
} io;
|
} io;
|
||||||
|
|
||||||
void tint_symbol(uint idx) {
|
void tint_symbol(uint idx) {
|
||||||
vec3 tint_symbol_1 = Bad(io.inner.i, io.inner.v);
|
io.inner.v = Bad(io.inner.i, io.inner.v);
|
||||||
io.inner.v = tint_symbol_1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
|
|
@ -17,13 +17,12 @@ struct S {
|
||||||
uint i;
|
uint i;
|
||||||
};
|
};
|
||||||
|
|
||||||
void tint_symbol_inner(uint idx, device S_tint_packed_vec3* const tint_symbol_2) {
|
void tint_symbol_inner(uint idx, device S_tint_packed_vec3* const tint_symbol_1) {
|
||||||
float3 const tint_symbol_1 = Bad((*(tint_symbol_2)).i, float3((*(tint_symbol_2)).v));
|
(*(tint_symbol_1)).v = packed_float3(Bad((*(tint_symbol_1)).i, float3((*(tint_symbol_1)).v)));
|
||||||
(*(tint_symbol_2)).v = packed_float3(tint_symbol_1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kernel void tint_symbol(device S_tint_packed_vec3* tint_symbol_3 [[buffer(0)]], uint idx [[thread_index_in_threadgroup]]) {
|
kernel void tint_symbol(device S_tint_packed_vec3* tint_symbol_2 [[buffer(0)]], uint idx [[thread_index_in_threadgroup]]) {
|
||||||
tint_symbol_inner(idx, tint_symbol_3);
|
tint_symbol_inner(idx, tint_symbol_2);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,9 +45,9 @@
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%26 = OpTypeFunction %void %uint
|
%26 = OpTypeFunction %void %uint
|
||||||
%uint_0 = OpConstant %uint 0
|
%uint_0 = OpConstant %uint 0
|
||||||
|
%_ptr_StorageBuffer_v3float = OpTypePointer StorageBuffer %v3float
|
||||||
%uint_1 = OpConstant %uint 1
|
%uint_1 = OpConstant %uint 1
|
||||||
%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
|
%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
|
||||||
%_ptr_StorageBuffer_v3float = OpTypePointer StorageBuffer %v3float
|
|
||||||
%41 = OpTypeFunction %void
|
%41 = OpTypeFunction %void
|
||||||
%Bad = OpFunction %v3float None %10
|
%Bad = OpFunction %v3float None %10
|
||||||
%index = OpFunctionParameter %uint
|
%index = OpFunctionParameter %uint
|
||||||
|
@ -67,13 +67,13 @@
|
||||||
%main_inner = OpFunction %void None %26
|
%main_inner = OpFunction %void None %26
|
||||||
%idx = OpFunctionParameter %uint
|
%idx = OpFunctionParameter %uint
|
||||||
%30 = OpLabel
|
%30 = OpLabel
|
||||||
%35 = OpAccessChain %_ptr_StorageBuffer_uint %io %uint_0 %uint_1
|
%33 = OpAccessChain %_ptr_StorageBuffer_v3float %io %uint_0 %uint_0
|
||||||
%36 = OpLoad %uint %35
|
%37 = OpAccessChain %_ptr_StorageBuffer_uint %io %uint_0 %uint_1
|
||||||
%38 = OpAccessChain %_ptr_StorageBuffer_v3float %io %uint_0 %uint_0
|
%38 = OpLoad %uint %37
|
||||||
%39 = OpLoad %v3float %38
|
%39 = OpAccessChain %_ptr_StorageBuffer_v3float %io %uint_0 %uint_0
|
||||||
%31 = OpFunctionCall %v3float %Bad %36 %39
|
%40 = OpLoad %v3float %39
|
||||||
%40 = OpAccessChain %_ptr_StorageBuffer_v3float %io %uint_0 %uint_0
|
%34 = OpFunctionCall %v3float %Bad %38 %40
|
||||||
OpStore %40 %31
|
OpStore %33 %34
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
%main = OpFunction %void None %41
|
%main = OpFunction %void None %41
|
||||||
|
|
|
@ -20,7 +20,6 @@ int runTest() {
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
const int tint_symbol = runTest();
|
const int tint_symbol = runTest();
|
||||||
const uint tint_symbol_1 = uint(tint_symbol);
|
result.Store(0u, asuint(uint(tint_symbol)));
|
||||||
result.Store(0u, asuint(tint_symbol_1));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@ int runTest() {
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
const int tint_symbol = runTest();
|
const int tint_symbol = runTest();
|
||||||
const uint tint_symbol_1 = uint(tint_symbol);
|
result.Store(0u, asuint(uint(tint_symbol)));
|
||||||
result.Store(0u, asuint(tint_symbol_1));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,8 +33,7 @@ int runTest() {
|
||||||
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
int tint_symbol_1 = runTest();
|
int tint_symbol_1 = runTest();
|
||||||
uint tint_symbol_2 = uint(tint_symbol_1);
|
result.inner.value = uint(tint_symbol_1);
|
||||||
result.inner.value = tint_symbol_2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
|
|
@ -26,14 +26,13 @@ struct TestData {
|
||||||
/* 0x0000 */ tint_array<atomic_int, 3> data;
|
/* 0x0000 */ tint_array<atomic_int, 3> data;
|
||||||
};
|
};
|
||||||
|
|
||||||
int runTest(device TestData* const tint_symbol_3, const constant Constants* const tint_symbol_4) {
|
int runTest(device TestData* const tint_symbol_2, const constant Constants* const tint_symbol_3) {
|
||||||
return atomic_load_explicit(&((*(tint_symbol_3)).data[(0u + uint((*(tint_symbol_4)).zero))]), memory_order_relaxed);
|
return atomic_load_explicit(&((*(tint_symbol_2)).data[(0u + uint((*(tint_symbol_3)).zero))]), memory_order_relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
kernel void tint_symbol(device TestData* tint_symbol_5 [[buffer(2)]], const constant Constants* tint_symbol_6 [[buffer(0)]], device Result* tint_symbol_7 [[buffer(1)]]) {
|
kernel void tint_symbol(device TestData* tint_symbol_4 [[buffer(2)]], const constant Constants* tint_symbol_5 [[buffer(0)]], device Result* tint_symbol_6 [[buffer(1)]]) {
|
||||||
int const tint_symbol_1 = runTest(tint_symbol_5, tint_symbol_6);
|
int const tint_symbol_1 = runTest(tint_symbol_4, tint_symbol_5);
|
||||||
uint const tint_symbol_2 = uint(tint_symbol_1);
|
(*(tint_symbol_6)).value = uint(tint_symbol_1);
|
||||||
(*(tint_symbol_7)).value = tint_symbol_2;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,8 +78,8 @@
|
||||||
%main = OpFunction %void None %32
|
%main = OpFunction %void None %32
|
||||||
%35 = OpLabel
|
%35 = OpLabel
|
||||||
%36 = OpFunctionCall %int %runTest
|
%36 = OpFunctionCall %int %runTest
|
||||||
%37 = OpBitcast %uint %36
|
%38 = OpAccessChain %_ptr_StorageBuffer_uint %result %uint_0 %uint_0
|
||||||
%39 = OpAccessChain %_ptr_StorageBuffer_uint %result %uint_0 %uint_0
|
%39 = OpBitcast %uint %36
|
||||||
OpStore %39 %37
|
OpStore %38 %39
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
|
|
@ -10,15 +10,15 @@ float2x2 arr_to_mat2x2_stride_16(strided_arr arr[2]) {
|
||||||
|
|
||||||
typedef strided_arr mat2x2_stride_16_to_arr_ret[2];
|
typedef strided_arr mat2x2_stride_16_to_arr_ret[2];
|
||||||
mat2x2_stride_16_to_arr_ret mat2x2_stride_16_to_arr(float2x2 m) {
|
mat2x2_stride_16_to_arr_ret mat2x2_stride_16_to_arr(float2x2 m) {
|
||||||
const strided_arr tint_symbol_1 = {m[0u]};
|
const strided_arr tint_symbol = {m[0u]};
|
||||||
const strided_arr tint_symbol_2 = {m[1u]};
|
const strided_arr tint_symbol_1 = {m[1u]};
|
||||||
const strided_arr tint_symbol_3[2] = {tint_symbol_1, tint_symbol_2};
|
const strided_arr tint_symbol_2[2] = {tint_symbol, tint_symbol_1};
|
||||||
return tint_symbol_3;
|
return tint_symbol_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
strided_arr ssbo_load_1(uint offset) {
|
strided_arr ssbo_load_1(uint offset) {
|
||||||
const strided_arr tint_symbol_4 = {asfloat(ssbo.Load2((offset + 0u)))};
|
const strided_arr tint_symbol_3 = {asfloat(ssbo.Load2((offset + 0u)))};
|
||||||
return tint_symbol_4;
|
return tint_symbol_3;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef strided_arr ssbo_load_ret[2];
|
typedef strided_arr ssbo_load_ret[2];
|
||||||
|
@ -47,8 +47,7 @@ void ssbo_store(uint offset, strided_arr value[2]) {
|
||||||
|
|
||||||
void f_1() {
|
void f_1() {
|
||||||
const float2x2 x_15 = arr_to_mat2x2_stride_16(ssbo_load(0u));
|
const float2x2 x_15 = arr_to_mat2x2_stride_16(ssbo_load(0u));
|
||||||
const strided_arr tint_symbol[2] = mat2x2_stride_16_to_arr(x_15);
|
ssbo_store(0u, mat2x2_stride_16_to_arr(x_15));
|
||||||
ssbo_store(0u, tint_symbol);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,15 +10,15 @@ float2x2 arr_to_mat2x2_stride_16(strided_arr arr[2]) {
|
||||||
|
|
||||||
typedef strided_arr mat2x2_stride_16_to_arr_ret[2];
|
typedef strided_arr mat2x2_stride_16_to_arr_ret[2];
|
||||||
mat2x2_stride_16_to_arr_ret mat2x2_stride_16_to_arr(float2x2 m) {
|
mat2x2_stride_16_to_arr_ret mat2x2_stride_16_to_arr(float2x2 m) {
|
||||||
const strided_arr tint_symbol_1 = {m[0u]};
|
const strided_arr tint_symbol = {m[0u]};
|
||||||
const strided_arr tint_symbol_2 = {m[1u]};
|
const strided_arr tint_symbol_1 = {m[1u]};
|
||||||
const strided_arr tint_symbol_3[2] = {tint_symbol_1, tint_symbol_2};
|
const strided_arr tint_symbol_2[2] = {tint_symbol, tint_symbol_1};
|
||||||
return tint_symbol_3;
|
return tint_symbol_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
strided_arr ssbo_load_1(uint offset) {
|
strided_arr ssbo_load_1(uint offset) {
|
||||||
const strided_arr tint_symbol_4 = {asfloat(ssbo.Load2((offset + 0u)))};
|
const strided_arr tint_symbol_3 = {asfloat(ssbo.Load2((offset + 0u)))};
|
||||||
return tint_symbol_4;
|
return tint_symbol_3;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef strided_arr ssbo_load_ret[2];
|
typedef strided_arr ssbo_load_ret[2];
|
||||||
|
@ -47,8 +47,7 @@ void ssbo_store(uint offset, strided_arr value[2]) {
|
||||||
|
|
||||||
void f_1() {
|
void f_1() {
|
||||||
const float2x2 x_15 = arr_to_mat2x2_stride_16(ssbo_load(0u));
|
const float2x2 x_15 = arr_to_mat2x2_stride_16(ssbo_load(0u));
|
||||||
const strided_arr tint_symbol[2] = mat2x2_stride_16_to_arr(x_15);
|
ssbo_store(0u, mat2x2_stride_16_to_arr(x_15));
|
||||||
ssbo_store(0u, tint_symbol);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,9 +32,8 @@ layout(binding = 4, std140) uniform uniforms_block_ubo {
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
InnerS v = InnerS(0);
|
InnerS v = InnerS(0);
|
||||||
OuterS s = OuterS(S1[8](S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0)))));
|
OuterS s = OuterS(S1[8](S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0))), S1(InnerS[8](InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0), InnerS(0)))));
|
||||||
InnerS tint_symbol_1 = v;
|
uint tint_symbol_1 = getNextIndex();
|
||||||
uint tint_symbol_2 = getNextIndex();
|
s.a1[tint_symbol_1].a2[uniforms.inner.j] = v;
|
||||||
s.a1[tint_symbol_2].a2[uniforms.inner.j] = tint_symbol_1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
|
|
@ -32,17 +32,16 @@ struct OuterS {
|
||||||
};
|
};
|
||||||
|
|
||||||
uint getNextIndex() {
|
uint getNextIndex() {
|
||||||
thread uint tint_symbol_3 = 0u;
|
thread uint tint_symbol_2 = 0u;
|
||||||
tint_symbol_3 = (tint_symbol_3 + 1u);
|
tint_symbol_2 = (tint_symbol_2 + 1u);
|
||||||
return tint_symbol_3;
|
return tint_symbol_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
kernel void tint_symbol(const constant Uniforms* tint_symbol_4 [[buffer(0)]]) {
|
kernel void tint_symbol(const constant Uniforms* tint_symbol_3 [[buffer(0)]]) {
|
||||||
InnerS v = {};
|
InnerS v = {};
|
||||||
OuterS s = {};
|
OuterS s = {};
|
||||||
InnerS const tint_symbol_1 = v;
|
uint const tint_symbol_1 = getNextIndex();
|
||||||
uint const tint_symbol_2 = getNextIndex();
|
s.a1[tint_symbol_1].a2[(*(tint_symbol_3)).j] = v;
|
||||||
s.a1[tint_symbol_2].a2[(*(tint_symbol_4)).j] = tint_symbol_1;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,11 +73,11 @@
|
||||||
%19 = OpLabel
|
%19 = OpLabel
|
||||||
%v = OpVariable %_ptr_Function_InnerS Function %24
|
%v = OpVariable %_ptr_Function_InnerS Function %24
|
||||||
%s = OpVariable %_ptr_Function_OuterS Function %32
|
%s = OpVariable %_ptr_Function_OuterS Function %32
|
||||||
%33 = OpLoad %InnerS %v
|
%33 = OpFunctionCall %uint %getNextIndex
|
||||||
%34 = OpFunctionCall %uint %getNextIndex
|
%36 = OpAccessChain %_ptr_Uniform_uint %uniforms %uint_0 %uint_1
|
||||||
%37 = OpAccessChain %_ptr_Uniform_uint %uniforms %uint_0 %uint_1
|
%37 = OpLoad %uint %36
|
||||||
%38 = OpLoad %uint %37
|
%38 = OpAccessChain %_ptr_Function_InnerS %s %uint_0 %33 %uint_0 %37
|
||||||
%39 = OpAccessChain %_ptr_Function_InnerS %s %uint_0 %34 %uint_0 %38
|
%39 = OpLoad %InnerS %v
|
||||||
OpStore %39 %33
|
OpStore %38 %39
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
|
|
@ -68,6 +68,11 @@
|
||||||
|
|
||||||
# Last rolled: 2023-03-03 12:32:02AM
|
# Last rolled: 2023-03-03 12:32:02AM
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# Evaluation order for assignments is changing
|
||||||
|
################################################################################
|
||||||
|
crbug.com/tint/1867 webgpu:shader,execution,evaluation_order:assignment:* [ Failure ]
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# copyToTexture failures on Linux
|
# copyToTexture failures on Linux
|
||||||
# Skipped instead of just Crash because of the number of failures
|
# Skipped instead of just Crash because of the number of failures
|
||||||
|
|
Loading…
Reference in New Issue