Skip to content

Commit b148872

Browse files
committed
Recompile compiled shaders if sources are updated.
1 parent 1864b71 commit b148872

File tree

18 files changed

+196
-109
lines changed

18 files changed

+196
-109
lines changed

src/Layers/xrRender/ShaderResourceTraits.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -392,14 +392,13 @@ inline T* CResourceManager::CreateShader(const char* name, const char* filename
392392
FS.update_path(cname, "$game_shaders$", cname);
393393
file = FS.r_open(cname);
394394
}
395-
R_ASSERT2(file, cname);
395+
R_ASSERT3(file, "Shader file doesnt exist:", cname);
396396

397397
// Duplicate and zero-terminate
398398
const auto size = file->length();
399399
char* const data = (LPSTR)_alloca(size + 1);
400400
CopyMemory(data, file->pointer(), size);
401401
data[size] = 0;
402-
FS.r_close(file);
403402

404403
// Select target
405404
LPCSTR c_target = ShaderTypeTraits<T>::GetCompilationTarget();
@@ -417,8 +416,9 @@ inline T* CResourceManager::CreateShader(const char* name, const char* filename
417416
#endif
418417

419418
// Compile
420-
HRESULT const _hr = GEnv.Render->shader_compile(name, (DWORD const*)data, size,
421-
c_entry, c_target, flags, (void*&)sh);
419+
HRESULT const _hr = GEnv.Render->shader_compile(name, file, c_entry, c_target, flags, (void*&)sh);
420+
421+
FS.r_close(file);
422422

423423
VERIFY(SUCCEEDED(_hr));
424424

src/Layers/xrRenderPC_GL/glResourceManager_Resources.cpp

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -208,16 +208,13 @@ SVS* CResourceManager::_CreateVS(LPCSTR _name)
208208
FS.update_path(cname, "$game_shaders$", cname);
209209
file = FS.r_open(cname);
210210
}
211-
u32 const size = file->length();
212-
char* const data = (LPSTR)_alloca(size + 1);
213-
CopyMemory ( data, file->pointer(), size );
214-
data[size] = 0;
215-
FS.r_close(file);
216211

217212
// Select target
218213
_vs->sh = glCreateShader(GL_VERTEX_SHADER);
219214
void* _result = &_vs->sh;
220-
HRESULT const _hr = GEnv.Render->shader_compile(name, (DWORD const*)data, size, nullptr, nullptr, NULL, _result);
215+
HRESULT const _hr = GEnv.Render->shader_compile(name, file, nullptr, nullptr, NULL, _result);
216+
217+
FS.r_close(file);
221218

222219
VERIFY(SUCCEEDED(_hr));
223220

@@ -291,16 +288,13 @@ SPS* CResourceManager::_CreatePS(LPCSTR _name)
291288
file = FS.r_open(cname);
292289
}
293290
R_ASSERT2 ( file, cname );
294-
u32 const size = file->length();
295-
char* const data = (LPSTR)_alloca(size + 1);
296-
CopyMemory ( data, file->pointer(), size );
297-
data[size] = 0;
298-
FS.r_close(file);
299291

300292
// Select target
301293
_ps->sh = glCreateShader(GL_FRAGMENT_SHADER);
302294
void* _result = &_ps->sh;
303-
HRESULT const _hr = GEnv.Render->shader_compile(name, (DWORD const*)data, size, nullptr, nullptr, NULL, _result);
295+
HRESULT const _hr = GEnv.Render->shader_compile(name, file, nullptr, nullptr, NULL, _result);
296+
297+
FS.r_close(file);
304298

305299
VERIFY(SUCCEEDED(_hr));
306300

@@ -367,7 +361,7 @@ SGS* CResourceManager::_CreateGS(LPCSTR name)
367361
// Select target
368362
_gs->sh = glCreateShader(GL_GEOMETRY_SHADER);
369363
void* _result = &_gs->sh;
370-
HRESULT const _hr = GEnv.Render->shader_compile(name, (DWORD const*)file->pointer(), file->length(), nullptr,
364+
HRESULT const _hr = GEnv.Render->shader_compile(name, file, nullptr,
371365
nullptr, NULL, _result);
372366

373367
VERIFY(SUCCEEDED(_hr));

src/Layers/xrRenderPC_GL/rgl.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,7 @@ class CRender : public D3DXRenderBase
291291
GLuint texture_load(LPCSTR fname, u32& msize, GLenum& ret_desc);
292292
HRESULT shader_compile(
293293
LPCSTR name,
294-
DWORD const* pSrcData,
295-
UINT SrcDataLen,
294+
IReader* fs,
296295
LPCSTR pFunctionName,
297296
LPCSTR pTarget,
298297
DWORD Flags,

src/Layers/xrRenderPC_GL/rgl_shaders.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ struct SHADER_MACRO
5959
char *Define = "#define ", *Name = "\n", *Sep = "\t", *Definition = "\n", *EOL = "\n";
6060
};
6161

62-
HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcDataLen, LPCSTR pFunctionName,
62+
HRESULT CRender::shader_compile(LPCSTR name, IReader* fs, LPCSTR pFunctionName,
6363
LPCSTR pTarget, DWORD Flags, void*& result)
6464
{
6565
xr_vector<char*> source, includes;
@@ -77,7 +77,7 @@ HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcData
7777
VERIFY(!Flags);
7878

7979
// open included files
80-
load_includes((LPCSTR)pSrcData, SrcDataLen, source, includes);
80+
load_includes((LPCSTR)fs->pointer(), fs->length(), source, includes);
8181

8282
char sh_name[MAX_PATH] = "";
8383
u32 len = 0;

src/Layers/xrRenderPC_R1/FStaticRender.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ class CRender : public D3DXRenderBase
116116
virtual void level_Unload() override;
117117

118118
virtual IDirect3DBaseTexture9* texture_load(LPCSTR fname, u32& msize);
119-
virtual HRESULT shader_compile(LPCSTR name, const DWORD* pSrcData, UINT SrcDataLen, LPCSTR pFunctionName,
120-
LPCSTR pTarget, DWORD Flags, void*& result) override;
119+
virtual HRESULT shader_compile(LPCSTR name, IReader* fs, LPCSTR pFunctionName, LPCSTR pTarget, DWORD Flags,
120+
void*& result) override;
121121

122122
// Information
123123
virtual void DumpStatistics(class IGameFont& font, class IPerformanceAlert* alert) override;

src/Layers/xrRenderPC_R1/FStaticRender_Shaders.cpp

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "stdafx.h"
22
#include "FStaticRender.h"
33
#include "Layers/xrRender/ShaderResourceTraits.h"
4+
#include "xrCore/FileCRC32.h"
45

56
template <typename T>
67
static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 const buffer_size, LPCSTR const file_name,
@@ -89,8 +90,7 @@ static inline bool match_shader_id(
8990
LPCSTR const debug_shader_id, LPCSTR const full_shader_id, FS_FileSet const& file_set, string_path& result);
9091

9192

92-
HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcDataLen, LPCSTR pFunctionName,
93-
LPCSTR pTarget, DWORD Flags, void*& result)
93+
HRESULT CRender::shader_compile(LPCSTR name, IReader* fs, LPCSTR pFunctionName, LPCSTR pTarget, DWORD Flags, void*& result)
9494
{
9595
D3DXMACRO defines[128];
9696
int def_it = 0;
@@ -177,14 +177,11 @@ HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcData
177177

178178
HRESULT _result = E_FAIL;
179179

180+
char extension[3];
180181
string_path folder_name, folder;
181-
xr_strcpy(folder, "r1\\objects\\r1\\");
182-
xr_strcat(folder, name);
183-
xr_strcat(folder, ".");
184182

185-
char extension[3];
186183
strncpy_s(extension, pTarget, 2);
187-
xr_strcat(folder, extension);
184+
strconcat(sizeof(folder), folder, "r1\\objects\\r1\\", name, ".", extension);
188185

189186
FS.update_path(folder_name, "$game_shaders$", folder);
190187
xr_strcat(folder_name, "\\");
@@ -196,12 +193,7 @@ HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcData
196193
if (!match_shader_id(name, sh_name, m_file_set, temp_file_name))
197194
{
198195
string_path file;
199-
xr_strcpy(file, "shaders_cache\\r1\\");
200-
xr_strcat(file, name);
201-
xr_strcat(file, ".");
202-
xr_strcat(file, extension);
203-
xr_strcat(file, "\\");
204-
xr_strcat(file, sh_name);
196+
strconcat(sizeof(file), file, "shaders_cache\\r1\\", name, ".", extension, "\\", sh_name);
205197
FS.update_path(file_name, "$app_data_root$", file);
206198
}
207199
else
@@ -210,15 +202,27 @@ HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcData
210202
xr_strcat(file_name, temp_file_name);
211203
}
212204

205+
string_path shadersFolder;
206+
FS.update_path(shadersFolder, "$game_shaders$", GEnv.Render->getShaderPath());
207+
208+
u32 fileCrc = 0;
209+
getFileCrc32(fs, shadersFolder, fileCrc);
210+
fs->seek(0);
211+
213212
if (FS.exist(file_name))
214213
{
215214
IReader* file = FS.r_open(file_name);
216215
if (file->length() > 4)
217216
{
218-
u32 crc = file->r_u32();
219-
u32 crcComp = crc32(file->pointer(), file->elapsed());
220-
if (crcComp == crc)
221-
_result = create_shader(pTarget, (DWORD*)file->pointer(), file->elapsed(), file_name, result, o.disasm);
217+
u32 savedFileCrc = file->r_u32();
218+
if (savedFileCrc == fileCrc)
219+
{
220+
u32 savedBytecodeCrc = file->r_u32();
221+
u32 bytecodeCrc = crc32(file->pointer(), file->elapsed());
222+
if (bytecodeCrc == savedBytecodeCrc)
223+
_result =
224+
create_shader(pTarget, (DWORD*)file->pointer(), file->elapsed(), file_name, result, o.disasm);
225+
}
222226
}
223227
file->close();
224228
}
@@ -231,14 +235,19 @@ HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcData
231235
LPD3DXCONSTANTTABLE pConstants = nullptr;
232236
LPD3DXINCLUDE pInclude = (LPD3DXINCLUDE)&Includer;
233237

234-
_result = D3DXCompileShader((LPCSTR)pSrcData, SrcDataLen, defines, pInclude, pFunctionName, pTarget,
238+
_result = D3DXCompileShader((LPCSTR)fs->pointer(), fs->length(), defines, pInclude, pFunctionName, pTarget,
235239
Flags | D3DXSHADER_USE_LEGACY_D3DX9_31_DLL, &pShaderBuf, &pErrorBuf, &pConstants);
236240
if (SUCCEEDED(_result))
237241
{
238242
IWriter* file = FS.w_open(file_name);
243+
244+
file->w_u32(fileCrc);
245+
239246
u32 crc = crc32(pShaderBuf->GetBufferPointer(), pShaderBuf->GetBufferSize());
240247
file->w_u32(crc);
248+
241249
file->w(pShaderBuf->GetBufferPointer(), (u32)pShaderBuf->GetBufferSize());
250+
242251
FS.w_close(file);
243252

244253
_result = create_shader(pTarget, (DWORD*)pShaderBuf->GetBufferPointer(), pShaderBuf->GetBufferSize(),

src/Layers/xrRenderPC_R2/r2.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,8 @@ class CRender : public D3DXRenderBase
245245
virtual void level_Unload();
246246

247247
virtual IDirect3DBaseTexture9* texture_load(LPCSTR fname, u32& msize);
248-
virtual HRESULT shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcDataLen, LPCSTR pFunctionName,
249-
LPCSTR pTarget, DWORD Flags, void*& result);
248+
virtual HRESULT shader_compile(
249+
LPCSTR name, IReader* fs, LPCSTR pFunctionName, LPCSTR pTarget, DWORD Flags, void*& result);
250250

251251
// Information
252252
virtual void DumpStatistics(class IGameFont& font, class IPerformanceAlert* alert) override;

src/Layers/xrRenderPC_R2/r2_shaders.cpp

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "stdafx.h"
22
#include "r2.h"
33
#include "Layers/xrRender/ShaderResourceTraits.h"
4+
#include "xrCore/FileCRC32.h"
45

56
template <typename T>
67
static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 const buffer_size, LPCSTR const file_name,
@@ -87,8 +88,8 @@ class includer : public ID3DXInclude
8788
static inline bool match_shader_id(
8889
LPCSTR const debug_shader_id, LPCSTR const full_shader_id, FS_FileSet const& file_set, string_path& result);
8990

90-
HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcDataLen, LPCSTR pFunctionName,
91-
LPCSTR pTarget, DWORD Flags, void*& result)
91+
HRESULT CRender::shader_compile(
92+
LPCSTR name, IReader* fs, LPCSTR pFunctionName, LPCSTR pTarget, DWORD Flags, void*& result)
9293
{
9394
D3DXMACRO defines[128];
9495
int def_it = 0;
@@ -439,14 +440,11 @@ HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcData
439440

440441
HRESULT _result = E_FAIL;
441442

443+
char extension[3];
442444
string_path folder_name, folder;
443-
xr_strcpy(folder, "r2\\objects\\r2\\");
444-
xr_strcat(folder, name);
445-
xr_strcat(folder, ".");
446445

447-
char extension[3];
448446
strncpy_s(extension, pTarget, 2);
449-
xr_strcat(folder, extension);
447+
strconcat(sizeof(folder), folder, "r2\\objects\\r2\\", name, ".", extension);
450448

451449
FS.update_path(folder_name, "$game_shaders$", folder);
452450
xr_strcat(folder_name, "\\");
@@ -458,12 +456,7 @@ HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcData
458456
if (!match_shader_id(name, sh_name, m_file_set, temp_file_name))
459457
{
460458
string_path file;
461-
xr_strcpy(file, "shaders_cache\\r2\\");
462-
xr_strcat(file, name);
463-
xr_strcat(file, ".");
464-
xr_strcat(file, extension);
465-
xr_strcat(file, "\\");
466-
xr_strcat(file, sh_name);
459+
strconcat(sizeof(file), file, "shaders_cache\\r2\\", name, ".", extension, "\\", sh_name);
467460
FS.update_path(file_name, "$app_data_root$", file);
468461
}
469462
else
@@ -472,15 +465,27 @@ HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcData
472465
xr_strcat(file_name, temp_file_name);
473466
}
474467

468+
string_path shadersFolder;
469+
FS.update_path(shadersFolder, "$game_shaders$", GEnv.Render->getShaderPath());
470+
471+
u32 fileCrc = 0;
472+
getFileCrc32(fs, shadersFolder, fileCrc);
473+
fs->seek(0);
474+
475475
if (FS.exist(file_name))
476476
{
477477
IReader* file = FS.r_open(file_name);
478478
if (file->length() > 4)
479479
{
480-
u32 crc = file->r_u32();
481-
u32 crcComp = crc32(file->pointer(), file->elapsed());
482-
if (crcComp == crc)
483-
_result = create_shader(pTarget, (DWORD*)file->pointer(), file->elapsed(), file_name, result, o.disasm);
480+
u32 savedFileCrc = file->r_u32();
481+
if (savedFileCrc == fileCrc)
482+
{
483+
u32 savedBytecodeCrc = file->r_u32();
484+
u32 bytecodeCrc = crc32(file->pointer(), file->elapsed());
485+
if (bytecodeCrc == savedBytecodeCrc)
486+
_result =
487+
create_shader(pTarget, (DWORD*)file->pointer(), file->elapsed(), file_name, result, o.disasm);
488+
}
484489
}
485490
file->close();
486491
}
@@ -501,14 +506,19 @@ HRESULT CRender::shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcData
501506
LPD3DXCONSTANTTABLE pConstants = nullptr;
502507
LPD3DXINCLUDE pInclude = (LPD3DXINCLUDE)&Includer;
503508

504-
_result = D3DXCompileShader((LPCSTR)pSrcData, SrcDataLen, defines, pInclude, pFunctionName, pTarget,
509+
_result = D3DXCompileShader((LPCSTR)fs->pointer(), fs->length(), defines, pInclude, pFunctionName, pTarget,
505510
Flags | D3DXSHADER_USE_LEGACY_D3DX9_31_DLL, &pShaderBuf, &pErrorBuf, &pConstants);
506511
if (SUCCEEDED(_result))
507512
{
508513
IWriter* file = FS.w_open(file_name);
514+
515+
file->w_u32(fileCrc);
516+
509517
u32 crc = crc32(pShaderBuf->GetBufferPointer(), pShaderBuf->GetBufferSize());
510518
file->w_u32(crc);
519+
511520
file->w(pShaderBuf->GetBufferPointer(), (u32)pShaderBuf->GetBufferSize());
521+
512522
FS.w_close(file);
513523

514524
_result = create_shader(pTarget, (DWORD*)pShaderBuf->GetBufferPointer(), pShaderBuf->GetBufferSize(),

src/Layers/xrRenderPC_R3/r3.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,8 @@ class CRender : public D3DXRenderBase
283283
virtual void level_Unload();
284284

285285
ID3DBaseTexture* texture_load(LPCSTR fname, u32& msize, bool bStaging = false);
286-
virtual HRESULT shader_compile(LPCSTR name, DWORD const* pSrcData, UINT SrcDataLen, LPCSTR pFunctionName,
287-
LPCSTR pTarget, DWORD Flags, void*& result);
286+
virtual HRESULT shader_compile(
287+
LPCSTR name, IReader* fs, LPCSTR pFunctionName, LPCSTR pTarget, DWORD Flags, void*& result);
288288

289289
// Information
290290
virtual void DumpStatistics(class IGameFont& font, class IPerformanceAlert* alert) override;

0 commit comments

Comments
 (0)