mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-12 22:56:09 +00:00
intrinsics: Remove deprected arrayLength instrinsic
Fixed: tint:806 Change-Id: I1d4ad27af73a1f64b926af64a123e2c0c2941e29 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/55240 Kokoro: Kokoro <noreply+kokoro@google.com> Auto-Submit: Ben Clayton <bclayton@google.com> Reviewed-by: David Neto <dneto@google.com>
This commit is contained in:
@@ -608,7 +608,7 @@ let c : u32 = 1u;
|
||||
fn f() {
|
||||
let b : f32 = s.b[c];
|
||||
let x : i32 = min(1, 2);
|
||||
let y : u32 = arrayLength(s.b);
|
||||
let y : u32 = arrayLength(&s.b);
|
||||
}
|
||||
)";
|
||||
|
||||
@@ -626,7 +626,7 @@ let c : u32 = 1u;
|
||||
fn f() {
|
||||
let b : f32 = s.b[min(u32(c), (arrayLength(&(s.b)) - 1u))];
|
||||
let x : i32 = min(1, 2);
|
||||
let y : u32 = arrayLength(s.b);
|
||||
let y : u32 = arrayLength(&(s.b));
|
||||
}
|
||||
)";
|
||||
|
||||
|
||||
@@ -129,23 +129,22 @@ Output CalculateArrayLength::Run(const Program* in, const DataMap&) {
|
||||
// * An expression must not evaluate to a runtime-sized array type.
|
||||
//
|
||||
// We can assume that the arrayLength() call has a single argument of
|
||||
// the form: arrayLength(&X.Y) or the now deprecated form
|
||||
// arrayLength(X.Y) where X is an expression that resolves to the
|
||||
// storage buffer structure, and Y is the runtime sized array.
|
||||
auto* array_expr = call_expr->params()[0];
|
||||
|
||||
// TODO(crbug.com/tint/806): Once the deprecated arrayLength()
|
||||
// overload is removed, this can safely assume a pointer arg.
|
||||
if (auto* address_of = array_expr->As<ast::UnaryOpExpression>()) {
|
||||
if (address_of->op() == ast::UnaryOp::kAddressOf) {
|
||||
array_expr = address_of->expr();
|
||||
}
|
||||
// the form: arrayLength(&X.Y) where X is an expression that resolves
|
||||
// to the storage buffer structure, and Y is the runtime sized array.
|
||||
auto* arg = call_expr->params()[0];
|
||||
auto* address_of = arg->As<ast::UnaryOpExpression>();
|
||||
if (!address_of || address_of->op() != ast::UnaryOp::kAddressOf) {
|
||||
TINT_ICE(ctx.dst->Diagnostics())
|
||||
<< "arrayLength() expected pointer to member access, got "
|
||||
<< address_of->TypeInfo().name;
|
||||
}
|
||||
auto* array_expr = address_of->expr();
|
||||
|
||||
auto* accessor = array_expr->As<ast::MemberAccessorExpression>();
|
||||
if (!accessor) {
|
||||
TINT_ICE(ctx.dst->Diagnostics())
|
||||
<< "arrayLength() expected ast::MemberAccessorExpression, got "
|
||||
<< "arrayLength() expected pointer to member access, got "
|
||||
"pointer to "
|
||||
<< array_expr->TypeInfo().name;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -22,268 +22,6 @@ namespace {
|
||||
|
||||
using CalculateArrayLengthTest = TransformTest;
|
||||
|
||||
// TODO(crbug.com/tint/806): Remove
|
||||
TEST_F(CalculateArrayLengthTest, Basic_DEPRECATED) {
|
||||
auto* src = R"(
|
||||
[[block]]
|
||||
struct SB {
|
||||
x : i32;
|
||||
arr : array<i32>;
|
||||
};
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read> sb : SB;
|
||||
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
var len : u32 = arrayLength(sb.arr);
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[block]]
|
||||
struct SB {
|
||||
x : i32;
|
||||
arr : array<i32>;
|
||||
};
|
||||
|
||||
[[internal(intrinsic_buffer_size)]]
|
||||
fn tint_symbol(buffer : SB, result : ptr<function, u32>)
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read> sb : SB;
|
||||
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
var tint_symbol_1 : u32 = 0u;
|
||||
tint_symbol(sb, &(tint_symbol_1));
|
||||
let tint_symbol_2 : u32 = ((tint_symbol_1 - 4u) / 4u);
|
||||
var len : u32 = tint_symbol_2;
|
||||
}
|
||||
)";
|
||||
|
||||
auto got = Run<CalculateArrayLength>(src);
|
||||
|
||||
EXPECT_EQ(expect, str(got));
|
||||
}
|
||||
|
||||
// TODO(crbug.com/tint/806): Remove
|
||||
TEST_F(CalculateArrayLengthTest, InSameBlock_DEPRECATED) {
|
||||
auto* src = R"(
|
||||
[[block]]
|
||||
struct SB {
|
||||
x : i32;
|
||||
arr : array<i32>;
|
||||
};
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read> sb : SB;
|
||||
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
var a : u32 = arrayLength(sb.arr);
|
||||
var b : u32 = arrayLength(sb.arr);
|
||||
var c : u32 = arrayLength(sb.arr);
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[block]]
|
||||
struct SB {
|
||||
x : i32;
|
||||
arr : array<i32>;
|
||||
};
|
||||
|
||||
[[internal(intrinsic_buffer_size)]]
|
||||
fn tint_symbol(buffer : SB, result : ptr<function, u32>)
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read> sb : SB;
|
||||
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
var tint_symbol_1 : u32 = 0u;
|
||||
tint_symbol(sb, &(tint_symbol_1));
|
||||
let tint_symbol_2 : u32 = ((tint_symbol_1 - 4u) / 4u);
|
||||
var a : u32 = tint_symbol_2;
|
||||
var b : u32 = tint_symbol_2;
|
||||
var c : u32 = tint_symbol_2;
|
||||
}
|
||||
)";
|
||||
|
||||
auto got = Run<CalculateArrayLength>(src);
|
||||
|
||||
EXPECT_EQ(expect, str(got));
|
||||
}
|
||||
|
||||
// TODO(crbug.com/tint/806): Remove
|
||||
TEST_F(CalculateArrayLengthTest, WithStride_DEPRECATED) {
|
||||
auto* src = R"(
|
||||
[[block]]
|
||||
struct SB {
|
||||
x : i32;
|
||||
y : f32;
|
||||
arr : [[stride(64)]] array<i32>;
|
||||
};
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read> sb : SB;
|
||||
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
var len : u32 = arrayLength(sb.arr);
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[block]]
|
||||
struct SB {
|
||||
x : i32;
|
||||
y : f32;
|
||||
arr : [[stride(64)]] array<i32>;
|
||||
};
|
||||
|
||||
[[internal(intrinsic_buffer_size)]]
|
||||
fn tint_symbol(buffer : SB, result : ptr<function, u32>)
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read> sb : SB;
|
||||
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
var tint_symbol_1 : u32 = 0u;
|
||||
tint_symbol(sb, &(tint_symbol_1));
|
||||
let tint_symbol_2 : u32 = ((tint_symbol_1 - 8u) / 64u);
|
||||
var len : u32 = tint_symbol_2;
|
||||
}
|
||||
)";
|
||||
|
||||
auto got = Run<CalculateArrayLength>(src);
|
||||
|
||||
EXPECT_EQ(expect, str(got));
|
||||
}
|
||||
|
||||
// TODO(crbug.com/tint/806): Remove
|
||||
TEST_F(CalculateArrayLengthTest, Nested_DEPRECATED) {
|
||||
auto* src = R"(
|
||||
[[block]]
|
||||
struct SB {
|
||||
x : i32;
|
||||
arr : array<i32>;
|
||||
};
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read> sb : SB;
|
||||
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
if (true) {
|
||||
var len : u32 = arrayLength(sb.arr);
|
||||
} else {
|
||||
if (true) {
|
||||
var len : u32 = arrayLength(sb.arr);
|
||||
}
|
||||
}
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[block]]
|
||||
struct SB {
|
||||
x : i32;
|
||||
arr : array<i32>;
|
||||
};
|
||||
|
||||
[[internal(intrinsic_buffer_size)]]
|
||||
fn tint_symbol(buffer : SB, result : ptr<function, u32>)
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read> sb : SB;
|
||||
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
if (true) {
|
||||
var tint_symbol_1 : u32 = 0u;
|
||||
tint_symbol(sb, &(tint_symbol_1));
|
||||
let tint_symbol_2 : u32 = ((tint_symbol_1 - 4u) / 4u);
|
||||
var len : u32 = tint_symbol_2;
|
||||
} else {
|
||||
if (true) {
|
||||
var tint_symbol_3 : u32 = 0u;
|
||||
tint_symbol(sb, &(tint_symbol_3));
|
||||
let tint_symbol_4 : u32 = ((tint_symbol_3 - 4u) / 4u);
|
||||
var len : u32 = tint_symbol_4;
|
||||
}
|
||||
}
|
||||
}
|
||||
)";
|
||||
|
||||
auto got = Run<CalculateArrayLength>(src);
|
||||
|
||||
EXPECT_EQ(expect, str(got));
|
||||
}
|
||||
|
||||
// TODO(crbug.com/tint/806): Remove
|
||||
TEST_F(CalculateArrayLengthTest, MultipleStorageBuffers_DEPRECATED) {
|
||||
auto* src = R"(
|
||||
[[block]]
|
||||
struct SB1 {
|
||||
x : i32;
|
||||
arr1 : array<i32>;
|
||||
};
|
||||
|
||||
[[block]]
|
||||
struct SB2 {
|
||||
x : i32;
|
||||
arr2 : array<vec4<f32>>;
|
||||
};
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read> sb1 : SB1;
|
||||
|
||||
[[group(0), binding(1)]] var<storage, read> sb2 : SB2;
|
||||
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
var len1 : u32 = arrayLength(sb1.arr1);
|
||||
var len2 : u32 = arrayLength(sb2.arr2);
|
||||
var x : u32 = (len1 + len2);
|
||||
}
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[block]]
|
||||
struct SB1 {
|
||||
x : i32;
|
||||
arr1 : array<i32>;
|
||||
};
|
||||
|
||||
[[internal(intrinsic_buffer_size)]]
|
||||
fn tint_symbol(buffer : SB1, result : ptr<function, u32>)
|
||||
|
||||
[[block]]
|
||||
struct SB2 {
|
||||
x : i32;
|
||||
arr2 : array<vec4<f32>>;
|
||||
};
|
||||
|
||||
[[internal(intrinsic_buffer_size)]]
|
||||
fn tint_symbol_3(buffer : SB2, result : ptr<function, u32>)
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read> sb1 : SB1;
|
||||
|
||||
[[group(0), binding(1)]] var<storage, read> sb2 : SB2;
|
||||
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
var tint_symbol_1 : u32 = 0u;
|
||||
tint_symbol(sb1, &(tint_symbol_1));
|
||||
let tint_symbol_2 : u32 = ((tint_symbol_1 - 4u) / 4u);
|
||||
var tint_symbol_4 : u32 = 0u;
|
||||
tint_symbol_3(sb2, &(tint_symbol_4));
|
||||
let tint_symbol_5 : u32 = ((tint_symbol_4 - 16u) / 16u);
|
||||
var len1 : u32 = tint_symbol_2;
|
||||
var len2 : u32 = tint_symbol_5;
|
||||
var x : u32 = (len1 + len2);
|
||||
}
|
||||
)";
|
||||
|
||||
auto got = Run<CalculateArrayLength>(src);
|
||||
|
||||
EXPECT_EQ(expect, str(got));
|
||||
}
|
||||
|
||||
TEST_F(CalculateArrayLengthTest, Basic) {
|
||||
auto* src = R"(
|
||||
[[block]]
|
||||
|
||||
Reference in New Issue
Block a user