mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-21 10:49:14 +00:00
Tint: Implement f16 in uniform and storage address space
This CL implements f16 in uniform and storage address space, allowing using f16 types in uniform and storage buffers on all backends. Tint uint tests and Dawn E2E tests are added to validate the f16 types work as expected. Bug: tint:1473, tint:1502 Change-Id: I15e3de1033d3727f2ea33f4657f682c5f13c2153 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/106320 Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Zhaoming Jiang <zhaoming.jiang@intel.com> Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
committed by
Dawn LUCI CQ
parent
ff2b5e441c
commit
ab9b5f3aa5
@@ -363,6 +363,29 @@ TEST_F(ResolverAddressSpaceLayoutValidationTest, UniformBuffer_Vec3MemberOffset_
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
// Make sure that this doesn't fail validation because vec3's align is 8, but
|
||||
// size is 6. 's' should be at offset 6, which is okay here.
|
||||
TEST_F(ResolverAddressSpaceLayoutValidationTest, UniformBuffer_Vec3F16MemberOffset_NoFail) {
|
||||
// struct ScalarPackedAtEndOfVec3 {
|
||||
// v : vec3<f16>;
|
||||
// s : f16;
|
||||
// };
|
||||
// @group(0) @binding(0)
|
||||
// var<uniform> a : ScalarPackedAtEndOfVec3;
|
||||
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
Structure("ScalarPackedAtEndOfVec3", utils::Vector{
|
||||
Member("v", ty.vec3(ty.f16())),
|
||||
Member("s", ty.f16()),
|
||||
});
|
||||
|
||||
GlobalVar(Source{{78, 90}}, "a", ty.type_name("ScalarPackedAtEndOfVec3"),
|
||||
ast::AddressSpace::kUniform, Group(0_a), Binding(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
// Detect array stride must be a multiple of 16 bytes for uniform buffers
|
||||
TEST_F(ResolverAddressSpaceLayoutValidationTest, UniformBuffer_InvalidArrayStride_Scalar) {
|
||||
// type Inner = array<f32, 10u>;
|
||||
|
||||
@@ -113,98 +113,6 @@ TEST_F(ResolverAddressSpaceValidationTest, StorageBufferBoolAlias) {
|
||||
56:78 note: while instantiating 'var' g)");
|
||||
}
|
||||
|
||||
// F16 types in storage and uniform buffer is not implemented yet.
|
||||
// TODO(tint:1473, tint:1502): make these testcases valid after f16 is supported.
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferF16_TemporallyBan) {
|
||||
// var<storage> g : f16;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
GlobalVar("g", ty.f16(Source{{56, 78}}), ast::AddressSpace::kStorage, Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_FALSE(r()->Resolve());
|
||||
|
||||
EXPECT_EQ(r()->error(),
|
||||
"56:78 error: using f16 types in 'storage' address space is not "
|
||||
"implemented yet");
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferF16Alias_TemporallyBan) {
|
||||
// type a = f16;
|
||||
// var<storage, read> g : a;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* a = Alias("a", ty.f16());
|
||||
GlobalVar("g", ty.type_name(Source{{56, 78}}, a->name), ast::AddressSpace::kStorage,
|
||||
Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_FALSE(r()->Resolve());
|
||||
|
||||
EXPECT_EQ(r()->error(),
|
||||
"56:78 error: using f16 types in 'storage' address space is not "
|
||||
"implemented yet");
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferVectorF16_TemporallyBan) {
|
||||
// var<storage> g : vec4<f16>;
|
||||
Enable(ast::Extension::kF16);
|
||||
GlobalVar("g", ty.vec(Source{{56, 78}}, ty.Of<f16>(), 4u), ast::AddressSpace::kStorage,
|
||||
Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_FALSE(r()->Resolve());
|
||||
|
||||
EXPECT_EQ(r()->error(),
|
||||
"56:78 error: using f16 types in 'storage' address space is not "
|
||||
"implemented yet");
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferArrayF16_TemporallyBan) {
|
||||
// struct S { a : f16 };
|
||||
// var<storage, read> g : array<S, 3u>;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* s = Structure("S", utils::Vector{Member("a", ty.f16(Source{{56, 78}}))});
|
||||
auto* a = ty.array(ty.Of(s), 3_u);
|
||||
GlobalVar("g", a, ast::AddressSpace::kStorage, ast::Access::kRead, Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_FALSE(r()->Resolve());
|
||||
|
||||
EXPECT_THAT(r()->error(), HasSubstr("56:78 error: using f16 types in 'storage' address "
|
||||
"space is not implemented yet"));
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferStructF16_TemporallyBan) {
|
||||
// struct S { x : f16 };
|
||||
// var<storage, read> g : S;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* s = Structure("S", utils::Vector{Member("x", ty.f16(Source{{12, 34}}))});
|
||||
GlobalVar("g", ty.Of(s), ast::AddressSpace::kStorage, ast::Access::kRead, Binding(0_a),
|
||||
Group(0_a));
|
||||
|
||||
ASSERT_FALSE(r()->Resolve());
|
||||
|
||||
EXPECT_THAT(r()->error(), HasSubstr("12:34 error: using f16 types in 'storage' address "
|
||||
"space is not implemented yet"));
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferNoErrorStructF16Aliases_TemporallyBan) {
|
||||
// struct S { x : f16 };
|
||||
// type a1 = S;
|
||||
// var<storage, read> g : a1;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* s = Structure("S", utils::Vector{Member("x", ty.f16(Source{{12, 34}}))});
|
||||
auto* a1 = Alias("a1", ty.Of(s));
|
||||
auto* a2 = Alias("a2", ty.Of(a1));
|
||||
GlobalVar("g", ty.Of(a2), ast::AddressSpace::kStorage, ast::Access::kRead, Binding(0_a),
|
||||
Group(0_a));
|
||||
|
||||
ASSERT_FALSE(r()->Resolve());
|
||||
|
||||
EXPECT_THAT(r()->error(), HasSubstr("12:34 error: using f16 types in 'storage' address "
|
||||
"space is not implemented yet"));
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferPointer) {
|
||||
// var<storage> g : ptr<private, f32>;
|
||||
GlobalVar(Source{{56, 78}}, "g", ty.pointer(ty.f32(), ast::AddressSpace::kPrivate),
|
||||
@@ -226,6 +134,27 @@ TEST_F(ResolverAddressSpaceValidationTest, StorageBufferIntScalar) {
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferF16) {
|
||||
// var<storage> g : f16;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
GlobalVar("g", ty.f16(Source{{56, 78}}), ast::AddressSpace::kStorage, Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferF16Alias) {
|
||||
// type a = f16;
|
||||
// var<storage, read> g : a;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* a = Alias("a", ty.f16());
|
||||
GlobalVar("g", ty.type_name(Source{{56, 78}}, a->name), ast::AddressSpace::kStorage,
|
||||
Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferVectorF32) {
|
||||
// var<storage> g : vec4<f32>;
|
||||
GlobalVar(Source{{56, 78}}, "g", ty.vec4<f32>(), ast::AddressSpace::kStorage, Binding(0_a),
|
||||
@@ -234,6 +163,15 @@ TEST_F(ResolverAddressSpaceValidationTest, StorageBufferVectorF32) {
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferVectorF16) {
|
||||
// var<storage> g : vec4<f16>;
|
||||
Enable(ast::Extension::kF16);
|
||||
GlobalVar("g", ty.vec(Source{{56, 78}}, ty.Of<f16>(), 4u), ast::AddressSpace::kStorage,
|
||||
Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferArrayF32) {
|
||||
// var<storage, read> g : array<S, 3u>;
|
||||
auto* s = Structure("S", utils::Vector{Member("a", ty.f32())});
|
||||
@@ -244,6 +182,68 @@ TEST_F(ResolverAddressSpaceValidationTest, StorageBufferArrayF32) {
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferArrayF16) {
|
||||
// var<storage, read> g : array<S, 3u>;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* s = Structure("S", utils::Vector{Member("a", ty.f16())});
|
||||
auto* a = ty.array(ty.Of(s), 3_u);
|
||||
GlobalVar(Source{{56, 78}}, "g", a, ast::AddressSpace::kStorage, ast::Access::kRead,
|
||||
Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferStructI32) {
|
||||
// struct S { x : i32 };
|
||||
// var<storage, read> g : S;
|
||||
auto* s = Structure("S", utils::Vector{Member(Source{{12, 34}}, "x", ty.i32())});
|
||||
GlobalVar(Source{{56, 78}}, "g", ty.Of(s), ast::AddressSpace::kStorage, ast::Access::kRead,
|
||||
Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferStructI32Aliases) {
|
||||
// struct S { x : i32 };
|
||||
// type a1 = S;
|
||||
// var<storage, read> g : a1;
|
||||
auto* s = Structure("S", utils::Vector{Member(Source{{12, 34}}, "x", ty.i32())});
|
||||
auto* a1 = Alias("a1", ty.Of(s));
|
||||
auto* a2 = Alias("a2", ty.Of(a1));
|
||||
GlobalVar(Source{{56, 78}}, "g", ty.Of(a2), ast::AddressSpace::kStorage, ast::Access::kRead,
|
||||
Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferStructF16) {
|
||||
// struct S { x : f16 };
|
||||
// var<storage, read> g : S;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* s = Structure("S", utils::Vector{Member("x", ty.f16(Source{{12, 34}}))});
|
||||
GlobalVar("g", ty.Of(s), ast::AddressSpace::kStorage, ast::Access::kRead, Binding(0_a),
|
||||
Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferStructF16Aliases) {
|
||||
// struct S { x : f16 };
|
||||
// type a1 = S;
|
||||
// var<storage, read> g : a1;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* s = Structure("S", utils::Vector{Member("x", ty.f16(Source{{12, 34}}))});
|
||||
auto* a1 = Alias("a1", ty.Of(s));
|
||||
auto* a2 = Alias("a2", ty.Of(a1));
|
||||
GlobalVar("g", ty.Of(a2), ast::AddressSpace::kStorage, ast::Access::kRead, Binding(0_a),
|
||||
Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, NotStorage_AccessMode) {
|
||||
// var<private, read> g : a;
|
||||
GlobalVar(Source{{56, 78}}, "g", ty.i32(), ast::AddressSpace::kPrivate, ast::Access::kRead);
|
||||
@@ -282,29 +282,6 @@ TEST_F(ResolverAddressSpaceValidationTest, Storage_WriteAccessMode) {
|
||||
R"(56:78 error: access mode 'write' is not valid for the 'storage' address space)");
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferStructI32) {
|
||||
// struct S { x : i32 };
|
||||
// var<storage, read> g : S;
|
||||
auto* s = Structure("S", utils::Vector{Member(Source{{12, 34}}, "x", ty.i32())});
|
||||
GlobalVar(Source{{56, 78}}, "g", ty.Of(s), ast::AddressSpace::kStorage, ast::Access::kRead,
|
||||
Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve());
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, StorageBufferNoErrorStructI32Aliases) {
|
||||
// struct S { x : i32 };
|
||||
// type a1 = S;
|
||||
// var<storage, read> g : a1;
|
||||
auto* s = Structure("S", utils::Vector{Member(Source{{12, 34}}, "x", ty.i32())});
|
||||
auto* a1 = Alias("a1", ty.Of(s));
|
||||
auto* a2 = Alias("a2", ty.Of(a1));
|
||||
GlobalVar(Source{{56, 78}}, "g", ty.Of(a2), ast::AddressSpace::kStorage, ast::Access::kRead,
|
||||
Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve());
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBuffer_Struct_Runtime) {
|
||||
// struct S { m: array<f32>; };
|
||||
// @group(0) @binding(0) var<uniform, > svar : S;
|
||||
@@ -349,97 +326,6 @@ TEST_F(ResolverAddressSpaceValidationTest, UniformBufferBoolAlias) {
|
||||
56:78 note: while instantiating 'var' g)");
|
||||
}
|
||||
|
||||
// F16 types in storage and uniform buffer is not implemented yet.
|
||||
// TODO(tint:1473, tint:1502): make these testcases valid after f16 is supported.
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferF16_TemporallyBan) {
|
||||
// var<uniform> g : f16;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
GlobalVar("g", ty.f16(Source{{56, 78}}), ast::AddressSpace::kUniform, Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_FALSE(r()->Resolve());
|
||||
|
||||
EXPECT_EQ(r()->error(),
|
||||
"56:78 error: using f16 types in 'uniform' address space is not "
|
||||
"implemented yet");
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferF16Alias_TemporallyBan) {
|
||||
// type a = f16;
|
||||
// var<uniform> g : a;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* a = Alias("a", ty.f16());
|
||||
GlobalVar("g", ty.type_name(Source{{56, 78}}, a->name), ast::AddressSpace::kUniform,
|
||||
Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_FALSE(r()->Resolve());
|
||||
|
||||
EXPECT_EQ(r()->error(),
|
||||
"56:78 error: using f16 types in 'uniform' address space is not "
|
||||
"implemented yet");
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferVectorF16_TemporallyBan) {
|
||||
// var<uniform> g : vec4<f16>;
|
||||
Enable(ast::Extension::kF16);
|
||||
GlobalVar("g", ty.vec(Source{{56, 78}}, ty.Of<f16>(), 4u), ast::AddressSpace::kUniform,
|
||||
Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_FALSE(r()->Resolve());
|
||||
|
||||
EXPECT_THAT(r()->error(), HasSubstr("56:78 error: using f16 types in 'uniform' address "
|
||||
"space is not implemented yet"));
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferArrayF16_TemporallyBan) {
|
||||
// struct S {
|
||||
// @size(16) f : f16;
|
||||
// }
|
||||
// var<uniform> g : array<S, 3u>;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* s = Structure(
|
||||
"S", utils::Vector{Member("a", ty.f16(Source{{56, 78}}), utils::Vector{MemberSize(16_a)})});
|
||||
auto* a = ty.array(ty.Of(s), 3_u);
|
||||
GlobalVar("g", a, ast::AddressSpace::kUniform, Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_FALSE(r()->Resolve());
|
||||
|
||||
EXPECT_THAT(r()->error(), HasSubstr("56:78 error: using f16 types in 'uniform' address "
|
||||
"space is not implemented yet"));
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferStructF16_TemporallyBan) {
|
||||
// struct S { x : f16 };
|
||||
// var<uniform> g : S;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* s = Structure("S", utils::Vector{Member("x", ty.f16(Source{{12, 34}}))});
|
||||
GlobalVar("g", ty.Of(s), ast::AddressSpace::kUniform, Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_FALSE(r()->Resolve());
|
||||
|
||||
EXPECT_THAT(r()->error(), HasSubstr("12:34 error: using f16 types in 'uniform' address "
|
||||
"space is not implemented yet"));
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferStructF16Aliases_TemporallyBan) {
|
||||
// struct S { x : f16 };
|
||||
// type a1 = S;
|
||||
// var<uniform> g : a1;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* s = Structure("S", utils::Vector{Member("x", ty.f16(Source{{12, 34}}))});
|
||||
auto* a1 = Alias("a1", ty.Of(s));
|
||||
GlobalVar("g", ty.Of(a1), ast::AddressSpace::kUniform, Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_FALSE(r()->Resolve());
|
||||
|
||||
EXPECT_THAT(r()->error(), HasSubstr("12:34 error: using f16 types in 'uniform' address "
|
||||
"space is not implemented yet"));
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferPointer) {
|
||||
// var<uniform> g : ptr<private, f32>;
|
||||
GlobalVar(Source{{56, 78}}, "g", ty.pointer(ty.f32(), ast::AddressSpace::kPrivate),
|
||||
@@ -461,6 +347,16 @@ TEST_F(ResolverAddressSpaceValidationTest, UniformBufferIntScalar) {
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferF16) {
|
||||
// var<uniform> g : f16;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
GlobalVar(Source{{56, 78}}, "g", ty.f16(), ast::AddressSpace::kUniform, Binding(0_a),
|
||||
Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferVectorF32) {
|
||||
// var<uniform> g : vec4<f32>;
|
||||
GlobalVar(Source{{56, 78}}, "g", ty.vec4<f32>(), ast::AddressSpace::kUniform, Binding(0_a),
|
||||
@@ -469,6 +365,16 @@ TEST_F(ResolverAddressSpaceValidationTest, UniformBufferVectorF32) {
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferVectorF16) {
|
||||
// var<uniform> g : vec4<f16>;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
GlobalVar(Source{{56, 78}}, "g", ty.vec4<f16>(), ast::AddressSpace::kUniform, Binding(0_a),
|
||||
Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferArrayF32) {
|
||||
// struct S {
|
||||
// @size(16) f : f32;
|
||||
@@ -481,6 +387,20 @@ TEST_F(ResolverAddressSpaceValidationTest, UniformBufferArrayF32) {
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferArrayF16) {
|
||||
// struct S {
|
||||
// @size(16) f : f16;
|
||||
// }
|
||||
// var<uniform> g : array<S, 3u>;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* s = Structure("S", utils::Vector{Member("a", ty.f16(), utils::Vector{MemberSize(16_a)})});
|
||||
auto* a = ty.array(ty.Of(s), 3_u);
|
||||
GlobalVar(Source{{56, 78}}, "g", a, ast::AddressSpace::kUniform, Binding(0_a), Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferStructI32) {
|
||||
// struct S { x : i32 };
|
||||
// var<uniform> g : S;
|
||||
@@ -503,6 +423,32 @@ TEST_F(ResolverAddressSpaceValidationTest, UniformBufferStructI32Aliases) {
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferStructF16) {
|
||||
// struct S { x : f16 };
|
||||
// var<uniform> g : S;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* s = Structure("S", utils::Vector{Member(Source{{12, 34}}, "x", ty.f16())});
|
||||
GlobalVar(Source{{56, 78}}, "g", ty.Of(s), ast::AddressSpace::kUniform, Binding(0_a),
|
||||
Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, UniformBufferStructF16Aliases) {
|
||||
// struct S { x : f16 };
|
||||
// type a1 = S;
|
||||
// var<uniform> g : a1;
|
||||
Enable(ast::Extension::kF16);
|
||||
|
||||
auto* s = Structure("S", utils::Vector{Member(Source{{12, 34}}, "x", ty.f16())});
|
||||
auto* a1 = Alias("a1", ty.Of(s));
|
||||
GlobalVar(Source{{56, 78}}, "g", ty.Of(a1), ast::AddressSpace::kUniform, Binding(0_a),
|
||||
Group(0_a));
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
}
|
||||
|
||||
TEST_F(ResolverAddressSpaceValidationTest, PushConstantBool) {
|
||||
// enable chromium_experimental_push_constant;
|
||||
// var<push_constant> g : bool;
|
||||
|
||||
@@ -395,13 +395,11 @@ bool Validator::AddressSpaceLayout(const sem::Type* store_ty,
|
||||
return true;
|
||||
}
|
||||
|
||||
// Temporally forbid using f16 types in "uniform" and "storage" address space.
|
||||
// TODO(tint:1473, tint:1502): Remove this error after f16 is supported in "uniform" and
|
||||
// "storage" address space but keep for "push_constant" address space.
|
||||
if (Is<sem::F16>(sem::Type::DeepestElementOf(store_ty))) {
|
||||
AddError("using f16 types in '" + utils::ToString(address_space) +
|
||||
"' address space is not implemented yet",
|
||||
source);
|
||||
// Among three host-shareable address spaces, f16 is supported in "uniform" and
|
||||
// "storage" address space, but not "push_constant" address space yet.
|
||||
if (Is<sem::F16>(sem::Type::DeepestElementOf(store_ty)) &&
|
||||
address_space == ast::AddressSpace::kPushConstant) {
|
||||
AddError("using f16 types in 'push_constant' address space is not implemented yet", source);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user