mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-15 15:30:29 +02:00
A drained MpscQueue node goes onto a free stack shared by every queue of the same type, and a producer takes that stack whole when its own thread's list runs dry, so once warmed up a push no longer allocates. That takes the heap allocation back off memory block notifications, the CPU queue, Vulkan deletes and the GL render queue. A unit test runs several producers against one consumer over two rounds. The NpSignin dialog's delays run on emulated time and are saved with the state, so the dialog behaves the same at any speed and under run-ahead. The time since the last save and savestate goes; only the standalone frontends' exit prompts read it.
132 lines
4.9 KiB
C++
132 lines
4.9 KiB
C++
// Copyright (c) 2012- PPSSPP Project.
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, version 2.0 or later versions.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License 2.0 for more details.
|
|
|
|
// A copy of the GPL 2.0 should have been included with the program.
|
|
// If not, see http://www.gnu.org/licenses/
|
|
|
|
// Official git repository and contact information can be found at
|
|
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
|
|
|
#pragma once
|
|
|
|
#include <functional>
|
|
#include <string>
|
|
#include <string_view>
|
|
#include <vector>
|
|
|
|
#include "Common/File/Path.h"
|
|
#include "Common/Serialize/Serializer.h"
|
|
|
|
class ParamSFOData;
|
|
#undef Process
|
|
|
|
namespace SaveState {
|
|
enum class Status {
|
|
FAILURE,
|
|
WARNING,
|
|
SUCCESS,
|
|
};
|
|
typedef std::function<void(Status status, std::string_view message, std::string_view metadata)> Callback;
|
|
|
|
static const char * const SCREENSHOT_EXTENSION = "jpg";
|
|
|
|
void Init();
|
|
void Shutdown();
|
|
|
|
// Cycle through the 5 savestate slots
|
|
void PrevSlot();
|
|
void NextSlot();
|
|
|
|
std::string GetGamePrefix(const ParamSFOData ¶mSFO);
|
|
|
|
// Run the various actions directly.
|
|
void SaveSlot(std::string_view gamePrefix, int slot, Callback callback);
|
|
void LoadSlot(std::string_view gamePrefix, int slot, Callback callback);
|
|
bool UndoSaveSlot(std::string_view gamePrefix, int slot);
|
|
bool UndoLastSave(std::string_view gamePrefix);
|
|
bool UndoLoad(std::string_view gamePrefix, Callback callback);
|
|
void DeleteSlot(std::string_view gamePrefix, int slot);
|
|
|
|
// This will rescan the save state directory for files associated with the specified game.
|
|
// Note that when we have many save states, this is really important on Android.
|
|
void Rescan(std::string_view gamePrefix);
|
|
|
|
// Checks whether there's an existing save in the specified slot.
|
|
bool HasSaveInSlot(std::string_view gamePrefix, int slot);
|
|
bool HasUndoSaveInSlot(std::string_view gamePrefix, int slot);
|
|
bool HasUndoLastSave(std::string_view gamePrefix);
|
|
bool HasUndoLoad(std::string_view gamePrefix);
|
|
bool HasScreenshotInSlot(std::string_view gamePrefix, int slot);
|
|
|
|
// Just returns the current slot from config.
|
|
int GetCurrentSlot();
|
|
|
|
// Returns -1 if there's no oldest/newest slot.
|
|
int GetNewestSlot(std::string_view gamePrefix);
|
|
int GetOldestSlot(std::string_view gamePrefix);
|
|
|
|
std::string GetSlotDateAsString(std::string_view gamePrefix, int slot);
|
|
|
|
std::string GetSlotCustomName(std::string_view gamePrefix, int slot);
|
|
Path GenerateSaveSlotPath(std::string_view gamePrefix, int slot, const char *extension);
|
|
void SetSlotCustomName(std::string_view gamePrefix, int slot, std::string_view newName);
|
|
|
|
// The files that sit beside a savestate and mean nothing without it: its screenshot, and the
|
|
// slot's custom name if it was given one. Anything deleting a .ppst from outside DeleteSlot -
|
|
// the savestate browser does exactly that - has to take these along, or they stay in the
|
|
// savestate folder for good. Returns nothing for a path that isn't a savestate.
|
|
std::vector<Path> GetCompanionFilePaths(const Path &statePath);
|
|
|
|
std::string GetTitle(const Path &filename);
|
|
|
|
// Load the specified file into the current state (async.)
|
|
// Warning: callback will be called on a different thread.
|
|
void Load(const Path &filename, int slot, Callback callback = Callback());
|
|
|
|
// Save the current state to the specified file (async.)
|
|
// Warning: callback will be called on a different thread.
|
|
void Save(const Path &filename, int slot, Callback callback = Callback());
|
|
|
|
CChunkFileReader::Error SaveToRam(std::vector<u8> &state);
|
|
CChunkFileReader::Error LoadFromRam(std::vector<u8> &state, std::string *errorString);
|
|
|
|
// For testing / automated tests. Runs a save state verification pass (async.)
|
|
// Warning: callback will be called on a different thread.
|
|
void Verify(Callback callback = Callback());
|
|
|
|
// To go back to a previous snapshot (only if enabled.)
|
|
// Warning: callback will be called on a different thread.
|
|
void Rewind(Callback callback = Callback());
|
|
|
|
// Returns true if there are rewind snapshots available.
|
|
bool CanRewind();
|
|
|
|
// Returns true if a savestate has been used during this session.
|
|
bool HasLoadedState();
|
|
|
|
// Returns true if the state has been reused instead of real saves many times.
|
|
bool IsStale();
|
|
|
|
// Returns true if state is from an older PPSSPP version.
|
|
bool IsOldVersion();
|
|
|
|
// Check if there's any save stating needing to be done. Normally called once per frame.
|
|
void Process();
|
|
|
|
// Notify save state code that new save data has been written.
|
|
void NotifySaveData();
|
|
|
|
// Checks whether a bad load required the caller to trigger a restart (and if returns true, resets the flag internally).
|
|
bool PollRestartNeeded();
|
|
|
|
// Returns the time since last save. -1 if N/A.
|
|
} // namespace SaveState
|