mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-30 01:29:42 -06:00
Boot: Clean up the boot code
* Move out boot parameters to a separate struct, which is not part of SConfig/ConfigManager because there is no reason for it to be there. * Move out file name parsing and constructing the appropriate params from paths to a separate function that does that, and only that. * For every different boot type we support, add a proper struct with only the required parameters, with descriptive names and use std::variant to only store what we need. * Clean up the bHLE_BS2 stuff which made no sense sometimes. Now instead of using bHLE_BS2 for two different things, both for storing the user config setting and as a runtime boot parameter, we simply replace the Disc boot params with BootParameters::IPL. * Const correctness so it's clear what can or cannot update the config. * Drop unused parameters and unneeded checks. * Make a few checks a lot more concise. (Looking at you, extension checks for disc images.) * Remove a mildly terrible workaround where we needed to pass an empty string in order to boot the GC IPL without any game inserted. (Not required anymore thanks to std::variant and std::optional.) The motivation for this are multiple: cleaning up and being able to add support for booting an installed NAND title. Without this change, it'd be pretty much impossible to implement that. Also, using std::visit with std::variant makes the compiler do additional type checks: now we're guaranteed that the boot code will handle all boot types and no invalid boot type will be possible.
This commit is contained in:
@ -5,15 +5,13 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdlib>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <variant>
|
||||
|
||||
#include "Common/CommonTypes.h"
|
||||
|
||||
namespace DiscIO
|
||||
{
|
||||
class Volume;
|
||||
struct Partition;
|
||||
}
|
||||
#include "DiscIO/Enums.h"
|
||||
#include "DiscIO/Volume.h"
|
||||
|
||||
struct RegionSetting
|
||||
{
|
||||
@ -23,10 +21,57 @@ struct RegionSetting
|
||||
const std::string code;
|
||||
};
|
||||
|
||||
struct BootParameters
|
||||
{
|
||||
struct Disc
|
||||
{
|
||||
std::string path;
|
||||
std::unique_ptr<DiscIO::Volume> volume;
|
||||
};
|
||||
|
||||
struct Executable
|
||||
{
|
||||
enum class Type
|
||||
{
|
||||
DOL,
|
||||
ELF,
|
||||
};
|
||||
std::string path;
|
||||
Type type;
|
||||
};
|
||||
|
||||
struct NAND
|
||||
{
|
||||
std::string content_path;
|
||||
};
|
||||
|
||||
struct IPL
|
||||
{
|
||||
explicit IPL(DiscIO::Region region_);
|
||||
IPL(DiscIO::Region region_, Disc&& disc_);
|
||||
std::string path;
|
||||
DiscIO::Region region;
|
||||
// It is possible to boot the IPL with a disc inserted (with "skip IPL" disabled).
|
||||
std::optional<Disc> disc;
|
||||
};
|
||||
|
||||
struct DFF
|
||||
{
|
||||
std::string dff_path;
|
||||
};
|
||||
|
||||
static std::unique_ptr<BootParameters> GenerateFromFile(const std::string& path);
|
||||
|
||||
using Parameters = std::variant<Disc, Executable, NAND, IPL, DFF>;
|
||||
BootParameters(Parameters&& parameters_);
|
||||
|
||||
Parameters parameters;
|
||||
};
|
||||
|
||||
class CBoot
|
||||
{
|
||||
public:
|
||||
static bool BootUp();
|
||||
static bool BootUp(std::unique_ptr<BootParameters> boot);
|
||||
static bool IsElfWii(const std::string& filename);
|
||||
|
||||
// Tries to find a map file for the current game by looking first in the
|
||||
|
Reference in New Issue
Block a user