yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Ellie Hermaszewskaformatf65d756bf

master
2.0 KiB60 linesraw
1// metal-sampler.cpp
2#include "metal-sampler.h"
3
4#include "metal-util.h"
5
6namespace gfx
7{
8
9using namespace Slang;
10
11namespace metal
12{
13
14SamplerStateImpl::~SamplerStateImpl() {}
15
16Result SamplerStateImpl::init(DeviceImpl* device, const ISamplerState::Desc& desc)
17{
18    m_device = device;
19
20    NS::SharedPtr<MTL::SamplerDescriptor> samplerDesc =
21        NS::TransferPtr(MTL::SamplerDescriptor::alloc()->init());
22
23    samplerDesc->setMinFilter(MetalUtil::translateSamplerMinMagFilter(desc.minFilter));
24    samplerDesc->setMagFilter(MetalUtil::translateSamplerMinMagFilter(desc.magFilter));
25    samplerDesc->setMipFilter(MetalUtil::translateSamplerMipFilter(desc.mipFilter));
26
27    samplerDesc->setSAddressMode(MetalUtil::translateSamplerAddressMode(desc.addressU));
28    samplerDesc->setTAddressMode(MetalUtil::translateSamplerAddressMode(desc.addressV));
29    samplerDesc->setRAddressMode(MetalUtil::translateSamplerAddressMode(desc.addressW));
30
31    samplerDesc->setMaxAnisotropy(Math::Clamp(desc.maxAnisotropy, 1u, 16u));
32
33    // TODO: support translation of border color...
34    MTL::SamplerBorderColor borderColor = MTL::SamplerBorderColorOpaqueBlack;
35    samplerDesc->setBorderColor(borderColor);
36
37    samplerDesc->setNormalizedCoordinates(true);
38
39    samplerDesc->setCompareFunction(MetalUtil::translateCompareFunction(desc.comparisonFunc));
40    samplerDesc->setLodMinClamp(Math::Clamp(desc.minLOD, 0.f, 1000.f));
41    samplerDesc->setLodMaxClamp(Math::Clamp(desc.maxLOD, samplerDesc->lodMinClamp(), 1000.f));
42
43    samplerDesc->setSupportArgumentBuffers(true);
44
45    // TODO: no support for reduction op
46
47    m_samplerState = NS::TransferPtr(m_device->m_device->newSamplerState(samplerDesc.get()));
48
49    return m_samplerState ? SLANG_OK : SLANG_FAIL;
50}
51
52Result SamplerStateImpl::getNativeHandle(InteropHandle* outHandle)
53{
54    outHandle->api = InteropHandleAPI::Metal;
55    outHandle->handleValue = reinterpret_cast<intptr_t>(m_samplerState.get());
56    return SLANG_OK;
57}
58
59} // namespace metal
60} // namespace gfx