예제 #1
0
int InputLayout::init(InputLayout& obj, const VertexFormat& vf, const void* code, size_t length)
{
    NYX_ASSERT(obj._input_layout == nullptr);

    ID3D11Device* device = RenderDevice::device();

    D3D11_INPUT_ELEMENT_DESC descs[VertexFormat::MAX_ELEMENT_COUNT];
    size_t element_count = vf.element_count();

    for (size_t i = 0; i < element_count; ++i)
    {
        const VertexFormat::Element& elem = vf.element(i);

        descs[i].SemanticName = vertex_semantic_to_string(elem.semantic);
        descs[i].SemanticIndex = elem.semantic_index;
        descs[i].Format = to_dxgi(elem.format);
        descs[i].InputSlot = elem.input_slot;
        descs[i].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
        descs[i].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
        descs[i].InstanceDataStepRate = 0;
    }

    HRESULT hr = device->CreateInputLayout(descs, element_count, code, length, &obj._input_layout);
    if (FAILED(hr))
    {
        term(obj);
        return 1;
    }

    return 0;
}