yum-mirror/slang

Making it easier to work with shaders

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

Ellie Hermaszewskaformatf65d756bf

master
2.0 KiB65 linesraw
1// metal-vertex-layout.cpp
2#include "metal-vertex-layout.h"
3
4#include "metal-util.h"
5
6namespace gfx
7{
8
9using namespace Slang;
10
11namespace metal
12{
13
14Result InputLayoutImpl::init(const IInputLayout::Desc& desc)
15{
16    for (Index i = 0; i < desc.inputElementCount; i++)
17    {
18        if (MetalUtil::translateVertexFormat(desc.inputElements[i].format) ==
19            MTL::VertexFormatInvalid)
20        {
21            return SLANG_E_INVALID_ARG;
22        }
23        m_inputElements.add(desc.inputElements[i]);
24    }
25    for (Index i = 0; i < desc.vertexStreamCount; i++)
26    {
27        m_vertexStreams.add(desc.vertexStreams[i]);
28    }
29    return SLANG_OK;
30}
31
32NS::SharedPtr<MTL::VertexDescriptor> InputLayoutImpl::createVertexDescriptor(
33    NS::UInteger vertexBufferIndexOffset)
34{
35    NS::SharedPtr<MTL::VertexDescriptor> vertexDescriptor =
36        NS::TransferPtr(MTL::VertexDescriptor::alloc()->init());
37
38    for (Index i = 0; i < m_inputElements.getCount(); i++)
39    {
40        const auto& inputElement = m_inputElements[i];
41        MTL::VertexAttributeDescriptor* desc = vertexDescriptor->attributes()->object(i);
42        desc->setOffset(inputElement.offset);
43        desc->setBufferIndex(inputElement.bufferSlotIndex + vertexBufferIndexOffset);
44        MTL::VertexFormat metalFormat = MetalUtil::translateVertexFormat(inputElement.format);
45        desc->setFormat(metalFormat);
46    }
47
48    for (Index i = 0; i < m_vertexStreams.getCount(); i++)
49    {
50        const auto& vertexStream = m_vertexStreams[i];
51        MTL::VertexBufferLayoutDescriptor* desc =
52            vertexDescriptor->layouts()->object(i + vertexBufferIndexOffset);
53        desc->setStepFunction(MetalUtil::translateVertexStepFunction(vertexStream.slotClass));
54        desc->setStepRate(
55            vertexStream.slotClass == InputSlotClass::PerVertex
56                ? 1
57                : vertexStream.instanceDataStepRate);
58        desc->setStride(vertexStream.stride);
59    }
60
61    return vertexDescriptor;
62}
63
64} // namespace metal
65} // namespace gfx