mirror of
https://github.com/Lime3DS/Lime3DS.git
synced 2026-06-09 01:25:03 -06:00
core: Fix accurate multiplication loading (home menu and savestate)
Some checks are pending
citra-build / source (push) Waiting to run
citra-build / linux (appimage) (push) Waiting to run
citra-build / linux (appimage-wayland) (push) Waiting to run
citra-build / linux (fresh) (push) Waiting to run
citra-build / macos (arm64) (push) Waiting to run
citra-build / macos (x86_64) (push) Waiting to run
citra-build / macos-universal (push) Blocked by required conditions
citra-build / windows (msvc) (push) Waiting to run
citra-build / windows (msys2) (push) Waiting to run
citra-build / android (googleplay) (push) Waiting to run
citra-build / android (vanilla) (push) Waiting to run
citra-build / docker (push) Waiting to run
citra-format / clang-format (push) Waiting to run
citra-transifex / transifex (push) Waiting to run
Some checks are pending
citra-build / source (push) Waiting to run
citra-build / linux (appimage) (push) Waiting to run
citra-build / linux (appimage-wayland) (push) Waiting to run
citra-build / linux (fresh) (push) Waiting to run
citra-build / macos (arm64) (push) Waiting to run
citra-build / macos (x86_64) (push) Waiting to run
citra-build / macos-universal (push) Blocked by required conditions
citra-build / windows (msvc) (push) Waiting to run
citra-build / windows (msys2) (push) Waiting to run
citra-build / android (googleplay) (push) Waiting to run
citra-build / android (vanilla) (push) Waiting to run
citra-build / docker (push) Waiting to run
citra-format / clang-format (push) Waiting to run
citra-transifex / transifex (push) Waiting to run
This commit is contained in:
parent
94b558d3f1
commit
b0fea112e8
@ -269,6 +269,8 @@ static Core::System::ResultStatus RunCitra(const std::string& filepath) {
|
|||||||
|
|
||||||
LoadDiskCacheProgress(VideoCore::LoadCallbackStage::Prepare, 0, 0);
|
LoadDiskCacheProgress(VideoCore::LoadCallbackStage::Prepare, 0, 0);
|
||||||
|
|
||||||
|
system.GPU().ApplyPerProgramSettings(program_id);
|
||||||
|
|
||||||
std::unique_ptr<Frontend::GraphicsContext> cpu_context;
|
std::unique_ptr<Frontend::GraphicsContext> cpu_context;
|
||||||
system.GPU().Renderer().Rasterizer()->LoadDefaultDiskResources(stop_run,
|
system.GPU().Renderer().Rasterizer()->LoadDefaultDiskResources(stop_run,
|
||||||
&LoadDiskCacheProgress);
|
&LoadDiskCacheProgress);
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
#include "core/3ds.h"
|
#include "core/3ds.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/frontend/framebuffer_layout.h"
|
#include "core/frontend/framebuffer_layout.h"
|
||||||
|
#include "core/loader/loader.h"
|
||||||
#include "core/perf_stats.h"
|
#include "core/perf_stats.h"
|
||||||
#include "input_common/keyboard.h"
|
#include "input_common/keyboard.h"
|
||||||
#include "input_common/main.h"
|
#include "input_common/main.h"
|
||||||
@ -78,6 +79,10 @@ void EmuThread::run() {
|
|||||||
|
|
||||||
emit LoadProgress(VideoCore::LoadCallbackStage::Prepare, 0, 0);
|
emit LoadProgress(VideoCore::LoadCallbackStage::Prepare, 0, 0);
|
||||||
|
|
||||||
|
u64 program_id{};
|
||||||
|
system.GetAppLoader().ReadProgramId(program_id);
|
||||||
|
system.GPU().ApplyPerProgramSettings(program_id);
|
||||||
|
|
||||||
system.GPU().Renderer().Rasterizer()->LoadDefaultDiskResources(
|
system.GPU().Renderer().Rasterizer()->LoadDefaultDiskResources(
|
||||||
stop_run, [this](VideoCore::LoadCallbackStage stage, std::size_t value, std::size_t total) {
|
stop_run, [this](VideoCore::LoadCallbackStage stage, std::size_t value, std::size_t total) {
|
||||||
emit LoadProgress(stage, value, total);
|
emit LoadProgress(stage, value, total);
|
||||||
|
|||||||
@ -474,6 +474,10 @@ int LaunchSdlFrontend(int argc, char** argv) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
u64 program_id{};
|
||||||
|
system.GetAppLoader().ReadProgramId(program_id);
|
||||||
|
system.GPU().ApplyPerProgramSettings(program_id);
|
||||||
|
|
||||||
std::atomic_bool stop_run;
|
std::atomic_bool stop_run;
|
||||||
system.GPU().Renderer().Rasterizer()->LoadDefaultDiskResources(
|
system.GPU().Renderer().Rasterizer()->LoadDefaultDiskResources(
|
||||||
stop_run, [](VideoCore::LoadCallbackStage stage, std::size_t value, std::size_t total) {
|
stop_run, [](VideoCore::LoadCallbackStage stage, std::size_t value, std::size_t total) {
|
||||||
|
|||||||
@ -403,8 +403,6 @@ System::ResultStatus System::Load(Frontend::EmuWindow& emu_window, const std::st
|
|||||||
|
|
||||||
kernel->UpdateCPUAndMemoryState(program_id, app_mem_mode, app_n3ds_hw_capabilities);
|
kernel->UpdateCPUAndMemoryState(program_id, app_mem_mode, app_n3ds_hw_capabilities);
|
||||||
|
|
||||||
gpu->ReportLoadingProgramID(program_id);
|
|
||||||
|
|
||||||
// Restore any parameters that should be carried through a reset.
|
// Restore any parameters that should be carried through a reset.
|
||||||
if (auto apt = Service::APT::GetModule(*this)) {
|
if (auto apt = Service::APT::GetModule(*this)) {
|
||||||
if (restore_deliver_arg.has_value()) {
|
if (restore_deliver_arg.has_value()) {
|
||||||
@ -902,13 +900,15 @@ void System::serialize(Archive& ar, const unsigned int file_version) {
|
|||||||
gpu->SetInterruptHandler(
|
gpu->SetInterruptHandler(
|
||||||
[gsp](Service::GSP::InterruptId interrupt_id) { gsp->SignalInterrupt(interrupt_id); });
|
[gsp](Service::GSP::InterruptId interrupt_id) { gsp->SignalInterrupt(interrupt_id); });
|
||||||
|
|
||||||
// Switch the shader cache to the title running when the savestate was created
|
// Apply per program settings and switch the shader cache to the title running when the
|
||||||
|
// savestate was created.
|
||||||
const u32 thread_id = gsp->GetActiveClientThreadId();
|
const u32 thread_id = gsp->GetActiveClientThreadId();
|
||||||
if (thread_id != std::numeric_limits<u32>::max()) {
|
if (thread_id != std::numeric_limits<u32>::max()) {
|
||||||
const auto thread = kernel->GetThreadByID(thread_id);
|
const auto thread = kernel->GetThreadByID(thread_id);
|
||||||
if (thread) {
|
if (thread) {
|
||||||
const std::shared_ptr<Kernel::Process> process = thread->owner_process.lock();
|
const std::shared_ptr<Kernel::Process> process = thread->owner_process.lock();
|
||||||
if (process) {
|
if (process) {
|
||||||
|
gpu->ApplyPerProgramSettings(process->codeset->program_id);
|
||||||
gpu->Renderer().Rasterizer()->SwitchDiskResources(process->codeset->program_id);
|
gpu->Renderer().Rasterizer()->SwitchDiskResources(process->codeset->program_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -693,6 +693,7 @@ Result GSP_GPU::AcquireGpuRight(const Kernel::HLERequestContext& ctx,
|
|||||||
Common::Hacks::HackAllowMode::DISALLOW) != Common::Hacks::HackAllowMode::DISALLOW;
|
Common::Hacks::HackAllowMode::DISALLOW) != Common::Hacks::HackAllowMode::DISALLOW;
|
||||||
|
|
||||||
auto& gpu = system.GPU();
|
auto& gpu = system.GPU();
|
||||||
|
gpu.ApplyPerProgramSettings(process->codeset->program_id);
|
||||||
gpu.GetRightEyeDisabler().SetEnabled(right_eye_disable_allow);
|
gpu.GetRightEyeDisabler().SetEnabled(right_eye_disable_allow);
|
||||||
gpu.PicaCore().vs_setup.requires_fixup = requires_shader_fixup;
|
gpu.PicaCore().vs_setup.requires_fixup = requires_shader_fixup;
|
||||||
gpu.PicaCore().gs_setup.requires_fixup = requires_shader_fixup;
|
gpu.PicaCore().gs_setup.requires_fixup = requires_shader_fixup;
|
||||||
|
|||||||
@ -311,7 +311,7 @@ GraphicsDebugger& GPU::Debugger() {
|
|||||||
return impl->gpu_debugger;
|
return impl->gpu_debugger;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GPU::ReportLoadingProgramID(u64 program_ID) {
|
void GPU::ApplyPerProgramSettings(u64 program_ID) {
|
||||||
auto hack = Common::Hacks::hack_manager.GetHack(
|
auto hack = Common::Hacks::hack_manager.GetHack(
|
||||||
Common::Hacks::HackType::ACCURATE_MULTIPLICATION, program_ID);
|
Common::Hacks::HackType::ACCURATE_MULTIPLICATION, program_ID);
|
||||||
bool use_accurate_mul = Settings::values.shaders_accurate_mul.GetValue();
|
bool use_accurate_mul = Settings::values.shaders_accurate_mul.GetValue();
|
||||||
|
|||||||
@ -94,7 +94,7 @@ public:
|
|||||||
return *right_eye_disabler;
|
return *right_eye_disabler;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReportLoadingProgramID(u64 program_ID);
|
void ApplyPerProgramSettings(u64 program_ID);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void SubmitCmdList(u32 index);
|
void SubmitCmdList(u32 index);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user