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