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
 |