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); +} 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,