2025-07-10 13:29:03 +03:30
|
|
|
#include <renderer/dx/shader.hpp>
|
|
|
|
#include <renderer/dx/shared_context.hpp>
|
|
|
|
#include <renderer/dx/vertex_layout.hpp>
|
2021-06-02 17:20:15 +04:30
|
|
|
|
2025-07-11 00:05:48 +03:30
|
|
|
namespace lt {
|
2021-06-02 17:20:15 +04:30
|
|
|
|
2025-07-05 13:28:41 +03:30
|
|
|
dxVertexLayout::dxVertexLayout(
|
|
|
|
Ref<Shader> shader,
|
|
|
|
const std::vector<std::pair<std::string, VertexElementType>> &elements,
|
|
|
|
Ref<dxSharedContext> sharedContext
|
|
|
|
)
|
2025-07-05 14:23:01 +03:30
|
|
|
: m_context(sharedContext)
|
|
|
|
, m_input_layout(nullptr)
|
2022-03-07 21:57:00 +03:30
|
|
|
{
|
2025-07-06 14:02:50 +03:30
|
|
|
auto inputElementsDesc = std::vector<D3D11_INPUT_ELEMENT_DESC> {};
|
2022-03-07 21:57:00 +03:30
|
|
|
inputElementsDesc.reserve(elements.size());
|
2021-06-02 17:20:15 +04:30
|
|
|
|
2022-03-07 21:57:00 +03:30
|
|
|
// extract elements desc
|
2025-07-05 13:28:41 +03:30
|
|
|
for (const auto &element : elements)
|
2021-06-02 17:20:15 +04:30
|
|
|
{
|
2025-07-11 14:05:59 +03:30
|
|
|
inputElementsDesc.emplace_back(
|
|
|
|
D3D11_INPUT_ELEMENT_DESC { element.first.c_str(),
|
|
|
|
NULL,
|
|
|
|
get_dxgi_format(element.second),
|
|
|
|
0u,
|
|
|
|
D3D11_APPEND_ALIGNED_ELEMENT,
|
|
|
|
D3D11_INPUT_PER_VERTEX_DATA,
|
|
|
|
0u }
|
|
|
|
);
|
2021-06-02 17:20:15 +04:30
|
|
|
}
|
|
|
|
|
2025-07-06 14:02:50 +03:30
|
|
|
auto dxpShader = std::dynamic_pointer_cast<dxShader>(shader);
|
2025-07-11 02:12:55 +03:30
|
|
|
ensure(dxpShader, "Failed to cast 'Shader' to 'dxShader'");
|
2021-06-02 17:20:15 +04:30
|
|
|
|
2022-03-07 21:57:00 +03:30
|
|
|
// create input layout (vertex layout)
|
2025-07-06 14:02:50 +03:30
|
|
|
auto hr = HRESULT {};
|
2025-07-05 15:36:53 +03:30
|
|
|
dxc(m_context->get_device()->CreateInputLayout(
|
2025-07-05 13:28:41 +03:30
|
|
|
&inputElementsDesc[0],
|
|
|
|
inputElementsDesc.size(),
|
2025-07-05 15:36:53 +03:30
|
|
|
dxpShader->get_vertex_blob().Get()->GetBufferPointer(),
|
|
|
|
dxpShader->get_vertex_blob().Get()->GetBufferSize(),
|
2025-07-05 14:23:01 +03:30
|
|
|
&m_input_layout
|
2025-07-05 13:28:41 +03:30
|
|
|
));
|
2022-03-07 21:57:00 +03:30
|
|
|
}
|
|
|
|
|
|
|
|
dxVertexLayout::~dxVertexLayout()
|
|
|
|
{
|
2025-07-05 15:36:53 +03:30
|
|
|
un_bind();
|
2022-03-07 21:57:00 +03:30
|
|
|
}
|
|
|
|
|
2025-07-05 15:36:53 +03:30
|
|
|
void dxVertexLayout::bind()
|
2022-03-07 21:57:00 +03:30
|
|
|
{
|
2025-07-05 15:36:53 +03:30
|
|
|
m_context->get_device_context()->IASetInputLayout(m_input_layout.Get());
|
2022-03-07 21:57:00 +03:30
|
|
|
}
|
|
|
|
|
2025-07-05 15:36:53 +03:30
|
|
|
void dxVertexLayout::un_bind()
|
2022-03-07 21:57:00 +03:30
|
|
|
{
|
2025-07-05 15:36:53 +03:30
|
|
|
m_context->get_device_context()->IASetInputLayout(nullptr);
|
2022-03-07 21:57:00 +03:30
|
|
|
}
|
2021-06-02 17:20:15 +04:30
|
|
|
|
2025-07-06 14:02:50 +03:30
|
|
|
auto dxVertexLayout::get_dxgi_format(VertexElementType type) -> DXGI_FORMAT
|
2022-03-07 21:57:00 +03:30
|
|
|
{
|
|
|
|
switch (type)
|
2021-06-02 17:20:15 +04:30
|
|
|
{
|
2022-03-07 21:57:00 +03:30
|
|
|
/* byte */
|
2025-07-11 00:05:48 +03:30
|
|
|
case lt::VertexElementType::Byte1: return DXGI_FORMAT_R8_SINT;
|
|
|
|
case lt::VertexElementType::Byte2: return DXGI_FORMAT_R8G8_SINT;
|
|
|
|
case lt::VertexElementType::Byte4: return DXGI_FORMAT_R8_SINT;
|
2022-03-07 21:57:00 +03:30
|
|
|
|
|
|
|
/* ubyte */
|
2025-07-11 00:05:48 +03:30
|
|
|
case lt::VertexElementType::UByte1: return DXGI_FORMAT_R8_UINT;
|
|
|
|
case lt::VertexElementType::UByte2: return DXGI_FORMAT_R8G8_UINT;
|
|
|
|
case lt::VertexElementType::UByte4: return DXGI_FORMAT_R8G8B8A8_UINT;
|
2022-03-07 21:57:00 +03:30
|
|
|
|
|
|
|
/* int */
|
2025-07-11 00:05:48 +03:30
|
|
|
case lt::VertexElementType::Int1: return DXGI_FORMAT_R32_SINT;
|
|
|
|
case lt::VertexElementType::Int2: return DXGI_FORMAT_R32G32_SINT;
|
|
|
|
case lt::VertexElementType::Int3: return DXGI_FORMAT_R32G32B32_SINT;
|
|
|
|
case lt::VertexElementType::Int4: return DXGI_FORMAT_R32G32B32A32_SINT;
|
2022-03-07 21:57:00 +03:30
|
|
|
|
|
|
|
/* uint */
|
2025-07-11 00:05:48 +03:30
|
|
|
case lt::VertexElementType::UInt1: return DXGI_FORMAT_R32_UINT;
|
|
|
|
case lt::VertexElementType::UInt2: return DXGI_FORMAT_R32G32_UINT;
|
|
|
|
case lt::VertexElementType::UInt3: return DXGI_FORMAT_R32G32B32_UINT;
|
|
|
|
case lt::VertexElementType::UInt4: return DXGI_FORMAT_R32G32B32A32_UINT;
|
2022-03-07 21:57:00 +03:30
|
|
|
|
|
|
|
/* float */
|
2025-07-11 00:05:48 +03:30
|
|
|
case lt::VertexElementType::Float1: return DXGI_FORMAT_R32_FLOAT;
|
|
|
|
case lt::VertexElementType::Float2: return DXGI_FORMAT_R32G32_FLOAT;
|
|
|
|
case lt::VertexElementType::Float3: return DXGI_FORMAT_R32G32B32_FLOAT;
|
|
|
|
case lt::VertexElementType::Float4: return DXGI_FORMAT_R32G32B32A32_FLOAT;
|
2022-03-07 21:57:00 +03:30
|
|
|
|
2025-07-11 02:12:55 +03:30
|
|
|
default: ensure(false, "Invalid 'VertexElementType'"); return DXGI_FORMAT_UNKNOWN;
|
2021-06-02 17:20:15 +04:30
|
|
|
}
|
2022-03-07 21:57:00 +03:30
|
|
|
}
|
2021-06-02 17:20:15 +04:30
|
|
|
|
2025-07-11 00:05:48 +03:30
|
|
|
} // namespace lt
|