From 84130b8892a3b0925d7b47f2fb5ebdf537d1f8e1 Mon Sep 17 00:00:00 2001 From: kaizhangNV Date: Mon, 17 Feb 2025 11:37:52 -0800 Subject: [PATCH 1/2] Fix invalid access mode for texture_buffer --- source/slang/slang-emit-metal.cpp | 11 +++++++++-- tests/metal/test_buffer.slang | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 tests/metal/test_buffer.slang diff --git a/source/slang/slang-emit-metal.cpp b/source/slang/slang-emit-metal.cpp index 166f02535f..0a7db8b288 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 0000000000..122af3b9a8 --- /dev/null +++ b/tests/metal/test_buffer.slang @@ -0,0 +1,17 @@ +// Test that Buffer maps to texture_buffer in Metal + +//TEST:SIMPLE(filecheck=METAL): -stage compute -entry computeMain -target metal + + +// METAL: texture_buffer inputBuffer_{{.*}} +Buffer inputBuffer; + +RWStructuredBuffer 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); +} From 1e22f534cc5c5a69d1cec3ab8d8516c665581221 Mon Sep 17 00:00:00 2001 From: kaizhangNV Date: Thu, 20 Feb 2025 14:30:28 -0800 Subject: [PATCH 2/2] Fix texture view create issue in metal In newTextureView, levelRange should represent the mipmap level range, while sliceRange should represent the texture layer range for texture array. But the implement inverse those two wrongly. --- tools/gfx/metal/metal-device.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/gfx/metal/metal-device.cpp b/tools/gfx/metal/metal-device.cpp index e20d3ea3b9..34b00d0dde 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,