mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	Merge remote-tracking branch 'origin/master' into better-account
This commit is contained in:
		@@ -201,7 +201,7 @@ ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(u32_le* src_cmdb
 | 
			
		||||
    return RESULT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(Thread& thread) {
 | 
			
		||||
ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(const Thread& thread) {
 | 
			
		||||
    std::array<u32, IPC::COMMAND_BUFFER_LENGTH> dst_cmdbuf;
 | 
			
		||||
    Memory::ReadBlock(*thread.owner_process, thread.GetTLSAddress(), dst_cmdbuf.data(),
 | 
			
		||||
                      dst_cmdbuf.size() * sizeof(u32));
 | 
			
		||||
 
 | 
			
		||||
@@ -132,7 +132,7 @@ public:
 | 
			
		||||
    ResultCode PopulateFromIncomingCommandBuffer(u32_le* src_cmdbuf, Process& src_process,
 | 
			
		||||
                                                 HandleTable& src_table);
 | 
			
		||||
    /// Writes data from this context back to the requesting process/thread.
 | 
			
		||||
    ResultCode WriteToOutgoingCommandBuffer(Thread& thread);
 | 
			
		||||
    ResultCode WriteToOutgoingCommandBuffer(const Thread& thread);
 | 
			
		||||
 | 
			
		||||
    u32_le GetCommand() const {
 | 
			
		||||
        return command;
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ public:
 | 
			
		||||
            {0, &IProfile::Get, "Get"},
 | 
			
		||||
            {1, &IProfile::GetBase, "GetBase"},
 | 
			
		||||
            {10, nullptr, "GetImageSize"},
 | 
			
		||||
            {11, nullptr, "LoadImage"},
 | 
			
		||||
            {11, &IProfile::LoadImage, "LoadImage"},
 | 
			
		||||
        };
 | 
			
		||||
        RegisterHandlers(functions);
 | 
			
		||||
    }
 | 
			
		||||
@@ -72,6 +72,27 @@ private:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void LoadImage(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
        LOG_WARNING(Service_ACC, "(STUBBED) called");
 | 
			
		||||
        // smallest jpeg https://github.com/mathiasbynens/small/blob/master/jpeg.jpg
 | 
			
		||||
        // TODO(mailwl): load actual profile image from disk, width 256px, max size 0x20000
 | 
			
		||||
        const u32 jpeg_size = 107;
 | 
			
		||||
        static const std::array<u8, jpeg_size> jpeg{
 | 
			
		||||
            0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03,
 | 
			
		||||
            0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x04, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04,
 | 
			
		||||
            0x08, 0x06, 0x06, 0x05, 0x06, 0x09, 0x08, 0x0a, 0x0a, 0x09, 0x08, 0x09, 0x09, 0x0a,
 | 
			
		||||
            0x0c, 0x0f, 0x0c, 0x0a, 0x0b, 0x0e, 0x0b, 0x09, 0x09, 0x0d, 0x11, 0x0d, 0x0e, 0x0f,
 | 
			
		||||
            0x10, 0x10, 0x11, 0x10, 0x0a, 0x0c, 0x12, 0x13, 0x12, 0x10, 0x13, 0x0f, 0x10, 0x10,
 | 
			
		||||
            0x10, 0xff, 0xc9, 0x00, 0x0b, 0x08, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x11, 0x00,
 | 
			
		||||
            0xff, 0xcc, 0x00, 0x06, 0x00, 0x10, 0x10, 0x05, 0xff, 0xda, 0x00, 0x08, 0x01, 0x01,
 | 
			
		||||
            0x00, 0x00, 0x3f, 0x00, 0xd2, 0xcf, 0x20, 0xff, 0xd9,
 | 
			
		||||
        };
 | 
			
		||||
        ctx.WriteBuffer(jpeg.data(), jpeg_size);
 | 
			
		||||
        IPC::ResponseBuilder rb{ctx, 3};
 | 
			
		||||
        rb.Push(RESULT_SUCCESS);
 | 
			
		||||
        rb.Push<u32>(jpeg_size);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ProfileManager& profile_manager;
 | 
			
		||||
    UUID user_id; ///< The user id this profile refers to.
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -136,7 +136,7 @@ ISelfController::ISelfController(std::shared_ptr<NVFlinger::NVFlinger> nvflinger
 | 
			
		||||
        {16, &ISelfController::SetOutOfFocusSuspendingEnabled, "SetOutOfFocusSuspendingEnabled"},
 | 
			
		||||
        {17, nullptr, "SetControllerFirmwareUpdateSection"},
 | 
			
		||||
        {18, nullptr, "SetRequiresCaptureButtonShortPressedMessage"},
 | 
			
		||||
        {19, nullptr, "SetScreenShotImageOrientation"},
 | 
			
		||||
        {19, &ISelfController::SetScreenShotImageOrientation, "SetScreenShotImageOrientation"},
 | 
			
		||||
        {20, nullptr, "SetDesirableKeyboardLayout"},
 | 
			
		||||
        {40, &ISelfController::CreateManagedDisplayLayer, "CreateManagedDisplayLayer"},
 | 
			
		||||
        {41, nullptr, "IsSystemBufferSharingEnabled"},
 | 
			
		||||
@@ -254,6 +254,13 @@ void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext&
 | 
			
		||||
    LOG_WARNING(Service_AM, "(STUBBED) called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ISelfController::SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    IPC::ResponseBuilder rb{ctx, 2};
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
 | 
			
		||||
    LOG_WARNING(Service_AM, "(STUBBED) called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ISelfController::CreateManagedDisplayLayer(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    // TODO(Subv): Find out how AM determines the display to use, for now just create the layer
 | 
			
		||||
    // in the Default display.
 | 
			
		||||
 
 | 
			
		||||
@@ -83,6 +83,7 @@ private:
 | 
			
		||||
    void LockExit(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void UnlockExit(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void CreateManagedDisplayLayer(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void SetScreenShotPermission(Kernel::HLERequestContext& ctx);
 | 
			
		||||
    void SetHandlesRequestToDisplay(Kernel::HLERequestContext& ctx);
 | 
			
		||||
 
 | 
			
		||||
@@ -59,7 +59,7 @@ ResultCode VfsDirectoryServiceWrapper::CreateFile(const std::string& path_, u64
 | 
			
		||||
ResultCode VfsDirectoryServiceWrapper::DeleteFile(const std::string& path_) const {
 | 
			
		||||
    std::string path(FileUtil::SanitizePath(path_));
 | 
			
		||||
    auto dir = GetDirectoryRelativeWrapped(backing, FileUtil::GetParentPath(path));
 | 
			
		||||
    if (path == "/" || path == "\\") {
 | 
			
		||||
    if (path.empty()) {
 | 
			
		||||
        // TODO(DarkLordZach): Why do games call this and what should it do? Works as is but...
 | 
			
		||||
        return RESULT_SUCCESS;
 | 
			
		||||
    }
 | 
			
		||||
@@ -281,15 +281,15 @@ ResultVal<FileSys::VirtualDir> OpenSDMC() {
 | 
			
		||||
    return sdmc_factory->Open();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RegisterFileSystems() {
 | 
			
		||||
void RegisterFileSystems(const FileSys::VirtualFilesystem& vfs) {
 | 
			
		||||
    romfs_factory = nullptr;
 | 
			
		||||
    save_data_factory = nullptr;
 | 
			
		||||
    sdmc_factory = nullptr;
 | 
			
		||||
 | 
			
		||||
    auto nand_directory = std::make_shared<FileSys::RealVfsDirectory>(
 | 
			
		||||
        FileUtil::GetUserPath(FileUtil::UserPath::NANDDir), FileSys::Mode::ReadWrite);
 | 
			
		||||
    auto sd_directory = std::make_shared<FileSys::RealVfsDirectory>(
 | 
			
		||||
        FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir), FileSys::Mode::ReadWrite);
 | 
			
		||||
    auto nand_directory = vfs->OpenDirectory(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir),
 | 
			
		||||
                                             FileSys::Mode::ReadWrite);
 | 
			
		||||
    auto sd_directory = vfs->OpenDirectory(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir),
 | 
			
		||||
                                           FileSys::Mode::ReadWrite);
 | 
			
		||||
 | 
			
		||||
    auto savedata = std::make_unique<FileSys::SaveDataFactory>(std::move(nand_directory));
 | 
			
		||||
    save_data_factory = std::move(savedata);
 | 
			
		||||
@@ -298,8 +298,8 @@ void RegisterFileSystems() {
 | 
			
		||||
    sdmc_factory = std::move(sdcard);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void InstallInterfaces(SM::ServiceManager& service_manager) {
 | 
			
		||||
    RegisterFileSystems();
 | 
			
		||||
void InstallInterfaces(SM::ServiceManager& service_manager, const FileSys::VirtualFilesystem& vfs) {
 | 
			
		||||
    RegisterFileSystems(vfs);
 | 
			
		||||
    std::make_shared<FSP_LDR>()->InstallAsService(service_manager);
 | 
			
		||||
    std::make_shared<FSP_PR>()->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();
 | 
			
		||||
 | 
			
		||||
/// 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
 | 
			
		||||
// pointers and booleans. This makes using a VfsDirectory with switch services much easier and
 | 
			
		||||
 
 | 
			
		||||
@@ -193,13 +193,10 @@ private:
 | 
			
		||||
template <typename T>
 | 
			
		||||
static void BuildEntryIndex(std::vector<FileSys::Entry>& entries, const std::vector<T>& new_data,
 | 
			
		||||
                            FileSys::EntryType type) {
 | 
			
		||||
    entries.reserve(entries.size() + new_data.size());
 | 
			
		||||
 | 
			
		||||
    for (const auto& new_entry : new_data) {
 | 
			
		||||
        FileSys::Entry entry;
 | 
			
		||||
        entry.filename[0] = '\0';
 | 
			
		||||
        std::strncat(entry.filename, new_entry->GetName().c_str(), FileSys::FILENAME_LENGTH - 1);
 | 
			
		||||
        entry.type = type;
 | 
			
		||||
        entry.file_size = new_entry->GetSize();
 | 
			
		||||
        entries.emplace_back(std::move(entry));
 | 
			
		||||
        entries.emplace_back(new_entry->GetName(), type, new_entry->GetSize());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -147,7 +147,7 @@ u32 nvhost_gpu::SubmitGPFIFO(const std::vector<u8>& input, std::vector<u8>& outp
 | 
			
		||||
    }
 | 
			
		||||
    params.fence_out.id = 0;
 | 
			
		||||
    params.fence_out.value = 0;
 | 
			
		||||
    std::memcpy(output.data(), ¶ms, output.size());
 | 
			
		||||
    std::memcpy(output.data(), ¶ms, sizeof(IoctlSubmitGpfifo));
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,19 +16,18 @@
 | 
			
		||||
#include "core/hle/service/nvdrv/interface.h"
 | 
			
		||||
#include "core/hle/service/nvdrv/nvdrv.h"
 | 
			
		||||
#include "core/hle/service/nvdrv/nvmemp.h"
 | 
			
		||||
#include "core/hle/service/nvflinger/nvflinger.h"
 | 
			
		||||
 | 
			
		||||
namespace Service::Nvidia {
 | 
			
		||||
 | 
			
		||||
std::weak_ptr<Module> nvdrv;
 | 
			
		||||
 | 
			
		||||
void InstallInterfaces(SM::ServiceManager& service_manager) {
 | 
			
		||||
void InstallInterfaces(SM::ServiceManager& service_manager, NVFlinger::NVFlinger& nvflinger) {
 | 
			
		||||
    auto module_ = std::make_shared<Module>();
 | 
			
		||||
    std::make_shared<NVDRV>(module_, "nvdrv")->InstallAsService(service_manager);
 | 
			
		||||
    std::make_shared<NVDRV>(module_, "nvdrv:a")->InstallAsService(service_manager);
 | 
			
		||||
    std::make_shared<NVDRV>(module_, "nvdrv:s")->InstallAsService(service_manager);
 | 
			
		||||
    std::make_shared<NVDRV>(module_, "nvdrv:t")->InstallAsService(service_manager);
 | 
			
		||||
    std::make_shared<NVMEMP>()->InstallAsService(service_manager);
 | 
			
		||||
    nvdrv = module_;
 | 
			
		||||
    nvflinger.SetNVDrvInstance(module_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Module::Module() {
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,10 @@
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
namespace Service::NVFlinger {
 | 
			
		||||
class NVFlinger;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace Service::Nvidia {
 | 
			
		||||
 | 
			
		||||
namespace Devices {
 | 
			
		||||
@@ -56,8 +60,6 @@ private:
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// Registers all NVDRV services with the specified service manager.
 | 
			
		||||
void InstallInterfaces(SM::ServiceManager& service_manager);
 | 
			
		||||
 | 
			
		||||
extern std::weak_ptr<Module> nvdrv;
 | 
			
		||||
void InstallInterfaces(SM::ServiceManager& service_manager, NVFlinger::NVFlinger& nvflinger);
 | 
			
		||||
 | 
			
		||||
} // namespace Service::Nvidia
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ BufferQueue::BufferQueue(u32 id, u64 layer_id) : id(id), layer_id(layer_id) {
 | 
			
		||||
        Kernel::Event::Create(Kernel::ResetType::Sticky, "BufferQueue NativeHandle");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void BufferQueue::SetPreallocatedBuffer(u32 slot, IGBPBuffer& igbp_buffer) {
 | 
			
		||||
void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer) {
 | 
			
		||||
    Buffer buffer{};
 | 
			
		||||
    buffer.slot = slot;
 | 
			
		||||
    buffer.igbp_buffer = igbp_buffer;
 | 
			
		||||
 
 | 
			
		||||
@@ -72,7 +72,7 @@ public:
 | 
			
		||||
        MathUtil::Rectangle<int> crop_rect;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    void SetPreallocatedBuffer(u32 slot, IGBPBuffer& buffer);
 | 
			
		||||
    void SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer);
 | 
			
		||||
    boost::optional<u32> DequeueBuffer(u32 width, u32 height);
 | 
			
		||||
    const IGBPBuffer& RequestBuffer(u32 slot) const;
 | 
			
		||||
    void QueueBuffer(u32 slot, BufferTransformFlags transform,
 | 
			
		||||
 
 | 
			
		||||
@@ -46,6 +46,10 @@ NVFlinger::~NVFlinger() {
 | 
			
		||||
    CoreTiming::UnscheduleEvent(composition_event, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void NVFlinger::SetNVDrvInstance(std::shared_ptr<Nvidia::Module> instance) {
 | 
			
		||||
    nvdrv = std::move(instance);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
u64 NVFlinger::OpenDisplay(std::string_view name) {
 | 
			
		||||
    LOG_WARNING(Service, "Opening display {}", name);
 | 
			
		||||
 | 
			
		||||
@@ -141,9 +145,6 @@ void NVFlinger::Compose() {
 | 
			
		||||
        auto& igbp_buffer = buffer->igbp_buffer;
 | 
			
		||||
 | 
			
		||||
        // Now send the buffer to the GPU for drawing.
 | 
			
		||||
        auto nvdrv = Nvidia::nvdrv.lock();
 | 
			
		||||
        ASSERT(nvdrv);
 | 
			
		||||
 | 
			
		||||
        // TODO(Subv): Support more than just disp0. The display device selection is probably based
 | 
			
		||||
        // on which display we're drawing (Default, Internal, External, etc)
 | 
			
		||||
        auto nvdisp = nvdrv->GetDevice<Nvidia::Devices::nvdisp_disp0>("/dev/nvdisp_disp0");
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,10 @@ namespace CoreTiming {
 | 
			
		||||
struct EventType;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace Service::Nvidia {
 | 
			
		||||
class Module;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace Service::NVFlinger {
 | 
			
		||||
 | 
			
		||||
class BufferQueue;
 | 
			
		||||
@@ -44,6 +48,9 @@ public:
 | 
			
		||||
    NVFlinger();
 | 
			
		||||
    ~NVFlinger();
 | 
			
		||||
 | 
			
		||||
    /// Sets the NVDrv module instance to use to send buffers to the GPU.
 | 
			
		||||
    void SetNVDrvInstance(std::shared_ptr<Nvidia::Module> instance);
 | 
			
		||||
 | 
			
		||||
    /// Opens the specified display and returns the id.
 | 
			
		||||
    u64 OpenDisplay(std::string_view name);
 | 
			
		||||
 | 
			
		||||
@@ -70,6 +77,8 @@ private:
 | 
			
		||||
    /// Returns the layer identified by the specified id in the desired display.
 | 
			
		||||
    Layer& GetLayer(u64 display_id, u64 layer_id);
 | 
			
		||||
 | 
			
		||||
    std::shared_ptr<Nvidia::Module> nvdrv;
 | 
			
		||||
 | 
			
		||||
    std::vector<Display> displays;
 | 
			
		||||
    std::vector<std::shared_ptr<BufferQueue>> buffer_queues;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -198,7 +198,7 @@ void AddNamedPort(std::string name, SharedPtr<ClientPort> port) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// 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
 | 
			
		||||
    // here and pass it into the respective InstallInterfaces functions.
 | 
			
		||||
    auto nv_flinger = std::make_shared<NVFlinger::NVFlinger>();
 | 
			
		||||
@@ -221,7 +221,7 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm) {
 | 
			
		||||
    EUPLD::InstallInterfaces(*sm);
 | 
			
		||||
    Fatal::InstallInterfaces(*sm);
 | 
			
		||||
    FGM::InstallInterfaces(*sm);
 | 
			
		||||
    FileSystem::InstallInterfaces(*sm);
 | 
			
		||||
    FileSystem::InstallInterfaces(*sm, rfs);
 | 
			
		||||
    Friend::InstallInterfaces(*sm);
 | 
			
		||||
    GRC::InstallInterfaces(*sm);
 | 
			
		||||
    HID::InstallInterfaces(*sm);
 | 
			
		||||
@@ -238,7 +238,7 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm) {
 | 
			
		||||
    NIFM::InstallInterfaces(*sm);
 | 
			
		||||
    NIM::InstallInterfaces(*sm);
 | 
			
		||||
    NS::InstallInterfaces(*sm);
 | 
			
		||||
    Nvidia::InstallInterfaces(*sm);
 | 
			
		||||
    Nvidia::InstallInterfaces(*sm, *nv_flinger);
 | 
			
		||||
    PCIe::InstallInterfaces(*sm);
 | 
			
		||||
    PCTL::InstallInterfaces(*sm);
 | 
			
		||||
    PCV::InstallInterfaces(*sm);
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,10 @@ class ServerSession;
 | 
			
		||||
class HLERequestContext;
 | 
			
		||||
} // namespace Kernel
 | 
			
		||||
 | 
			
		||||
namespace FileSys {
 | 
			
		||||
struct VfsFilesystem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace Service {
 | 
			
		||||
 | 
			
		||||
namespace SM {
 | 
			
		||||
@@ -177,7 +181,8 @@ private:
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// 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
 | 
			
		||||
void Shutdown();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user