core: Port core to VfsFilesystem for file access
This commit is contained in:
parent
aaa8fdea52
commit
4b471f0554
|
@ -89,7 +89,7 @@ System::ResultStatus System::SingleStep() {
|
||||||
}
|
}
|
||||||
|
|
||||||
System::ResultStatus System::Load(EmuWindow& emu_window, const std::string& filepath) {
|
System::ResultStatus System::Load(EmuWindow& emu_window, const std::string& filepath) {
|
||||||
app_loader = Loader::GetLoader(std::make_shared<FileSys::RealVfsFile>(filepath));
|
app_loader = Loader::GetLoader(virtual_filesystem->OpenFile(filepath, FileSys::Mode::Read));
|
||||||
|
|
||||||
if (!app_loader) {
|
if (!app_loader) {
|
||||||
LOG_CRITICAL(Core, "Failed to obtain loader for {}!", filepath);
|
LOG_CRITICAL(Core, "Failed to obtain loader for {}!", filepath);
|
||||||
|
@ -174,6 +174,10 @@ System::ResultStatus System::Init(EmuWindow& emu_window) {
|
||||||
|
|
||||||
CoreTiming::Init();
|
CoreTiming::Init();
|
||||||
|
|
||||||
|
// Create a default fs if one doesn't already exist.
|
||||||
|
if (virtual_filesystem == nullptr)
|
||||||
|
virtual_filesystem = std::make_shared<FileSys::RealVfsFilesystem>();
|
||||||
|
|
||||||
current_process = Kernel::Process::Create("main");
|
current_process = Kernel::Process::Create("main");
|
||||||
|
|
||||||
cpu_barrier = std::make_shared<CpuBarrier>();
|
cpu_barrier = std::make_shared<CpuBarrier>();
|
||||||
|
@ -186,7 +190,7 @@ System::ResultStatus System::Init(EmuWindow& emu_window) {
|
||||||
service_manager = std::make_shared<Service::SM::ServiceManager>();
|
service_manager = std::make_shared<Service::SM::ServiceManager>();
|
||||||
|
|
||||||
Kernel::Init();
|
Kernel::Init();
|
||||||
Service::Init(service_manager);
|
Service::Init(service_manager, virtual_filesystem);
|
||||||
GDBStub::Init();
|
GDBStub::Init();
|
||||||
|
|
||||||
renderer = VideoCore::CreateRenderer(emu_window);
|
renderer = VideoCore::CreateRenderer(emu_window);
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
#include "core/perf_stats.h"
|
#include "core/perf_stats.h"
|
||||||
#include "core/telemetry_session.h"
|
#include "core/telemetry_session.h"
|
||||||
|
#include "file_sys/vfs_real.h"
|
||||||
|
#include "hle/service/filesystem/filesystem.h"
|
||||||
#include "video_core/debug_utils/debug_utils.h"
|
#include "video_core/debug_utils/debug_utils.h"
|
||||||
#include "video_core/gpu.h"
|
#include "video_core/gpu.h"
|
||||||
|
|
||||||
|
@ -211,6 +213,14 @@ public:
|
||||||
return debug_context;
|
return debug_context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetFilesystem(FileSys::VirtualFilesystem vfs) {
|
||||||
|
virtual_filesystem = std::move(vfs);
|
||||||
|
}
|
||||||
|
|
||||||
|
FileSys::VirtualFilesystem GetFilesystem() const {
|
||||||
|
return virtual_filesystem;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
System();
|
System();
|
||||||
|
|
||||||
|
@ -225,6 +235,8 @@ private:
|
||||||
*/
|
*/
|
||||||
ResultStatus Init(EmuWindow& emu_window);
|
ResultStatus Init(EmuWindow& emu_window);
|
||||||
|
|
||||||
|
/// RealVfsFilesystem instance
|
||||||
|
FileSys::VirtualFilesystem virtual_filesystem;
|
||||||
/// AppLoader used to load the current executing application
|
/// AppLoader used to load the current executing application
|
||||||
std::unique_ptr<Loader::AppLoader> app_loader;
|
std::unique_ptr<Loader::AppLoader> app_loader;
|
||||||
std::unique_ptr<VideoCore::RendererBase> renderer;
|
std::unique_ptr<VideoCore::RendererBase> renderer;
|
||||||
|
|
|
@ -281,15 +281,15 @@ ResultVal<FileSys::VirtualDir> OpenSDMC() {
|
||||||
return sdmc_factory->Open();
|
return sdmc_factory->Open();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegisterFileSystems() {
|
void RegisterFileSystems(const FileSys::VirtualFilesystem& vfs) {
|
||||||
romfs_factory = nullptr;
|
romfs_factory = nullptr;
|
||||||
save_data_factory = nullptr;
|
save_data_factory = nullptr;
|
||||||
sdmc_factory = nullptr;
|
sdmc_factory = nullptr;
|
||||||
|
|
||||||
auto nand_directory = std::make_shared<FileSys::RealVfsDirectory>(
|
auto nand_directory = vfs->OpenDirectory(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir),
|
||||||
FileUtil::GetUserPath(FileUtil::UserPath::NANDDir), FileSys::Mode::ReadWrite);
|
FileSys::Mode::ReadWrite);
|
||||||
auto sd_directory = std::make_shared<FileSys::RealVfsDirectory>(
|
auto sd_directory = vfs->OpenDirectory(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir),
|
||||||
FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir), FileSys::Mode::ReadWrite);
|
FileSys::Mode::ReadWrite);
|
||||||
|
|
||||||
auto savedata = std::make_unique<FileSys::SaveDataFactory>(std::move(nand_directory));
|
auto savedata = std::make_unique<FileSys::SaveDataFactory>(std::move(nand_directory));
|
||||||
save_data_factory = std::move(savedata);
|
save_data_factory = std::move(savedata);
|
||||||
|
@ -298,8 +298,8 @@ void RegisterFileSystems() {
|
||||||
sdmc_factory = std::move(sdcard);
|
sdmc_factory = std::move(sdcard);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstallInterfaces(SM::ServiceManager& service_manager) {
|
void InstallInterfaces(SM::ServiceManager& service_manager, const FileSys::VirtualFilesystem& vfs) {
|
||||||
RegisterFileSystems();
|
RegisterFileSystems(vfs);
|
||||||
std::make_shared<FSP_LDR>()->InstallAsService(service_manager);
|
std::make_shared<FSP_LDR>()->InstallAsService(service_manager);
|
||||||
std::make_shared<FSP_PR>()->InstallAsService(service_manager);
|
std::make_shared<FSP_PR>()->InstallAsService(service_manager);
|
||||||
std::make_shared<FSP_SRV>()->InstallAsService(service_manager);
|
std::make_shared<FSP_SRV>()->InstallAsService(service_manager);
|
||||||
|
|
|
@ -36,7 +36,7 @@ ResultVal<FileSys::VirtualDir> OpenSDMC();
|
||||||
// ResultVal<std::unique_ptr<FileSys::FileSystemBackend>> OpenBIS();
|
// ResultVal<std::unique_ptr<FileSys::FileSystemBackend>> OpenBIS();
|
||||||
|
|
||||||
/// Registers all Filesystem services with the specified service manager.
|
/// Registers all Filesystem services with the specified service manager.
|
||||||
void InstallInterfaces(SM::ServiceManager& service_manager);
|
void InstallInterfaces(SM::ServiceManager& service_manager, const FileSys::VirtualFilesystem& vfs);
|
||||||
|
|
||||||
// A class that wraps a VfsDirectory with methods that return ResultVal and ResultCode instead of
|
// A class that wraps a VfsDirectory with methods that return ResultVal and ResultCode instead of
|
||||||
// pointers and booleans. This makes using a VfsDirectory with switch services much easier and
|
// pointers and booleans. This makes using a VfsDirectory with switch services much easier and
|
||||||
|
|
|
@ -198,7 +198,7 @@ void AddNamedPort(std::string name, SharedPtr<ClientPort> port) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Initialize ServiceManager
|
/// Initialize ServiceManager
|
||||||
void Init(std::shared_ptr<SM::ServiceManager>& sm) {
|
void Init(std::shared_ptr<SM::ServiceManager>& sm, const FileSys::VirtualFilesystem& rfs) {
|
||||||
// NVFlinger needs to be accessed by several services like Vi and AppletOE so we instantiate it
|
// NVFlinger needs to be accessed by several services like Vi and AppletOE so we instantiate it
|
||||||
// here and pass it into the respective InstallInterfaces functions.
|
// here and pass it into the respective InstallInterfaces functions.
|
||||||
auto nv_flinger = std::make_shared<NVFlinger::NVFlinger>();
|
auto nv_flinger = std::make_shared<NVFlinger::NVFlinger>();
|
||||||
|
@ -221,7 +221,7 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm) {
|
||||||
EUPLD::InstallInterfaces(*sm);
|
EUPLD::InstallInterfaces(*sm);
|
||||||
Fatal::InstallInterfaces(*sm);
|
Fatal::InstallInterfaces(*sm);
|
||||||
FGM::InstallInterfaces(*sm);
|
FGM::InstallInterfaces(*sm);
|
||||||
FileSystem::InstallInterfaces(*sm);
|
FileSystem::InstallInterfaces(*sm, rfs);
|
||||||
Friend::InstallInterfaces(*sm);
|
Friend::InstallInterfaces(*sm);
|
||||||
GRC::InstallInterfaces(*sm);
|
GRC::InstallInterfaces(*sm);
|
||||||
HID::InstallInterfaces(*sm);
|
HID::InstallInterfaces(*sm);
|
||||||
|
|
|
@ -22,6 +22,10 @@ class ServerSession;
|
||||||
class HLERequestContext;
|
class HLERequestContext;
|
||||||
} // namespace Kernel
|
} // namespace Kernel
|
||||||
|
|
||||||
|
namespace FileSys {
|
||||||
|
struct VfsFilesystem;
|
||||||
|
}
|
||||||
|
|
||||||
namespace Service {
|
namespace Service {
|
||||||
|
|
||||||
namespace SM {
|
namespace SM {
|
||||||
|
@ -177,7 +181,8 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Initialize ServiceManager
|
/// Initialize ServiceManager
|
||||||
void Init(std::shared_ptr<SM::ServiceManager>& sm);
|
void Init(std::shared_ptr<SM::ServiceManager>& sm,
|
||||||
|
const std::shared_ptr<FileSys::VfsFilesystem>& vfs);
|
||||||
|
|
||||||
/// Shutdown ServiceManager
|
/// Shutdown ServiceManager
|
||||||
void Shutdown();
|
void Shutdown();
|
||||||
|
|
|
@ -197,7 +197,8 @@ void GameList::onFilterCloseClicked() {
|
||||||
main_window->filterBarSetChecked(false);
|
main_window->filterBarSetChecked(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
GameList::GameList(GMainWindow* parent) : QWidget{parent} {
|
GameList::GameList(FileSys::VirtualFilesystem vfs, GMainWindow* parent)
|
||||||
|
: QWidget{parent}, vfs(std::move(vfs)) {
|
||||||
watcher = new QFileSystemWatcher(this);
|
watcher = new QFileSystemWatcher(this);
|
||||||
connect(watcher, &QFileSystemWatcher::directoryChanged, this, &GameList::RefreshGameDirectory);
|
connect(watcher, &QFileSystemWatcher::directoryChanged, this, &GameList::RefreshGameDirectory);
|
||||||
|
|
||||||
|
@ -341,7 +342,7 @@ void GameList::PopulateAsync(const QString& dir_path, bool deep_scan) {
|
||||||
|
|
||||||
emit ShouldCancelWorker();
|
emit ShouldCancelWorker();
|
||||||
|
|
||||||
GameListWorker* worker = new GameListWorker(dir_path, deep_scan);
|
GameListWorker* worker = new GameListWorker(vfs, dir_path, deep_scan);
|
||||||
|
|
||||||
connect(worker, &GameListWorker::EntryReady, this, &GameList::AddEntry, Qt::QueuedConnection);
|
connect(worker, &GameListWorker::EntryReady, this, &GameList::AddEntry, Qt::QueuedConnection);
|
||||||
connect(worker, &GameListWorker::Finished, this, &GameList::DonePopulating,
|
connect(worker, &GameListWorker::Finished, this, &GameList::DonePopulating,
|
||||||
|
@ -436,7 +437,7 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign
|
||||||
if (!is_dir &&
|
if (!is_dir &&
|
||||||
(HasSupportedFileExtension(physical_name) || IsExtractedNCAMain(physical_name))) {
|
(HasSupportedFileExtension(physical_name) || IsExtractedNCAMain(physical_name))) {
|
||||||
std::unique_ptr<Loader::AppLoader> loader =
|
std::unique_ptr<Loader::AppLoader> loader =
|
||||||
Loader::GetLoader(std::make_shared<FileSys::RealVfsFile>(physical_name));
|
Loader::GetLoader(vfs->OpenFile(physical_name, FileSys::Mode::Read));
|
||||||
if (!loader || ((loader->GetFileType() == Loader::FileType::Unknown ||
|
if (!loader || ((loader->GetFileType() == Loader::FileType::Unknown ||
|
||||||
loader->GetFileType() == Loader::FileType::Error) &&
|
loader->GetFileType() == Loader::FileType::Error) &&
|
||||||
!UISettings::values.show_unknown))
|
!UISettings::values.show_unknown))
|
||||||
|
|
|
@ -59,7 +59,7 @@ public:
|
||||||
QToolButton* button_filter_close = nullptr;
|
QToolButton* button_filter_close = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit GameList(GMainWindow* parent = nullptr);
|
explicit GameList(FileSys::VirtualFilesystem vfs, GMainWindow* parent = nullptr);
|
||||||
~GameList() override;
|
~GameList() override;
|
||||||
|
|
||||||
void clearFilter();
|
void clearFilter();
|
||||||
|
@ -90,6 +90,7 @@ private:
|
||||||
void PopupContextMenu(const QPoint& menu_location);
|
void PopupContextMenu(const QPoint& menu_location);
|
||||||
void RefreshGameDirectory();
|
void RefreshGameDirectory();
|
||||||
|
|
||||||
|
FileSys::VirtualFilesystem vfs;
|
||||||
SearchField* search_field;
|
SearchField* search_field;
|
||||||
GMainWindow* main_window = nullptr;
|
GMainWindow* main_window = nullptr;
|
||||||
QVBoxLayout* layout = nullptr;
|
QVBoxLayout* layout = nullptr;
|
||||||
|
|
|
@ -139,7 +139,7 @@ class GameListWorker : public QObject, public QRunnable {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GameListWorker(QString dir_path, bool deep_scan)
|
GameListWorker(FileSys::VirtualFilesystem vfs, QString dir_path, bool deep_scan)
|
||||||
: dir_path(std::move(dir_path)), deep_scan(deep_scan) {}
|
: dir_path(std::move(dir_path)), deep_scan(deep_scan) {}
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
@ -163,6 +163,7 @@ signals:
|
||||||
void Finished(QStringList watch_list);
|
void Finished(QStringList watch_list);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
FileSys::VirtualFilesystem vfs;
|
||||||
QStringList watch_list;
|
QStringList watch_list;
|
||||||
QString dir_path;
|
QString dir_path;
|
||||||
bool deep_scan;
|
bool deep_scan;
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "common/string_util.h"
|
#include "common/string_util.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/crypto/key_manager.h"
|
#include "core/crypto/key_manager.h"
|
||||||
|
#include "core/file_sys/vfs_real.h"
|
||||||
#include "core/gdbstub/gdbstub.h"
|
#include "core/gdbstub/gdbstub.h"
|
||||||
#include "core/loader/loader.h"
|
#include "core/loader/loader.h"
|
||||||
#include "core/settings.h"
|
#include "core/settings.h"
|
||||||
|
@ -81,9 +82,9 @@ static void ShowCalloutMessage(const QString& message, CalloutFlag flag) {
|
||||||
|
|
||||||
void GMainWindow::ShowCallouts() {}
|
void GMainWindow::ShowCallouts() {}
|
||||||
|
|
||||||
const int GMainWindow::max_recent_files_item;
|
GMainWindow::GMainWindow()
|
||||||
|
: config(new Config()), emu_thread(nullptr),
|
||||||
GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {
|
vfs(std::make_shared<FileSys::RealVfsFilesystem>()) {
|
||||||
|
|
||||||
debug_context = Tegra::DebugContext::Construct();
|
debug_context = Tegra::DebugContext::Construct();
|
||||||
|
|
||||||
|
@ -132,7 +133,7 @@ void GMainWindow::InitializeWidgets() {
|
||||||
render_window = new GRenderWindow(this, emu_thread.get());
|
render_window = new GRenderWindow(this, emu_thread.get());
|
||||||
render_window->hide();
|
render_window->hide();
|
||||||
|
|
||||||
game_list = new GameList(this);
|
game_list = new GameList(vfs, this);
|
||||||
ui.horizontalLayout->addWidget(game_list);
|
ui.horizontalLayout->addWidget(game_list);
|
||||||
|
|
||||||
// Create status bar
|
// Create status bar
|
||||||
|
@ -406,6 +407,7 @@ bool GMainWindow::LoadROM(const QString& filename) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::System& system{Core::System::GetInstance()};
|
Core::System& system{Core::System::GetInstance()};
|
||||||
|
system.SetFilesystem(vfs);
|
||||||
|
|
||||||
system.SetGPUDebugContext(debug_context);
|
system.SetGPUDebugContext(debug_context);
|
||||||
|
|
||||||
|
|
|
@ -161,6 +161,9 @@ private:
|
||||||
bool emulation_running = false;
|
bool emulation_running = false;
|
||||||
std::unique_ptr<EmuThread> emu_thread;
|
std::unique_ptr<EmuThread> emu_thread;
|
||||||
|
|
||||||
|
// FS
|
||||||
|
FileSys::VirtualFilesystem vfs;
|
||||||
|
|
||||||
// Debugger panes
|
// Debugger panes
|
||||||
ProfilerWidget* profilerWidget;
|
ProfilerWidget* profilerWidget;
|
||||||
MicroProfileDialog* microProfileDialog;
|
MicroProfileDialog* microProfileDialog;
|
||||||
|
|
|
@ -161,6 +161,7 @@ int main(int argc, char** argv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::System& system{Core::System::GetInstance()};
|
Core::System& system{Core::System::GetInstance()};
|
||||||
|
system.SetFilesystem(std::make_shared<FileSys::RealVfsFilesystem>());
|
||||||
|
|
||||||
SCOPE_EXIT({ system.Shutdown(); });
|
SCOPE_EXIT({ system.Shutdown(); });
|
||||||
|
|
||||||
|
|
Reference in New Issue