summaryrefslogtreecommitdiffstats
path: root/tools/gfx/metal/metal-sampler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gfx/metal/metal-sampler.cpp')
-rw-r--r--tools/gfx/metal/metal-sampler.cpp44
1 files changed, 39 insertions, 5 deletions
diff --git a/tools/gfx/metal/metal-sampler.cpp b/tools/gfx/metal/metal-sampler.cpp
index cd94def37..561b93ea2 100644
--- a/tools/gfx/metal/metal-sampler.cpp
+++ b/tools/gfx/metal/metal-sampler.cpp
@@ -1,5 +1,6 @@
// metal-sampler.cpp
#include "metal-sampler.h"
+#include "metal-util.h"
namespace gfx
{
@@ -9,17 +10,50 @@ using namespace Slang;
namespace metal
{
-SamplerStateImpl::SamplerStateImpl(DeviceImpl* device)
- : m_device(device)
-{}
-
SamplerStateImpl::~SamplerStateImpl()
{
}
+Result SamplerStateImpl::init(DeviceImpl* device, const ISamplerState::Desc& desc)
+{
+ m_device = device;
+
+ NS::SharedPtr<MTL::SamplerDescriptor> samplerDesc = NS::TransferPtr(MTL::SamplerDescriptor::alloc()->init());
+
+ samplerDesc->setMinFilter(MetalUtil::translateSamplerMinMagFilter(desc.minFilter));
+ samplerDesc->setMagFilter(MetalUtil::translateSamplerMinMagFilter(desc.magFilter));
+ samplerDesc->setMipFilter(MetalUtil::translateSamplerMipFilter(desc.mipFilter));
+
+ samplerDesc->setSAddressMode(MetalUtil::translateSamplerAddressMode(desc.addressU));
+ samplerDesc->setTAddressMode(MetalUtil::translateSamplerAddressMode(desc.addressV));
+ samplerDesc->setRAddressMode(MetalUtil::translateSamplerAddressMode(desc.addressW));
+
+ samplerDesc->setMaxAnisotropy(Math::Clamp(desc.maxAnisotropy, 1u, 16u));
+
+ // TODO: support translation of border color...
+ MTL::SamplerBorderColor borderColor = MTL::SamplerBorderColorOpaqueBlack;
+ samplerDesc->setBorderColor(borderColor);
+
+ samplerDesc->setNormalizedCoordinates(true);
+
+ samplerDesc->setCompareFunction(MetalUtil::translateCompareFunction(desc.comparisonFunc));
+ samplerDesc->setLodMinClamp(Math::Clamp(desc.minLOD, 0.f, 1000.f));
+ samplerDesc->setLodMaxClamp(Math::Clamp(desc.maxLOD, samplerDesc->lodMinClamp(), 1000.f));
+
+ samplerDesc->setSupportArgumentBuffers(true);
+
+ // TODO: no support for reduction op
+
+ m_samplerState = NS::TransferPtr(m_device->m_device->newSamplerState(samplerDesc.get()));
+
+ return m_samplerState ? SLANG_OK : SLANG_FAIL;
+}
+
Result SamplerStateImpl::getNativeHandle(InteropHandle* outHandle)
{
- return SLANG_E_NOT_IMPLEMENTED;
+ outHandle->api = InteropHandleAPI::Metal;
+ outHandle->handleValue = reinterpret_cast<intptr_t>(m_samplerState.get());
+ return SLANG_OK;
}
} // namespace metal