Jeck - Cache Leakfix. Quads now individually lock/unlock. Demo still crashes PSP.

This commit is contained in:
wagic.jeck
2009-09-14 20:54:49 +00:00
parent 5467fd379f
commit a84ed94954
4 changed files with 218 additions and 65 deletions

View File

@@ -54,6 +54,7 @@ void WResourceManager::DebugRender(){
#ifdef DEBUG_CACHE
if(debugMessage.size())
font->DrawString(debugMessage.c_str(), SCREEN_WIDTH-10,SCREEN_HEIGHT-25,JGETEXT_RIGHT);
#endif
}
@@ -161,6 +162,11 @@ WResourceManager::WResourceManager(){
WResourceManager::~WResourceManager(){
LOG("==Destroying WResourceManager==");
RemoveAll();
for(vector<WManagedQuad*>::iterator it=managedQuads.begin();it!=managedQuads.end();it++){
WManagedQuad* wm = *it;
SAFE_DELETE(wm);
}
managedQuads.clear();
LOG("==Successfully Destroyed WResourceManager==");
}
@@ -199,10 +205,10 @@ int WResourceManager::CreateQuad(const string &quadName, const string &textureNa
string resname = quadName;
std::transform(resname.begin(),resname.end(),resname.begin(),::tolower);
vector<WManagedQuad>::iterator it;
vector<WManagedQuad*>::iterator it;
int pos = 0;
for(it = managedQuads.begin();it!=managedQuads.end();it++,pos++){
if(it->resname == resname)
if((*it)->resname == resname)
return pos;
}
@@ -216,9 +222,10 @@ int WResourceManager::CreateQuad(const string &quadName, const string &textureNa
JQuad * jq = jtex->GetQuad(x,y,width,height,quadName);
if(jq){
WManagedQuad mq;
mq.resname = resname;
mq.texture = jtex;
WManagedQuad * mq;
mq = NEW WManagedQuad();
mq->resname = resname;
mq->texture = jtex;
managedQuads.push_back(mq);
}
@@ -232,9 +239,9 @@ JQuad * WResourceManager::GetQuad(const string &quadName){
string lookup = quadName;
std::transform(lookup.begin(),lookup.end(),lookup.begin(),::tolower);
for(vector<WManagedQuad>::iterator it=managedQuads.begin();it!=managedQuads.end();it++){
if(it->resname == lookup)
return it->texture->GetQuad(lookup);
for(vector<WManagedQuad*>::iterator it=managedQuads.begin();it!=managedQuads.end();it++){
if((*it)->resname == lookup)
return (*it)->texture->GetQuad(lookup);
}
return NULL;
@@ -244,11 +251,11 @@ JQuad * WResourceManager::GetQuad(int id){
if(id < 0 || id >= (int) managedQuads.size())
return NULL;
WCachedTexture * jtex = managedQuads[id].texture;
WCachedTexture * jtex = managedQuads[id]->texture;
if(!jtex)
return NULL;
return jtex->GetQuad(managedQuads[id].resname);
return jtex->GetQuad(managedQuads[id]->resname);
}
JQuad * WResourceManager::RetrieveTempQuad(string filename){
@@ -265,12 +272,26 @@ JQuad * WResourceManager::RetrieveQuad(string filename, float offX, float offY,
return jq;
}
//Aliases.
if(style == RETRIEVE_VRAM){
submode = submode | TEXTURE_SUB_VRAM;
style = RETRIEVE_LOCK;
}
else if(style == RETRIEVE_THUMB){
submode = submode | TEXTURE_SUB_THUMB;
style = RETRIEVE_NORMAL;
}
//Resname defaults to filename.
if(!resname.size())
resname = filename;
//No quad, but we have a managed texture for this!
WCachedTexture * jtex = textureWCache.Retrieve(filename,style,submode);
WCachedTexture * jtex = NULL;
if(style == RETRIEVE_MANAGE)
jtex = textureWCache.Retrieve(filename,RETRIEVE_MANAGE,submode);
else
jtex = textureWCache.Retrieve(filename,RETRIEVE_NORMAL,submode);
//Somehow, jtex wasn't promoted.
if(style == RETRIEVE_MANAGE && jtex && !jtex->isPermanent())
@@ -278,16 +299,26 @@ JQuad * WResourceManager::RetrieveQuad(string filename, float offX, float offY,
//Make this quad, overwriting any similarly resname'd quads.
if(jtex){
jq = jtex->GetQuad(offX,offY,width,height,resname);
WTrackedQuad * tq = jtex->GetTrackedQuad(offX,offY,width,height,resname);
if(tq == NULL)
return NULL;
if(style == RETRIEVE_MANAGE && resname != ""){
WManagedQuad mq;
mq.resname = resname;
mq.texture = jtex;
WManagedQuad * mq = NEW WManagedQuad();
mq->resname = resname;
mq->texture = jtex;
managedQuads.push_back(mq);
}
return jq;
if(style == RETRIEVE_LOCK)
tq->lock();
else if(style == RETRIEVE_UNLOCK)
tq->unlock();
else if(style == RETRIEVE_MANAGE)
tq->deadbolt();
return tq->quad;
}
//Texture doesn't exist, so no quad.