Skip to content

Commit 2c2a2a1

Browse files
committed
R1/R2: create pixel shader using ShaderResourceTraits
1 parent e9e25dc commit 2c2a2a1

File tree

5 files changed

+71
-144
lines changed

5 files changed

+71
-144
lines changed

src/Layers/xrRender/ResourceManager.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,6 @@ class ECORE_API CResourceManager
251251
void Dump(bool bBrief);
252252

253253
private:
254-
#if defined(USE_DX10) || defined(USE_DX11)
255254
template <typename T>
256255
T& GetShaderMap();
257256

@@ -260,7 +259,6 @@ class ECORE_API CResourceManager
260259

261260
template <typename T>
262261
void DestroyShader(const T* sh);
263-
#endif
264262
};
265263

266264
#endif // ResourceManagerH

src/Layers/xrRender/ResourceManager_Resources.cpp

Lines changed: 3 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "tss.h"
1515
#include "blenders/blender.h"
1616
#include "blenders/blender_recorder.h"
17+
#include "ShaderResourceTraits.h"
1718

1819
void fix_texture_name(LPSTR fn);
1920

@@ -252,98 +253,8 @@ void CResourceManager::_DeleteVS(const SVS* vs)
252253
Msg("! ERROR: Failed to find compiled vertex-shader '%s'", *vs->cName);
253254
}
254255

255-
#ifndef _EDITOR
256-
//--------------------------------------------------------------------------------------------------------------
257-
SPS* CResourceManager::_CreatePS(LPCSTR name)
258-
{
259-
LPSTR N = LPSTR(name);
260-
map_PS::iterator I = m_ps.find(N);
261-
if (I != m_ps.end())
262-
return I->second;
263-
else
264-
{
265-
SPS* _ps = new SPS();
266-
_ps->dwFlags |= xr_resource_flagged::RF_REGISTERED;
267-
m_ps.insert(std::make_pair(_ps->set_name(name), _ps));
268-
if (0 == xr_stricmp(name, "null"))
269-
{
270-
_ps->sh = nullptr;
271-
return _ps;
272-
}
273-
274-
// Open file
275-
string_path cname;
276-
LPCSTR shader_path = GEnv.Render->getShaderPath();
277-
strconcat(sizeof(cname), cname, shader_path, name, ".ps");
278-
FS.update_path(cname, "$game_shaders$", cname);
279-
280-
// duplicate and zero-terminate
281-
IReader* file = FS.r_open(cname);
282-
R_ASSERT2(file, cname);
283-
u32 const size = file->length();
284-
char* const data = (LPSTR)_alloca(size + 1);
285-
CopyMemory(data, file->pointer(), size);
286-
data[size] = 0;
287-
FS.r_close(file);
288-
289-
// Select target
290-
LPCSTR c_target = "ps_2_0";
291-
LPCSTR c_entry = "main";
292-
if (strstr(data, "main_ps_1_1"))
293-
{
294-
c_target = "ps_1_1";
295-
c_entry = "main_ps_1_1";
296-
}
297-
if (strstr(data, "main_ps_1_2"))
298-
{
299-
c_target = "ps_1_2";
300-
c_entry = "main_ps_1_2";
301-
}
302-
if (strstr(data, "main_ps_1_3"))
303-
{
304-
c_target = "ps_1_3";
305-
c_entry = "main_ps_1_3";
306-
}
307-
if (strstr(data, "main_ps_1_4"))
308-
{
309-
c_target = "ps_1_4";
310-
c_entry = "main_ps_1_4";
311-
}
312-
if (strstr(data, "main_ps_2_0"))
313-
{
314-
c_target = "ps_2_0";
315-
c_entry = "main_ps_2_0";
316-
}
317-
318-
Msg("compiling shader %s", name);
319-
HRESULT const _hr = GEnv.Render->shader_compile(name, (DWORD const*)data, size, c_entry, c_target,
320-
D3DXSHADER_DEBUG | D3DXSHADER_PACKMATRIX_ROWMAJOR, (void*&)_ps);
321-
322-
if (FAILED(_hr))
323-
{
324-
FlushLog();
325-
}
326-
327-
CHECK_OR_EXIT(!FAILED(_hr), "Your video card doesn't meet game requirements.\n\nTry to lower game settings.");
328-
329-
return _ps;
330-
}
331-
}
332-
#endif
333-
334-
void CResourceManager::_DeletePS(const SPS* ps)
335-
{
336-
if (0 == (ps->dwFlags & xr_resource_flagged::RF_REGISTERED))
337-
return;
338-
LPSTR N = LPSTR(*ps->cName);
339-
map_PS::iterator I = m_ps.find(N);
340-
if (I != m_ps.end())
341-
{
342-
m_ps.erase(I);
343-
return;
344-
}
345-
Msg("! ERROR: Failed to find compiled pixel-shader '%s'", *ps->cName);
346-
}
256+
SPS* CResourceManager::_CreatePS(LPCSTR name) { return CreateShader<SPS>(name, true); }
257+
void CResourceManager::_DeletePS(const SPS* ps) { DestroyShader(ps); }
347258

348259
R_constant_table* CResourceManager::_CreateConstantTable(R_constant_table& C)
349260
{

src/Layers/xrRender/ShaderResourceTraits.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
#pragma once
22

3-
#if defined(USE_DX10) || defined(USE_DX11)
4-
53
#include "ResourceManager.h"
64

75
template <typename T>
86
struct ShaderTypeTraits;
97

10-
#if defined(USE_DX10) || defined(USE_DX11)
118
template <>
129
struct ShaderTypeTraits<SPS>
1310
{
@@ -57,14 +54,15 @@ struct ShaderTypeTraits<SPS>
5754
#elif defined(USE_DX10)
5855
R_CHK(HW.pDevice->CreatePixelShader(buffer, size, &ps));
5956
#else
60-
R_CHK(HW.pDevice->CreatePixelShader(buffer, &ps);
57+
R_CHK(HW.pDevice->CreatePixelShader(buffer, &ps));
6158
#endif
6259
return ps;
6360
}
6461

6562
static inline u32 GetShaderDest() { return RC_dest_pixel; }
6663
};
6764

65+
#if defined(USE_DX10) || defined(USE_DX11)
6866
template <>
6967
struct ShaderTypeTraits<SGS>
7068
{
@@ -284,9 +282,17 @@ inline T* CResourceManager::CreateShader(const char* name, const bool searchForE
284282
if (searchForEntryAndTarget)
285283
ShaderTypeTraits<T>::GetCompilationTarget(c_target, c_entry, data);
286284

285+
#ifdef USE_OGL
286+
DWORD flags = NULL;
287+
#elif defined(USE_DX10) || defined(USE_DX11)
288+
DWORD flags = D3D10_SHADER_PACK_MATRIX_ROW_MAJOR;
289+
#else
290+
DWORD flags = D3DXSHADER_DEBUG | D3DXSHADER_PACKMATRIX_ROWMAJOR;
291+
#endif
292+
287293
// Compile
288294
HRESULT const _hr = GEnv.Render->shader_compile(name, (DWORD const*)data, size,
289-
c_entry, c_target, D3D10_SHADER_PACK_MATRIX_ROW_MAJOR, (void*&)sh);
295+
c_entry, c_target, flags, (void*&)sh);
290296

291297
VERIFY(SUCCEEDED(_hr));
292298

@@ -312,7 +318,5 @@ inline void CResourceManager::DestroyShader(const T* sh)
312318
sh_map.erase(iterator);
313319
return;
314320
}
315-
Msg("! ERROR: Failed to find compiled geometry shader '%s'", *sh->cName);
321+
Msg("! ERROR: Failed to find compiled shader '%s'", sh->cName.c_str());
316322
}
317-
318-
#endif

src/Layers/xrRenderPC_R1/FStaticRender.cpp

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "Layers/xrRender/LightTrack.h"
1212
#include "Layers/xrRender/dxWallMarkArray.h"
1313
#include "Layers/xrRender/dxUIShader.h"
14+
#include "Layers/xrRender/ShaderResourceTraits.h"
1415

1516
CRender RImplementation;
1617

@@ -753,32 +754,38 @@ void CRender::DumpStatistics(IGameFont& font, IPerformanceAlert* alert)
753754
Sectors_xrc.DumpStatistics(font, alert);
754755
}
755756

757+
template <typename T>
758+
static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 const buffer_size, LPCSTR const file_name,
759+
T*& result, bool const disasm)
760+
{
761+
// XXX: disasm it
762+
763+
result->sh = ShaderTypeTraits<T>::CreateHWShader(buffer, buffer_size);
764+
765+
LPCVOID data = nullptr;
766+
767+
HRESULT const _hr = D3DXFindShaderComment(buffer, MAKEFOURCC('C', 'T', 'A', 'B'), &data, nullptr);
768+
769+
if (SUCCEEDED(_hr) && data)
770+
{
771+
// Parse constant table data
772+
LPD3DXSHADER_CONSTANTTABLE pConstants = LPD3DXSHADER_CONSTANTTABLE(data);
773+
result->constants.parse(pConstants, ShaderTypeTraits<T>::GetShaderDest());
774+
}
775+
else
776+
{
777+
Msg("! D3DXFindShaderComment %s hr == 0x%08x", file_name, _hr);
778+
}
779+
780+
return _hr;
781+
}
782+
756783
static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 const buffer_size, LPCSTR const file_name, void*& result, bool const disasm)
757784
{
758785
HRESULT _result = E_FAIL;
759786
if (pTarget[0] == 'p')
760787
{
761-
SPS* sps_result = (SPS*)result;
762-
_result = HW.pDevice->CreatePixelShader(buffer, &sps_result->sh);
763-
if (!SUCCEEDED(_result))
764-
{
765-
Log("! PS: ", file_name);
766-
Msg("! CreatePixelShader hr == 0x%08x", _result);
767-
return E_FAIL;
768-
}
769-
770-
LPCVOID data = nullptr;
771-
_result = D3DXFindShaderComment(buffer, MAKEFOURCC('C', 'T', 'A', 'B'), &data, nullptr);
772-
if (SUCCEEDED(_result) && data)
773-
{
774-
LPD3DXSHADER_CONSTANTTABLE pConstants = LPD3DXSHADER_CONSTANTTABLE(data);
775-
sps_result->constants.parse(pConstants, 0x1);
776-
}
777-
else
778-
{
779-
Log("! PS: ", file_name);
780-
Msg("! D3DXFindShaderComment hr == 0x%08x", _result);
781-
}
788+
_result = create_shader(pTarget, buffer, buffer_size, file_name, (SPS*&)result, disasm);
782789
}
783790
else if (pTarget[0] == 'v')
784791
{

src/Layers/xrRenderPC_R2/r2.cpp

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "Layers/xrRender/LightTrack.h"
1212
#include "Layers/xrRender/dxWallMarkArray.h"
1313
#include "Layers/xrRender/dxUIShader.h"
14+
#include "Layers/xrRender/ShaderResourceTraits.h"
1415

1516
CRender RImplementation;
1617

@@ -628,32 +629,38 @@ void CRender::DumpStatistics(IGameFont& font, IPerformanceAlert* alert)
628629
Sectors_xrc.DumpStatistics(font, alert);
629630
}
630631

632+
template <typename T>
633+
static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 const buffer_size, LPCSTR const file_name,
634+
T*& result, bool const disasm)
635+
{
636+
// XXX: disasm it
637+
638+
result->sh = ShaderTypeTraits<T>::CreateHWShader(buffer, buffer_size);
639+
640+
LPCVOID data = nullptr;
641+
642+
HRESULT const _hr = D3DXFindShaderComment(buffer, MAKEFOURCC('C', 'T', 'A', 'B'), &data, nullptr);
643+
644+
if (SUCCEEDED(_hr) && data)
645+
{
646+
// Parse constant table data
647+
LPD3DXSHADER_CONSTANTTABLE pConstants = LPD3DXSHADER_CONSTANTTABLE(data);
648+
result->constants.parse(pConstants, ShaderTypeTraits<T>::GetShaderDest());
649+
}
650+
else
651+
{
652+
Msg("! D3DXFindShaderComment %s hr == 0x%08x", file_name, _hr);
653+
}
654+
655+
return _hr;
656+
}
657+
631658
static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 const buffer_size, LPCSTR const file_name, void*& result, bool const disasm)
632659
{
633660
HRESULT _result = E_FAIL;
634661
if (pTarget[0] == 'p')
635662
{
636-
SPS* sps_result = (SPS*)result;
637-
_result = HW.pDevice->CreatePixelShader(buffer, &sps_result->sh);
638-
if (!SUCCEEDED(_result))
639-
{
640-
Log("! PS: ", file_name);
641-
Msg("! CreatePixelShader hr == 0x%08x", _result);
642-
return E_FAIL;
643-
}
644-
645-
LPCVOID data = nullptr;
646-
_result = D3DXFindShaderComment(buffer, MAKEFOURCC('C', 'T', 'A', 'B'), &data, nullptr);
647-
if (SUCCEEDED(_result) && data)
648-
{
649-
LPD3DXSHADER_CONSTANTTABLE pConstants = LPD3DXSHADER_CONSTANTTABLE(data);
650-
sps_result->constants.parse(pConstants, 0x1);
651-
}
652-
else
653-
{
654-
Log("! PS: ", file_name);
655-
Msg("! D3DXFindShaderComment hr == 0x%08x", _result);
656-
}
663+
_result = create_shader(pTarget, buffer, buffer_size, file_name, (SPS*&)result, disasm);
657664
}
658665
else if (pTarget[0] == 'v')
659666
{

0 commit comments

Comments
 (0)