mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-31 19:47:06 +01:00
A disc game or memory stick EBOOT started from the XMB used to be swapped in under the XMB's session, so it ran without its PARAM.SFO, compat flags, game config, window title, savestates and so on. Much of that is decided once, at boot (the memory map, the GPU backend, the shader cache), so sceKernelLoadExec now asks the frontend for a reboot into the disc image or EBOOT (PSP_RequestBoot) and stops. The app and headless boot it like a game from the game list. The game keeps the XMB's launch args (CoreParameter::launchedFromVSH), so exiting boots the XMB again, with the disc that's in the drive and those args, and the XMB comes back where it was without auto-starting the disc. Homebrew keeps the disc that was in the drive. A disc whose executables are all zeroes (the EUR Video Demo Disc's "game") still loads in place and fails back to the XMB. In headless, the run carries on through the reboot, starting stopped under the debugger like the first boot, since the reboot loses a pending cpu.runUntilTime. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
129 lines
4.1 KiB
C++
129 lines
4.1 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 <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "Common/File/Path.h"
|
|
#include "Core/Compatibility.h"
|
|
#include "Core/Loaders.h"
|
|
|
|
enum GPUCore : int {
|
|
GPUCORE_GLES = 0,
|
|
GPUCORE_SOFTWARE = 1,
|
|
GPUCORE_DIRECTX11 = 3,
|
|
GPUCORE_VULKAN = 4,
|
|
GPUCORE_NULL = 5, // Draws nothing, see GPU_Null.h.
|
|
GPUCORE_METAL = 6,
|
|
};
|
|
|
|
// The XMB session a game was started from.
|
|
struct VSHLaunch {
|
|
Path vshmain; // Host path of vshmain.prx.
|
|
std::vector<u8> vshmainArgs; // What the XMB passed when it launched the game.
|
|
};
|
|
|
|
enum class FPSLimit {
|
|
NORMAL = 0,
|
|
CUSTOM1 = 1,
|
|
CUSTOM2 = 2,
|
|
ANALOG = 3,
|
|
// Set over the WebSocket debugger (game.speed.set). Deliberately its own mode instead of
|
|
// reusing CUSTOM1/2: those read their rate from g_Config, which is persisted per game, so a
|
|
// debugger session would permanently overwrite the user's configured alternative speed.
|
|
DEBUGGER = 4,
|
|
};
|
|
|
|
class FileLoader;
|
|
|
|
class GraphicsContext;
|
|
namespace Draw {
|
|
class DrawContext;
|
|
}
|
|
|
|
enum class CPUCore;
|
|
|
|
// PSP_CoreParameter()
|
|
struct CoreParameter {
|
|
CPUCore cpuCore;
|
|
GPUCore gpuCore;
|
|
|
|
// Independent of cpuCore. Standalone turns it on wherever the host can JIT; headless keeps it
|
|
// off, since the test references were recorded with the C++ vertex decoder.
|
|
bool bUseVertexDecoderJit = false;
|
|
|
|
GraphicsContext *graphicsContext = nullptr; // TODO: Find a better place.
|
|
bool enableSound = true; // there aren't multiple sound cores.
|
|
|
|
Path fileToStart;
|
|
|
|
Path mountIso; // If non-empty, and fileToStart is an ELF or PBP, will mount this ISO in the background to umd1:.
|
|
Path mountRoot; // If non-empty, and fileToStart is an ELF or PBP, mount this as host0:.
|
|
// Overrides the VSH's "UMD auto-start" setting (bVshUmdAutoboot) for this boot.
|
|
std::optional<bool> umdAutoboot;
|
|
|
|
// Set when the XMB started this game, which then boots the XMB again when it exits.
|
|
std::optional<VSHLaunch> launchedFromVSH;
|
|
// For a boot of vshmain.prx: what its module_start gets, which tells it it's coming back from a game.
|
|
std::vector<u8> vshmainArgs;
|
|
|
|
Path nandRoot; // If non-empty, use this directory as the root above flash0:-flash3: (which are hosted in subdirectories flash0-flash3 of it).
|
|
|
|
std::string errorString;
|
|
bool loadGameConfigs = true;
|
|
|
|
bool startBreak = false;
|
|
std::string *collectDebugOutput = nullptr;
|
|
bool headLess = false; // Try to avoid messageboxes etc
|
|
// Headless leaves out compat settings when replaying frame dumps, unless this is set.
|
|
bool dumpCompat = false;
|
|
// Headless: GPU_USE_ feature bits to turn off, to test the fallbacks for GPUs without them.
|
|
u32 disabledGPUFeatures = 0;
|
|
|
|
// Internal PSP rendering resolution and scale factor.
|
|
int renderScaleFactor = 1;
|
|
int renderWidth = 0;
|
|
int renderHeight = 0;
|
|
|
|
// Actual output resolution in pixels.
|
|
int pixelWidth = 0;
|
|
int pixelHeight = 0;
|
|
|
|
// Can be modified at runtime. Do not belong here.
|
|
bool fastForward = false;
|
|
FPSLimit fpsLimit = FPSLimit::NORMAL;
|
|
int analogFpsLimit = 0;
|
|
// Target FPS for FPSLimit::DEBUGGER. Lives here rather than in g_Config on purpose - see the
|
|
// enum. Resets with the rest of this struct on every boot, so a debugger can't leave a game
|
|
// permanently slowed down.
|
|
int debuggerFpsLimit = 0;
|
|
|
|
bool updateRecent = true;
|
|
|
|
// Freeze-frame. For nvidia perfhud profiling. Developers only.
|
|
bool freezeNext = false;
|
|
bool frozen = false;
|
|
|
|
FileLoader *mountIsoLoader = nullptr;
|
|
IdentifiedFileType fileType = IdentifiedFileType::UNKNOWN;
|
|
|
|
Compatibility compat;
|
|
};
|