Skip to content

Commit

Permalink
R1/R2/R3/R4: create vertex shader using ShaderResourceTraits
Browse files Browse the repository at this point in the history
(R3/R4: only partial code replacement)
  • Loading branch information
Xottab-DUTY committed May 28, 2018
1 parent 2c2a2a1 commit d757f8a
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 201 deletions.
82 changes: 3 additions & 79 deletions src/Layers/xrRender/ResourceManager_Resources.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,6 @@ void CResourceManager::_DeleteDecl(const SDeclaration* dcl)
}

//--------------------------------------------------------------------------------------------------------------
#ifndef _EDITOR
SVS* CResourceManager::_CreateVS(LPCSTR _name)
{
string_path name;
Expand All @@ -172,86 +171,11 @@ SVS* CResourceManager::_CreateVS(LPCSTR _name)
xr_strcat(name, "_3");
if (4 == GEnv.Render->m_skinning)
xr_strcat(name, "_4");
LPSTR N = LPSTR(name);
map_VS::iterator I = m_vs.find(N);
if (I != m_vs.end())
return I->second;
else
{
SVS* _vs = new SVS();
_vs->dwFlags |= xr_resource_flagged::RF_REGISTERED;
m_vs.insert(std::make_pair(_vs->set_name(name), _vs));
if (0 == xr_stricmp(_name, "null"))
{
_vs->sh = nullptr;
return _vs;
}

string_path cname;
strconcat(sizeof(cname), cname, GEnv.Render->getShaderPath(), _name, ".vs");
FS.update_path(cname, "$game_shaders$", cname);
// LPCSTR target = NULL;

IReader* fs = FS.r_open(cname);
R_ASSERT3(fs, "shader file doesnt exist", cname);

// Select target
LPCSTR c_target = "vs_2_0";
LPCSTR c_entry = "main";
if (HW.Caps.geometry_major >= 2)
c_target = "vs_2_0";
else
c_target = "vs_1_1";

// duplicate and zero-terminate
IReader* file = FS.r_open(cname);
R_ASSERT2(file, cname);
u32 const size = file->length();
char* const data = (LPSTR)_alloca(size + 1);
CopyMemory(data, file->pointer(), size);
data[size] = 0;
FS.r_close(file);

if (strstr(data, "main_vs_1_1"))
{
c_target = "vs_1_1";
c_entry = "main_vs_1_1";
}
if (strstr(data, "main_vs_2_0"))
{
c_target = "vs_2_0";
c_entry = "main_vs_2_0";
}

Msg("compiling shader %s", name);
HRESULT const _hr = GEnv.Render->shader_compile(name, (DWORD const*)data, size, c_entry, c_target,
D3DXSHADER_DEBUG | D3DXSHADER_PACKMATRIX_ROWMAJOR, (void*&)_vs);

if (FAILED(_hr))
{
FlushLog();
}

CHECK_OR_EXIT(!FAILED(_hr), "Your video card doesn't meet game requirements.\n\nTry to lower game settings.");

return _vs;
}

return CreateShader<SVS>(name, true);
}
#endif

void CResourceManager::_DeleteVS(const SVS* vs)
{
if (0 == (vs->dwFlags & xr_resource_flagged::RF_REGISTERED))
return;
LPSTR N = LPSTR(*vs->cName);
map_VS::iterator I = m_vs.find(N);
if (I != m_vs.end())
{
m_vs.erase(I);
return;
}
Msg("! ERROR: Failed to find compiled vertex-shader '%s'", *vs->cName);
}
void CResourceManager::_DeleteVS(const SVS* vs) { DestroyShader(vs); }

SPS* CResourceManager::_CreatePS(LPCSTR name) { return CreateShader<SPS>(name, true); }
void CResourceManager::_DeletePS(const SPS* ps) { DestroyShader(ps); }
Expand Down
57 changes: 56 additions & 1 deletion src/Layers/xrRender/ShaderResourceTraits.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,54 @@
template <typename T>
struct ShaderTypeTraits;

template <>
struct ShaderTypeTraits<SVS>
{
typedef CResourceManager::map_VS MapType;
typedef ID3DVertexShader DXIface;

static inline const char* GetShaderExt() { return ".vs"; }
static inline const char* GetCompilationTarget()
{
return "vs_2_0";
}

static void GetCompilationTarget(const char*& target, const char*& entry, const char* data)
{
if (HW.Caps.geometry_major >= 2)
target = "vs_2_0";
else
target = "vs_1_1";

if (strstr(data, "main_vs_1_1"))
{
target = "vs_1_1";
entry = "main_vs_1_1";
}

if (strstr(data, "main_vs_2_0"))
{
target = "vs_2_0";
entry = "main_vs_2_0";
}
}

static inline DXIface* CreateHWShader(DWORD const* buffer, size_t size)
{
DXIface* vs = 0;
#ifdef USE_DX11
R_CHK(HW.pDevice->CreateVertexShader(buffer, size, 0, &vs));
#elif defined(USE_DX10)
R_CHK(HW.pDevice->CreateVertexShader(buffer, size, &vs));
#else
R_CHK(HW.pDevice->CreateVertexShader(buffer, &vs));
#endif
return vs;
}

static inline u32 GetShaderDest() { return RC_dest_vertex; }
};

template <>
struct ShaderTypeTraits<SPS>
{
Expand Down Expand Up @@ -194,6 +242,12 @@ inline CResourceManager::map_PS& CResourceManager::GetShaderMap()
return m_ps;
}

template <>
inline CResourceManager::map_VS& CResourceManager::GetShaderMap()
{
return m_vs;
}

#if defined(USE_DX10) || defined(USE_DX11)
template <>
inline CResourceManager::map_GS& CResourceManager::GetShaderMap()
Expand Down Expand Up @@ -256,7 +310,7 @@ inline T* CResourceManager::CreateShader(const char* name, const bool searchForE
ShaderTypeTraits<T>::GetShaderExt());
FS.update_path(cname, "$game_shaders$", cname);

// duplicate and zero-terminate
// Try to open
IReader* file = FS.r_open(cname);
if (!file && strstr(Core.Params, "-lack_of_shaders"))
{
Expand All @@ -269,6 +323,7 @@ inline T* CResourceManager::CreateShader(const char* name, const bool searchForE
}
R_ASSERT2(file, cname);

// Duplicate and zero-terminate
const auto size = file->length();
char* const data = (LPSTR)_alloca(size + 1);
CopyMemory(data, file->pointer(), size);
Expand Down
80 changes: 5 additions & 75 deletions src/Layers/xrRenderDX10/dx10ResourceManager_Resources.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,85 +134,15 @@ SVS* CResourceManager::_CreateVS(LPCSTR _name)
xr_strcat(name, "_3");
if (4 == GEnv.Render->m_skinning)
xr_strcat(name, "_4");
LPSTR N = LPSTR(name);
map_VS::iterator I = m_vs.find(N);
if (I != m_vs.end())
return I->second;
else
{
SVS* _vs = new SVS();
_vs->dwFlags |= xr_resource_flagged::RF_REGISTERED;
m_vs.insert(std::make_pair(_vs->set_name(name), _vs));
//_vs->sh = NULL;
//_vs->signature = NULL;
if (0 == xr_stricmp(_name, "null"))
{
return _vs;
}

string_path shName;
{
const char* pchr = strchr(_name, '(');
ptrdiff_t size = pchr ? pchr - _name : xr_strlen(_name);
strncpy(shName, _name, size);
shName[size] = 0;
}

string_path cname;
strconcat(sizeof(cname), cname, GEnv.Render->getShaderPath(), /*_name*/ shName, ".vs");
FS.update_path(cname, "$game_shaders$", cname);
// LPCSTR target = NULL;

// duplicate and zero-terminate
IReader* file = FS.r_open(cname);
// TODO: DX10: HACK: Implement all shaders. Remove this for PS
if (!file)
{
string1024 tmp;
xr_sprintf(tmp, "DX10: %s is missing. Replace with stub_default.vs", cname);
Msg(tmp);
strconcat(sizeof(cname), cname, GEnv.Render->getShaderPath(), "stub_default", ".vs");
FS.update_path(cname, "$game_shaders$", cname);
file = FS.r_open(cname);
}
u32 const size = file->length();
char* const data = (LPSTR)_alloca(size + 1);
CopyMemory(data, file->pointer(), size);
data[size] = 0;
FS.r_close(file);

// Select target
LPCSTR c_target = "vs_2_0";
LPCSTR c_entry = "main";
if (HW.Caps.geometry_major >= 2)
c_target = "vs_2_0";
else
c_target = "vs_1_1";

if (strstr(data, "main_vs_1_1"))
{
c_target = "vs_1_1";
c_entry = "main_vs_1_1";
}
if (strstr(data, "main_vs_2_0"))
{
c_target = "vs_2_0";
c_entry = "main_vs_2_0";
}

HRESULT const _hr = GEnv.Render->shader_compile(
name, (DWORD const*)data, size, c_entry, c_target, D3D10_SHADER_PACK_MATRIX_ROW_MAJOR, (void*&)_vs);

VERIFY(SUCCEEDED(_hr));

CHECK_OR_EXIT(!FAILED(_hr), "Your video card doesn't meet game requirements.\n\nTry to lower game settings.");

return _vs;
}

return CreateShader<SVS>(name, true);
}

void CResourceManager::_DeleteVS(const SVS* vs)
{
// XXX: try to use code below
// DestroyShader(vs);

if (0 == (vs->dwFlags & xr_resource_flagged::RF_REGISTERED))
return;
LPSTR N = LPSTR(*vs->cName);
Expand Down
24 changes: 1 addition & 23 deletions src/Layers/xrRenderPC_R1/FStaticRender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -758,8 +758,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);

LPCVOID data = nullptr;
Expand Down Expand Up @@ -789,27 +787,7 @@ static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 cons
}
else if (pTarget[0] == 'v')
{
SVS* svs_result = (SVS*)result;
_result = HW.pDevice->CreateVertexShader(buffer, &svs_result->sh);
if (!SUCCEEDED(_result))
{
Log("! VS: ", file_name);
Msg("! CreatePixelShader hr == 0x%08x", _result);
return E_FAIL;
}

LPCVOID data = nullptr;
_result = D3DXFindShaderComment(buffer, MAKEFOURCC('C', 'T', 'A', 'B'), &data, nullptr);
if (SUCCEEDED(_result) && data)
{
LPD3DXSHADER_CONSTANTTABLE pConstants = LPD3DXSHADER_CONSTANTTABLE(data);
svs_result->constants.parse(pConstants, 0x2);
}
else
{
Log("! VS: ", file_name);
Msg("! D3DXFindShaderComment hr == 0x%08x", _result);
}
_result = create_shader(pTarget, buffer, buffer_size, file_name, (SVS*&)result, disasm);
}
else
{
Expand Down
24 changes: 1 addition & 23 deletions src/Layers/xrRenderPC_R2/r2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -633,8 +633,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);

LPCVOID data = nullptr;
Expand Down Expand Up @@ -664,27 +662,7 @@ static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 cons
}
else if (pTarget[0] == 'v')
{
SVS* svs_result = (SVS*)result;
_result = HW.pDevice->CreateVertexShader(buffer, &svs_result->sh);
if (!SUCCEEDED(_result))
{
Log("! VS: ", file_name);
Msg("! CreatePixelShader hr == 0x%08x", _result);
return E_FAIL;
}

LPCVOID data = nullptr;
_result = D3DXFindShaderComment(buffer, MAKEFOURCC('C', 'T', 'A', 'B'), &data, nullptr);
if (SUCCEEDED(_result) && data)
{
LPD3DXSHADER_CONSTANTTABLE pConstants = LPD3DXSHADER_CONSTANTTABLE(data);
svs_result->constants.parse(pConstants, 0x2);
}
else
{
Log("! VS: ", file_name);
Msg("! D3DXFindShaderComment hr == 0x%08x", _result);
}
_result = create_shader(pTarget, buffer, buffer_size, file_name, (SVS*&)result, disasm);
}
else
{
Expand Down
3 changes: 3 additions & 0 deletions src/Layers/xrRenderPC_R3/r3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -800,6 +800,9 @@ static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 cons
}
else if (pTarget[0] == 'v')
{
// XXX: try to use code below
// _result = create_shader(pTarget, buffer, buffer_size, file_name, (SVS*&)result, disasm);

SVS* svs_result = (SVS*)result;
#ifdef USE_DX11
_result = HW.pDevice->CreateVertexShader(buffer, buffer_size, 0, &svs_result->sh);
Expand Down
3 changes: 3 additions & 0 deletions src/Layers/xrRenderPC_R4/r4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -817,6 +817,9 @@ static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 cons
}
else if (pTarget[0] == 'v')
{
// XXX: try to use code below
// _result = create_shader(pTarget, buffer, buffer_size, file_name, (SVS*&)result, disasm);

SVS* svs_result = (SVS*)result;
#ifdef USE_DX11
_result = HW.pDevice->CreateVertexShader(buffer, buffer_size, 0, &svs_result->sh);
Expand Down

0 comments on commit d757f8a

Please sign in to comment.