Skip to content

Commit 5708cd2

Browse files
committed
R3/R4: create pixel shader using ShaderTypeTraits
1 parent 995fe8f commit 5708cd2

File tree

4 files changed

+67
-168
lines changed

4 files changed

+67
-168
lines changed

src/Layers/xrRender/ShaderResourceTraits.h

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,63 @@ template <typename T>
88
struct ShaderTypeTraits;
99

1010
#if defined(USE_DX10) || defined(USE_DX11)
11+
template <>
12+
struct ShaderTypeTraits<SPS>
13+
{
14+
typedef CResourceManager::map_PS MapType;
15+
typedef ID3DPixelShader DXIface;
16+
17+
static inline const char* GetShaderExt() { return ".ps"; }
18+
static inline const char* GetCompilationTarget()
19+
{
20+
return "ps_2_0";
21+
}
22+
23+
static void GetCompilationTarget(const char*& target, const char*& entry, const char* data)
24+
{
25+
if (strstr(data, "main_ps_1_1"))
26+
{
27+
target = "ps_1_1";
28+
entry = "main_ps_1_1";
29+
}
30+
if (strstr(data, "main_ps_1_2"))
31+
{
32+
target = "ps_1_2";
33+
entry = "main_ps_1_2";
34+
}
35+
if (strstr(data, "main_ps_1_3"))
36+
{
37+
target = "ps_1_3";
38+
entry = "main_ps_1_3";
39+
}
40+
if (strstr(data, "main_ps_1_4"))
41+
{
42+
target = "ps_1_4";
43+
entry = "main_ps_1_4";
44+
}
45+
if (strstr(data, "main_ps_2_0"))
46+
{
47+
target = "ps_2_0";
48+
entry = "main_ps_2_0";
49+
}
50+
}
51+
52+
static inline DXIface* CreateHWShader(DWORD const* buffer, size_t size)
53+
{
54+
DXIface* ps = 0;
55+
#ifdef USE_DX11
56+
R_CHK(HW.pDevice->CreatePixelShader(buffer, size, 0, &ps));
57+
#elif defined(USE_DX10)
58+
R_CHK(HW.pDevice->CreatePixelShader(buffer, size, &ps));
59+
#else
60+
R_CHK(HW.pDevice->CreatePixelShader(buffer, &ps);
61+
#endif
62+
return ps;
63+
}
64+
65+
static inline u32 GetShaderDest() { return RC_dest_pixel; }
66+
};
67+
1168
template <>
1269
struct ShaderTypeTraits<SGS>
1370
{
@@ -133,6 +190,12 @@ struct ShaderTypeTraits<SCS>
133190
};
134191
#endif
135192

193+
template <>
194+
inline CResourceManager::map_PS& CResourceManager::GetShaderMap()
195+
{
196+
return m_ps;
197+
}
198+
136199
#if defined(USE_DX10) || defined(USE_DX11)
137200
template <>
138201
inline CResourceManager::map_GS& CResourceManager::GetShaderMap()

src/Layers/xrRenderDX10/dx10ResourceManager_Resources.cpp

Lines changed: 2 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -258,107 +258,11 @@ SPS* CResourceManager::_CreatePS(LPCSTR _name)
258258
xr_strcat(name, "_6");
259259
if (7 == GEnv.Render->m_MSAASample)
260260
xr_strcat(name, "_7");
261-
LPSTR N = LPSTR(name);
262-
map_PS::iterator I = m_ps.find(N);
263-
if (I != m_ps.end())
264-
return I->second;
265-
else
266-
{
267-
SPS* _ps = new SPS();
268-
_ps->dwFlags |= xr_resource_flagged::RF_REGISTERED;
269-
m_ps.insert(std::make_pair(_ps->set_name(name), _ps));
270-
if (0 == xr_stricmp(_name, "null"))
271-
{
272-
_ps->sh = NULL;
273-
return _ps;
274-
}
275-
276-
string_path shName;
277-
const char* pchr = strchr(_name, '(');
278-
ptrdiff_t strSize = pchr ? pchr - _name : xr_strlen(_name);
279-
strncpy(shName, _name, strSize);
280-
shName[strSize] = 0;
281-
282-
// Open file
283-
string_path cname;
284-
strconcat(sizeof(cname), cname, GEnv.Render->getShaderPath(), /*_name*/ shName, ".ps");
285-
FS.update_path(cname, "$game_shaders$", cname);
286-
287-
// duplicate and zero-terminate
288-
IReader* file = FS.r_open(cname);
289-
// TODO: DX10: HACK: Implement all shaders. Remove this for PS
290-
if (!file)
291-
{
292-
string1024 tmp;
293-
// TODO: HACK: Test failure
294-
// Memory.mem_compact();
295-
xr_sprintf(tmp, "DX10: %s is missing. Replace with stub_default.ps", cname);
296-
Msg(tmp);
297-
strconcat(sizeof(cname), cname, GEnv.Render->getShaderPath(), "stub_default", ".ps");
298-
FS.update_path(cname, "$game_shaders$", cname);
299-
file = FS.r_open(cname);
300-
}
301-
R_ASSERT2(file, cname);
302-
u32 const size = file->length();
303-
char* const data = (LPSTR)_alloca(size + 1);
304-
CopyMemory(data, file->pointer(), size);
305-
data[size] = 0;
306-
FS.r_close(file);
307261

308-
// Select target
309-
LPCSTR c_target = "ps_2_0";
310-
LPCSTR c_entry = "main";
311-
if (strstr(data, "main_ps_1_1"))
312-
{
313-
c_target = "ps_1_1";
314-
c_entry = "main_ps_1_1";
315-
}
316-
if (strstr(data, "main_ps_1_2"))
317-
{
318-
c_target = "ps_1_2";
319-
c_entry = "main_ps_1_2";
320-
}
321-
if (strstr(data, "main_ps_1_3"))
322-
{
323-
c_target = "ps_1_3";
324-
c_entry = "main_ps_1_3";
325-
}
326-
if (strstr(data, "main_ps_1_4"))
327-
{
328-
c_target = "ps_1_4";
329-
c_entry = "main_ps_1_4";
330-
}
331-
if (strstr(data, "main_ps_2_0"))
332-
{
333-
c_target = "ps_2_0";
334-
c_entry = "main_ps_2_0";
335-
}
336-
337-
HRESULT const _hr = GEnv.Render->shader_compile(
338-
name, (DWORD const*)data, size, c_entry, c_target, D3D10_SHADER_PACK_MATRIX_ROW_MAJOR, (void*&)_ps);
339-
340-
VERIFY(SUCCEEDED(_hr));
341-
342-
CHECK_OR_EXIT(!FAILED(_hr), "Your video card doesn't meet game requirements.\n\nTry to lower game settings.");
343-
344-
return _ps;
345-
}
346-
}
347-
348-
void CResourceManager::_DeletePS(const SPS* ps)
349-
{
350-
if (0 == (ps->dwFlags & xr_resource_flagged::RF_REGISTERED))
351-
return;
352-
LPSTR N = LPSTR(*ps->cName);
353-
map_PS::iterator I = m_ps.find(N);
354-
if (I != m_ps.end())
355-
{
356-
m_ps.erase(I);
357-
return;
358-
}
359-
Msg("! ERROR: Failed to find compiled pixel-shader '%s'", *ps->cName);
262+
return CreateShader<SPS>(name, true);
360263
}
361264

265+
void CResourceManager::_DeletePS(const SPS* ps) { DestroyShader(ps); }
362266
//--------------------------------------------------------------------------------------------------------------
363267
static BOOL dcl_equal(D3DVERTEXELEMENT9* a, D3DVERTEXELEMENT9* b)
364268
{

src/Layers/xrRenderPC_R3/r3.cpp

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -796,41 +796,7 @@ static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 cons
796796
HRESULT _result = E_FAIL;
797797
if (pTarget[0] == 'p')
798798
{
799-
SPS* sps_result = (SPS*)result;
800-
#ifdef USE_DX11
801-
_result = HW.pDevice->CreatePixelShader(buffer, buffer_size, 0, &sps_result->sh);
802-
#else // #ifdef USE_DX11
803-
_result = HW.pDevice->CreatePixelShader(buffer, buffer_size, &sps_result->sh);
804-
#endif // #ifdef USE_DX11
805-
if (!SUCCEEDED(_result))
806-
{
807-
Log("! PS: ", file_name);
808-
Msg("! CreatePixelShader hr == 0x%08x", _result);
809-
return E_FAIL;
810-
}
811-
812-
ID3DShaderReflection* pReflection = 0;
813-
814-
#ifdef USE_DX11
815-
_result = D3DReflect(buffer, buffer_size, IID_ID3DShaderReflection, (void**)&pReflection);
816-
#else
817-
_result = D3D10ReflectShader(buffer, buffer_size, &pReflection);
818-
#endif
819-
820-
// Parse constant, texture, sampler binding
821-
// Store input signature blob
822-
if (SUCCEEDED(_result) && pReflection)
823-
{
824-
// Let constant table parse it's data
825-
sps_result->constants.parse(pReflection, RC_dest_pixel);
826-
827-
_RELEASE(pReflection);
828-
}
829-
else
830-
{
831-
Log("! PS: ", file_name);
832-
Msg("! D3DReflectShader hr == 0x%08x", _result);
833-
}
799+
_result = create_shader(pTarget, buffer, buffer_size, file_name, (SPS*&)result, disasm);
834800
}
835801
else if (pTarget[0] == 'v')
836802
{

src/Layers/xrRenderPC_R4/r4.cpp

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -813,41 +813,7 @@ static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 cons
813813
HRESULT _result = E_FAIL;
814814
if (pTarget[0] == 'p')
815815
{
816-
SPS* sps_result = (SPS*)result;
817-
#ifdef USE_DX11
818-
_result = HW.pDevice->CreatePixelShader(buffer, buffer_size, 0, &sps_result->sh);
819-
#else // #ifdef USE_DX11
820-
_result = HW.pDevice->CreatePixelShader(buffer, buffer_size, &sps_result->sh);
821-
#endif // #ifdef USE_DX11
822-
if (!SUCCEEDED(_result))
823-
{
824-
Log("! PS: ", file_name);
825-
Msg("! CreatePixelShader hr == 0x%08x", _result);
826-
return E_FAIL;
827-
}
828-
829-
ID3DShaderReflection* pReflection = 0;
830-
831-
#ifdef USE_DX11
832-
_result = D3DReflect(buffer, buffer_size, IID_ID3DShaderReflection, (void**)&pReflection);
833-
#else
834-
_result = D3D10ReflectShader(buffer, buffer_size, &pReflection);
835-
#endif
836-
837-
// Parse constant, texture, sampler binding
838-
// Store input signature blob
839-
if (SUCCEEDED(_result) && pReflection)
840-
{
841-
// Let constant table parse it's data
842-
sps_result->constants.parse(pReflection, RC_dest_pixel);
843-
844-
_RELEASE(pReflection);
845-
}
846-
else
847-
{
848-
Log("! PS: ", file_name);
849-
Msg("! D3DReflectShader hr == 0x%08x", _result);
850-
}
816+
_result = create_shader(pTarget, buffer, buffer_size, file_name, (SPS*&)result, disasm);
851817
}
852818
else if (pTarget[0] == 'v')
853819
{

0 commit comments

Comments
 (0)