Skip to content

Commit

Permalink
Shaders compilation code moved to separate files.
Browse files Browse the repository at this point in the history
  • Loading branch information
qweasdd136963 committed Sep 29, 2018
1 parent f2771f3 commit 1864b71
Show file tree
Hide file tree
Showing 20 changed files with 3,282 additions and 3,272 deletions.
665 changes: 0 additions & 665 deletions src/Layers/xrRenderPC_GL/rgl.cpp

Large diffs are not rendered by default.

660 changes: 660 additions & 0 deletions src/Layers/xrRenderPC_GL/rgl_shaders.cpp

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/Layers/xrRenderPC_GL/xrRender_GL.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,7 @@
<ClCompile Include="r3_R_rain.cpp" />
<ClCompile Include="r3_R_sun_support.cpp" />
<ClCompile Include="rgl.cpp" />
<ClCompile Include="rgl_shaders.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader>Create</PrecompiledHeader>
</ClCompile>
Expand Down
3 changes: 3 additions & 0 deletions src/Layers/xrRenderPC_GL/xrRender_GL.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -675,6 +675,9 @@
<ClCompile Include="gl_rendertarget_phase_flip.cpp">
<Filter>Core_Target</Filter>
</ClCompile>
<ClCompile Include="rgl_shaders.cpp">
<Filter>Core</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h">
Expand Down
316 changes: 0 additions & 316 deletions src/Layers/xrRenderPC_R1/FStaticRender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -758,319 +758,3 @@ void CRender::DumpStatistics(IGameFont& font, IPerformanceAlert* alert)
HOM.DumpStatistics(font, alert);
Sectors_xrc.DumpStatistics(font, alert);
}

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)
{
result->sh = ShaderTypeTraits<T>::CreateHWShader(buffer, buffer_size);

LPCVOID data = nullptr;

HRESULT const _hr = D3DXFindShaderComment(buffer, MAKEFOURCC('C', 'T', 'A', 'B'), &data, nullptr);

if (SUCCEEDED(_hr) && data)
{
// Parse constant table data
LPD3DXSHADER_CONSTANTTABLE pConstants = LPD3DXSHADER_CONSTANTTABLE(data);
result->constants.parse(pConstants, ShaderTypeTraits<T>::GetShaderDest());
}
else
Msg("! D3DXFindShaderComment %s hr == 0x%08x", file_name, _hr);

if (disasm)
{
ID3DXBuffer* disasm = nullptr;
D3DXDisassembleShader(LPDWORD(buffer), FALSE, nullptr, &disasm);
string_path dname;
strconcat(sizeof(dname), dname, "disasm\\", file_name, ('v' == pTarget[0]) ? ".vs" : ".ps");
IWriter* W = FS.w_open("$logs$", dname);
W->w(disasm->GetBufferPointer(), disasm->GetBufferSize());
FS.w_close(W);
_RELEASE(disasm);
}

return _hr;
}

inline HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 const buffer_size, LPCSTR const file_name, void*& result, bool const disasm)
{
if (pTarget[0] == 'p')
return create_shader(pTarget, buffer, buffer_size, file_name, (SPS*&)result, disasm);

if (pTarget[0] == 'v')
return create_shader(pTarget, buffer, buffer_size, file_name, (SVS*&)result, disasm);

NODEFAULT;
return E_FAIL;
}

class includer : public ID3DXInclude
{
public:
HRESULT __stdcall Open(
D3DXINCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID* ppData, UINT* pBytes)
{
string_path pname;
strconcat(sizeof(pname), pname, GEnv.Render->getShaderPath(), pFileName);
IReader* R = FS.r_open("$game_shaders$", pname);
if (nullptr == R)
{
// possibly in shared directory or somewhere else - open directly
R = FS.r_open("$game_shaders$", pFileName);
if (nullptr == R)
return E_FAIL;
}

// duplicate and zero-terminate
u32 size = R->length();
u8* data = xr_alloc<u8>(size + 1);
CopyMemory(data, R->pointer(), size);
data[size] = 0;
FS.r_close(R);

*ppData = data;
*pBytes = size;
return D3D_OK;
}
HRESULT __stdcall Close(LPCVOID pData)
{
xr_free(pData);
return D3D_OK;
}
};

static inline bool match_shader_id(
LPCSTR const debug_shader_id, LPCSTR const full_shader_id, FS_FileSet const& file_set, string_path& result);

HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcDataLen, LPCSTR pFunctionName,
LPCSTR pTarget, DWORD Flags, void*& result)
{
D3DXMACRO defines[128];
int def_it = 0;

char sh_name[MAX_PATH] = "";
u32 len = 0;
// options
if (o.forceskinw)
{
defines[def_it].Name = "SKIN_COLOR";
defines[def_it].Definition = "1";
def_it++;
}
sh_name[len] = '0' + char(o.forceskinw);
++len;

// skinning
if (m_skinning < 0)
{
defines[def_it].Name = "SKIN_NONE";
defines[def_it].Definition = "1";
def_it++;
sh_name[len] = '1';
++len;
}
else
{
sh_name[len] = '0';
++len;
}

if (0 == m_skinning)
{
defines[def_it].Name = "SKIN_0";
defines[def_it].Definition = "1";
def_it++;
}
sh_name[len] = '0' + char(0 == m_skinning);
++len;

if (1 == m_skinning)
{
defines[def_it].Name = "SKIN_1";
defines[def_it].Definition = "1";
def_it++;
}
sh_name[len] = '0' + char(1 == m_skinning);
++len;

if (2 == m_skinning)
{
defines[def_it].Name = "SKIN_2";
defines[def_it].Definition = "1";
def_it++;
}
sh_name[len] = '0' + char(2 == m_skinning);
++len;

if (3 == m_skinning)
{
defines[def_it].Name = "SKIN_3";
defines[def_it].Definition = "1";
def_it++;
}
sh_name[len] = '0' + char(3 == m_skinning);
++len;

if (4 == m_skinning)
{
defines[def_it].Name = "SKIN_4";
defines[def_it].Definition = "1";
def_it++;
}
sh_name[len] = '0' + char(4 == m_skinning);
++len;

sh_name[len] = '\0';

// finish
defines[def_it].Name = nullptr;
defines[def_it].Definition = nullptr;
def_it++;
R_ASSERT(def_it < 128);

HRESULT _result = E_FAIL;

string_path folder_name, folder;
xr_strcpy(folder, "r1\\objects\\r1\\");
xr_strcat(folder, name);
xr_strcat(folder, ".");

char extension[3];
strncpy_s(extension, pTarget, 2);
xr_strcat(folder, extension);

FS.update_path(folder_name, "$game_shaders$", folder);
xr_strcat(folder_name, "\\");

m_file_set.clear();
FS.file_list(m_file_set, folder_name, FS_ListFiles | FS_RootOnly, "*");

string_path temp_file_name, file_name;
if (!match_shader_id(name, sh_name, m_file_set, temp_file_name))
{
string_path file;
xr_strcpy(file, "shaders_cache\\r1\\");
xr_strcat(file, name);
xr_strcat(file, ".");
xr_strcat(file, extension);
xr_strcat(file, "\\");
xr_strcat(file, sh_name);
FS.update_path(file_name, "$app_data_root$", file);
}
else
{
xr_strcpy(file_name, folder_name);
xr_strcat(file_name, temp_file_name);
}

if (FS.exist(file_name))
{
IReader* file = FS.r_open(file_name);
if (file->length() > 4)
{
u32 crc = file->r_u32();
u32 crcComp = crc32(file->pointer(), file->elapsed());
if (crcComp == crc)
_result = create_shader(pTarget, (DWORD*)file->pointer(), file->elapsed(), file_name, result, o.disasm);
}
file->close();
}

if (FAILED(_result))
{
includer Includer;
LPD3DXBUFFER pShaderBuf = nullptr;
LPD3DXBUFFER pErrorBuf = nullptr;
LPD3DXCONSTANTTABLE pConstants = nullptr;
LPD3DXINCLUDE pInclude = (LPD3DXINCLUDE)&Includer;

_result = D3DXCompileShader((LPCSTR)pSrcData, SrcDataLen, defines, pInclude, pFunctionName, pTarget,
Flags | D3DXSHADER_USE_LEGACY_D3DX9_31_DLL, &pShaderBuf, &pErrorBuf, &pConstants);
if (SUCCEEDED(_result))
{
IWriter* file = FS.w_open(file_name);
u32 crc = crc32(pShaderBuf->GetBufferPointer(), pShaderBuf->GetBufferSize());
file->w_u32(crc);
file->w(pShaderBuf->GetBufferPointer(), (u32)pShaderBuf->GetBufferSize());
FS.w_close(file);

_result = create_shader(pTarget, (DWORD*)pShaderBuf->GetBufferPointer(), pShaderBuf->GetBufferSize(),
file_name, result, o.disasm);
}
else
{
Log("! ", file_name);
if (pErrorBuf)
Log("! error: ", (LPCSTR)pErrorBuf->GetBufferPointer());
else
Msg("Can't compile shader hr=0x%08x", _result);
}
}

return _result;
}

static inline bool match_shader(
LPCSTR const debug_shader_id, LPCSTR const full_shader_id, LPCSTR const mask, size_t const mask_length)
{
u32 const full_shader_id_length = xr_strlen(full_shader_id);
R_ASSERT2(full_shader_id_length == mask_length,
make_string("bad cache for shader %s, [%s], [%s]", debug_shader_id, mask, full_shader_id));
char const* i = full_shader_id;
char const* const e = full_shader_id + full_shader_id_length;
char const* j = mask;
for (; i != e; ++i, ++j)
{
if (*i == *j)
continue;

if (*j == '_')
continue;

return false;
}

return true;
}

static inline bool match_shader_id(
LPCSTR const debug_shader_id, LPCSTR const full_shader_id, FS_FileSet const& file_set, string_path& result)
{
#if 1
strcpy_s ( result, "" );
return false;
#else // #if 1
#ifdef DEBUG
LPCSTR temp = "";
bool found = false;
FS_FileSet::const_iterator i = file_set.begin();
FS_FileSet::const_iterator const e = file_set.end();
for (; i != e; ++i)
{
if (match_shader(debug_shader_id, full_shader_id, (*i).name.c_str(), (*i).name.size()))
{
VERIFY(!found);
found = true;
temp = (*i).name.c_str();
}
}
xr_strcpy(result, temp);
return found;
#else // #ifdef DEBUG
FS_FileSet::const_iterator i = file_set.begin();
FS_FileSet::const_iterator const e = file_set.end();
for (; i != e; ++i)
{
if (match_shader(debug_shader_id, full_shader_id, (*i).name.c_str(), (*i).name.size()))
{
xr_strcpy(result, (*i).name.c_str());
return true;
}
}
return false;
#endif // #ifdef DEBUG
#endif // #if 1
}
Loading

0 comments on commit 1864b71

Please sign in to comment.