diff --git a/src/Layers/xrRender/ResourceManager_Resources.cpp b/src/Layers/xrRender/ResourceManager_Resources.cpp index 08526158867..9579b7d9c55 100644 --- a/src/Layers/xrRender/ResourceManager_Resources.cpp +++ b/src/Layers/xrRender/ResourceManager_Resources.cpp @@ -157,7 +157,6 @@ void CResourceManager::_DeleteDecl(const SDeclaration* dcl) } //-------------------------------------------------------------------------------------------------------------- -#ifndef _EDITOR SVS* CResourceManager::_CreateVS(LPCSTR _name) { string_path name; @@ -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(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(name, true); } void CResourceManager::_DeletePS(const SPS* ps) { DestroyShader(ps); } diff --git a/src/Layers/xrRender/ShaderResourceTraits.h b/src/Layers/xrRender/ShaderResourceTraits.h index e7e00b99d9d..4aae78d1997 100644 --- a/src/Layers/xrRender/ShaderResourceTraits.h +++ b/src/Layers/xrRender/ShaderResourceTraits.h @@ -5,6 +5,54 @@ template struct ShaderTypeTraits; +template <> +struct ShaderTypeTraits +{ + 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 { @@ -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() @@ -256,7 +310,7 @@ inline T* CResourceManager::CreateShader(const char* name, const bool searchForE ShaderTypeTraits::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")) { @@ -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); diff --git a/src/Layers/xrRenderDX10/dx10ResourceManager_Resources.cpp b/src/Layers/xrRenderDX10/dx10ResourceManager_Resources.cpp index cb6be5f9da0..f6e7cf6e991 100644 --- a/src/Layers/xrRenderDX10/dx10ResourceManager_Resources.cpp +++ b/src/Layers/xrRenderDX10/dx10ResourceManager_Resources.cpp @@ -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(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); diff --git a/src/Layers/xrRenderPC_R1/FStaticRender.cpp b/src/Layers/xrRenderPC_R1/FStaticRender.cpp index 149e3aea488..70bfb9997db 100644 --- a/src/Layers/xrRenderPC_R1/FStaticRender.cpp +++ b/src/Layers/xrRenderPC_R1/FStaticRender.cpp @@ -758,8 +758,6 @@ template 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::CreateHWShader(buffer, buffer_size); LPCVOID data = nullptr; @@ -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 { diff --git a/src/Layers/xrRenderPC_R2/r2.cpp b/src/Layers/xrRenderPC_R2/r2.cpp index 0fe8ccb4281..e1993a7c885 100644 --- a/src/Layers/xrRenderPC_R2/r2.cpp +++ b/src/Layers/xrRenderPC_R2/r2.cpp @@ -633,8 +633,6 @@ template 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::CreateHWShader(buffer, buffer_size); LPCVOID data = nullptr; @@ -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 { diff --git a/src/Layers/xrRenderPC_R3/r3.cpp b/src/Layers/xrRenderPC_R3/r3.cpp index 9f9882b4ca1..e828d644cdc 100644 --- a/src/Layers/xrRenderPC_R3/r3.cpp +++ b/src/Layers/xrRenderPC_R3/r3.cpp @@ -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); diff --git a/src/Layers/xrRenderPC_R4/r4.cpp b/src/Layers/xrRenderPC_R4/r4.cpp index 04af5b4755e..15b1f6d26d7 100644 --- a/src/Layers/xrRenderPC_R4/r4.cpp +++ b/src/Layers/xrRenderPC_R4/r4.cpp @@ -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);