From 0ada442cbc4ec7ee4df6c62908f0f845a68e673a Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 27 Jun 2024 16:37:17 +0300 Subject: [PATCH] Stabilization8 (#218) * disable configured flexible memory size (caused issues in some games) * fixed case S_OR_B64 for blazing chrome * submodules updates and fixes for latest SDL * stubbed _sigprocmask (not handled and spams too much) * added ReplaceOp case in Stencilop * dummy ajm module added --- CMakeLists.txt | 2 + externals/cryptopp | 2 +- externals/fmt | 2 +- externals/glslang | 2 +- externals/sdl3 | 2 +- externals/vma | 2 +- externals/zlib-ng | 2 +- src/audio_core/sdl_audio.cpp | 2 +- src/common/logging/filter.cpp | 1 + src/common/logging/types.h | 1 + src/core/libraries/ajm/ajm.cpp | 147 ++++++++++++++++++ src/core/libraries/ajm/ajm.h | 38 +++++ src/core/libraries/kernel/libkernel.cpp | 6 + src/core/libraries/libs.cpp | 2 + src/core/linker.cpp | 10 +- src/sdl_window.cpp | 2 +- .../frontend/translate/scalar_alu.cpp | 2 + .../renderer_vulkan/liverpool_to_vk.cpp | 2 + 18 files changed, 214 insertions(+), 13 deletions(-) create mode 100644 src/core/libraries/ajm/ajm.cpp create mode 100644 src/core/libraries/ajm/ajm.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d08b2fb..9c78258c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -111,6 +111,8 @@ set(AUDIO_LIB src/core/libraries/audio/audioin.cpp src/core/libraries/audio/audioin.h src/core/libraries/audio/audioout.cpp src/core/libraries/audio/audioout.h + src/core/libraries/ajm/ajm.cpp + src/core/libraries/ajm/ajm.h ) set(GNM_LIB src/core/libraries/gnmdriver/gnmdriver.cpp diff --git a/externals/cryptopp b/externals/cryptopp index 9bb6680c..60f81a77 160000 --- a/externals/cryptopp +++ b/externals/cryptopp @@ -1 +1 @@ -Subproject commit 9bb6680cfaedd3d46eff082ede8d0c76be6a2145 +Subproject commit 60f81a77e0c9a0e7ffc1ca1bc438ddfa2e43b78e diff --git a/externals/fmt b/externals/fmt index 18a325f3..bbf44cc0 160000 --- a/externals/fmt +++ b/externals/fmt @@ -1 +1 @@ -Subproject commit 18a325f370ffd5ec1eda0087d2efc3dc9b3faf56 +Subproject commit bbf44cc000531dc7737d5321ccfa9f2f11b20127 diff --git a/externals/glslang b/externals/glslang index 2d8b71fc..ea087ff9 160000 --- a/externals/glslang +++ b/externals/glslang @@ -1 +1 @@ -Subproject commit 2d8b71fc63578a93726c05e0565c3ef064bdc1ba +Subproject commit ea087ff90d03947307cfe52500b74551aa35d34d diff --git a/externals/sdl3 b/externals/sdl3 index 4fc68a48..a4f962fd 160000 --- a/externals/sdl3 +++ b/externals/sdl3 @@ -1 +1 @@ -Subproject commit 4fc68a48f20574326eb18022eed0b7c0fa52a10e +Subproject commit a4f962fd46b5b0b4ed9d5eb1e40a203cc0e5f422 diff --git a/externals/vma b/externals/vma index 7942b798..feb11e17 160000 --- a/externals/vma +++ b/externals/vma @@ -1 +1 @@ -Subproject commit 7942b798289f752dc23b0a79516fd8545febd718 +Subproject commit feb11e172715011ef2a7b3b6c7c8737337b34181 diff --git a/externals/zlib-ng b/externals/zlib-ng index 2e3e5f30..80514c17 160000 --- a/externals/zlib-ng +++ b/externals/zlib-ng @@ -1 +1 @@ -Subproject commit 2e3e5f30a05ee7b113c755ad9a075304e02bc328 +Subproject commit 80514c17b384df68fbe83cca69ece0521b85f708 diff --git a/src/audio_core/sdl_audio.cpp b/src/audio_core/sdl_audio.cpp index 72f0f9ef..6a2a70e3 100644 --- a/src/audio_core/sdl_audio.cpp +++ b/src/audio_core/sdl_audio.cpp @@ -78,7 +78,7 @@ int SDLAudio::AudioOutOpen(int type, u32 samples_num, u32 freq, fmt.channels = port.channels_num; fmt.freq = 48000; port.stream = - SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_OUTPUT, &fmt, NULL, NULL); + SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &fmt, NULL, NULL); SDL_ResumeAudioDevice(SDL_GetAudioStreamDevice(port.stream)); return id + 1; } diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index 6ea076ed..35159bf1 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -107,6 +107,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) { SUB(Lib, Png) \ SUB(Lib, PlayGo) \ SUB(Lib, Usbd) \ + SUB(Lib, Ajm) \ CLS(Frontend) \ CLS(Render) \ SUB(Render, Vulkan) \ diff --git a/src/common/logging/types.h b/src/common/logging/types.h index 3d9c87b1..d415335b 100644 --- a/src/common/logging/types.h +++ b/src/common/logging/types.h @@ -74,6 +74,7 @@ enum class Class : u8 { Lib_Png, ///< The LibScePng implementation. Lib_PlayGo, ///< The LibScePlayGo implementation. Lib_Usbd, ///< The LibSceUsbd implementation. + Lib_Ajm, ///< The LibSceAjm implementation. Frontend, ///< Emulator UI Render, ///< Video Core Render_Vulkan, ///< Vulkan backend diff --git a/src/core/libraries/ajm/ajm.cpp b/src/core/libraries/ajm/ajm.cpp new file mode 100644 index 00000000..d8d8304a --- /dev/null +++ b/src/core/libraries/ajm/ajm.cpp @@ -0,0 +1,147 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +// Generated By moduleGenerator +#include "common/logging/log.h" +#include "core/libraries/ajm/ajm.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" + +namespace Libraries::Ajm { + +int PS4_SYSV_ABI sceAjmBatchCancel() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmBatchErrorDump() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmBatchJobControlBufferRa() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmBatchJobInlineBuffer() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmBatchJobRunBufferRa() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmBatchJobRunSplitBufferRa() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmBatchStartBuffer() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmBatchWait() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmDecAt9ParseConfigData() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmDecMp3ParseFrame() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmFinalize() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmInitialize() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmInstanceCodecType() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmInstanceCreate() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmInstanceDestroy() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmInstanceExtend() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmInstanceSwitch() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmMemoryRegister() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmMemoryUnregister() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmModuleRegister() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmModuleUnregister() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceAjmStrError() { + LOG_ERROR(Lib_Ajm, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterlibSceAjm(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("NVDXiUesSbA", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmBatchCancel); + LIB_FUNCTION("WfAiBW8Wcek", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmBatchErrorDump); + LIB_FUNCTION("dmDybN--Fn8", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmBatchJobControlBufferRa); + LIB_FUNCTION("stlghnic3Jc", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmBatchJobInlineBuffer); + LIB_FUNCTION("ElslOCpOIns", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmBatchJobRunBufferRa); + LIB_FUNCTION("7jdAXK+2fMo", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmBatchJobRunSplitBufferRa); + LIB_FUNCTION("fFFkk0xfGWs", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmBatchStartBuffer); + LIB_FUNCTION("-qLsfDAywIY", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmBatchWait); + LIB_FUNCTION("1t3ixYNXyuc", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmDecAt9ParseConfigData); + LIB_FUNCTION("eDFeTyi+G3Y", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmDecMp3ParseFrame); + LIB_FUNCTION("MHur6qCsUus", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmFinalize); + LIB_FUNCTION("dl+4eHSzUu4", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmInitialize); + LIB_FUNCTION("diXjQNiMu-s", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmInstanceCodecType); + LIB_FUNCTION("AxoDrINp4J8", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmInstanceCreate); + LIB_FUNCTION("RbLbuKv8zho", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmInstanceDestroy); + LIB_FUNCTION("YDFR0dDVGAg", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmInstanceExtend); + LIB_FUNCTION("rgLjmfdXocI", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmInstanceSwitch); + LIB_FUNCTION("bkRHEYG6lEM", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmMemoryRegister); + LIB_FUNCTION("pIpGiaYkHkM", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmMemoryUnregister); + LIB_FUNCTION("Q3dyFuwGn64", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmModuleRegister); + LIB_FUNCTION("Wi7DtlLV+KI", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmModuleUnregister); + LIB_FUNCTION("AxhcqVv5AYU", "libSceAjm", 1, "libSceAjm", 1, 1, sceAjmStrError); +}; + +} // namespace Libraries::Ajm \ No newline at end of file diff --git a/src/core/libraries/ajm/ajm.h b/src/core/libraries/ajm/ajm.h new file mode 100644 index 00000000..8491e519 --- /dev/null +++ b/src/core/libraries/ajm/ajm.h @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::Ajm { + +int PS4_SYSV_ABI sceAjmBatchCancel(); +int PS4_SYSV_ABI sceAjmBatchErrorDump(); +int PS4_SYSV_ABI sceAjmBatchJobControlBufferRa(); +int PS4_SYSV_ABI sceAjmBatchJobInlineBuffer(); +int PS4_SYSV_ABI sceAjmBatchJobRunBufferRa(); +int PS4_SYSV_ABI sceAjmBatchJobRunSplitBufferRa(); +int PS4_SYSV_ABI sceAjmBatchStartBuffer(); +int PS4_SYSV_ABI sceAjmBatchWait(); +int PS4_SYSV_ABI sceAjmDecAt9ParseConfigData(); +int PS4_SYSV_ABI sceAjmDecMp3ParseFrame(); +int PS4_SYSV_ABI sceAjmFinalize(); +int PS4_SYSV_ABI sceAjmInitialize(); +int PS4_SYSV_ABI sceAjmInstanceCodecType(); +int PS4_SYSV_ABI sceAjmInstanceCreate(); +int PS4_SYSV_ABI sceAjmInstanceDestroy(); +int PS4_SYSV_ABI sceAjmInstanceExtend(); +int PS4_SYSV_ABI sceAjmInstanceSwitch(); +int PS4_SYSV_ABI sceAjmMemoryRegister(); +int PS4_SYSV_ABI sceAjmMemoryUnregister(); +int PS4_SYSV_ABI sceAjmModuleRegister(); +int PS4_SYSV_ABI sceAjmModuleUnregister(); +int PS4_SYSV_ABI sceAjmStrError(); + +void RegisterlibSceAjm(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::Ajm \ No newline at end of file diff --git a/src/core/libraries/kernel/libkernel.cpp b/src/core/libraries/kernel/libkernel.cpp index 6edb5449..e7e7d11d 100644 --- a/src/core/libraries/kernel/libkernel.cpp +++ b/src/core/libraries/kernel/libkernel.cpp @@ -297,12 +297,18 @@ int PS4_SYSV_ABI posix_connect() { return -1; } +int PS4_SYSV_ABI _sigprocmask() { + LOG_DEBUG(Lib_Kernel, "STUBBED"); + return ORBIS_OK; +} + void LibKernel_Register(Core::Loader::SymbolsResolver* sym) { // obj LIB_OBJ("f7uOxY9mM1U", "libkernel", 1, "libkernel", 1, 1, &g_stack_chk_guard); // misc LIB_FUNCTION("JGfTMBOdUJo", "libkernel", 1, "libkernel", 1, 1, sceKernelGetFsSandboxRandomWord); LIB_FUNCTION("XVL8So3QJUk", "libkernel", 1, "libkernel", 1, 1, posix_connect); + LIB_FUNCTION("6xVpy0Fdq+I", "libkernel", 1, "libkernel", 1, 1, _sigprocmask); // memory LIB_FUNCTION("OMDRKKAZ8I4", "libkernel", 1, "libkernel", 1, 1, sceKernelDebugRaiseException); LIB_FUNCTION("rTXw65xmLIA", "libkernel", 1, "libkernel", 1, 1, sceKernelAllocateDirectMemory); diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index 46ada931..1279016f 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -32,6 +32,7 @@ #include "core/libraries/system/userservice.h" #include "core/libraries/usbd/usbd.h" #include "core/libraries/videoout/video_out.h" +#include "src/core/libraries/ajm/ajm.h" #include "src/core/libraries/libpng/pngdec.h" namespace Libraries { @@ -68,6 +69,7 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) { Libraries::PlayGo::RegisterlibScePlayGo(sym); Libraries::Usbd::RegisterlibSceUsbd(sym); Libraries::Pad::RegisterlibScePad(sym); + Libraries::Ajm::RegisterlibSceAjm(sym); } } // namespace Libraries diff --git a/src/core/linker.cpp b/src/core/linker.cpp index 09526b53..217b822f 100644 --- a/src/core/linker.cpp +++ b/src/core/linker.cpp @@ -68,11 +68,11 @@ void Linker::Execute() { } // Configure used flexible memory size. - if (auto* mem_param = GetProcParam()->mem_param) { - if (u64* flexible_size = mem_param->flexible_memory_size) { - memory->SetTotalFlexibleSize(*flexible_size); - } - } + // if (auto* mem_param = GetProcParam()->mem_param) { + // if (u64* flexible_size = mem_param->flexible_memory_size) { + // memory->SetTotalFlexibleSize(*flexible_size); + // } + // } // Init primary thread. Common::SetCurrentThreadName("GAME_MainThread"); diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index ef492db6..1cc3f65a 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -102,7 +102,7 @@ void WindowSDL::onKeyPress(const SDL_Event* event) { Input::Axis axis = Input::Axis::AxisMax; int axisvalue = 0; int ax = 0; - switch (event->key.keysym.sym) { + switch (event->key.key) { case SDLK_UP: button = OrbisPadButtonDataOffset::ORBIS_PAD_BUTTON_UP; break; diff --git a/src/shader_recompiler/frontend/translate/scalar_alu.cpp b/src/shader_recompiler/frontend/translate/scalar_alu.cpp index 9e0d78c4..8b8c7c0f 100644 --- a/src/shader_recompiler/frontend/translate/scalar_alu.cpp +++ b/src/shader_recompiler/frontend/translate/scalar_alu.cpp @@ -107,6 +107,8 @@ void Translator::S_MOV_B64(const GcnInst& inst) { void Translator::S_OR_B64(NegateMode negate, const GcnInst& inst) { const auto get_src = [&](const InstOperand& operand) { switch (operand.field) { + case OperandField::ExecLo: + return ir.GetExec(); case OperandField::VccLo: return ir.GetVcc(); case OperandField::ScalarGPR: diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index 4fcee07a..8e3f9207 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -26,6 +26,8 @@ vk::StencilOp StencilOp(Liverpool::StencilFunc op) { return vk::StencilOp::eIncrementAndWrap; case Liverpool::StencilFunc::SubWrap: return vk::StencilOp::eDecrementAndWrap; + case Liverpool::StencilFunc::ReplaceOp: + return vk::StencilOp::eReplace; default: UNREACHABLE(); return vk::StencilOp::eKeep;