mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-04-10 03:18:55 +02:00
Compare commits
1 commit
cb66fcc088
...
4b76c8ef53
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b76c8ef53 |
18 changed files with 92 additions and 166 deletions
|
|
@ -8,10 +8,11 @@
|
||||||
|
|
||||||
namespace AudioCore {
|
namespace AudioCore {
|
||||||
|
|
||||||
AudioCore::AudioCore(Core::System& system) : audio_manager{std::make_unique<AudioManager>()} {
|
AudioCore::AudioCore(Core::System& system) {
|
||||||
|
audio_manager.emplace();
|
||||||
CreateSinks();
|
CreateSinks();
|
||||||
// Must be created after the sinks
|
// Must be created after the sinks
|
||||||
adsp = std::make_unique<ADSP::ADSP>(system, *output_sink);
|
adsp.emplace(system, *output_sink);
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioCore ::~AudioCore() {
|
AudioCore ::~AudioCore() {
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,7 @@ class System;
|
||||||
|
|
||||||
namespace AudioCore {
|
namespace AudioCore {
|
||||||
|
|
||||||
class AudioManager;
|
/// @brief Main audio class, stored inside the core, and holding the audio manager, all sinks, and the ADSP.
|
||||||
/**
|
|
||||||
* Main audio class, stored inside the core, and holding the audio manager, all sinks, and the ADSP.
|
|
||||||
*/
|
|
||||||
class AudioCore {
|
class AudioCore {
|
||||||
public:
|
public:
|
||||||
explicit AudioCore(Core::System& system);
|
explicit AudioCore(Core::System& system);
|
||||||
|
|
@ -50,27 +47,22 @@ public:
|
||||||
*/
|
*/
|
||||||
Sink::Sink& GetInputSink();
|
Sink::Sink& GetInputSink();
|
||||||
|
|
||||||
/**
|
/// @brief Get the ADSP.
|
||||||
* Get the ADSP.
|
/// @return Ref to the ADSP.
|
||||||
*
|
|
||||||
* @return Ref to the ADSP.
|
|
||||||
*/
|
|
||||||
ADSP::ADSP& ADSP();
|
ADSP::ADSP& ADSP();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/// @brief Create the sinks on startup.
|
||||||
* Create the sinks on startup.
|
|
||||||
*/
|
|
||||||
void CreateSinks();
|
void CreateSinks();
|
||||||
|
|
||||||
/// Main audio manager for audio in/out
|
/// Main audio manager for audio in/out
|
||||||
std::unique_ptr<AudioManager> audio_manager;
|
std::optional<AudioManager> audio_manager;
|
||||||
/// Sink used for audio renderer and audio out
|
/// Sink used for audio renderer and audio out
|
||||||
std::unique_ptr<Sink::Sink> output_sink;
|
std::unique_ptr<Sink::Sink> output_sink;
|
||||||
/// Sink used for audio input
|
/// Sink used for audio input
|
||||||
std::unique_ptr<Sink::Sink> input_sink;
|
std::unique_ptr<Sink::Sink> input_sink;
|
||||||
/// The ADSP in the sysmodule
|
/// The ADSP in the sysmodule
|
||||||
std::unique_ptr<ADSP::ADSP> adsp;
|
std::optional<ADSP::ADSP> adsp;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace AudioCore
|
} // namespace AudioCore
|
||||||
|
|
|
||||||
|
|
@ -41,8 +41,7 @@ void Manager::ReleaseSessionId(const size_t session_id) {
|
||||||
Result Manager::LinkToManager() {
|
Result Manager::LinkToManager() {
|
||||||
std::scoped_lock l{mutex};
|
std::scoped_lock l{mutex};
|
||||||
if (!linked_to_manager) {
|
if (!linked_to_manager) {
|
||||||
AudioManager& manager{system.AudioCore().GetAudioManager()};
|
system.AudioCore().GetAudioManager().SetInManager(std::bind(&Manager::BufferReleaseAndRegister, this));
|
||||||
manager.SetInManager(std::bind(&Manager::BufferReleaseAndRegister, this));
|
|
||||||
linked_to_manager = true;
|
linked_to_manager = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,8 +40,7 @@ void Manager::ReleaseSessionId(const size_t session_id) {
|
||||||
Result Manager::LinkToManager() {
|
Result Manager::LinkToManager() {
|
||||||
std::scoped_lock l{mutex};
|
std::scoped_lock l{mutex};
|
||||||
if (!linked_to_manager) {
|
if (!linked_to_manager) {
|
||||||
AudioManager& manager{system.AudioCore().GetAudioManager()};
|
system.AudioCore().GetAudioManager().SetOutManager(std::bind(&Manager::BufferReleaseAndRegister, this));
|
||||||
manager.SetOutManager(std::bind(&Manager::BufferReleaseAndRegister, this));
|
|
||||||
linked_to_manager = true;
|
linked_to_manager = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -347,7 +347,7 @@ struct System::Impl {
|
||||||
|
|
||||||
// Register with applet manager
|
// Register with applet manager
|
||||||
// All threads are started, begin main process execution, now that we're in the clear
|
// All threads are started, begin main process execution, now that we're in the clear
|
||||||
applet_manager.CreateAndInsertByFrontendAppletParameters(std::move(process), params);
|
applet_manager.CreateAndInsertByFrontendAppletParameters(std::make_unique<Service::Process>(*std::move(process)), params);
|
||||||
|
|
||||||
if (Settings::values.gamecard_inserted) {
|
if (Settings::values.gamecard_inserted) {
|
||||||
if (Settings::values.gamecard_current_game) {
|
if (Settings::values.gamecard_current_game) {
|
||||||
|
|
|
||||||
|
|
@ -268,7 +268,7 @@ void AppletManager::SetWindowSystem(WindowSystem* window_system) {
|
||||||
|
|
||||||
if (Settings::values.enable_overlay && m_window_system->GetOverlayDisplayApplet() == nullptr) {
|
if (Settings::values.enable_overlay && m_window_system->GetOverlayDisplayApplet() == nullptr) {
|
||||||
if (auto overlay_process = CreateProcess(m_system, static_cast<u64>(AppletProgramId::OverlayDisplay), 0, 0)) {
|
if (auto overlay_process = CreateProcess(m_system, static_cast<u64>(AppletProgramId::OverlayDisplay), 0, 0)) {
|
||||||
auto overlay_applet = std::make_shared<Applet>(m_system, std::move(overlay_process), false);
|
auto overlay_applet = std::make_shared<Applet>(m_system, std::make_unique<Service::Process>(*std::move(overlay_process)), false);
|
||||||
overlay_applet->program_id = static_cast<u64>(AppletProgramId::OverlayDisplay);
|
overlay_applet->program_id = static_cast<u64>(AppletProgramId::OverlayDisplay);
|
||||||
overlay_applet->applet_id = AppletId::OverlayDisplay;
|
overlay_applet->applet_id = AppletId::OverlayDisplay;
|
||||||
overlay_applet->type = AppletType::OverlayApplet;
|
overlay_applet->type = AppletType::OverlayApplet;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/file_sys/content_archive.h"
|
#include "core/file_sys/content_archive.h"
|
||||||
#include "core/file_sys/nca_metadata.h"
|
#include "core/file_sys/nca_metadata.h"
|
||||||
|
|
@ -36,31 +37,23 @@ FileSys::StorageId GetStorageIdForFrontendSlot(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Process> CreateProcessImpl(std::unique_ptr<Loader::AppLoader>& out_loader,
|
std::optional<Process> CreateProcessImpl(std::unique_ptr<Loader::AppLoader>& out_loader, Loader::ResultStatus& out_load_result, Core::System& system, FileSys::VirtualFile file, u64 program_id, u64 program_index) {
|
||||||
Loader::ResultStatus& out_load_result,
|
|
||||||
Core::System& system, FileSys::VirtualFile file,
|
|
||||||
u64 program_id, u64 program_index) {
|
|
||||||
// Get the appropriate loader to parse this NCA.
|
// Get the appropriate loader to parse this NCA.
|
||||||
out_loader = Loader::GetLoader(system, file, program_id, program_index);
|
out_loader = Loader::GetLoader(system, file, program_id, program_index);
|
||||||
|
|
||||||
// Ensure we have a loader which can parse the NCA.
|
// Ensure we have a loader which can parse the NCA.
|
||||||
if (!out_loader) {
|
if (out_loader) {
|
||||||
return nullptr;
|
// Try to load the process.
|
||||||
|
auto process = std::optional<Process>(system);
|
||||||
|
if (process->Initialize(*out_loader, out_load_result)) {
|
||||||
|
return process;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return std::nullopt;
|
||||||
// Try to load the process.
|
|
||||||
auto process = std::make_unique<Process>(system);
|
|
||||||
if (process->Initialize(*out_loader, out_load_result)) {
|
|
||||||
return process;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
std::unique_ptr<Process> CreateProcess(Core::System& system, u64 program_id,
|
std::optional<Process> CreateProcess(Core::System& system, u64 program_id, u8 minimum_key_generation, u8 maximum_key_generation) {
|
||||||
u8 minimum_key_generation, u8 maximum_key_generation) {
|
|
||||||
// Attempt to load program NCA.
|
// Attempt to load program NCA.
|
||||||
FileSys::VirtualFile nca_raw{};
|
FileSys::VirtualFile nca_raw{};
|
||||||
|
|
||||||
|
|
@ -70,7 +63,7 @@ std::unique_ptr<Process> CreateProcess(Core::System& system, u64 program_id,
|
||||||
|
|
||||||
// Ensure we retrieved a program NCA.
|
// Ensure we retrieved a program NCA.
|
||||||
if (!nca_raw) {
|
if (!nca_raw) {
|
||||||
return nullptr;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure we have a suitable version.
|
// Ensure we have a suitable version.
|
||||||
|
|
@ -79,9 +72,8 @@ std::unique_ptr<Process> CreateProcess(Core::System& system, u64 program_id,
|
||||||
if (nca.GetStatus() == Loader::ResultStatus::Success &&
|
if (nca.GetStatus() == Loader::ResultStatus::Success &&
|
||||||
(nca.GetKeyGeneration() < minimum_key_generation ||
|
(nca.GetKeyGeneration() < minimum_key_generation ||
|
||||||
nca.GetKeyGeneration() > maximum_key_generation)) {
|
nca.GetKeyGeneration() > maximum_key_generation)) {
|
||||||
LOG_WARNING(Service_LDR, "Skipping program {:016X} with generation {}", program_id,
|
LOG_WARNING(Service_LDR, "Skipping program {:016X} with generation {}", program_id, nca.GetKeyGeneration());
|
||||||
nca.GetKeyGeneration());
|
return std::nullopt;
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -90,15 +82,10 @@ std::unique_ptr<Process> CreateProcess(Core::System& system, u64 program_id,
|
||||||
return CreateProcessImpl(loader, status, system, nca_raw, program_id, 0);
|
return CreateProcessImpl(loader, status, system, nca_raw, program_id, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Process> CreateApplicationProcess(std::vector<u8>& out_control,
|
std::optional<Process> CreateApplicationProcess(std::vector<u8>& out_control, std::unique_ptr<Loader::AppLoader>& out_loader, Loader::ResultStatus& out_load_result, Core::System& system, FileSys::VirtualFile file, u64 program_id, u64 program_index) {
|
||||||
std::unique_ptr<Loader::AppLoader>& out_loader,
|
auto process = CreateProcessImpl(out_loader, out_load_result, system, file, program_id, program_index);
|
||||||
Loader::ResultStatus& out_load_result,
|
|
||||||
Core::System& system, FileSys::VirtualFile file,
|
|
||||||
u64 program_id, u64 program_index) {
|
|
||||||
auto process =
|
|
||||||
CreateProcessImpl(out_loader, out_load_result, system, file, program_id, program_index);
|
|
||||||
if (!process) {
|
if (!process) {
|
||||||
return nullptr;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
FileSys::NACP nacp;
|
FileSys::NACP nacp;
|
||||||
|
|
@ -118,13 +105,10 @@ std::unique_ptr<Process> CreateApplicationProcess(std::vector<u8>& out_control,
|
||||||
|
|
||||||
// TODO(DarkLordZach): When FSController/Game Card Support is added, if
|
// TODO(DarkLordZach): When FSController/Game Card Support is added, if
|
||||||
// current_process_game_card use correct StorageId
|
// current_process_game_card use correct StorageId
|
||||||
launch.base_game_storage_id = GetStorageIdForFrontendSlot(
|
launch.base_game_storage_id = GetStorageIdForFrontendSlot(storage.GetSlotForEntry(launch.title_id, FileSys::ContentRecordType::Program));
|
||||||
storage.GetSlotForEntry(launch.title_id, FileSys::ContentRecordType::Program));
|
launch.update_storage_id = GetStorageIdForFrontendSlot(storage.GetSlotForEntry(FileSys::GetUpdateTitleID(launch.title_id), FileSys::ContentRecordType::Program));
|
||||||
launch.update_storage_id = GetStorageIdForFrontendSlot(storage.GetSlotForEntry(
|
|
||||||
FileSys::GetUpdateTitleID(launch.title_id), FileSys::ContentRecordType::Program));
|
|
||||||
|
|
||||||
system.GetARPManager().Register(launch.title_id, launch, out_control);
|
system.GetARPManager().Register(launch.title_id, launch, out_control);
|
||||||
|
|
||||||
return process;
|
return process;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,12 +24,7 @@ class Process;
|
||||||
|
|
||||||
namespace Service::AM {
|
namespace Service::AM {
|
||||||
|
|
||||||
std::unique_ptr<Process> CreateProcess(Core::System& system, u64 program_id,
|
std::optional<Process> CreateProcess(Core::System& system, u64 program_id, u8 minimum_key_generation, u8 maximum_key_generation);
|
||||||
u8 minimum_key_generation, u8 maximum_key_generation);
|
std::optional<Process> CreateApplicationProcess(std::vector<u8>& out_control, std::unique_ptr<Loader::AppLoader>& out_loader, Loader::ResultStatus& out_load_result, Core::System& system, FileSys::VirtualFile file, u64 program_id, u64 program_index);
|
||||||
std::unique_ptr<Process> CreateApplicationProcess(std::vector<u8>& out_control,
|
|
||||||
std::unique_ptr<Loader::AppLoader>& out_loader,
|
|
||||||
Loader::ResultStatus& out_load_result,
|
|
||||||
Core::System& system, FileSys::VirtualFile file,
|
|
||||||
u64 program_id, u64 program_index);
|
|
||||||
|
|
||||||
} // namespace Service::AM
|
} // namespace Service::AM
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,7 @@ namespace Service::AM {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
Result CreateGuestApplication(SharedPointer<IApplicationAccessor>* out_application_accessor,
|
Result CreateGuestApplication(SharedPointer<IApplicationAccessor>* out_application_accessor, Core::System& system, WindowSystem& window_system, u64 program_id) {
|
||||||
Core::System& system, WindowSystem& window_system, u64 program_id) {
|
|
||||||
FileSys::VirtualFile nca_raw{};
|
FileSys::VirtualFile nca_raw{};
|
||||||
|
|
||||||
// Get the program NCA from storage.
|
// Get the program NCA from storage.
|
||||||
|
|
@ -35,11 +34,10 @@ Result CreateGuestApplication(SharedPointer<IApplicationAccessor>* out_applicati
|
||||||
std::vector<u8> control;
|
std::vector<u8> control;
|
||||||
std::unique_ptr<Loader::AppLoader> loader;
|
std::unique_ptr<Loader::AppLoader> loader;
|
||||||
Loader::ResultStatus result;
|
Loader::ResultStatus result;
|
||||||
auto process =
|
auto process = CreateApplicationProcess(control, loader, result, system, nca_raw, program_id, 0);
|
||||||
CreateApplicationProcess(control, loader, result, system, nca_raw, program_id, 0);
|
R_UNLESS(process != std::nullopt, ResultUnknown);
|
||||||
R_UNLESS(process != nullptr, ResultUnknown);
|
|
||||||
|
|
||||||
const auto applet = std::make_shared<Applet>(system, std::move(process), true);
|
const auto applet = std::make_shared<Applet>(system, std::make_unique<Service::Process>(*std::move(process)), true);
|
||||||
applet->program_id = program_id;
|
applet->program_id = program_id;
|
||||||
applet->applet_id = AppletId::Application;
|
applet->applet_id = AppletId::Application;
|
||||||
applet->type = AppletType::Application;
|
applet->type = AppletType::Application;
|
||||||
|
|
@ -47,8 +45,7 @@ Result CreateGuestApplication(SharedPointer<IApplicationAccessor>* out_applicati
|
||||||
|
|
||||||
window_system.TrackApplet(applet, true);
|
window_system.TrackApplet(applet, true);
|
||||||
|
|
||||||
*out_application_accessor =
|
*out_application_accessor = std::make_shared<IApplicationAccessor>(system, applet, window_system);
|
||||||
std::make_shared<IApplicationAccessor>(system, applet, window_system);
|
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -90,12 +87,10 @@ Result IApplicationCreator::CreateSystemApplication(
|
||||||
|
|
||||||
std::vector<u8> control;
|
std::vector<u8> control;
|
||||||
std::unique_ptr<Loader::AppLoader> loader;
|
std::unique_ptr<Loader::AppLoader> loader;
|
||||||
|
auto process = CreateProcess(system, application_id, 1, 21);
|
||||||
|
R_UNLESS(process != std::nullopt, ResultUnknown);
|
||||||
|
|
||||||
auto process =
|
const auto applet = std::make_shared<Applet>(system, std::make_unique<Service::Process>(*std::move(process)), true);
|
||||||
CreateProcess(system, application_id, 1, 21);
|
|
||||||
R_UNLESS(process != nullptr, ResultUnknown);
|
|
||||||
|
|
||||||
const auto applet = std::make_shared<Applet>(system, std::move(process), true);
|
|
||||||
applet->program_id = application_id;
|
applet->program_id = application_id;
|
||||||
applet->applet_id = AppletId::Starter;
|
applet->applet_id = AppletId::Starter;
|
||||||
applet->type = AppletType::LibraryApplet;
|
applet->type = AppletType::LibraryApplet;
|
||||||
|
|
@ -103,8 +98,7 @@ Result IApplicationCreator::CreateSystemApplication(
|
||||||
|
|
||||||
m_window_system.TrackApplet(applet, true);
|
m_window_system.TrackApplet(applet, true);
|
||||||
|
|
||||||
*out_application_accessor =
|
*out_application_accessor = std::make_shared<IApplicationAccessor>(system, applet, m_window_system);
|
||||||
std::make_shared<IApplicationAccessor>(system, applet, m_window_system);
|
|
||||||
Core::LaunchTimestampCache::SaveLaunchTimestamp(application_id);
|
Core::LaunchTimestampCache::SaveLaunchTimestamp(application_id);
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -121,26 +121,23 @@ std::shared_ptr<ILibraryAppletAccessor> CreateGuestApplet(Core::System& system,
|
||||||
};
|
};
|
||||||
|
|
||||||
auto process = CreateProcess(system, program_id, Firmware1400, Firmware2100);
|
auto process = CreateProcess(system, program_id, Firmware1400, Firmware2100);
|
||||||
if (!process) {
|
if (process) {
|
||||||
// Couldn't initialize the guest process
|
const auto applet = std::make_shared<Applet>(system, std::make_unique<Service::Process>(*std::move(process)), false);
|
||||||
return {};
|
applet->program_id = program_id;
|
||||||
|
applet->applet_id = applet_id;
|
||||||
|
applet->type = AppletType::LibraryApplet;
|
||||||
|
applet->library_applet_mode = mode;
|
||||||
|
applet->window_visible = mode != LibraryAppletMode::AllForegroundInitiallyHidden;
|
||||||
|
|
||||||
|
auto broker = std::make_shared<AppletDataBroker>(system);
|
||||||
|
applet->caller_applet = caller_applet;
|
||||||
|
applet->caller_applet_broker = broker;
|
||||||
|
caller_applet->child_applets.push_back(applet);
|
||||||
|
window_system.TrackApplet(applet, false);
|
||||||
|
return std::make_shared<ILibraryAppletAccessor>(system, broker, applet);
|
||||||
}
|
}
|
||||||
|
// Couldn't initialize the guest process
|
||||||
const auto applet = std::make_shared<Applet>(system, std::move(process), false);
|
return {};
|
||||||
applet->program_id = program_id;
|
|
||||||
applet->applet_id = applet_id;
|
|
||||||
applet->type = AppletType::LibraryApplet;
|
|
||||||
applet->library_applet_mode = mode;
|
|
||||||
applet->window_visible = mode != LibraryAppletMode::AllForegroundInitiallyHidden;
|
|
||||||
|
|
||||||
auto broker = std::make_shared<AppletDataBroker>(system);
|
|
||||||
applet->caller_applet = caller_applet;
|
|
||||||
applet->caller_applet_broker = broker;
|
|
||||||
caller_applet->child_applets.push_back(applet);
|
|
||||||
|
|
||||||
window_system.TrackApplet(applet, false);
|
|
||||||
|
|
||||||
return std::make_shared<ILibraryAppletAccessor>(system, broker, applet);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<ILibraryAppletAccessor> CreateFrontendApplet(Core::System& system,
|
std::shared_ptr<ILibraryAppletAccessor> CreateFrontendApplet(Core::System& system,
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,9 @@ namespace Service::Audio {
|
||||||
using namespace AudioCore::AudioOut;
|
using namespace AudioCore::AudioOut;
|
||||||
|
|
||||||
IAudioOutManager::IAudioOutManager(Core::System& system_)
|
IAudioOutManager::IAudioOutManager(Core::System& system_)
|
||||||
: ServiceFramework{system_, "audout:u"}, impl{std::make_unique<Manager>(system_)} {
|
: ServiceFramework{system_, "audout:u"}
|
||||||
|
, impl(system_)
|
||||||
|
{
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, D<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"},
|
{0, D<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"},
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ private:
|
||||||
AudioCore::AudioOut::AudioOutParameter parameter,
|
AudioCore::AudioOut::AudioOutParameter parameter,
|
||||||
InCopyHandle<Kernel::KProcess> process_handle, ClientAppletResourceUserId aruid);
|
InCopyHandle<Kernel::KProcess> process_handle, ClientAppletResourceUserId aruid);
|
||||||
|
|
||||||
std::unique_ptr<AudioCore::AudioOut::Manager> impl;
|
std::optional<AudioCore::AudioOut::Manager> impl;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::Audio
|
} // namespace Service::Audio
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,9 @@ namespace Service::Audio {
|
||||||
using namespace AudioCore::Renderer;
|
using namespace AudioCore::Renderer;
|
||||||
|
|
||||||
IAudioRendererManager::IAudioRendererManager(Core::System& system_)
|
IAudioRendererManager::IAudioRendererManager(Core::System& system_)
|
||||||
: ServiceFramework{system_, "audren:u"}, impl{std::make_unique<Manager>(system_)} {
|
: ServiceFramework{system_, "audren:u"}
|
||||||
|
, impl(system_)
|
||||||
|
{
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, D<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"},
|
{0, D<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"},
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ private:
|
||||||
Result GetAudioDeviceServiceWithRevisionInfo(Out<SharedPointer<IAudioDevice>> out_audio_device,
|
Result GetAudioDeviceServiceWithRevisionInfo(Out<SharedPointer<IAudioDevice>> out_audio_device,
|
||||||
u32 revision, ClientAppletResourceUserId aruid);
|
u32 revision, ClientAppletResourceUserId aruid);
|
||||||
|
|
||||||
std::unique_ptr<AudioCore::Renderer::Manager> impl;
|
std::optional<AudioCore::Renderer::Manager> impl;
|
||||||
u32 num_audio_devices{0};
|
u32 num_audio_devices{0};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,14 +10,6 @@
|
||||||
|
|
||||||
namespace Service {
|
namespace Service {
|
||||||
|
|
||||||
Process::Process(Core::System& system)
|
|
||||||
: m_system(system), m_process(), m_main_thread_priority(), m_main_thread_stack_size(),
|
|
||||||
m_process_started() {}
|
|
||||||
|
|
||||||
Process::~Process() {
|
|
||||||
this->Finalize();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Process::Initialize(Loader::AppLoader& loader, Loader::ResultStatus& out_load_result) {
|
bool Process::Initialize(Loader::AppLoader& loader, Loader::ResultStatus& out_load_result) {
|
||||||
// First, ensure we are not holding another process.
|
// First, ensure we are not holding another process.
|
||||||
this->Finalize();
|
this->Finalize();
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,8 @@ namespace Service {
|
||||||
|
|
||||||
class Process {
|
class Process {
|
||||||
public:
|
public:
|
||||||
explicit Process(Core::System& system);
|
inline explicit Process(Core::System& system) noexcept : m_system(system) {}
|
||||||
~Process();
|
inline ~Process() { this->Finalize(); }
|
||||||
|
|
||||||
bool Initialize(Loader::AppLoader& loader, Loader::ResultStatus& out_load_result);
|
bool Initialize(Loader::AppLoader& loader, Loader::ResultStatus& out_load_result);
|
||||||
void Finalize();
|
void Finalize();
|
||||||
|
|
@ -50,8 +50,8 @@ public:
|
||||||
private:
|
private:
|
||||||
Core::System& m_system;
|
Core::System& m_system;
|
||||||
Kernel::KProcess* m_process{};
|
Kernel::KProcess* m_process{};
|
||||||
s32 m_main_thread_priority{};
|
|
||||||
u64 m_main_thread_stack_size{};
|
u64 m_main_thread_stack_size{};
|
||||||
|
s32 m_main_thread_priority{};
|
||||||
bool m_process_started{};
|
bool m_process_started{};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -126,16 +126,14 @@ public:
|
||||||
current_query = nullptr;
|
current_query = nullptr;
|
||||||
amend_value = 0;
|
amend_value = 0;
|
||||||
accumulation_value = 0;
|
accumulation_value = 0;
|
||||||
queries_prefix_scan_pass = std::make_unique<QueriesPrefixScanPass>(
|
queries_prefix_scan_pass.emplace(device, scheduler, descriptor_pool, compute_pass_descriptor_queue);
|
||||||
device, scheduler, descriptor_pool, compute_pass_descriptor_queue);
|
|
||||||
|
|
||||||
const VkBufferCreateInfo buffer_ci = {
|
const VkBufferCreateInfo buffer_ci = {
|
||||||
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
|
||||||
.pNext = nullptr,
|
.pNext = nullptr,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.size = 8,
|
.size = 8,
|
||||||
.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
|
.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
||||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
|
||||||
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
||||||
.queueFamilyIndexCount = 0,
|
.queueFamilyIndexCount = 0,
|
||||||
.pQueueFamilyIndices = nullptr,
|
.pQueueFamilyIndices = nullptr,
|
||||||
|
|
@ -592,8 +590,7 @@ private:
|
||||||
VideoCommon::HostQueryBase* current_query;
|
VideoCommon::HostQueryBase* current_query;
|
||||||
bool has_started{};
|
bool has_started{};
|
||||||
std::mutex flush_guard;
|
std::mutex flush_guard;
|
||||||
|
std::optional<QueriesPrefixScanPass> queries_prefix_scan_pass;
|
||||||
std::unique_ptr<QueriesPrefixScanPass> queries_prefix_scan_pass;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Transform feedback queries
|
// Transform feedback queries
|
||||||
|
|
@ -1176,35 +1173,21 @@ private:
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
struct QueryCacheRuntimeImpl {
|
struct QueryCacheRuntimeImpl {
|
||||||
QueryCacheRuntimeImpl(QueryCacheRuntime& runtime, VideoCore::RasterizerInterface* rasterizer_,
|
QueryCacheRuntimeImpl(QueryCacheRuntime& runtime, VideoCore::RasterizerInterface* rasterizer_, Tegra::MaxwellDeviceMemoryManager& device_memory_, Vulkan::BufferCache& buffer_cache_, const Device& device_, const MemoryAllocator& memory_allocator_, Scheduler& scheduler_, StagingBufferPool& staging_pool_, ComputePassDescriptorQueue& compute_pass_descriptor_queue, DescriptorPool& descriptor_pool, TextureCache& texture_cache_)
|
||||||
Tegra::MaxwellDeviceMemoryManager& device_memory_,
|
: rasterizer{rasterizer_}, device_memory{device_memory_}, buffer_cache{buffer_cache_}
|
||||||
Vulkan::BufferCache& buffer_cache_, const Device& device_,
|
, device{device_}, memory_allocator{memory_allocator_}, scheduler{scheduler_}
|
||||||
const MemoryAllocator& memory_allocator_, Scheduler& scheduler_,
|
, staging_pool{staging_pool_}, guest_streamer(0, runtime)
|
||||||
StagingBufferPool& staging_pool_,
|
, sample_streamer(size_t(QueryType::ZPassPixelCount64), runtime, rasterizer, texture_cache_, device, scheduler, memory_allocator, compute_pass_descriptor_queue, descriptor_pool)
|
||||||
ComputePassDescriptorQueue& compute_pass_descriptor_queue,
|
, tfb_streamer(size_t(QueryType::StreamingByteCount), runtime, device, scheduler, memory_allocator, staging_pool)
|
||||||
DescriptorPool& descriptor_pool, TextureCache& texture_cache_)
|
, primitives_succeeded_streamer(size_t(QueryType::StreamingPrimitivesSucceeded), runtime, tfb_streamer, device_memory_)
|
||||||
: rasterizer{rasterizer_}, device_memory{device_memory_}, buffer_cache{buffer_cache_},
|
, primitives_needed_minus_succeeded_streamer(size_t(QueryType::StreamingPrimitivesNeededMinusSucceeded), runtime, 0u)
|
||||||
device{device_}, memory_allocator{memory_allocator_}, scheduler{scheduler_},
|
, hcr_setup{}, hcr_is_set{}, is_hcr_running{}, maxwell3d{} {
|
||||||
staging_pool{staging_pool_}, guest_streamer(0, runtime),
|
|
||||||
sample_streamer(static_cast<size_t>(QueryType::ZPassPixelCount64), runtime, rasterizer,
|
|
||||||
texture_cache_, device, scheduler, memory_allocator,
|
|
||||||
compute_pass_descriptor_queue, descriptor_pool),
|
|
||||||
tfb_streamer(static_cast<size_t>(QueryType::StreamingByteCount), runtime, device,
|
|
||||||
scheduler, memory_allocator, staging_pool),
|
|
||||||
primitives_succeeded_streamer(
|
|
||||||
static_cast<size_t>(QueryType::StreamingPrimitivesSucceeded), runtime, tfb_streamer,
|
|
||||||
device_memory_),
|
|
||||||
primitives_needed_minus_succeeded_streamer(
|
|
||||||
static_cast<size_t>(QueryType::StreamingPrimitivesNeededMinusSucceeded), runtime, 0u),
|
|
||||||
hcr_setup{}, hcr_is_set{}, is_hcr_running{}, maxwell3d{} {
|
|
||||||
|
|
||||||
hcr_setup.sType = VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT;
|
hcr_setup.sType = VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT;
|
||||||
hcr_setup.pNext = nullptr;
|
hcr_setup.pNext = nullptr;
|
||||||
hcr_setup.flags = 0;
|
hcr_setup.flags = 0;
|
||||||
|
|
||||||
conditional_resolve_pass = std::make_unique<ConditionalRenderingResolvePass>(
|
conditional_resolve_pass.emplace(device, scheduler, descriptor_pool, compute_pass_descriptor_queue);
|
||||||
device, scheduler, descriptor_pool, compute_pass_descriptor_queue);
|
|
||||||
|
|
||||||
const VkBufferCreateInfo buffer_ci = {
|
const VkBufferCreateInfo buffer_ci = {
|
||||||
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
|
||||||
.pNext = nullptr,
|
.pNext = nullptr,
|
||||||
|
|
@ -1241,7 +1224,7 @@ struct QueryCacheRuntimeImpl {
|
||||||
std::vector<std::vector<VkBufferCopy>> copies_setup;
|
std::vector<std::vector<VkBufferCopy>> copies_setup;
|
||||||
|
|
||||||
// Host conditional rendering data
|
// Host conditional rendering data
|
||||||
std::unique_ptr<ConditionalRenderingResolvePass> conditional_resolve_pass;
|
std::optional<ConditionalRenderingResolvePass> conditional_resolve_pass;
|
||||||
vk::Buffer hcr_resolve_buffer;
|
vk::Buffer hcr_resolve_buffer;
|
||||||
VkConditionalRenderingBeginInfoEXT hcr_setup;
|
VkConditionalRenderingBeginInfoEXT hcr_setup;
|
||||||
VkBuffer hcr_buffer;
|
VkBuffer hcr_buffer;
|
||||||
|
|
@ -1253,13 +1236,7 @@ struct QueryCacheRuntimeImpl {
|
||||||
Maxwell3D* maxwell3d;
|
Maxwell3D* maxwell3d;
|
||||||
};
|
};
|
||||||
|
|
||||||
QueryCacheRuntime::QueryCacheRuntime(VideoCore::RasterizerInterface* rasterizer,
|
QueryCacheRuntime::QueryCacheRuntime(VideoCore::RasterizerInterface* rasterizer, Tegra::MaxwellDeviceMemoryManager& device_memory_, Vulkan::BufferCache& buffer_cache_, const Device& device_, const MemoryAllocator& memory_allocator_, Scheduler& scheduler_, StagingBufferPool& staging_pool_, ComputePassDescriptorQueue& compute_pass_descriptor_queue, DescriptorPool& descriptor_pool, TextureCache& texture_cache_) {
|
||||||
Tegra::MaxwellDeviceMemoryManager& device_memory_,
|
|
||||||
Vulkan::BufferCache& buffer_cache_, const Device& device_,
|
|
||||||
const MemoryAllocator& memory_allocator_,
|
|
||||||
Scheduler& scheduler_, StagingBufferPool& staging_pool_,
|
|
||||||
ComputePassDescriptorQueue& compute_pass_descriptor_queue,
|
|
||||||
DescriptorPool& descriptor_pool, TextureCache& texture_cache_) {
|
|
||||||
impl = std::make_unique<QueryCacheRuntimeImpl>(
|
impl = std::make_unique<QueryCacheRuntimeImpl>(
|
||||||
*this, rasterizer, device_memory_, buffer_cache_, device_, memory_allocator_, scheduler_,
|
*this, rasterizer, device_memory_, buffer_cache_, device_, memory_allocator_, scheduler_,
|
||||||
staging_pool_, compute_pass_descriptor_queue, descriptor_pool, texture_cache_);
|
staging_pool_, compute_pass_descriptor_queue, descriptor_pool, texture_cache_);
|
||||||
|
|
@ -1484,13 +1461,11 @@ void QueryCacheRuntime::Barriers(bool is_prebarrier) {
|
||||||
impl->scheduler.RequestOutsideRenderPassOperationContext();
|
impl->scheduler.RequestOutsideRenderPassOperationContext();
|
||||||
if (is_prebarrier) {
|
if (is_prebarrier) {
|
||||||
impl->scheduler.Record([](vk::CommandBuffer cmdbuf) {
|
impl->scheduler.Record([](vk::CommandBuffer cmdbuf) {
|
||||||
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
|
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, READ_BARRIER);
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT, 0, READ_BARRIER);
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
impl->scheduler.Record([](vk::CommandBuffer cmdbuf) {
|
impl->scheduler.Record([](vk::CommandBuffer cmdbuf) {
|
||||||
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT,
|
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, WRITE_BARRIER);
|
||||||
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, WRITE_BARRIER);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1583,8 +1558,7 @@ void QueryCacheRuntime::SyncValues(std::span<SyncValuesType> values, VkBuffer ba
|
||||||
}
|
}
|
||||||
|
|
||||||
impl->scheduler.RequestOutsideRenderPassOperationContext();
|
impl->scheduler.RequestOutsideRenderPassOperationContext();
|
||||||
impl->scheduler.Record([src_buffer, dst_buffers = std::move(impl->buffers_to_upload_to),
|
impl->scheduler.Record([src_buffer, dst_buffers = std::move(impl->buffers_to_upload_to), vk_copies = std::move(impl->copies_setup)](vk::CommandBuffer cmdbuf) {
|
||||||
vk_copies = std::move(impl->copies_setup)](vk::CommandBuffer cmdbuf) {
|
|
||||||
size_t size = dst_buffers.size();
|
size_t size = dst_buffers.size();
|
||||||
for (size_t i = 0; i < size; i++) {
|
for (size_t i = 0; i < size; i++) {
|
||||||
cmdbuf.CopyBuffer(src_buffer, dst_buffers[i].first, vk_copies[i]);
|
cmdbuf.CopyBuffer(src_buffer, dst_buffers[i].first, vk_copies[i]);
|
||||||
|
|
|
||||||
|
|
@ -12,20 +12,15 @@ namespace Vulkan {
|
||||||
class Device;
|
class Device;
|
||||||
class Scheduler;
|
class Scheduler;
|
||||||
|
|
||||||
struct DescriptorUpdateEntry {
|
union DescriptorUpdateEntry {
|
||||||
struct Empty {};
|
|
||||||
|
|
||||||
DescriptorUpdateEntry() = default;
|
DescriptorUpdateEntry() = default;
|
||||||
DescriptorUpdateEntry(VkDescriptorImageInfo image_) : image{image_} {}
|
DescriptorUpdateEntry(VkDescriptorImageInfo image_) : image{image_} {}
|
||||||
DescriptorUpdateEntry(VkDescriptorBufferInfo buffer_) : buffer{buffer_} {}
|
DescriptorUpdateEntry(VkDescriptorBufferInfo buffer_) : buffer{buffer_} {}
|
||||||
DescriptorUpdateEntry(VkBufferView texel_buffer_) : texel_buffer{texel_buffer_} {}
|
DescriptorUpdateEntry(VkBufferView texel_buffer_) : texel_buffer{texel_buffer_} {}
|
||||||
|
std::monostate empty{};
|
||||||
union {
|
VkDescriptorImageInfo image;
|
||||||
Empty empty{};
|
VkDescriptorBufferInfo buffer;
|
||||||
VkDescriptorImageInfo image;
|
VkBufferView texel_buffer;
|
||||||
VkDescriptorBufferInfo buffer;
|
|
||||||
VkBufferView texel_buffer;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class UpdateDescriptorQueue final {
|
class UpdateDescriptorQueue final {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue