Skip to content

Commit

Permalink
xrRender_R3-R4: removed code duplication from shaders creation code
Browse files Browse the repository at this point in the history
  • Loading branch information
Xottab-DUTY committed Oct 14, 2018
1 parent 0e88131 commit fcea4a1
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 77 deletions.
48 changes: 9 additions & 39 deletions src/Layers/xrRenderPC_R3/r3_shaders.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ template <typename T>
static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 const buffer_size, LPCSTR const file_name,
T*& result, bool const disasm)
{
// XXX: disasm it

result->sh = ShaderTypeTraits<T>::CreateHWShader(buffer, buffer_size);

ID3DShaderReflection* pReflection = 0;
Expand All @@ -23,7 +21,7 @@ static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 cons
}
else
{
Msg("! D3DReflectShader %s hr == 0x%08x", file_name, _hr);
Msg("! D3D10ReflectShader %s hr == 0x%08x", file_name, _hr);
}

return _hr;
Expand All @@ -34,58 +32,32 @@ static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 cons
{
// XXX: what's going on with casts here???
HRESULT _result = E_FAIL;
pcstr extension = ".hlsl";
if (pTarget[0] == 'p')
{
extension = ".ps";
_result = create_shader(pTarget, buffer, buffer_size, file_name, (SPS*&)result, disasm);
}
else if (pTarget[0] == 'v')
{
// XXX: try to use code below
// _result = create_shader(pTarget, buffer, buffer_size, file_name, (SVS*&)result, disasm);

extension = ".vs";
SVS* svs_result = (SVS*)result;
_result = HW.pDevice->CreateVertexShader(buffer, buffer_size, &svs_result->sh);

if (!SUCCEEDED(_result))
{
Log("! VS: ", file_name);
Msg("! CreatePixelShader hr == 0x%08x", _result);
return E_FAIL;
}

ID3DShaderReflection* pReflection = 0;
_result = D3D10ReflectShader(buffer, buffer_size, &pReflection);

// Parse constant, texture, sampler binding
// Store input signature blob
if (SUCCEEDED(_result) && pReflection)
_result = create_shader(pTarget, buffer, buffer_size, file_name, svs_result, disasm);
if (SUCCEEDED(_result))
{
// TODO: DX10: share the same input signatures

// Store input signature (need only for VS)
// CHK_DX( D3DxxGetInputSignatureBlob(pShaderBuf->GetBufferPointer(), pShaderBuf->GetBufferSize(),
// &_vs->signature) );
ID3DBlob* pSignatureBlob;
CHK_DX(D3DGetInputSignatureBlob(buffer, buffer_size, &pSignatureBlob));
VERIFY(pSignatureBlob);

svs_result->signature = RImplementation.Resources->_CreateInputSignature(pSignatureBlob);

_RELEASE(pSignatureBlob);

// Let constant table parse it's data
svs_result->constants.parse(pReflection, RC_dest_vertex);

_RELEASE(pReflection);
}
else
{
Log("! VS: ", file_name);
Msg("! D3DXFindShaderComment hr == 0x%08x", _result);
}
}
else if (pTarget[0] == 'g')
{
extension = ".gs";
_result = create_shader(pTarget, buffer, buffer_size, file_name, (SGS*&)result, disasm);
}
else
Expand All @@ -96,11 +68,9 @@ static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 cons
if (disasm)
{
ID3DBlob* disasm = 0;
D3DDisassemble(buffer, buffer_size, FALSE, 0, &disasm);
// D3DXDisassembleShader (LPDWORD(code->GetBufferPointer()), FALSE, 0, &disasm );
D3DDisassemble(buffer, buffer_size, FALSE, nullptr, &disasm);
string_path dname;
strconcat(sizeof(dname), dname, "disasm" DELIMITER, file_name,
('v' == pTarget[0]) ? ".vs" : ('p' == pTarget[0]) ? ".ps" : ".gs");
strconcat(sizeof(dname), dname, "disasm" DELIMITER, file_name, extension);
IWriter* W = FS.w_open("$logs$", dname);
W->w(disasm->GetBufferPointer(), (u32)disasm->GetBufferSize());
FS.w_close(W);
Expand Down
48 changes: 10 additions & 38 deletions src/Layers/xrRenderPC_R4/r4_shaders.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ template <typename T>
static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 const buffer_size, LPCSTR const file_name,
T*& result, bool const disasm)
{
// XXX: disasm it

result->sh = ShaderTypeTraits<T>::CreateHWShader(buffer, buffer_size);

ID3DShaderReflection* pReflection = 0;
Expand All @@ -38,72 +36,48 @@ static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 cons
static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 const buffer_size, LPCSTR const file_name,
void*& result, bool const disasm)
{
// XXX: what's going on with casts here???
HRESULT _result = E_FAIL;
pcstr extension = ".hlsl";
if (pTarget[0] == 'p')
{
extension = ".ps";
_result = create_shader(pTarget, buffer, buffer_size, file_name, (SPS*&)result, disasm);
}
else if (pTarget[0] == 'v')
{
// XXX: try to use code below
// _result = create_shader(pTarget, buffer, buffer_size, file_name, (SVS*&)result, disasm);

extension = ".vs";
SVS* svs_result = (SVS*)result;
_result = HW.pDevice->CreateVertexShader(buffer, buffer_size, 0, &svs_result->sh);

if (!SUCCEEDED(_result))
{
Log("! VS: ", file_name);
Msg("! CreatePixelShader hr == 0x%08x", _result);
return E_FAIL;
}

ID3DShaderReflection* pReflection = 0;
_result = D3DReflect(buffer, buffer_size, IID_ID3DShaderReflection, (void**)&pReflection);

// Parse constant, texture, sampler binding
// Store input signature blob
if (SUCCEEDED(_result) && pReflection)
_result = create_shader(pTarget, buffer, buffer_size, file_name, svs_result, disasm);
if (SUCCEEDED(_result))
{
// TODO: DX10: share the same input signatures

// Store input signature (need only for VS)
// CHK_DX( D3DxxGetInputSignatureBlob(pShaderBuf->GetBufferPointer(), pShaderBuf->GetBufferSize(),
// &_vs->signature) );
ID3DBlob* pSignatureBlob;
CHK_DX(D3DGetInputSignatureBlob(buffer, buffer_size, &pSignatureBlob));
VERIFY(pSignatureBlob);

svs_result->signature = RImplementation.Resources->_CreateInputSignature(pSignatureBlob);

_RELEASE(pSignatureBlob);

// Let constant table parse it's data
svs_result->constants.parse(pReflection, RC_dest_vertex);

_RELEASE(pReflection);
}
else
{
Log("! VS: ", file_name);
Msg("! D3DXFindShaderComment hr == 0x%08x", _result);
}
}
else if (pTarget[0] == 'g')
{
extension = ".gs";
_result = create_shader(pTarget, buffer, buffer_size, file_name, (SGS*&)result, disasm);
}
else if (pTarget[0] == 'c')
{
extension = ".cs";
_result = create_shader(pTarget, buffer, buffer_size, file_name, (SCS*&)result, disasm);
}
else if (pTarget[0] == 'h')
{
extension = ".hs";
_result = create_shader(pTarget, buffer, buffer_size, file_name, (SHS*&)result, disasm);
}
else if (pTarget[0] == 'd')
{
extension = ".ds";
_result = create_shader(pTarget, buffer, buffer_size, file_name, (SDS*&)result, disasm);
}
else
Expand All @@ -115,10 +89,8 @@ static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 cons
{
ID3DBlob* disasm = 0;
D3DDisassemble(buffer, buffer_size, FALSE, 0, &disasm);
// D3DXDisassembleShader (LPDWORD(code->GetBufferPointer()), FALSE, 0, &disasm );
string_path dname;
strconcat(sizeof(dname), dname, "disasm" DELIMITER, file_name,
('v' == pTarget[0]) ? ".vs" : ('p' == pTarget[0]) ? ".ps" : ".gs");
strconcat(sizeof(dname), dname, "disasm" DELIMITER, file_name, extension);
IWriter* W = FS.w_open("$logs$", dname);
W->w(disasm->GetBufferPointer(), (u32)disasm->GetBufferSize());
FS.w_close(W);
Expand Down

0 comments on commit fcea4a1

Please sign in to comment.