[tint][ir][spirv] Deduplicate storage textures with different accesses
`readonly_and_readwrite_storage_textures` adds support for storage texture with read and write access controls. SPIR-V does not consider these different types, and need deduplicating.
Fixed: 342840932
Change-Id: I3ecb0b7ac4dabe414eece04343d1089ffb9af570
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/190621
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: David Neto <dneto@google.com>
Auto-Submit: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index c2e7104..3a3fa00 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -32,6 +32,7 @@
#include "spirv/unified1/GLSL.std.450.h"
#include "spirv/unified1/spirv.h"
+#include "src/tint/lang/core/access.h"
#include "src/tint/lang/core/address_space.h"
#include "src/tint/lang/core/builtin_value.h"
#include "src/tint/lang/core/constant/scalar.h"
@@ -157,6 +158,10 @@
[&](const core::type::DepthMultisampledTexture* depth) {
return types.Get<core::type::MultisampledTexture>(depth->dim(), types.f32());
},
+ [&](const core::type::StorageTexture* st) -> const core::type::Type* {
+ return types.Get<core::type::StorageTexture>(st->dim(), st->texel_format(),
+ core::Access::kRead, st->type());
+ },
// Both sampler types are the same in SPIR-V.
[&](const core::type::Sampler* s) -> const core::type::Type* {
diff --git a/src/tint/lang/spirv/writer/type_test.cc b/src/tint/lang/spirv/writer/type_test.cc
index 27fdc1b..febac19 100644
--- a/src/tint/lang/spirv/writer/type_test.cc
+++ b/src/tint/lang/spirv/writer/type_test.cc
@@ -302,6 +302,26 @@
EXPECT_INST("%v2 = OpVariable %_ptr_UniformConstant_3_0 UniformConstant");
}
+TEST_F(SpirvWriterTest, Type_StorageTexture_Dedup) {
+ b.Append(b.ir.root_block, [&] {
+ auto* v1 = b.Var("v1", ty.ptr<handle, read_write>(ty.Get<core::type::StorageTexture>(
+ core::type::TextureDimension::k2dArray,
+ core::TexelFormat::kR32Uint, core::Access::kRead, ty.u32())));
+ auto* v2 = b.Var("v2", ty.ptr<handle, read_write>(ty.Get<core::type::StorageTexture>(
+ core::type::TextureDimension::k2dArray,
+ core::TexelFormat::kR32Uint, core::Access::kWrite, ty.u32())));
+ v1->SetBindingPoint(0, 1);
+ v2->SetBindingPoint(0, 2);
+ });
+
+ ASSERT_TRUE(Generate()) << Error() << output_;
+ EXPECT_INST("%3 = OpTypeImage %uint 2D 0 1 0 2 R32ui");
+ EXPECT_INST("%_ptr_UniformConstant_3 = OpTypePointer UniformConstant %3");
+ EXPECT_INST("%v1 = OpVariable %_ptr_UniformConstant_3 UniformConstant");
+ EXPECT_INST("%_ptr_UniformConstant_3_0 = OpTypePointer UniformConstant %3");
+ EXPECT_INST("%v2 = OpVariable %_ptr_UniformConstant_3_0 UniformConstant");
+}
+
using Dim = core::type::TextureDimension;
struct TextureCase {
std::string result;
diff --git a/test/tint/bug/chromium/342840932.wgsl b/test/tint/bug/chromium/342840932.wgsl
new file mode 100644
index 0000000..fdfbe04
--- /dev/null
+++ b/test/tint/bug/chromium/342840932.wgsl
@@ -0,0 +1,4 @@
+@group(0) @binding(0) var image_dup_src: texture_storage_1d<r32uint,read>;
+@group(0) @binding(1) var image_dst: texture_storage_1d<r32uint,write>;
+
+// for #1307 loads with ivec2 coords.
diff --git a/test/tint/bug/chromium/342840932.wgsl.expected.dxc.hlsl b/test/tint/bug/chromium/342840932.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..94156e0
--- /dev/null
+++ b/test/tint/bug/chromium/342840932.wgsl.expected.dxc.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+ return;
+}
+
+Texture1D<uint4> image_dup_src : register(t0);
+RWTexture1D<uint4> image_dst : register(u1);
diff --git a/test/tint/bug/chromium/342840932.wgsl.expected.fxc.hlsl b/test/tint/bug/chromium/342840932.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..94156e0
--- /dev/null
+++ b/test/tint/bug/chromium/342840932.wgsl.expected.fxc.hlsl
@@ -0,0 +1,7 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+ return;
+}
+
+Texture1D<uint4> image_dup_src : register(t0);
+RWTexture1D<uint4> image_dst : register(u1);
diff --git a/test/tint/bug/chromium/342840932.wgsl.expected.glsl b/test/tint/bug/chromium/342840932.wgsl.expected.glsl
new file mode 100644
index 0000000..53b3c19
--- /dev/null
+++ b/test/tint/bug/chromium/342840932.wgsl.expected.glsl
@@ -0,0 +1,8 @@
+#version 310 es
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void unused_entry_point() {
+ return;
+}
+layout(r32ui) uniform highp readonly uimage2D image_dup_src;
+layout(r32ui) uniform highp writeonly uimage2D image_dst;
diff --git a/test/tint/bug/chromium/342840932.wgsl.expected.msl b/test/tint/bug/chromium/342840932.wgsl.expected.msl
new file mode 100644
index 0000000..466ceaa
--- /dev/null
+++ b/test/tint/bug/chromium/342840932.wgsl.expected.msl
@@ -0,0 +1,3 @@
+#include <metal_stdlib>
+
+using namespace metal;
diff --git a/test/tint/bug/chromium/342840932.wgsl.expected.spvasm b/test/tint/bug/chromium/342840932.wgsl.expected.spvasm
new file mode 100644
index 0000000..6936908
--- /dev/null
+++ b/test/tint/bug/chromium/342840932.wgsl.expected.spvasm
@@ -0,0 +1,31 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 11
+; Schema: 0
+ OpCapability Shader
+ OpCapability Image1D
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+ OpExecutionMode %unused_entry_point LocalSize 1 1 1
+ OpName %image_dup_src "image_dup_src"
+ OpName %image_dst "image_dst"
+ OpName %unused_entry_point "unused_entry_point"
+ OpDecorate %image_dup_src NonWritable
+ OpDecorate %image_dup_src DescriptorSet 0
+ OpDecorate %image_dup_src Binding 0
+ OpDecorate %image_dst NonReadable
+ OpDecorate %image_dst DescriptorSet 0
+ OpDecorate %image_dst Binding 1
+ %uint = OpTypeInt 32 0
+ %3 = OpTypeImage %uint 1D 0 0 0 2 R32ui
+%_ptr_UniformConstant_3 = OpTypePointer UniformConstant %3
+%image_dup_src = OpVariable %_ptr_UniformConstant_3 UniformConstant
+%_ptr_UniformConstant_3_0 = OpTypePointer UniformConstant %3
+ %image_dst = OpVariable %_ptr_UniformConstant_3_0 UniformConstant
+ %void = OpTypeVoid
+ %7 = OpTypeFunction %void
+%unused_entry_point = OpFunction %void None %7
+ %10 = OpLabel
+ OpReturn
+ OpFunctionEnd
diff --git a/test/tint/bug/chromium/342840932.wgsl.expected.wgsl b/test/tint/bug/chromium/342840932.wgsl.expected.wgsl
new file mode 100644
index 0000000..f5ce9b1
--- /dev/null
+++ b/test/tint/bug/chromium/342840932.wgsl.expected.wgsl
@@ -0,0 +1,3 @@
+@group(0) @binding(0) var image_dup_src : texture_storage_1d<r32uint, read>;
+
+@group(0) @binding(1) var image_dst : texture_storage_1d<r32uint, write>;