diff options
| -rw-r--r-- | source/slang/slang-emit-metal.cpp | 11 | ||||
| -rw-r--r-- | tests/metal/test_buffer.slang | 17 | ||||
| -rw-r--r-- | tools/gfx/metal/metal-device.cpp | 4 |
3 files changed, 28 insertions, 4 deletions
diff --git a/source/slang/slang-emit-metal.cpp b/source/slang/slang-emit-metal.cpp index 166f02535..0a7db8b28 100644 --- a/source/slang/slang-emit-metal.cpp +++ b/source/slang/slang-emit-metal.cpp @@ -136,8 +136,15 @@ void MetalSourceEmitter::_emitHLSLTextureType(IRTextureTypeBase* texType) switch (texType->getAccess()) { case SLANG_RESOURCE_ACCESS_READ: - m_writer->emit("access::sample"); - break; + { + // Metal does not support access::sample for texture buffers, so we need to emit + // access::read instead. + if (texType->GetBaseShape() == SLANG_TEXTURE_BUFFER) + m_writer->emit("access::read"); + else + m_writer->emit("access::sample"); + break; + } case SLANG_RESOURCE_ACCESS_WRITE: m_writer->emit("access::write"); diff --git a/tests/metal/test_buffer.slang b/tests/metal/test_buffer.slang new file mode 100644 index 000000000..122af3b9a --- /dev/null +++ b/tests/metal/test_buffer.slang @@ -0,0 +1,17 @@ +// Test that Buffer<T> maps to texture_buffer<uint, access::read> in Metal + +//TEST:SIMPLE(filecheck=METAL): -stage compute -entry computeMain -target metal + + +// METAL: texture_buffer<uint, access::read> inputBuffer_{{.*}} +Buffer<uint> inputBuffer; + +RWStructuredBuffer<uint> outputBuffer; + +[numthreads(4, 1, 1)] +void computeMain(uint3 dtid : SV_DispatchThreadID) +{ + uint idx = dtid.x; + // Load values from the buffer to verify correct access + outputBuffer[idx] = inputBuffer.Load(idx); +} diff --git a/tools/gfx/metal/metal-device.cpp b/tools/gfx/metal/metal-device.cpp index e20d3ea3b..34b00d0dd 100644 --- a/tools/gfx/metal/metal-device.cpp +++ b/tools/gfx/metal/metal-device.cpp @@ -653,8 +653,8 @@ Result DeviceImpl::createTextureView( MTL::PixelFormat pixelFormat = desc.format == Format::Unknown ? textureImpl->m_pixelFormat : MetalUtil::translatePixelFormat(desc.format); - NS::Range levelRange(sr.baseArrayLayer, sr.layerCount); - NS::Range sliceRange(sr.mipLevel, sr.mipLevelCount); + NS::Range sliceRange(sr.baseArrayLayer, sr.layerCount); + NS::Range levelRange(sr.mipLevel, sr.mipLevelCount); viewImpl->m_textureView = NS::TransferPtr(textureImpl->m_texture->newTextureView( pixelFormat, |
