Jeck — Cache refresh functionality, forcing in situ reload of textures.
* Changing profiles will now reload graphics, in case the profile has a different theme/mode/whatever.
This commit is contained in:
@@ -36,6 +36,7 @@ public:
|
|||||||
bool ReleaseQuad(JQuad* quad); //We're done with this quad, so delete and stop tracking. True if existed.
|
bool ReleaseQuad(JQuad* quad); //We're done with this quad, so delete and stop tracking. True if existed.
|
||||||
protected:
|
protected:
|
||||||
JTexture * texture;
|
JTexture * texture;
|
||||||
|
bool bVRAM;
|
||||||
vector<JQuad*> trackedQuads;
|
vector<JQuad*> trackedQuads;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -82,6 +83,8 @@ public:
|
|||||||
void Release(JSample * sample);
|
void Release(JSample * sample);
|
||||||
|
|
||||||
void ClearMisses();
|
void ClearMisses();
|
||||||
|
void ClearUnlocked();
|
||||||
|
void Refresh(); //Refreshes all files in cache, for when mode/profile changes.
|
||||||
|
|
||||||
unsigned int nowTime();
|
unsigned int nowTime();
|
||||||
|
|
||||||
|
|||||||
@@ -319,6 +319,7 @@ void OptionProfile::acceptSubmode()
|
|||||||
options[Options::ACTIVE_PROFILE] = selections[value];
|
options[Options::ACTIVE_PROFILE] = selections[value];
|
||||||
initialValue = value;
|
initialValue = value;
|
||||||
populate();
|
populate();
|
||||||
|
resources.Refresh(); //Update images, in case we've changed profiles, etc.
|
||||||
bCheck = false;
|
bCheck = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ void WCachedResource::hit(){
|
|||||||
|
|
||||||
WCachedTexture::WCachedTexture(){
|
WCachedTexture::WCachedTexture(){
|
||||||
texture = NULL;
|
texture = NULL;
|
||||||
|
bVRAM = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
WCachedTexture::~WCachedTexture(){
|
WCachedTexture::~WCachedTexture(){
|
||||||
@@ -136,6 +137,28 @@ void WResourceManager::ClearMisses(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WResourceManager::ClearUnlocked(){
|
||||||
|
map<string,WCachedTexture*>::iterator itTex, nextTex;
|
||||||
|
map<string,WCachedSample*>::iterator itSfx, nextSfx;
|
||||||
|
|
||||||
|
for(itTex = textureCache.begin(); itTex != textureCache.end();itTex=nextTex){
|
||||||
|
nextTex = itTex;
|
||||||
|
nextTex++;
|
||||||
|
|
||||||
|
if(!itTex->second || (itTex->second && !itTex->second->isLocked())){
|
||||||
|
textureCache.erase(itTex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(itSfx = sampleCache.begin(); itSfx != sampleCache.end();itSfx=nextSfx){
|
||||||
|
nextSfx = itSfx;
|
||||||
|
nextSfx++;
|
||||||
|
|
||||||
|
if(!itSfx->second || (itSfx->second && !itSfx->second->isLocked())){
|
||||||
|
sampleCache.erase(itSfx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool WResourceManager::cleanup(){
|
bool WResourceManager::cleanup(){
|
||||||
int maxSize = options[Options::CACHESIZE].number * 100000;
|
int maxSize = options[Options::CACHESIZE].number * 100000;
|
||||||
if (!maxSize) maxSize = CACHE_SIZE_PIXELS;
|
if (!maxSize) maxSize = CACHE_SIZE_PIXELS;
|
||||||
@@ -475,6 +498,8 @@ JQuad * WResourceManager::RetrieveQuad(string filename, float offX, float offY,
|
|||||||
|
|
||||||
//Texture exists! Get quad.
|
//Texture exists! Get quad.
|
||||||
if(tc && tc->texture != NULL){
|
if(tc && tc->texture != NULL){
|
||||||
|
if(style == RETRIEVE_VRAM)
|
||||||
|
tc->bVRAM = true;
|
||||||
tc->hit();
|
tc->hit();
|
||||||
return tc->GetQuad(offX,offY,width,height);
|
return tc->GetQuad(offX,offY,width,height);
|
||||||
}
|
}
|
||||||
@@ -962,3 +987,102 @@ int WResourceManager::CreateQuad(const string &quadName, const string &textureNa
|
|||||||
else
|
else
|
||||||
return itr->second;
|
return itr->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WResourceManager::Refresh(){
|
||||||
|
map<string,WCachedTexture*>::iterator it;
|
||||||
|
vector<JQuad*>::iterator q;
|
||||||
|
JTexture * oldtex;
|
||||||
|
|
||||||
|
ClearMisses();
|
||||||
|
|
||||||
|
for(it = textureCache.begin();it!=textureCache.end();it++){
|
||||||
|
if(it->second == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
oldtex = it->second->texture;
|
||||||
|
|
||||||
|
//Reload the texture.
|
||||||
|
if(it->second->bVRAM)
|
||||||
|
it->second->texture = JRenderer::GetInstance()->LoadTexture(graphicsFile(it->first).c_str(),TEX_TYPE_USE_VRAM,TEXTURE_FORMAT);
|
||||||
|
else
|
||||||
|
it->second->texture = JRenderer::GetInstance()->LoadTexture(graphicsFile(it->first).c_str(),0,TEXTURE_FORMAT);
|
||||||
|
|
||||||
|
//This texture doesn't exist in our current theme. Either use the old one, or record cache miss.
|
||||||
|
if(!it->second->texture){
|
||||||
|
if(it->second->isLocked())
|
||||||
|
it->second->texture = oldtex;
|
||||||
|
else{
|
||||||
|
SAFE_DELETE(oldtex);
|
||||||
|
SAFE_DELETE(it->second);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Relink quads to new texture.
|
||||||
|
for(q = it->second->trackedQuads.begin(); q != it->second->trackedQuads.end(); q++){
|
||||||
|
(*q)->mTex = it->second->texture;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Now do some juggling so that managed resources also reload.
|
||||||
|
map<JTexture *,JTexture *> oldTextures;
|
||||||
|
map<JTexture *,string> newNames;
|
||||||
|
map<JTexture *,JTexture *>::iterator oldIt;
|
||||||
|
vector<JTexture*>::iterator jtex;
|
||||||
|
map<string, int>::iterator mapping;
|
||||||
|
JTexture * newtex;
|
||||||
|
|
||||||
|
//Store old mappings.
|
||||||
|
for(mapping = mTextureMap.begin();mapping != mTextureMap.end();mapping++){
|
||||||
|
if(oldTextures[mTextureList[mapping->second]] == NULL){
|
||||||
|
newtex = JRenderer::GetInstance()->LoadTexture(graphicsFile(mapping->first).c_str(),0,TEXTURE_FORMAT);
|
||||||
|
oldtex = mTextureList[mapping->second];
|
||||||
|
if(!newtex)
|
||||||
|
newNames[oldtex] = mapping->first;
|
||||||
|
else{
|
||||||
|
newNames[newtex] = mapping->first;
|
||||||
|
JRenderer::GetInstance()->BindTexture(newtex);
|
||||||
|
}
|
||||||
|
|
||||||
|
oldTextures[oldtex] = newtex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Remap quads.
|
||||||
|
for(q = mQuadList.begin();q!=mQuadList.end();q++){
|
||||||
|
newtex = oldTextures[(*q)->mTex];
|
||||||
|
if(newtex != NULL)
|
||||||
|
(*q)->mTex = newtex;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rebuild mTextureList and mapping.
|
||||||
|
mTextureList.clear();
|
||||||
|
mTextureMap.clear();
|
||||||
|
int x = 0;
|
||||||
|
for(oldIt = oldTextures.begin();oldIt!=oldTextures.end();oldIt++){
|
||||||
|
|
||||||
|
if(oldIt->second)
|
||||||
|
newtex = oldIt->second;
|
||||||
|
else
|
||||||
|
newtex = oldIt->first;
|
||||||
|
|
||||||
|
mTextureList.push_back(newtex);
|
||||||
|
mTextureMap[newNames[newtex]] = x;
|
||||||
|
x++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Rebuild mapping.
|
||||||
|
for(mapping = mTextureMap.begin();mapping != mTextureMap.end();mapping++){
|
||||||
|
if(oldTextures[mTextureList[mapping->second]] == NULL)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Delete unused textures.
|
||||||
|
for(oldIt = oldTextures.begin();oldIt!=oldTextures.end();oldIt++){
|
||||||
|
if(!oldIt->second || !oldIt->first )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
oldtex = oldIt->first;
|
||||||
|
SAFE_DELETE(oldtex);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user