summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-emit-metal.cpp6
-rw-r--r--tests/metal/texture-multisample.slang16
2 files changed, 19 insertions, 3 deletions
diff --git a/source/slang/slang-emit-metal.cpp b/source/slang/slang-emit-metal.cpp
index a2e339942..9232fc95d 100644
--- a/source/slang/slang-emit-metal.cpp
+++ b/source/slang/slang-emit-metal.cpp
@@ -138,9 +138,9 @@ void MetalSourceEmitter::_emitHLSLTextureType(IRTextureTypeBase* texType)
{
case SLANG_RESOURCE_ACCESS_READ:
{
- // Metal does not support access::sample for texture buffers, so we need to emit
- // access::read instead.
- if (texType->GetBaseShape() == SLANG_TEXTURE_BUFFER)
+ // Metal does not support access::sample for texture buffers and multisampled textures,
+ // so we need to emit access::read instead.
+ if (texType->GetBaseShape() == SLANG_TEXTURE_BUFFER || texType->isMultisample())
m_writer->emit("access::read");
else
m_writer->emit("access::sample");
diff --git a/tests/metal/texture-multisample.slang b/tests/metal/texture-multisample.slang
new file mode 100644
index 000000000..4bd6e3be0
--- /dev/null
+++ b/tests/metal/texture-multisample.slang
@@ -0,0 +1,16 @@
+//TEST:SIMPLE(filecheck=METAL): -stage compute -entry computeMain -target metal -DEMIT_SOURCE
+
+// TEST_INPUT: RWTexture2D(size=4, content = zero, sampleCount=2):name texMS
+Texture2DMS<float4> texMS;
+// TEST_INPUT: RWTexture2D(size=4, content = zero):name output
+RWTexture2D<float4> output;
+
+[numthreads(1, 1, 1)]
+void computeMain()
+{
+ int2 location = int2(0, 0);
+ uint sampleIndex = 0;
+ // METAL: {{.*}}access::read{{.*}}
+ float4 v = texMS.Load(location, sampleIndex);
+ output[location] = v;
+} \ No newline at end of file