From 29743f87ca52ad1a6f0896f1074058cf3184ea4b Mon Sep 17 00:00:00 2001 From: D-AIRY <admin@ds-servers.com> Date: Fri, 26 Jun 2020 06:01:12 +0300 Subject: [PATCH] Fixed shader cache --- source/gcore/shader.cpp | 71 ++++++----------------------------------- source/gcore/shader.h | 50 ++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 62 deletions(-) diff --git a/source/gcore/shader.cpp b/source/gcore/shader.cpp index af26fb09d..05deff780 100644 --- a/source/gcore/shader.cpp +++ b/source/gcore/shader.cpp @@ -545,11 +545,9 @@ ID CShaderManager::existsPathMacro(SHADER_TYPE type, const char *szPath, GXMacro { for(int i = 0; i < m_aVS.size(); ++i) { - if(strcmp(m_aVS[i]->m_szPath, szPath) == 0) + if(m_aVS[i]->isSame(szPath, aMacros)) { - idShader = i; - pShaderMacro = m_aVS[i]->m_aMacros; - break; + return(i); } } } @@ -557,11 +555,9 @@ ID CShaderManager::existsPathMacro(SHADER_TYPE type, const char *szPath, GXMacro { for(int i = 0; i < m_aPS.size(); ++i) { - if(strcmp(m_aPS[i]->m_szPath, szPath) == 0) + if(m_aPS[i]->isSame(szPath, aMacros)) { - idShader = i; - pShaderMacro = m_aPS[i]->m_aMacros; - break; + return(i); } } } @@ -569,11 +565,9 @@ ID CShaderManager::existsPathMacro(SHADER_TYPE type, const char *szPath, GXMacro { for(int i = 0; i < m_aGS.size(); ++i) { - if(strcmp(m_aGS[i]->m_szPath, szPath) == 0) + if(m_aGS[i]->isSame(szPath, aMacros)) { - idShader = i; - pShaderMacro = m_aGS[i]->m_aMacros; - break; + return(i); } } } @@ -581,58 +575,13 @@ ID CShaderManager::existsPathMacro(SHADER_TYPE type, const char *szPath, GXMacro { for(int i = 0; i < m_aCS.size(); ++i) { - if(strcmp(m_aCS[i]->m_szPath, szPath) == 0) + if(m_aCS[i]->isSame(szPath, aMacros)) { - idShader = i; - pShaderMacro = m_aCS[i]->m_aMacros; - break; + return(i); } } } - if(ID_VALID(idShader)) - { - GXMacro def = {NULL, NULL}; - if(!aMacros) - { - aMacros = &def; - } - UINT i = 0, j; - bool bFound = false; - while(aMacros[i].szName) - { - j = 0; - bFound = false; - while(pShaderMacro[j].szName) - { - if(!strcmp(aMacros[i].szName, pShaderMacro[j].szName)) - { - if(strcmp(aMacros[i].szDefinition, pShaderMacro[j].szDefinition)) - { - return(-1); - } - bFound = true; - break; - } - ++j; - } - if(!bFound) - { - return(-1); - } - ++i; - } - j = 0; - while(pShaderMacro[j].szName) - { - ++j; - } - if(i != j) - { - return(-1); - } - return(idShader); - } return(-1); } @@ -658,7 +607,7 @@ ID CShaderManager::preLoad(SHADER_TYPE type, const char *szPath, GXMacro *aMacro if(!ID_VALID(id)) { - ScopedLock lock(m_mxLock); + ScopedSpinLock lock(m_spLock); CShader *pShader = 0; if(type == SHADER_TYPE_VERTEX) @@ -725,7 +674,7 @@ ID CShaderManager::preLoad(SHADER_TYPE type, const char *szPath, GXMacro *aMacro void CShaderManager::allLoad(bool bReload) { - ScopedLock lock(m_mxLock); + ScopedSpinLock lock(m_spLock); if(m_aVS.size() == m_iLastAllLoadVS && m_aPS.size() == m_iLastAllLoadPS && m_aGS.size() == m_iLastAllLoadGS && m_aCS.size() == m_iLastAllLoadCS) return; diff --git a/source/gcore/shader.h b/source/gcore/shader.h index c921797eb..499aa11a5 100644 --- a/source/gcore/shader.h +++ b/source/gcore/shader.h @@ -64,6 +64,54 @@ struct CShaderImpl: public CShader } } + bool isSame(const char *szPath, GXMacro *aMacros) + { + if(!strcmp(m_szPath, szPath)) + { + GXMacro def = {NULL, NULL}; + if(!aMacros) + { + aMacros = &def; + } + UINT i = 0, j; + bool bFound = false; + while(aMacros[i].szName) + { + j = 0; + bFound = false; + while(m_aMacros[j].szName) + { + if(!strcmp(aMacros[i].szName, m_aMacros[j].szName)) + { + if(strcmp(aMacros[i].szDefinition, m_aMacros[j].szDefinition)) + { + return(false); + } + bFound = true; + break; + } + ++j; + } + if(!bFound) + { + return(false); + } + ++i; + } + j = 0; + while(m_aMacros[j].szName) + { + ++j; + } + if(i != j) + { + return(false); + } + return(true); + } + return(false); + } + T *m_pGXShader; }; @@ -182,7 +230,7 @@ protected: Array<CShaderKit*> m_aShaderKit; - mutex m_mxLock; + SpinLock m_spLock; int m_iLastAllLoadVS = 0; //! общее количество загруженных vs шейдеров, с прошлого раза int m_iLastAllLoadPS = 0; //! общее количество загруженных ps шейдеров, с прошлого раза -- GitLab