light/modules/renderer/private/dx/shader.cpp

86 lines
2 KiB
C++
Raw Normal View History

2025-07-05 13:28:41 +03:30
#include <d3dcompiler.h>
#include <renderer/dx/shader.hpp>
#include <renderer/dx/shared_context.hpp>
2025-07-05 13:28:41 +03:30
2025-07-11 00:05:48 +03:30
namespace lt {
2025-07-05 13:28:41 +03:30
dxShader::dxShader(
2025-07-06 14:02:50 +03:30
BasicFileHandle vertexFile,
BasicFileHandle pixelFile,
2025-07-05 13:28:41 +03:30
Ref<dxSharedContext> sharedContext
)
: m_context(sharedContext)
, m_vertex_shader(nullptr)
, m_pixel_shader(nullptr)
, m_vertex_blob(nullptr)
2025-07-05 13:28:41 +03:30
{
2025-07-06 14:02:50 +03:30
auto ps = Microsoft::WRL::ComPtr<ID3DBlob> { nullptr };
auto vsErr = Microsoft::WRL::ComPtr<ID3DBlob> { nullptr };
auto psErr = Microsoft::WRL::ComPtr<ID3DBlob> { nullptr };
2025-07-05 13:28:41 +03:30
// compile shaders (we don't use dxc here because if d3_d_compile fails it throws a dxException
2025-07-05 13:28:41 +03:30
// without logging the vsErr/psErr
d3_d_compile(
2025-07-05 13:28:41 +03:30
vertexFile.GetData(),
vertexFile.get_size(),
2025-07-05 13:28:41 +03:30
NULL,
nullptr,
nullptr,
"main",
"vs_4_0",
NULL,
NULL,
&m_vertex_blob,
2025-07-05 13:28:41 +03:30
&vsErr
);
d3_d_compile(
2025-07-05 13:28:41 +03:30
pixelFile.GetData(),
pixelFile.get_size(),
2025-07-05 13:28:41 +03:30
NULL,
nullptr,
nullptr,
"main",
"ps_4_0",
NULL,
NULL,
&ps,
&psErr
);
// check
2025-07-11 02:12:55 +03:30
ensure(!vsErr.Get(), "Vertex shader compile error: {}", (char *)vsErr->GetBufferPointer());
ensure(!psErr.Get(), "Pixels shader compile error: {}", (char *)psErr->GetBufferPointer());
2025-07-05 13:28:41 +03:30
// create shaders
2025-07-06 14:02:50 +03:30
auto hr = HRESULT {};
dxc(m_context->get_device()->CreateVertexShader(
m_vertex_blob->GetBufferPointer(),
m_vertex_blob->GetBufferSize(),
2025-07-05 13:28:41 +03:30
NULL,
&m_vertex_shader
2025-07-05 13:28:41 +03:30
));
2025-07-11 14:05:59 +03:30
dxc(
m_context->get_device()
2025-07-06 14:02:50 +03:30
->CreatePixelShader(ps->GetBufferPointer(), ps->GetBufferSize(), NULL, &m_pixel_shader)
);
2025-07-05 13:28:41 +03:30
}
dxShader::~dxShader()
{
un_bind();
2025-07-05 13:28:41 +03:30
}
void dxShader::bind()
2025-07-05 13:28:41 +03:30
{
m_context->get_device_context()->VSSetShader(m_vertex_shader.Get(), nullptr, 0u);
m_context->get_device_context()->PSSetShader(m_pixel_shader.Get(), nullptr, 0u);
2025-07-05 13:28:41 +03:30
}
void dxShader::un_bind()
2025-07-05 13:28:41 +03:30
{
m_context->get_device_context()->VSSetShader(nullptr, nullptr, 0u);
m_context->get_device_context()->PSSetShader(nullptr, nullptr, 0u);
2025-07-05 13:28:41 +03:30
}
2025-07-11 00:05:48 +03:30
} // namespace lt