[glsl][ir] Add storage texture desktop types.
Add tests for storage textures when targeting desktop.
Bug: 42251044
Change-Id: I7d309556072afefacf6df9feef151da2caf2aa42
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/204497
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/tint/lang/glsl/writer/printer/printer.cc b/src/tint/lang/glsl/writer/printer/printer.cc
index 4db5cd0..9cb97bc 100644
--- a/src/tint/lang/glsl/writer/printer/printer.cc
+++ b/src/tint/lang/glsl/writer/printer/printer.cc
@@ -492,7 +492,6 @@
switch (t->Dim()) {
case core::type::TextureDimension::k1d:
- TINT_ASSERT(!storage);
out << "1D";
break;
case core::type::TextureDimension::k2d:
diff --git a/src/tint/lang/glsl/writer/type_test.cc b/src/tint/lang/glsl/writer/type_test.cc
index 844c1dd..e2bd95d 100644
--- a/src/tint/lang/glsl/writer/type_test.cc
+++ b/src/tint/lang/glsl/writer/type_test.cc
@@ -713,9 +713,8 @@
str << data.dim << " " << data.access << " " << static_cast<uint8_t>(data.datatype);
return out << str.str();
}
-using GlslWriterStorageTexturesTest = GlslWriterTestWithParam<GlslStorageTextureData>;
-// TODO(dsinclair): Add storage texture support
-TEST_P(GlslWriterStorageTexturesTest, Emit) {
+using GlslWriterStorageTextureESTest = GlslWriterTestWithParam<GlslStorageTextureData>;
+TEST_P(GlslWriterStorageTextureESTest, Emit) {
auto params = GetParam();
const core::type::Type* subtype = nullptr;
@@ -750,7 +749,7 @@
}
INSTANTIATE_TEST_SUITE_P(
GlslWriterTest,
- GlslWriterStorageTexturesTest,
+ GlslWriterStorageTextureESTest,
testing::Values(
GlslStorageTextureData{core::type::TextureDimension::k2d, core::Access::kRead,
TextureDataType::kF32, "readonly image2D"},
@@ -815,5 +814,163 @@
GlslStorageTextureData{core::type::TextureDimension::k3d, core::Access::kReadWrite,
TextureDataType::kU32, "uimage3D"}));
+using GlslWriterStorageTextureNonESTest = GlslWriterTestWithParam<GlslStorageTextureData>;
+TEST_P(GlslWriterStorageTextureNonESTest, Emit) {
+ auto params = GetParam();
+
+ const core::type::Type* subtype = nullptr;
+ switch (params.datatype) {
+ case TextureDataType::kF32:
+ subtype = ty.f32();
+ break;
+ case TextureDataType::kI32:
+ subtype = ty.i32();
+ break;
+ case TextureDataType::kU32:
+ subtype = ty.u32();
+ break;
+ }
+ auto s = ty.Get<core::type::StorageTexture>(params.dim, core::TexelFormat::kR32Float,
+ params.access, subtype);
+ auto* func = b.Function("foo", ty.void_());
+ auto* param = b.FunctionParam("a", s);
+ func->SetParams({param});
+ func->SetWorkgroupSize(1, 1, 1);
+ b.Append(func->Block(), [&] { b.Return(func); });
+
+ Options opts{};
+ opts.version = Version(Version::Standard::kDesktop, 4, 6);
+ ASSERT_TRUE(Generate(opts)) << err_ << output_.glsl;
+ EXPECT_EQ(output_.glsl, R"(#version 460
+
+void foo(highp )" + params.result +
+ R"( a) {
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+}
+)");
+}
+INSTANTIATE_TEST_SUITE_P(
+ GlslWriterTest,
+ GlslWriterStorageTextureNonESTest,
+ testing::Values(
+ GlslStorageTextureData{core::type::TextureDimension::k1d, core::Access::kRead,
+ TextureDataType::kF32, "readonly image1D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2d, core::Access::kRead,
+ TextureDataType::kF32, "readonly image2D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2dArray, core::Access::kRead,
+ TextureDataType::kF32, "readonly image2DArray"},
+ GlslStorageTextureData{core::type::TextureDimension::k3d, core::Access::kRead,
+ TextureDataType::kF32, "readonly image3D"},
+ GlslStorageTextureData{core::type::TextureDimension::kCube, core::Access::kRead,
+ TextureDataType::kF32, "readonly imageCube"},
+ GlslStorageTextureData{core::type::TextureDimension::kCubeArray, core::Access::kRead,
+ TextureDataType::kF32, "readonly imageCubeArray"},
+
+ GlslStorageTextureData{core::type::TextureDimension::k1d, core::Access::kWrite,
+ TextureDataType::kF32, "writeonly image1D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2d, core::Access::kWrite,
+ TextureDataType::kF32, "writeonly image2D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2dArray, core::Access::kWrite,
+ TextureDataType::kF32, "writeonly image2DArray"},
+ GlslStorageTextureData{core::type::TextureDimension::k3d, core::Access::kWrite,
+ TextureDataType::kF32, "writeonly image3D"},
+ GlslStorageTextureData{core::type::TextureDimension::kCube, core::Access::kWrite,
+ TextureDataType::kF32, "writeonly imageCube"},
+ GlslStorageTextureData{core::type::TextureDimension::kCubeArray, core::Access::kWrite,
+ TextureDataType::kF32, "writeonly imageCubeArray"},
+
+ GlslStorageTextureData{core::type::TextureDimension::k1d, core::Access::kReadWrite,
+ TextureDataType::kF32, "image1D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2d, core::Access::kReadWrite,
+ TextureDataType::kF32, "image2D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2dArray, core::Access::kReadWrite,
+ TextureDataType::kF32, "image2DArray"},
+ GlslStorageTextureData{core::type::TextureDimension::k3d, core::Access::kReadWrite,
+ TextureDataType::kF32, "image3D"},
+ GlslStorageTextureData{core::type::TextureDimension::kCube, core::Access::kReadWrite,
+ TextureDataType::kF32, "imageCube"},
+ GlslStorageTextureData{core::type::TextureDimension::kCubeArray, core::Access::kReadWrite,
+ TextureDataType::kF32, "imageCubeArray"},
+
+ GlslStorageTextureData{core::type::TextureDimension::k1d, core::Access::kRead,
+ TextureDataType::kI32, "readonly iimage1D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2d, core::Access::kRead,
+ TextureDataType::kI32, "readonly iimage2D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2dArray, core::Access::kRead,
+ TextureDataType::kI32, "readonly iimage2DArray"},
+ GlslStorageTextureData{core::type::TextureDimension::k3d, core::Access::kRead,
+ TextureDataType::kI32, "readonly iimage3D"},
+ GlslStorageTextureData{core::type::TextureDimension::kCube, core::Access::kRead,
+ TextureDataType::kI32, "readonly iimageCube"},
+ GlslStorageTextureData{core::type::TextureDimension::kCubeArray, core::Access::kRead,
+ TextureDataType::kI32, "readonly iimageCubeArray"},
+
+ GlslStorageTextureData{core::type::TextureDimension::k1d, core::Access::kWrite,
+ TextureDataType::kI32, "writeonly iimage1D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2d, core::Access::kWrite,
+ TextureDataType::kI32, "writeonly iimage2D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2dArray, core::Access::kWrite,
+ TextureDataType::kI32, "writeonly iimage2DArray"},
+ GlslStorageTextureData{core::type::TextureDimension::k3d, core::Access::kWrite,
+ TextureDataType::kI32, "writeonly iimage3D"},
+ GlslStorageTextureData{core::type::TextureDimension::kCube, core::Access::kWrite,
+ TextureDataType::kI32, "writeonly iimageCube"},
+ GlslStorageTextureData{core::type::TextureDimension::kCubeArray, core::Access::kWrite,
+ TextureDataType::kI32, "writeonly iimageCubeArray"},
+
+ GlslStorageTextureData{core::type::TextureDimension::k1d, core::Access::kReadWrite,
+ TextureDataType::kI32, "iimage1D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2d, core::Access::kReadWrite,
+ TextureDataType::kI32, "iimage2D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2dArray, core::Access::kReadWrite,
+ TextureDataType::kI32, "iimage2DArray"},
+ GlslStorageTextureData{core::type::TextureDimension::k3d, core::Access::kReadWrite,
+ TextureDataType::kI32, "iimage3D"},
+ GlslStorageTextureData{core::type::TextureDimension::kCube, core::Access::kReadWrite,
+ TextureDataType::kI32, "iimageCube"},
+ GlslStorageTextureData{core::type::TextureDimension::kCubeArray, core::Access::kReadWrite,
+ TextureDataType::kI32, "iimageCubeArray"},
+
+ GlslStorageTextureData{core::type::TextureDimension::k1d, core::Access::kRead,
+ TextureDataType::kU32, "readonly uimage1D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2d, core::Access::kRead,
+ TextureDataType::kU32, "readonly uimage2D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2dArray, core::Access::kRead,
+ TextureDataType::kU32, "readonly uimage2DArray"},
+ GlslStorageTextureData{core::type::TextureDimension::k3d, core::Access::kRead,
+ TextureDataType::kU32, "readonly uimage3D"},
+ GlslStorageTextureData{core::type::TextureDimension::kCube, core::Access::kRead,
+ TextureDataType::kU32, "readonly uimageCube"},
+ GlslStorageTextureData{core::type::TextureDimension::kCubeArray, core::Access::kRead,
+ TextureDataType::kU32, "readonly uimageCubeArray"},
+
+ GlslStorageTextureData{core::type::TextureDimension::k1d, core::Access::kWrite,
+ TextureDataType::kU32, "writeonly uimage1D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2d, core::Access::kWrite,
+ TextureDataType::kU32, "writeonly uimage2D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2dArray, core::Access::kWrite,
+ TextureDataType::kU32, "writeonly uimage2DArray"},
+ GlslStorageTextureData{core::type::TextureDimension::k3d, core::Access::kWrite,
+ TextureDataType::kU32, "writeonly uimage3D"},
+ GlslStorageTextureData{core::type::TextureDimension::kCube, core::Access::kWrite,
+ TextureDataType::kU32, "writeonly uimageCube"},
+ GlslStorageTextureData{core::type::TextureDimension::kCubeArray, core::Access::kWrite,
+ TextureDataType::kU32, "writeonly uimageCubeArray"},
+
+ GlslStorageTextureData{core::type::TextureDimension::k1d, core::Access::kReadWrite,
+ TextureDataType::kU32, "uimage1D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2d, core::Access::kReadWrite,
+ TextureDataType::kU32, "uimage2D"},
+ GlslStorageTextureData{core::type::TextureDimension::k2dArray, core::Access::kReadWrite,
+ TextureDataType::kU32, "uimage2DArray"},
+ GlslStorageTextureData{core::type::TextureDimension::k3d, core::Access::kReadWrite,
+ TextureDataType::kU32, "uimage3D"},
+ GlslStorageTextureData{core::type::TextureDimension::kCube, core::Access::kReadWrite,
+ TextureDataType::kU32, "uimageCube"},
+ GlslStorageTextureData{core::type::TextureDimension::kCubeArray, core::Access::kReadWrite,
+ TextureDataType::kU32, "uimageCubeArray"}));
+
} // namespace
} // namespace tint::glsl::writer