[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