Savedata: Skip and defer texture exist check.
We can skip if there's no UI.
This commit is contained in:
parent
8c1acc30e4
commit
5bed35b293
5 changed files with 78 additions and 24 deletions
|
@ -56,6 +56,29 @@ const static int SAVEDATA_DIALOG_SIZE_V1 = 1480;
|
|||
const static int SAVEDATA_DIALOG_SIZE_V2 = 1500;
|
||||
const static int SAVEDATA_DIALOG_SIZE_V3 = 1536;
|
||||
|
||||
static bool IsNotVisibleAction(SceUtilitySavedataType type) {
|
||||
switch (type) {
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_AUTOLOAD:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_AUTOSAVE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_SIZES:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_LIST:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_FILES:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_GETSIZE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATASECURE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_MAKEDATA:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATASECURE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_WRITEDATA:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_READDATASECURE:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_READDATA:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_DELETEDATA:
|
||||
case SCE_UTILITY_SAVEDATA_TYPE_AUTODELETE:
|
||||
return true;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
PSPSaveDialog::PSPSaveDialog(UtilityDialogType type) : PSPDialog(type) {
|
||||
param.SetPspParam(0);
|
||||
|
@ -87,6 +110,7 @@ int PSPSaveDialog::Init(int paramAddr)
|
|||
Memory::Memcpy(&request, requestAddr, size);
|
||||
Memory::Memcpy(&originalRequest, requestAddr, size);
|
||||
|
||||
param.SetIgnoreTextures(IsNotVisibleAction((SceUtilitySavedataType)(u32)request.mode));
|
||||
int retval = param.SetPspParam(&request);
|
||||
|
||||
const u32 mode = (u32)param.GetPspParam()->mode;
|
||||
|
@ -345,7 +369,7 @@ void PSPSaveDialog::DisplaySaveList(bool canMove) {
|
|||
PPGeImageStyle imageStyle = FadedImageStyle();
|
||||
auto fileInfo = param.GetFileInfo(displayCount);
|
||||
|
||||
if (fileInfo.size == 0 && fileInfo.texture != NULL)
|
||||
if (fileInfo.size == 0 && fileInfo.texture && fileInfo.texture->IsValid())
|
||||
imageStyle.color = CalcFadedColor(0xFF777777);
|
||||
|
||||
// Calc save image position on screen
|
||||
|
@ -370,7 +394,7 @@ void PSPSaveDialog::DisplaySaveList(bool canMove) {
|
|||
continue;
|
||||
|
||||
int pad = 0;
|
||||
if (fileInfo.texture != nullptr) {
|
||||
if (fileInfo.texture != nullptr && fileInfo.texture->IsValid()) {
|
||||
fileInfo.texture->SetTexture();
|
||||
int tw = fileInfo.texture->Width();
|
||||
int th = fileInfo.texture->Height();
|
||||
|
@ -420,7 +444,7 @@ void PSPSaveDialog::DisplaySaveIcon(bool checkExists)
|
|||
|
||||
int tw = 256;
|
||||
int th = 256;
|
||||
if (curSave.texture != NULL) {
|
||||
if (curSave.texture != nullptr && curSave.texture->IsValid()) {
|
||||
curSave.texture->SetTexture();
|
||||
tw = curSave.texture->Width();
|
||||
th = curSave.texture->Height();
|
||||
|
|
|
@ -1600,15 +1600,14 @@ void SavedataParam::SetFileInfo(SaveFileInfo &saveInfo, PSPFileInfo &info, std::
|
|||
|
||||
// Search save image icon0
|
||||
// TODO : If icon0 don't exist, need to use icon1 which is a moving icon. Also play sound
|
||||
std::string fileDataPath2 = savePath + saveDir + "/" + ICON0_FILENAME;
|
||||
PSPFileInfo info2 = pspFileSystem.GetFileInfo(fileDataPath2);
|
||||
if (info2.exists)
|
||||
saveInfo.texture = new PPGeImage(fileDataPath2);
|
||||
if (!ignoreTextures_) {
|
||||
saveInfo.texture = new PPGeImage(savePath + saveDir + "/" + ICON0_FILENAME);
|
||||
}
|
||||
|
||||
// Load info in PARAM.SFO
|
||||
std::vector<u8> sfoData;
|
||||
fileDataPath2 = savePath + saveDir + "/" + SFO_FILENAME;
|
||||
if (pspFileSystem.ReadEntireFile(fileDataPath2, sfoData) >= 0) {
|
||||
std::string sfoFilename = savePath + saveDir + "/" + SFO_FILENAME;
|
||||
if (pspFileSystem.ReadEntireFile(sfoFilename, sfoData) >= 0) {
|
||||
ParamSFOData sfoFile;
|
||||
if (sfoFile.ReadSFO(sfoData)) {
|
||||
SetStringFromSFO(sfoFile, "TITLE", saveInfo.title, sizeof(saveInfo.title));
|
||||
|
@ -1859,9 +1858,8 @@ bool SavedataParam::wouldHasMultiSaveName(SceUtilitySavedataParam* param) {
|
|||
}
|
||||
}
|
||||
|
||||
void SavedataParam::DoState(PointerWrap &p)
|
||||
{
|
||||
auto s = p.Section("SavedataParam", 1);
|
||||
void SavedataParam::DoState(PointerWrap &p) {
|
||||
auto s = p.Section("SavedataParam", 1, 2);
|
||||
if (!s)
|
||||
return;
|
||||
|
||||
|
@ -1869,20 +1867,24 @@ void SavedataParam::DoState(PointerWrap &p)
|
|||
Do(p, selectedSave);
|
||||
Do(p, saveDataListCount);
|
||||
Do(p, saveNameListDataCount);
|
||||
if (p.mode == p.MODE_READ)
|
||||
{
|
||||
if (p.mode == p.MODE_READ) {
|
||||
if (saveDataList != NULL)
|
||||
delete [] saveDataList;
|
||||
if (saveDataListCount != 0)
|
||||
{
|
||||
if (saveDataListCount != 0) {
|
||||
saveDataList = new SaveFileInfo[saveDataListCount];
|
||||
DoArray(p, saveDataList, saveDataListCount);
|
||||
}
|
||||
else
|
||||
} else {
|
||||
saveDataList = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
DoArray(p, saveDataList, saveDataListCount);
|
||||
|
||||
if (s >= 2) {
|
||||
Do(p, ignoreTextures_);
|
||||
} else {
|
||||
ignoreTextures_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
int SavedataParam::GetSaveCryptMode(SceUtilitySavedataParam *param, const std::string &saveDirName) {
|
||||
|
|
|
@ -324,6 +324,9 @@ public:
|
|||
|
||||
static std::string GetSpaceText(u64 size, bool roundUp);
|
||||
|
||||
void SetIgnoreTextures(bool state) {
|
||||
ignoreTextures_ = state;
|
||||
}
|
||||
int SetPspParam(SceUtilitySavedataParam* param);
|
||||
SceUtilitySavedataParam *GetPspParam();
|
||||
const SceUtilitySavedataParam *GetPspParam() const;
|
||||
|
@ -379,4 +382,5 @@ private:
|
|||
SaveFileInfo *noSaveIcon = nullptr;
|
||||
int saveDataListCount = 0;
|
||||
int saveNameListDataCount = 0;
|
||||
bool ignoreTextures_ = false;
|
||||
};
|
||||
|
|
|
@ -1256,11 +1256,11 @@ void PPGeDisableTexture()
|
|||
std::vector<PPGeImage *> PPGeImage::loadedTextures_;
|
||||
|
||||
PPGeImage::PPGeImage(const std::string &pspFilename)
|
||||
: filename_(pspFilename), texture_(0) {
|
||||
: filename_(pspFilename) {
|
||||
}
|
||||
|
||||
PPGeImage::PPGeImage(u32 pngPointer, size_t pngSize)
|
||||
: filename_(""), png_(pngPointer), size_(pngSize), texture_(0) {
|
||||
: filename_(""), png_(pngPointer), size_(pngSize) {
|
||||
}
|
||||
|
||||
PPGeImage::~PPGeImage() {
|
||||
|
@ -1268,6 +1268,7 @@ PPGeImage::~PPGeImage() {
|
|||
}
|
||||
|
||||
bool PPGeImage::Load() {
|
||||
loadFailed_ = false;
|
||||
Free();
|
||||
|
||||
// In case it fails to load.
|
||||
|
@ -1281,7 +1282,8 @@ bool PPGeImage::Load() {
|
|||
} else {
|
||||
std::vector<u8> pngData;
|
||||
if (pspFileSystem.ReadEntireFile(filename_, pngData) < 0) {
|
||||
WARN_LOG(SCEGE, "Bad PPGeImage - cannot load file");
|
||||
WARN_LOG(SCEGE, "PPGeImage cannot load file %s", filename_.c_str());
|
||||
loadFailed_ = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1289,6 +1291,7 @@ bool PPGeImage::Load() {
|
|||
}
|
||||
if (!success) {
|
||||
WARN_LOG(SCEGE, "Bad PPGeImage - not a valid png");
|
||||
loadFailed_ = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1298,6 +1301,7 @@ bool PPGeImage::Load() {
|
|||
if (texture_ == 0) {
|
||||
free(textureData);
|
||||
WARN_LOG(SCEGE, "Bad PPGeImage - unable to allocate space for texture");
|
||||
// Don't set loadFailed_ here, we'll try again if there's more memory later.
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1310,16 +1314,28 @@ bool PPGeImage::Load() {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool PPGeImage::IsValid() {
|
||||
if (loadFailed_)
|
||||
return false;
|
||||
|
||||
if (texture_ == 0) {
|
||||
Decimate();
|
||||
return Load();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void PPGeImage::Free() {
|
||||
if (texture_ != 0) {
|
||||
kernelMemory.Free(texture_);
|
||||
texture_ = 0;
|
||||
loadedTextures_.erase(std::remove(loadedTextures_.begin(), loadedTextures_.end(), this), loadedTextures_.end());
|
||||
loadFailed_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
void PPGeImage::DoState(PointerWrap &p) {
|
||||
auto s = p.Section("PPGeImage", 1);
|
||||
auto s = p.Section("PPGeImage", 1, 2);
|
||||
if (!s)
|
||||
return;
|
||||
|
||||
|
@ -1330,6 +1346,11 @@ void PPGeImage::DoState(PointerWrap &p) {
|
|||
Do(p, width_);
|
||||
Do(p, height_);
|
||||
Do(p, lastFrame_);
|
||||
if (s >= 2) {
|
||||
Do(p, loadFailed_);
|
||||
} else {
|
||||
loadFailed_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
void PPGeImage::CompatLoad(u32 texture, int width, int height) {
|
||||
|
@ -1337,6 +1358,7 @@ void PPGeImage::CompatLoad(u32 texture, int width, int height) {
|
|||
texture_ = texture;
|
||||
width_ = width;
|
||||
height_ = height;
|
||||
loadFailed_ = false;
|
||||
}
|
||||
|
||||
void PPGeImage::Decimate(int age) {
|
||||
|
@ -1351,7 +1373,7 @@ void PPGeImage::Decimate(int age) {
|
|||
}
|
||||
|
||||
void PPGeImage::SetTexture() {
|
||||
if (texture_ == 0) {
|
||||
if (texture_ == 0 && !loadFailed_) {
|
||||
Decimate();
|
||||
Load();
|
||||
}
|
||||
|
|
|
@ -122,6 +122,7 @@ public:
|
|||
// Does not normally need to be called (except to force preloading.)
|
||||
bool Load();
|
||||
void Free();
|
||||
bool IsValid();
|
||||
|
||||
void DoState(PointerWrap &p);
|
||||
|
||||
|
@ -147,11 +148,12 @@ private:
|
|||
u32 png_;
|
||||
size_t size_;
|
||||
|
||||
u32 texture_;
|
||||
u32 texture_ = 0;
|
||||
int width_;
|
||||
int height_;
|
||||
|
||||
int lastFrame_;
|
||||
bool loadFailed_ = false;
|
||||
};
|
||||
|
||||
void PPGeDrawRect(float x1, float y1, float x2, float y2, u32 color);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue