#include "ltpch.h" #include "dxShader.h" #include "dxSharedContext.h" #include namespace Light { dxShader::dxShader(BasicFileHandle vertexFile, BasicFileHandle pixelFile, Ref sharedContext) : m_Context(sharedContext), m_VertexShader(nullptr), m_PixelShader(nullptr), m_VertexBlob(nullptr) { Microsoft::WRL::ComPtr ps = nullptr, vsErr = nullptr, psErr = nullptr; // compile shaders (we don't use DXC here because if D3DCompile fails it throws a dxException without logging the vsErr/psErr D3DCompile(vertexFile.GetData(), vertexFile.GetSize(), NULL, nullptr, nullptr, "main", "vs_4_0", NULL, NULL, &m_VertexBlob, &vsErr); D3DCompile(pixelFile.GetData(), pixelFile.GetSize(), NULL, nullptr, nullptr, "main", "ps_4_0", NULL, NULL, &ps, &psErr); // check LT_ENGINE_ASSERT(!vsErr.Get(), "dxShader::dxShader: vertex shader compile error: {}", (char*)vsErr->GetBufferPointer()); LT_ENGINE_ASSERT(!psErr.Get(), "dxShader::dxShader: pixels shader compile error: {}", (char*)psErr->GetBufferPointer()); // create shaders HRESULT hr; DXC(m_Context->GetDevice()->CreateVertexShader(m_VertexBlob->GetBufferPointer(), m_VertexBlob->GetBufferSize(), NULL, &m_VertexShader)); DXC(m_Context->GetDevice()->CreatePixelShader(ps->GetBufferPointer(), ps->GetBufferSize(), NULL, &m_PixelShader)); } dxShader::~dxShader() { UnBind(); } void dxShader::Bind() { m_Context->GetDeviceContext()->VSSetShader(m_VertexShader.Get(), nullptr, 0u); m_Context->GetDeviceContext()->PSSetShader(m_PixelShader.Get(), nullptr, 0u); } void dxShader::UnBind() { m_Context->GetDeviceContext()->VSSetShader(nullptr, nullptr, 0u); m_Context->GetDeviceContext()->PSSetShader(nullptr, nullptr, 0u); } }