mirror of https://github.com/cemu-project/Cemu.git
Migrate force_log_printf to new logging (#714)
This commit is contained in:
parent
072c18a6e3
commit
4be57f4896
|
@ -166,7 +166,7 @@ std::error_code Account::Load()
|
||||||
}
|
}
|
||||||
catch(const std::exception& ex)
|
catch(const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("handled error in Account::Load: %s", ex.what());
|
cemuLog_log(LogType::Force, "handled error in Account::Load: {}", ex.what());
|
||||||
return AccountErrc::ParseError;
|
return AccountErrc::ParseError;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -347,7 +347,7 @@ void Account::UpdatePersisidDat()
|
||||||
f.close();
|
f.close();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
forceLog_printf("Unable to save persisid.dat");
|
cemuLog_log(LogType::Force, "Unable to save persisid.dat");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Account::HasFreeAccountSlots()
|
bool Account::HasFreeAccountSlots()
|
||||||
|
|
|
@ -133,7 +133,7 @@ void LoadMainExecutable()
|
||||||
// otherwise search for first file with .rpx extension in the code folder
|
// otherwise search for first file with .rpx extension in the code folder
|
||||||
if (!ScanForRPX())
|
if (!ScanForRPX())
|
||||||
{
|
{
|
||||||
forceLog_printf("Unable to find RPX executable");
|
cemuLog_log(LogType::Force, "Unable to find RPX executable");
|
||||||
cemuLog_waitForFlush();
|
cemuLog_waitForFlush();
|
||||||
cemu_assert(false);
|
cemu_assert(false);
|
||||||
}
|
}
|
||||||
|
@ -143,7 +143,7 @@ void LoadMainExecutable()
|
||||||
uint8* rpxData = fsc_extractFile(_pathToExecutable.c_str(), &rpxSize);
|
uint8* rpxData = fsc_extractFile(_pathToExecutable.c_str(), &rpxSize);
|
||||||
if (rpxData == nullptr)
|
if (rpxData == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to load \"%s\"", _pathToExecutable.c_str());
|
cemuLog_log(LogType::Force, "Failed to load \"{}\"", _pathToExecutable);
|
||||||
cemuLog_waitForFlush();
|
cemuLog_waitForFlush();
|
||||||
cemu_assert(false);
|
cemu_assert(false);
|
||||||
}
|
}
|
||||||
|
@ -383,7 +383,7 @@ void cemu_initForGame()
|
||||||
RPLLoader_Link();
|
RPLLoader_Link();
|
||||||
RPLLoader_NotifyControlPassedToApplication();
|
RPLLoader_NotifyControlPassedToApplication();
|
||||||
uint32 linkTime = GetTickCount() - linkTimeStart;
|
uint32 linkTime = GetTickCount() - linkTimeStart;
|
||||||
forceLog_printf("RPL link time: %dms", linkTime);
|
cemuLog_log(LogType::Force, "RPL link time: {}ms", linkTime);
|
||||||
// for HBL ELF: Setup OS-specifics struct
|
// for HBL ELF: Setup OS-specifics struct
|
||||||
if (isLaunchTypeELF)
|
if (isLaunchTypeELF)
|
||||||
{
|
{
|
||||||
|
@ -406,13 +406,13 @@ void cemu_initForGame()
|
||||||
}
|
}
|
||||||
debugger_handleEntryBreakpoint(_entryPoint);
|
debugger_handleEntryBreakpoint(_entryPoint);
|
||||||
// load graphic packs
|
// load graphic packs
|
||||||
forceLog_printf("------- Activate graphic packs -------");
|
cemuLog_log(LogType::Force, "------- Activate graphic packs -------");
|
||||||
GraphicPack2::ActivateForCurrentTitle();
|
GraphicPack2::ActivateForCurrentTitle();
|
||||||
// print audio log
|
// print audio log
|
||||||
IAudioAPI::PrintLogging();
|
IAudioAPI::PrintLogging();
|
||||||
IAudioInputAPI::PrintLogging();
|
IAudioInputAPI::PrintLogging();
|
||||||
// everything initialized
|
// everything initialized
|
||||||
forceLog_printf("------- Run title -------");
|
cemuLog_log(LogType::Force, "------- Run title -------");
|
||||||
// wait till GPU thread is initialized
|
// wait till GPU thread is initialized
|
||||||
while (g_isGPUInitFinished == false) std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
while (g_isGPUInitFinished == false) std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
||||||
// init initial thread
|
// init initial thread
|
||||||
|
|
|
@ -300,7 +300,7 @@ void GamePatch_scan()
|
||||||
if( hleAddr )
|
if( hleAddr )
|
||||||
{
|
{
|
||||||
#ifdef CEMU_DEBUG_ASSERT
|
#ifdef CEMU_DEBUG_ASSERT
|
||||||
forceLog_printf("HLE: XCX GPU hang detection");
|
cemuLog_log(LogType::Force, "HLE: XCX GPU hang detection");
|
||||||
#endif
|
#endif
|
||||||
// remove the ADDI r25, r25, 1 instruction
|
// remove the ADDI r25, r25, 1 instruction
|
||||||
memory_writeU32(hleAddr, memory_readU32(hleAddr+4));
|
memory_writeU32(hleAddr, memory_readU32(hleAddr+4));
|
||||||
|
@ -310,7 +310,7 @@ void GamePatch_scan()
|
||||||
if( hleAddr )
|
if( hleAddr )
|
||||||
{
|
{
|
||||||
#ifdef CEMU_DEBUG_ASSERT
|
#ifdef CEMU_DEBUG_ASSERT
|
||||||
forceLog_printf("HLE: Prevent XCX rendertarget reduction");
|
cemuLog_log(LogType::Force, "HLE: Prevent XCX rendertarget reduction");
|
||||||
#endif
|
#endif
|
||||||
uint32 bl = memory_readU32(hleAddr+0x14);
|
uint32 bl = memory_readU32(hleAddr+0x14);
|
||||||
uint32 func_isReductionBuffer = hleAddr + 0x14 + (bl&0x3FFFFFC);
|
uint32 func_isReductionBuffer = hleAddr + 0x14 + (bl&0x3FFFFFC);
|
||||||
|
@ -326,7 +326,7 @@ void GamePatch_scan()
|
||||||
if (hleAddr)
|
if (hleAddr)
|
||||||
{
|
{
|
||||||
#ifdef CEMU_DEBUG_ASSERT
|
#ifdef CEMU_DEBUG_ASSERT
|
||||||
forceLog_printf("HLE: Patch BotW busy loop 1 at 0x%08x", hleAddr);
|
cemuLog_log(LogType::Force, "HLE: Patch BotW busy loop 1 at 0x{:08x}", hleAddr);
|
||||||
#endif
|
#endif
|
||||||
sint32 functionIndex = hleIndex_h000000001;
|
sint32 functionIndex = hleIndex_h000000001;
|
||||||
uint32 opcode = (1 << 26) | (functionIndex); // opcode for HLE: 0x1000 + FunctionIndex
|
uint32 opcode = (1 << 26) | (functionIndex); // opcode for HLE: 0x1000 + FunctionIndex
|
||||||
|
@ -337,7 +337,7 @@ void GamePatch_scan()
|
||||||
if (hleAddr)
|
if (hleAddr)
|
||||||
{
|
{
|
||||||
#ifdef CEMU_DEBUG_ASSERT
|
#ifdef CEMU_DEBUG_ASSERT
|
||||||
forceLog_printf("HLE: Patch BotW busy loop 2 at 0x%08x", hleAddr);
|
cemuLog_log(LogType::Force, "HLE: Patch BotW busy loop 2 at 0x{:08x}", hleAddr);
|
||||||
#endif
|
#endif
|
||||||
sint32 functionIndex = hleIndex_h000000002;
|
sint32 functionIndex = hleIndex_h000000002;
|
||||||
uint32 opcode = (1 << 26) | (functionIndex); // opcode for HLE: 0x1000 + FunctionIndex
|
uint32 opcode = (1 << 26) | (functionIndex); // opcode for HLE: 0x1000 + FunctionIndex
|
||||||
|
@ -372,7 +372,7 @@ void GamePatch_scan()
|
||||||
if (hleAddr)
|
if (hleAddr)
|
||||||
{
|
{
|
||||||
uint32 patchAddr = hleAddr + 0x10;
|
uint32 patchAddr = hleAddr + 0x10;
|
||||||
forceLog_printf("HLE: Patch MH3U race condition candidate at 0x%08x", patchAddr);
|
cemuLog_log(LogType::Force, "HLE: Patch MH3U race condition candidate at 0x{:08x}", patchAddr);
|
||||||
uint32 funcAddr = PPCInterpreter_makeCallableExportDepr(hleExport_mh3u_raceConditionWorkaround);
|
uint32 funcAddr = PPCInterpreter_makeCallableExportDepr(hleExport_mh3u_raceConditionWorkaround);
|
||||||
// set absolute jump
|
// set absolute jump
|
||||||
uint32 opc = 0x48000000;
|
uint32 opc = 0x48000000;
|
||||||
|
@ -411,7 +411,7 @@ void GamePatch_scan()
|
||||||
if (hleAddr)
|
if (hleAddr)
|
||||||
{
|
{
|
||||||
// replace CMPL with CMP
|
// replace CMPL with CMP
|
||||||
forceLog_printf("Patching Bayonetta 2 audio bug at: 0x%08x", hleAddr+0x34);
|
cemuLog_log(LogType::Force, "Patching Bayonetta 2 audio bug at: 0x{:08x}", hleAddr+0x34);
|
||||||
uint32 opc = memory_readU32(hleAddr + 0x34);
|
uint32 opc = memory_readU32(hleAddr + 0x34);
|
||||||
opc &= ~(0x3FF << 1); // turn CMPL to CMP
|
opc &= ~(0x3FF << 1); // turn CMPL to CMP
|
||||||
memory_writeU32(hleAddr + 0x34, opc);
|
memory_writeU32(hleAddr + 0x34, opc);
|
||||||
|
@ -444,7 +444,7 @@ void GamePatch_scan()
|
||||||
hleAddr = hle_locate(sm3dw_dynFrameBufferResScale, nullptr, sizeof(sm3dw_dynFrameBufferResScale));
|
hleAddr = hle_locate(sm3dw_dynFrameBufferResScale, nullptr, sizeof(sm3dw_dynFrameBufferResScale));
|
||||||
if (hleAddr)
|
if (hleAddr)
|
||||||
{
|
{
|
||||||
forceLog_printf("Patching SM3DW dynamic resolution scaling at: 0x%08x", hleAddr);
|
cemuLog_log(LogType::Force, "Patching SM3DW dynamic resolution scaling at: 0x{:08x}", hleAddr);
|
||||||
memory_writeU32(hleAddr, 0x4E800020); // BLR
|
memory_writeU32(hleAddr, 0x4E800020); // BLR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -453,7 +453,7 @@ void GamePatch_scan()
|
||||||
hleAddr = hle_locate(tww_waitFunc, nullptr, sizeof(tww_waitFunc));
|
hleAddr = hle_locate(tww_waitFunc, nullptr, sizeof(tww_waitFunc));
|
||||||
if (hleAddr)
|
if (hleAddr)
|
||||||
{
|
{
|
||||||
forceLog_printf("Patching TWW race conditon at: 0x%08x", hleAddr);
|
cemuLog_log(LogType::Force, "Patching TWW race conditon at: 0x{:08x}", hleAddr);
|
||||||
// NOP calls to Lock/Unlock mutex
|
// NOP calls to Lock/Unlock mutex
|
||||||
memory_writeU32(hleAddr + 0x34, 0x60000000);
|
memory_writeU32(hleAddr + 0x34, 0x60000000);
|
||||||
memory_writeU32(hleAddr + 0x48, 0x60000000);
|
memory_writeU32(hleAddr + 0x48, 0x60000000);
|
||||||
|
@ -462,7 +462,7 @@ void GamePatch_scan()
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 hleInstallEnd = GetTickCount();
|
uint32 hleInstallEnd = GetTickCount();
|
||||||
forceLog_printf("HLE scan time: %dms", hleInstallEnd-hleInstallStart);
|
cemuLog_log(LogType::Force, "HLE scan time: {}ms", hleInstallEnd-hleInstallStart);
|
||||||
}
|
}
|
||||||
|
|
||||||
RunAtCemuBoot _loadGamePatchAPI([]()
|
RunAtCemuBoot _loadGamePatchAPI([]()
|
||||||
|
|
|
@ -173,7 +173,7 @@ void GraphicPack2::ActivateForCurrentTitle()
|
||||||
{
|
{
|
||||||
if (gp->GetPresets().empty())
|
if (gp->GetPresets().empty())
|
||||||
{
|
{
|
||||||
forceLog_printf("Activate graphic pack: %s", gp->GetPath().c_str());
|
cemuLog_log(LogType::Force, "Activate graphic pack: {}", gp->GetPath());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -720,7 +720,7 @@ void GraphicPack2::LoadShaders()
|
||||||
}
|
}
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("graphicPack: error while loading custom shader: %s", ex.what());
|
cemuLog_log(LogType::Force, "graphicPack: error while loading custom shader: {}", ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -743,7 +743,7 @@ bool GraphicPack2::IsPresetVisible(const PresetPtr& preset) const
|
||||||
}
|
}
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("error when trying to check visiblity of preset: %s", ex.what());
|
cemuLog_log(LogType::Force, "error when trying to check visiblity of preset: {}", ex.what());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -974,7 +974,7 @@ bool GraphicPack2::Activate()
|
||||||
}
|
}
|
||||||
catch(const std::exception& ex)
|
catch(const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf((char*)ex.what());
|
cemuLog_log(LogType::Force, ex.what());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -998,11 +998,11 @@ bool GraphicPack2::Activate()
|
||||||
if (LatteTiming_getCustomVsyncFrequency(globalCustomVsyncFreq))
|
if (LatteTiming_getCustomVsyncFrequency(globalCustomVsyncFreq))
|
||||||
{
|
{
|
||||||
if (customVsyncFreq != globalCustomVsyncFreq)
|
if (customVsyncFreq != globalCustomVsyncFreq)
|
||||||
forceLog_printf("rules.txt error: Mismatching vsync frequency %d in graphic pack \'%s\'", customVsyncFreq, GetPath().c_str());
|
cemuLog_log(LogType::Force, "rules.txt error: Mismatching vsync frequency {} in graphic pack \'{}\'", customVsyncFreq, GetPath());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("Set vsync frequency to %d (graphic pack %s)", customVsyncFreq, GetPath().c_str());
|
cemuLog_log(LogType::Force, "Set vsync frequency to {} (graphic pack {})", customVsyncFreq, GetPath());
|
||||||
LatteTiming_setCustomVsyncFrequency(customVsyncFreq);
|
LatteTiming_setCustomVsyncFrequency(customVsyncFreq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1255,4 +1255,4 @@ std::vector<std::pair<MPTR, MPTR>> GraphicPack2::GetActiveRAMMappings()
|
||||||
return a.first < b.first;
|
return a.first < b.first;
|
||||||
});
|
});
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
|
@ -353,7 +353,7 @@ PATCH_RESOLVE_RESULT PatchEntryInstruction::resolveReloc(PatchContext_t& ctx, PP
|
||||||
// absolute
|
// absolute
|
||||||
if (result >= 0x3FFFFFC)
|
if (result >= 0x3FFFFFC)
|
||||||
{
|
{
|
||||||
forceLog_printf("Target \'%s\' for branch at line %d out of range", reloc->m_expression.c_str(), m_lineNumber);
|
cemuLog_log(LogType::Force, "Target \'{}\' for branch at line {} out of range", reloc->m_expression, m_lineNumber);
|
||||||
return PATCH_RESOLVE_RESULT::VALUE_ERROR;
|
return PATCH_RESOLVE_RESULT::VALUE_ERROR;
|
||||||
}
|
}
|
||||||
opcode &= ~0x3FFFFFC;
|
opcode &= ~0x3FFFFFC;
|
||||||
|
@ -438,7 +438,7 @@ PATCH_RESOLVE_RESULT PatchEntryInstruction::resolve(PatchContext_t& ctx)
|
||||||
{
|
{
|
||||||
if (_relocateAddress(resolverState.currentGroup, &ctx, m_addr, m_relocatedAddr) == false)
|
if (_relocateAddress(resolverState.currentGroup, &ctx, m_addr, m_relocatedAddr) == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("Patches: Address 0x%08x (line %d) is not within code cave or any module section", this->getAddr(), this->m_lineNumber);
|
cemuLog_log(LogType::Force, "Patches: Address 0x{:08x} (line {}) is not within code cave or any module section", this->getAddr(), this->m_lineNumber);
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
return PATCH_RESOLVE_RESULT::INVALID_ADDRESS;
|
return PATCH_RESOLVE_RESULT::INVALID_ADDRESS;
|
||||||
}
|
}
|
||||||
|
@ -639,12 +639,12 @@ void GraphicPack2::ApplyPatchGroups(std::vector<PatchGroup*>& groups, const RPLM
|
||||||
if (patchGroup->codeCaveSize > 0)
|
if (patchGroup->codeCaveSize > 0)
|
||||||
{
|
{
|
||||||
auto codeCaveMem = RPLLoader_AllocateCodeCaveMem(256, patchGroup->codeCaveSize);
|
auto codeCaveMem = RPLLoader_AllocateCodeCaveMem(256, patchGroup->codeCaveSize);
|
||||||
forceLog_printf("Applying patch group \'%s\' (Codecave: %08x-%08x)", patchGroup->name.c_str(), codeCaveMem.GetMPTR(), codeCaveMem.GetMPTR() + patchGroup->codeCaveSize);
|
cemuLog_log(LogType::Force, "Applying patch group \'{}\' (Codecave: {:08x}-{:08x})", patchGroup->name, codeCaveMem.GetMPTR(), codeCaveMem.GetMPTR() + patchGroup->codeCaveSize);
|
||||||
patchGroup->codeCaveMem = codeCaveMem;
|
patchGroup->codeCaveMem = codeCaveMem;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("Applying patch group \'%s\'", patchGroup->name.c_str());
|
cemuLog_log(LogType::Force, "Applying patch group \'{}\'", patchGroup->name);
|
||||||
patchGroup->codeCaveMem = nullptr;
|
patchGroup->codeCaveMem = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,7 @@ void GraphicPack2::AddPatchGroup(PatchGroup* group)
|
||||||
if (group->list_patches.size() < (numEstimatedCodeCaveInstr / 8))
|
if (group->list_patches.size() < (numEstimatedCodeCaveInstr / 8))
|
||||||
{
|
{
|
||||||
// if less than 1/8th of the code cave is filled print a warning
|
// if less than 1/8th of the code cave is filled print a warning
|
||||||
forceLog_printf("Graphic pack patches: Code cave for group [%s] in gfx pack \"%s\" ranges from 0 to 0x%x but has only few instructions. Is this intentional?", group->name.c_str(), this->m_name.c_str(), codeCaveMaxAddr);
|
cemuLog_log(LogType::Force, "Graphic pack patches: Code cave for group [{}] in gfx pack \"{}\" ranges from 0 to 0x{:x} but has only few instructions. Is this intentional?", group->name, this->m_name, codeCaveMaxAddr);
|
||||||
}
|
}
|
||||||
group->codeCaveSize = codeCaveMaxAddr;
|
group->codeCaveSize = codeCaveMaxAddr;
|
||||||
list_patchGroups.emplace_back(group);
|
list_patchGroups.emplace_back(group);
|
||||||
|
|
|
@ -515,7 +515,7 @@ void PPCInterpreter_MTFSF(PPCInterpreter_t* hCPU, uint32 Opcode)
|
||||||
static bool logFPSCRWriteOnce = false;
|
static bool logFPSCRWriteOnce = false;
|
||||||
if( logFPSCRWriteOnce == false )
|
if( logFPSCRWriteOnce == false )
|
||||||
{
|
{
|
||||||
forceLog_printf("Unsupported write to FPSCR\n");
|
cemuLog_log(LogType::Force, "Unsupported write to FPSCR");
|
||||||
logFPSCRWriteOnce = true;
|
logFPSCRWriteOnce = true;
|
||||||
}
|
}
|
||||||
PPCInterpreter_nextInstruction(hCPU);
|
PPCInterpreter_nextInstruction(hCPU);
|
||||||
|
@ -697,4 +697,4 @@ void PPCInterpreter_FCMPU(PPCInterpreter_t* hCPU, uint32 Opcode)
|
||||||
fcmpu_espresso(hCPU, crfD, hCPU->fpr[frA].fp0, hCPU->fpr[frB].fp0);
|
fcmpu_espresso(hCPU, crfD, hCPU->fpr[frA].fp0, hCPU->fpr[frB].fp0);
|
||||||
|
|
||||||
PPCInterpreter_nextInstruction(hCPU);
|
PPCInterpreter_nextInstruction(hCPU);
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,12 +60,12 @@ uint64 PPCTimer_estimateRDTSCFrequency()
|
||||||
uint64 tsc_freq = muldiv64(tsc_diff, hrtFreq, hrtDiff);
|
uint64 tsc_freq = muldiv64(tsc_diff, hrtFreq, hrtDiff);
|
||||||
|
|
||||||
// uint64 freqMultiplier = tsc_freq / hrtFreq;
|
// uint64 freqMultiplier = tsc_freq / hrtFreq;
|
||||||
//forceLog_printf("RDTSC measurement test:");
|
//cemuLog_log(LogType::Force, "RDTSC measurement test:");
|
||||||
//forceLog_printf("TSC-diff: 0x%016llx", tsc_diff);
|
//cemuLog_log(LogType::Force, "TSC-diff: 0x{:016x}", tsc_diff);
|
||||||
//forceLog_printf("TSC-freq: 0x%016llx", tsc_freq);
|
//cemuLog_log(LogType::Force, "TSC-freq: 0x{:016x}", tsc_freq);
|
||||||
//forceLog_printf("HPC-diff: 0x%016llx", qpc_diff);
|
//cemuLog_log(LogType::Force, "HPC-diff: 0x{:016x}", qpc_diff);
|
||||||
//forceLog_printf("HPC-freq: 0x%016llx", (uint64)qpc_freq.QuadPart);
|
//cemuLog_log(LogType::Force, "HPC-freq: 0x{:016x}", (uint64)qpc_freq.QuadPart);
|
||||||
//forceLog_printf("Multiplier: 0x%016llx", freqMultiplier);
|
//cemuLog_log(LogType::Force, "Multiplier: 0x{:016x}", freqMultiplier);
|
||||||
|
|
||||||
return tsc_freq;
|
return tsc_freq;
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,7 +82,7 @@ void PPCRecompiler_enter(PPCInterpreter_t* hCPU, PPCREC_JUMP_ENTRY funcPtr)
|
||||||
{
|
{
|
||||||
auto t = std::chrono::high_resolution_clock::now();
|
auto t = std::chrono::high_resolution_clock::now();
|
||||||
auto dur = std::chrono::duration_cast<std::chrono::microseconds>(t.time_since_epoch()).count();
|
auto dur = std::chrono::duration_cast<std::chrono::microseconds>(t.time_since_epoch()).count();
|
||||||
forceLog_printf("Recompiler exit: 0x%08x LR: 0x%08x Timestamp %lld.%04lld", hCPU->instructionPointer, hCPU->spr.LR, dur / 1000LL, (dur % 1000LL));
|
cemuLog_log(LogType::Force, "Recompiler exit: 0x{:08x} LR: 0x{:08x} Timestamp {}.{:04}", hCPU->instructionPointer, hCPU->spr.LR, dur / 1000LL, (dur % 1000LL));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
|
@ -341,7 +341,7 @@ void PPCRecompiler_reserveLookupTableBlock(uint32 offset)
|
||||||
void* p3 = MemMapper::AllocateMemory(&(ppcRecompilerInstanceData->ppcRecompilerDirectJumpTable[offset/4]), (PPC_REC_ALLOC_BLOCK_SIZE/4)*sizeof(void*), MemMapper::PAGE_PERMISSION::P_RW, true);
|
void* p3 = MemMapper::AllocateMemory(&(ppcRecompilerInstanceData->ppcRecompilerDirectJumpTable[offset/4]), (PPC_REC_ALLOC_BLOCK_SIZE/4)*sizeof(void*), MemMapper::PAGE_PERMISSION::P_RW, true);
|
||||||
if( !p1 || !p3 )
|
if( !p1 || !p3 )
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to allocate memory for recompiler (0x%08x)", offset);
|
cemuLog_log(LogType::Force, "Failed to allocate memory for recompiler (0x{:08x})", offset);
|
||||||
cemu_assert(false);
|
cemu_assert(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -584,7 +584,7 @@ void PPCRecompiler_init()
|
||||||
|
|
||||||
PPCRecompiler_initPlatform();
|
PPCRecompiler_initPlatform();
|
||||||
|
|
||||||
forceLog_printf("Recompiler initialized");
|
cemuLog_log(LogType::Force, "Recompiler initialized");
|
||||||
|
|
||||||
ppcRecompilerEnabled = true;
|
ppcRecompilerEnabled = true;
|
||||||
|
|
||||||
|
|
|
@ -643,7 +643,7 @@ bool PPCRecompilerImlGen_B(ppcImlGenContext_t* ppcImlGenContext, uint32 opcode)
|
||||||
{
|
{
|
||||||
// generate NOP iml instead of BL macro (this assures that segment PPC range remains intact)
|
// generate NOP iml instead of BL macro (this assures that segment PPC range remains intact)
|
||||||
PPCRecompilerImlGen_generateNewInstruction_noOp(ppcImlGenContext, NULL);
|
PPCRecompilerImlGen_generateNewInstruction_noOp(ppcImlGenContext, NULL);
|
||||||
//forceLog_printf("Inline func 0x%08x at %08x", jumpAddressDest, ppcImlGenContext->ppcAddressOfCurrentInstruction);
|
//cemuLog_log(LogType::Force, "Inline func 0x{:08x} at {:08x}", jumpAddressDest, ppcImlGenContext->ppcAddressOfCurrentInstruction);
|
||||||
uint32* prevInstructionPtr = ppcImlGenContext->currentInstruction;
|
uint32* prevInstructionPtr = ppcImlGenContext->currentInstruction;
|
||||||
ppcImlGenContext->currentInstruction = (uint32*)memory_getPointerFromVirtualOffset(jumpAddressDest);
|
ppcImlGenContext->currentInstruction = (uint32*)memory_getPointerFromVirtualOffset(jumpAddressDest);
|
||||||
PPCRecompiler_generateInlinedCode(ppcImlGenContext, jumpAddressDest, inlineFuncInstructionCount);
|
PPCRecompiler_generateInlinedCode(ppcImlGenContext, jumpAddressDest, inlineFuncInstructionCount);
|
||||||
|
|
|
@ -871,11 +871,11 @@ public:
|
||||||
// retry allocation
|
// retry allocation
|
||||||
if (!newRange->allocateCacheMemory())
|
if (!newRange->allocateCacheMemory())
|
||||||
{
|
{
|
||||||
forceLog_printf("Out-of-memory in GPU buffer (trying to allocate: %dKB) Cleaning up cache...", (rangeEnd - rangeBegin + 1023) / 1024);
|
cemuLog_log(LogType::Force, "Out-of-memory in GPU buffer (trying to allocate: {}KB) Cleaning up cache...", (rangeEnd - rangeBegin + 1023) / 1024);
|
||||||
CleanupCacheAggressive(rangeBegin, rangeEnd);
|
CleanupCacheAggressive(rangeBegin, rangeEnd);
|
||||||
if (!newRange->allocateCacheMemory())
|
if (!newRange->allocateCacheMemory())
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to free enough memory in GPU buffer");
|
cemuLog_log(LogType::Force, "Failed to free enough memory in GPU buffer");
|
||||||
cemu_assert(false);
|
cemu_assert(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -907,7 +907,7 @@ public:
|
||||||
// todo - add support for splitting BufferCacheNode memory allocations, then we dont need to do a separate allocation
|
// todo - add support for splitting BufferCacheNode memory allocations, then we dont need to do a separate allocation
|
||||||
if (!newRange->allocateCacheMemory())
|
if (!newRange->allocateCacheMemory())
|
||||||
{
|
{
|
||||||
forceLog_printf("Out-of-memory in GPU buffer during split operation");
|
cemuLog_log(LogType::Force, "Out-of-memory in GPU buffer during split operation");
|
||||||
cemu_assert(false);
|
cemu_assert(false);
|
||||||
}
|
}
|
||||||
newRange->syncFromNode(nodeObject);
|
newRange->syncFromNode(nodeObject);
|
||||||
|
|
|
@ -222,7 +222,7 @@ LatteParsedGSCopyShader* LatteGSCopyShaderParser_parse(uint8* programData, uint3
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("Copyshader: Unknown 23_7 clause 0x%x found\n", cf_inst23_7);
|
cemuLog_log(LogType::Force, "Copyshader: Unknown 23_7 clause 0x{:x} found", cf_inst23_7);
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
}
|
}
|
||||||
if( isEndOfProgram )
|
if( isEndOfProgram )
|
||||||
|
|
|
@ -507,7 +507,7 @@ bool LatteMRT::UpdateCurrentFBO()
|
||||||
else if (rtEffectiveSize->width != effectiveWidth && rtEffectiveSize->height != effectiveHeight)
|
else if (rtEffectiveSize->width != effectiveWidth && rtEffectiveSize->height != effectiveHeight)
|
||||||
{
|
{
|
||||||
#ifdef CEMU_DEBUG_ASSERT
|
#ifdef CEMU_DEBUG_ASSERT
|
||||||
forceLog_printf("Color buffer size mismatch (%dx%d). Effective size: %dx%d Real size: %dx%d Mismatching texture: %08x %dx%d fmt %04x", rtEffectiveSize->width, rtEffectiveSize->height, effectiveWidth, effectiveHeight, colorAttachmentView->baseTexture->width, colorAttachmentView->baseTexture->height, colorAttachmentView->baseTexture->physAddress, colorAttachmentView->baseTexture->width, colorAttachmentView->baseTexture->height, (uint32)colorAttachmentView->baseTexture->format);
|
cemuLog_log(LogType::Force, "Color buffer size mismatch ({}x{}). Effective size: {}x{} Real size: {}x{} Mismatching texture: {:08x} {}x{} fmt {:04x}", rtEffectiveSize->width, rtEffectiveSize->height, effectiveWidth, effectiveHeight, colorAttachmentView->baseTexture->width, colorAttachmentView->baseTexture->height, colorAttachmentView->baseTexture->physAddress, colorAttachmentView->baseTexture->width, colorAttachmentView->baseTexture->height, (uint32)colorAttachmentView->baseTexture->format);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
// currently the first color attachment defines the size of the current render target
|
// currently the first color attachment defines the size of the current render target
|
||||||
|
|
|
@ -301,7 +301,7 @@ void LatteShader_CreateRendererShader(LatteDecompilerShader* shader, bool compil
|
||||||
{
|
{
|
||||||
if (shader->hasError )
|
if (shader->hasError )
|
||||||
{
|
{
|
||||||
forceLog_printf("Unable to compile shader %" PRIx64, shader->baseHash);
|
cemuLog_log(LogType::Force, "Unable to compile shader {:016x}", shader->baseHash);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -319,7 +319,7 @@ void LatteShaderCache_load()
|
||||||
if (LatteShaderCache_readSeparableShader(fileData.data(), fileData.size()) == false)
|
if (LatteShaderCache_readSeparableShader(fileData.data(), fileData.size()) == false)
|
||||||
{
|
{
|
||||||
// something is wrong with the stored shader, remove entry from shader cache files
|
// something is wrong with the stored shader, remove entry from shader cache files
|
||||||
forceLog_printf("Shader cache entry %d invalid, deleting...", loadIndex);
|
cemuLog_log(LogType::Force, "Shader cache entry {} invalid, deleting...", loadIndex);
|
||||||
fc_shaderCacheGeneric->DeleteFile({ name1, name2 });
|
fc_shaderCacheGeneric->DeleteFile({ name1, name2 });
|
||||||
}
|
}
|
||||||
numLoadedShaders++;
|
numLoadedShaders++;
|
||||||
|
@ -338,7 +338,7 @@ void LatteShaderCache_load()
|
||||||
GetProcessMemoryInfo(GetCurrentProcess(), &pmc2, sizeof(PROCESS_MEMORY_COUNTERS));
|
GetProcessMemoryInfo(GetCurrentProcess(), &pmc2, sizeof(PROCESS_MEMORY_COUNTERS));
|
||||||
LONGLONG totalMem2 = pmc2.PagefileUsage;
|
LONGLONG totalMem2 = pmc2.PagefileUsage;
|
||||||
LONGLONG memCommited = totalMem2 - totalMem1;
|
LONGLONG memCommited = totalMem2 - totalMem1;
|
||||||
forceLog_printf("Shader cache loaded with %d shaders. Commited mem %dMB. Took %dms", numLoadedShaders, (sint32)(memCommited/1024/1024), timeLoad);
|
cemuLog_log(LogType::Force, "Shader cache loaded with {} shaders. Commited mem {}MB. Took {}ms", numLoadedShaders, (sint32)(memCommited/1024/1024), timeLoad);
|
||||||
#endif
|
#endif
|
||||||
LatteShaderCache_finish();
|
LatteShaderCache_finish();
|
||||||
// if Vulkan then also load pipeline cache
|
// if Vulkan then also load pipeline cache
|
||||||
|
|
|
@ -19,7 +19,7 @@ bool gxShader_checkIfSuccessfullyLinked(GLuint glProgram)
|
||||||
tempLength = sizeof(infoLog)-1;
|
tempLength = sizeof(infoLog)-1;
|
||||||
glGetProgramInfoLog(glProgram, std::min(tempLength, infoLogLength), (GLsizei*)&tempLength, (GLcharARB*)infoLog);
|
glGetProgramInfoLog(glProgram, std::min(tempLength, infoLogLength), (GLsizei*)&tempLength, (GLcharARB*)infoLog);
|
||||||
infoLog[tempLength] = '\0';
|
infoLog[tempLength] = '\0';
|
||||||
forceLog_printf("Link error in raw shader");
|
cemuLog_log(LogType::Force, "Link error in raw shader");
|
||||||
cemuLog_log(LogType::Force, infoLog);
|
cemuLog_log(LogType::Force, infoLog);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -83,8 +83,8 @@ GLuint gpu7ShaderGLDepr_compileShader(const std::string& source, uint32_t type)
|
||||||
char log[2048]{};
|
char log[2048]{};
|
||||||
GLsizei log_size;
|
GLsizei log_size;
|
||||||
glGetShaderInfoLog(shader_object, std::min(log_length, (GLint)sizeof(log) - 1), &log_size, log);
|
glGetShaderInfoLog(shader_object, std::min(log_length, (GLint)sizeof(log) - 1), &log_size, log);
|
||||||
forceLog_printf("Error/Warning in vertex shader:");
|
cemuLog_log(LogType::Force, "Error/Warning in vertex shader:");
|
||||||
forceLog_printf("%s", log);
|
cemuLog_log(LogType::Force, log);
|
||||||
}
|
}
|
||||||
|
|
||||||
return shader_object;
|
return shader_object;
|
||||||
|
@ -112,8 +112,8 @@ GLuint gpu7ShaderGLDepr_compileVertexShader(const char* shaderSource, sint32 sha
|
||||||
{
|
{
|
||||||
char messageLog[2048]{};
|
char messageLog[2048]{};
|
||||||
glGetShaderInfoLog(shaderObject, std::min<uint32>(shaderLogLengthInfo, sizeof(messageLog) - 1), (GLsizei*)&shaderLogLen, (GLcharARB*)messageLog);
|
glGetShaderInfoLog(shaderObject, std::min<uint32>(shaderLogLengthInfo, sizeof(messageLog) - 1), (GLsizei*)&shaderLogLen, (GLcharARB*)messageLog);
|
||||||
forceLog_printf("Error/Warning in vertex shader:");
|
cemuLog_log(LogType::Force, "Error/Warning in vertex shader:");
|
||||||
forceLog_printf("%s", messageLog);
|
cemuLog_log(LogType::Force, messageLog);
|
||||||
}
|
}
|
||||||
return shaderObject;
|
return shaderObject;
|
||||||
}
|
}
|
||||||
|
@ -132,8 +132,8 @@ GLuint gpu7ShaderGLDepr_compileFragmentShader(const char* shaderSource, sint32 s
|
||||||
{
|
{
|
||||||
memset(messageLog, 0, sizeof(messageLog));
|
memset(messageLog, 0, sizeof(messageLog));
|
||||||
glGetShaderInfoLog(shaderObject, std::min<uint32>(shaderLogLengthInfo, sizeof(messageLog) - 1), (GLsizei*)&shaderLogLen, (GLcharARB*)messageLog);
|
glGetShaderInfoLog(shaderObject, std::min<uint32>(shaderLogLengthInfo, sizeof(messageLog) - 1), (GLsizei*)&shaderLogLen, (GLcharARB*)messageLog);
|
||||||
forceLog_printf("Error/Warning in fragment shader:");
|
cemuLog_log(LogType::Force, "Error/Warning in fragment shader:");
|
||||||
forceLog_printf("%s", messageLog);
|
cemuLog_log(LogType::Force, messageLog);
|
||||||
}
|
}
|
||||||
return shaderObject;
|
return shaderObject;
|
||||||
}
|
}
|
||||||
|
|
|
@ -376,13 +376,13 @@ void LatteTexture_CopySlice(LatteTexture* srcTexture, sint32 srcSlice, sint32 sr
|
||||||
sint32 effectiveHeight_dst = dstTexture->overwriteInfo.hasResolutionOverwrite ? dstTexture->overwriteInfo.height : dstTexture->height;
|
sint32 effectiveHeight_dst = dstTexture->overwriteInfo.hasResolutionOverwrite ? dstTexture->overwriteInfo.height : dstTexture->height;
|
||||||
if (cafeLog_isLoggingFlagEnabled(LOG_TYPE_TEXTURE_CACHE))
|
if (cafeLog_isLoggingFlagEnabled(LOG_TYPE_TEXTURE_CACHE))
|
||||||
{
|
{
|
||||||
forceLog_printf("_copySlice(): Unable to sync textures with mismatching scale ratio (due to texture rule)");
|
cemuLog_log(LogType::Force, "_copySlice(): Unable to sync textures with mismatching scale ratio (due to texture rule)");
|
||||||
float ratioWidth_src = (float)effectiveWidth_src / (float)srcTexture->width;
|
float ratioWidth_src = (float)effectiveWidth_src / (float)srcTexture->width;
|
||||||
float ratioHeight_src = (float)effectiveHeight_src / (float)srcTexture->height;
|
float ratioHeight_src = (float)effectiveHeight_src / (float)srcTexture->height;
|
||||||
float ratioWidth_dst = (float)effectiveWidth_dst / (float)dstTexture->width;
|
float ratioWidth_dst = (float)effectiveWidth_dst / (float)dstTexture->width;
|
||||||
float ratioHeight_dst = (float)effectiveHeight_dst / (float)dstTexture->height;
|
float ratioHeight_dst = (float)effectiveHeight_dst / (float)dstTexture->height;
|
||||||
forceLog_printf("Source: %08x origResolution %4d/%4d effectiveResolution %4d/%4d fmt %04x mipIndex %d ratioW/H: %.4f/%.4f", srcTexture->physAddress, srcTexture->width, srcTexture->height, effectiveWidth_src, effectiveHeight_src, (uint32)srcTexture->format, srcMip, ratioWidth_src, ratioHeight_src);
|
cemuLog_log(LogType::Force, "Source: {:08x} origResolution {:4}/{:4} effectiveResolution {:4}/{:4} fmt {:04x} mipIndex {} ratioW/H: {:.4}/{:.4}", srcTexture->physAddress, srcTexture->width, srcTexture->height, effectiveWidth_src, effectiveHeight_src, (uint32)srcTexture->format, srcMip, ratioWidth_src, ratioHeight_src);
|
||||||
forceLog_printf("Destination: %08x origResolution %4d/%4d effectiveResolution %4d/%4d fmt %04x mipIndex %d ratioW/H: %.4f/%.4f", dstTexture->physAddress, dstTexture->width, dstTexture->height, effectiveWidth_dst, effectiveHeight_dst, (uint32)dstTexture->format, dstMip, ratioWidth_dst, ratioHeight_dst);
|
cemuLog_log(LogType::Force, "Destination: {:08x} origResolution {:4}/{:4} effectiveResolution {:4}/{:4} fmt {:04x} mipIndex {} ratioW/H: {:.4}/{:.4}", dstTexture->physAddress, dstTexture->width, dstTexture->height, effectiveWidth_dst, effectiveHeight_dst, (uint32)dstTexture->format, dstMip, ratioWidth_dst, ratioHeight_dst);
|
||||||
}
|
}
|
||||||
//forceLogDebug_printf("If these textures are not meant to share data you can ignore this");
|
//forceLogDebug_printf("If these textures are not meant to share data you can ignore this");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -661,7 +661,7 @@ void LatteTextureLoader_UpdateTextureSliceData(LatteTexture* tex, sint32 texture
|
||||||
uint64 benchmarkResultMicroSeconds = (benchmark_end.QuadPart - benchmark_begin.QuadPart) * 1000000ULL / benchmark_freq.QuadPart;
|
uint64 benchmarkResultMicroSeconds = (benchmark_end.QuadPart - benchmark_begin.QuadPart) * 1000000ULL / benchmark_freq.QuadPart;
|
||||||
textureDecodeBenchmark_perFormatSum[(int)tex->format & 0x3F] += benchmarkResultMicroSeconds;
|
textureDecodeBenchmark_perFormatSum[(int)tex->format & 0x3F] += benchmarkResultMicroSeconds;
|
||||||
textureDecodeBenchmark_totalSum += benchmarkResultMicroSeconds;
|
textureDecodeBenchmark_totalSum += benchmarkResultMicroSeconds;
|
||||||
forceLog_printf("TexDecode %04dx%04dx%04d Fmt %04x Dim %d TileMode %02x Took %03d.%03dms Sum(format) %06dms Sum(total) %06dms", textureLoader.width, textureLoader.height, textureLoader.surfaceInfoDepth, (int)tex->format, (int)tex->dim, textureLoader.tileMode, (uint32)(benchmarkResultMicroSeconds / 1000ULL), (uint32)(benchmarkResultMicroSeconds % 1000ULL), (uint32)(textureDecodeBenchmark_perFormatSum[tex->gx2Format & 0x3F] / 1000ULL), (uint32)(textureDecodeBenchmark_totalSum / 1000ULL));
|
cemuLog_log(LogType::Force, "TexDecode {:04}x{:04}x{:04} Fmt {:04x} Dim {} TileMode {:02x} Took {:03}.{:03}ms Sum(format) {:06}ms Sum(total) {:06}ms", textureLoader.width, textureLoader.height, textureLoader.surfaceInfoDepth, (int)tex->format, (int)tex->dim, textureLoader.tileMode, (uint32)(benchmarkResultMicroSeconds / 1000ULL), (uint32)(benchmarkResultMicroSeconds % 1000ULL), (uint32)(textureDecodeBenchmark_perFormatSum[tex->gx2Format & 0x3F] / 1000ULL), (uint32)(textureDecodeBenchmark_totalSum / 1000ULL));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// convert texture to RGBA when dumping is enabled
|
// convert texture to RGBA when dumping is enabled
|
||||||
|
@ -738,11 +738,11 @@ void LatteTextureLoader_writeReadbackTextureToMemory(LatteTextureDefinition* tex
|
||||||
|
|
||||||
#ifdef CEMU_DEBUG_ASSERT
|
#ifdef CEMU_DEBUG_ASSERT
|
||||||
if (textureData->depth != 1)
|
if (textureData->depth != 1)
|
||||||
forceLog_printf("_writeReadbackTextureToMemory(): Texture has multiple slices (not supported)");
|
cemuLog_log(LogType::Force, "_writeReadbackTextureToMemory(): Texture has multiple slices (not supported)");
|
||||||
#endif
|
#endif
|
||||||
if (textureLoader.physAddress == MPTR_NULL)
|
if (textureLoader.physAddress == MPTR_NULL)
|
||||||
{
|
{
|
||||||
forceLog_printf("_writeReadbackTextureToMemory(): Texture has invalid address");
|
cemuLog_log(LogType::Force, "_writeReadbackTextureToMemory(): Texture has invalid address");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ void LatteTextureReadback_Initate(LatteTextureView* textureView)
|
||||||
// currently we don't support readback for resized textures
|
// currently we don't support readback for resized textures
|
||||||
if (textureView->baseTexture->overwriteInfo.hasResolutionOverwrite)
|
if (textureView->baseTexture->overwriteInfo.hasResolutionOverwrite)
|
||||||
{
|
{
|
||||||
forceLog_printf("_initate(): Readback is not supported for textures with modified resolution");
|
cemuLog_log(LogType::Force, "_initate(): Readback is not supported for textures with modified resolution");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// check if texture isn't already queued for transfer
|
// check if texture isn't already queued for transfer
|
||||||
|
@ -128,7 +128,7 @@ void LatteTextureReadback_UpdateFinishedTransfers(bool forceFinish)
|
||||||
HRTick currentTick = HighResolutionTimer().now().getTick();
|
HRTick currentTick = HighResolutionTimer().now().getTick();
|
||||||
double elapsedSecondsTransfer = HighResolutionTimer::getTimeDiff(readbackInfo->transferStartTime, currentTick);
|
double elapsedSecondsTransfer = HighResolutionTimer::getTimeDiff(readbackInfo->transferStartTime, currentTick);
|
||||||
double elapsedSecondsWaiting = HighResolutionTimer::getTimeDiff(readbackInfo->waitStartTime, currentTick);
|
double elapsedSecondsWaiting = HighResolutionTimer::getTimeDiff(readbackInfo->waitStartTime, currentTick);
|
||||||
forceLog_printf("[Texture-Readback] %08x Res %4d/%4d TM %d FMT %04x ReadbackLatency: %6.3lfms WaitTime: %6.3lfms ForcedWait %s", readbackInfo->hostTextureCopy.physAddress, readbackInfo->hostTextureCopy.width, readbackInfo->hostTextureCopy.height, readbackInfo->hostTextureCopy.tileMode, (uint32)readbackInfo->hostTextureCopy.format, elapsedSecondsTransfer * 1000.0, elapsedSecondsWaiting * 1000.0, forceFinish?"yes":"no");
|
cemuLog_log(LogType::Force, "[Texture-Readback] {:08x} Res {:4}/{:4} TM {} FMT {:04x} ReadbackLatency: {:6.3}ms WaitTime: {:6.3}ms ForcedWait {}", readbackInfo->hostTextureCopy.physAddress, readbackInfo->hostTextureCopy.width, readbackInfo->hostTextureCopy.height, readbackInfo->hostTextureCopy.tileMode, (uint32)readbackInfo->hostTextureCopy.format, elapsedSecondsTransfer * 1000.0, elapsedSecondsWaiting * 1000.0, forceFinish?"yes":"no");
|
||||||
#endif
|
#endif
|
||||||
uint8* pixelData = readbackInfo->GetData();
|
uint8* pixelData = readbackInfo->GetData();
|
||||||
LatteTextureLoader_writeReadbackTextureToMemory(&readbackInfo->hostTextureCopy, 0, 0, pixelData);
|
LatteTextureLoader_writeReadbackTextureToMemory(&readbackInfo->hostTextureCopy, 0, 0, pixelData);
|
||||||
|
|
|
@ -125,7 +125,7 @@ void LatteTextureGL::GetOpenGLFormatInfo(bool isDepth, Latte::E_GX2SURFFMT forma
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// unsupported depth format
|
// unsupported depth format
|
||||||
forceLog_printf("OpenGL: Unsupported texture depth format 0x%04x", (uint32)format);
|
cemuLog_log(LogType::Force, "OpenGL: Unsupported texture depth format 0x{:04x}", (uint32)format);
|
||||||
// use placeholder format
|
// use placeholder format
|
||||||
formatInfoOut->setDepthFormat(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, false);
|
formatInfoOut->setDepthFormat(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, false);
|
||||||
formatInfoOut->markAsAlternativeFormat();
|
formatInfoOut->markAsAlternativeFormat();
|
||||||
|
@ -499,7 +499,7 @@ void LatteTextureGL::GetOpenGLFormatInfo(bool isDepth, Latte::E_GX2SURFFMT forma
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("OpenGL: Unsupported texture format 0x%04x", (uint32)format);
|
cemuLog_log(LogType::Force, "OpenGL: Unsupported texture format 0x{:04x}", (uint32)format);
|
||||||
cemu_assert_unimplemented();
|
cemu_assert_unimplemented();
|
||||||
}
|
}
|
||||||
formatInfoOut->glInternalFormat = glInternalFormat;
|
formatInfoOut->glInternalFormat = glInternalFormat;
|
||||||
|
|
|
@ -89,7 +89,7 @@ OpenGLRenderer::OpenGLRenderer()
|
||||||
void* buffer = glMapNamedBufferRange(glRendererState.uploadBuffer, 0, TEXBUFFER_SIZE, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
|
void* buffer = glMapNamedBufferRange(glRendererState.uploadBuffer, 0, TEXBUFFER_SIZE, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
|
||||||
if (buffer == nullptr)
|
if (buffer == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to allocate GL texture upload buffer. Using traditional API instead");
|
cemuLog_log(LogType::Force, "Failed to allocate GL texture upload buffer. Using traditional API instead");
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
}
|
}
|
||||||
glRendererState.uploadBufferPtr = buffer;
|
glRendererState.uploadBufferPtr = buffer;
|
||||||
|
@ -104,7 +104,7 @@ OpenGLRenderer::OpenGLRenderer()
|
||||||
}
|
}
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("Unable to create dxgi wrapper: %s (VRAM overlay stat won't be available)", ex.what());
|
cemuLog_log(LogType::Force, "Unable to create dxgi wrapper: {} (VRAM overlay stat won't be available)", ex.what());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -254,7 +254,7 @@ void OpenGLRenderer::Initialize()
|
||||||
{
|
{
|
||||||
Renderer::Initialize();
|
Renderer::Initialize();
|
||||||
auto lock = cafeLog_acquire();
|
auto lock = cafeLog_acquire();
|
||||||
forceLog_printf("------- Init OpenGL graphics backend -------");
|
cemuLog_log(LogType::Force, "------- Init OpenGL graphics backend -------");
|
||||||
|
|
||||||
GLCanvas_MakeCurrent(false);
|
GLCanvas_MakeCurrent(false);
|
||||||
LoadOpenGLImports();
|
LoadOpenGLImports();
|
||||||
|
@ -268,12 +268,12 @@ void OpenGLRenderer::Initialize()
|
||||||
if (glMaxShaderCompilerThreadsARB)
|
if (glMaxShaderCompilerThreadsARB)
|
||||||
glMaxShaderCompilerThreadsARB(0xFFFFFFFF);
|
glMaxShaderCompilerThreadsARB(0xFFFFFFFF);
|
||||||
|
|
||||||
forceLog_printf("OpenGL extensions:");
|
cemuLog_log(LogType::Force, "OpenGL extensions:");
|
||||||
forceLog_printf("ARB_clip_control: %s", glClipControl ? "available" : "not supported");
|
cemuLog_log(LogType::Force, "ARB_clip_control: {}", glClipControl ? "available" : "not supported");
|
||||||
forceLog_printf("ARB_get_program_binary: %s", (glGetProgramBinary != NULL && glProgramBinary != NULL) ? "available" : "not supported");
|
cemuLog_log(LogType::Force, "ARB_get_program_binary: {}", (glGetProgramBinary != NULL && glProgramBinary != NULL) ? "available" : "not supported");
|
||||||
forceLog_printf("ARB_clear_texture: %s", (glClearTexImage != NULL) ? "available" : "not supported");
|
cemuLog_log(LogType::Force, "ARB_clear_texture: {}", (glClearTexImage != NULL) ? "available" : "not supported");
|
||||||
forceLog_printf("ARB_copy_image: %s", (glCopyImageSubData != NULL) ? "available" : "not supported");
|
cemuLog_log(LogType::Force, "ARB_copy_image: {}", (glCopyImageSubData != NULL) ? "available" : "not supported");
|
||||||
forceLog_printf("NV_depth_buffer_float: %s", (glDepthRangedNV != NULL) ? "available" : "not supported");
|
cemuLog_log(LogType::Force, "NV_depth_buffer_float: {}", (glDepthRangedNV != NULL) ? "available" : "not supported");
|
||||||
|
|
||||||
// generate default frame buffer
|
// generate default frame buffer
|
||||||
glGenFramebuffers(1, &m_defaultFramebufferId);
|
glGenFramebuffers(1, &m_defaultFramebufferId);
|
||||||
|
@ -376,9 +376,9 @@ void OpenGLRenderer::GetVendorInformation()
|
||||||
char* glRendererString = (char*)glGetString(GL_RENDERER);
|
char* glRendererString = (char*)glGetString(GL_RENDERER);
|
||||||
char* glVersionString = (char*)glGetString(GL_VERSION);
|
char* glVersionString = (char*)glGetString(GL_VERSION);
|
||||||
|
|
||||||
forceLog_printf("GL_VENDOR: %s", glVendorString ? glVendorString : "unknown");
|
cemuLog_log(LogType::Force, "GL_VENDOR: {}", glVendorString ? glVendorString : "unknown");
|
||||||
forceLog_printf("GL_RENDERER: %s", glRendererString ? glRendererString : "unknown");
|
cemuLog_log(LogType::Force, "GL_RENDERER: {}", glRendererString ? glRendererString : "unknown");
|
||||||
forceLog_printf("GL_VERSION: %s", glVersionString ? glVersionString : "unknown");
|
cemuLog_log(LogType::Force, "GL_VERSION: {}", glVersionString ? glVersionString : "unknown");
|
||||||
|
|
||||||
if(boost::icontains(glVersionString, "Mesa"))
|
if(boost::icontains(glVersionString, "Mesa"))
|
||||||
{
|
{
|
||||||
|
@ -424,7 +424,7 @@ void _glDebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GL
|
||||||
if (LatteGPUState.glVendor == GLVENDOR_NVIDIA && strstr(message, "does not have a defined base level"))
|
if (LatteGPUState.glVendor == GLVENDOR_NVIDIA && strstr(message, "does not have a defined base level"))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
forceLog_printf("GLDEBUG: %s", message);
|
cemuLog_log(LogType::Force, "GLDEBUG: {}", message);
|
||||||
|
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -494,7 +494,7 @@ void LatteDrawGL_prepareIndicesWithGPUCache(MPTR indexDataMPTR, _INDEX_TYPE inde
|
||||||
break;
|
break;
|
||||||
if (indexDataCacheFirst == nullptr)
|
if (indexDataCacheFirst == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("Unable to allocate entry in index cache");
|
cemuLog_log(LogType::Force, "Unable to allocate entry in index cache");
|
||||||
assert_dbg();
|
assert_dbg();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1601,4 +1601,4 @@ void OpenGLRenderer::renderstate_updateTextureSettingsGL(LatteDecompilerShader*
|
||||||
}
|
}
|
||||||
catchOpenGLError();
|
catchOpenGLError();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ void OpenGLRenderer::bufferCache_copyStreamoutToMainBuffer(uint32 srcOffset, uin
|
||||||
if (glCopyNamedBufferSubData)
|
if (glCopyNamedBufferSubData)
|
||||||
glCopyNamedBufferSubData(glStreamoutCacheRingBuffer, glAttributeCacheAB, srcOffset, dstOffset, size);
|
glCopyNamedBufferSubData(glStreamoutCacheRingBuffer, glAttributeCacheAB, srcOffset, dstOffset, size);
|
||||||
else
|
else
|
||||||
forceLog_printf("glCopyNamedBufferSubData() not supported");
|
cemuLog_log(LogType::Force, "glCopyNamedBufferSubData() not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenGLRenderer::streamout_rendererFinishDrawcall()
|
void OpenGLRenderer::streamout_rendererFinishDrawcall()
|
||||||
|
@ -55,4 +55,4 @@ void OpenGLRenderer::streamout_rendererFinishDrawcall()
|
||||||
m_isXfbActive = false;
|
m_isXfbActive = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,8 +119,8 @@ RendererShaderGL::RendererShaderGL(ShaderType type, uint64 baseHash, uint64 auxH
|
||||||
char log[2048]{};
|
char log[2048]{};
|
||||||
GLsizei log_size;
|
GLsizei log_size;
|
||||||
glGetShaderInfoLog(m_shader_object, std::min<uint32>(log_length, sizeof(log) - 1), &log_size, log);
|
glGetShaderInfoLog(m_shader_object, std::min<uint32>(log_length, sizeof(log) - 1), &log_size, log);
|
||||||
forceLog_printf("Error/Warning in shader:");
|
cemuLog_log(LogType::Force, "Error/Warning in shader:");
|
||||||
forceLog_printf("%s", log);
|
cemuLog_log(LogType::Force, log);
|
||||||
}
|
}
|
||||||
|
|
||||||
// set debug name
|
// set debug name
|
||||||
|
@ -192,7 +192,7 @@ bool RendererShaderGL::WaitForCompiled()
|
||||||
tempLength = sizeof(infoLog) - 1;
|
tempLength = sizeof(infoLog) - 1;
|
||||||
glGetShaderInfoLog(m_shader_object, std::min(infoLogLength, tempLength), (GLsizei*)&tempLength, (GLcharARB*)infoLog);
|
glGetShaderInfoLog(m_shader_object, std::min(infoLogLength, tempLength), (GLsizei*)&tempLength, (GLcharARB*)infoLog);
|
||||||
infoLog[tempLength] = '\0';
|
infoLog[tempLength] = '\0';
|
||||||
forceLog_printf("Compile error in shader. Log:", infoLog);
|
cemuLog_log(LogType::Force, "Compile error in shader. Log:");
|
||||||
cemuLog_log(LogType::Force, infoLog);
|
cemuLog_log(LogType::Force, infoLog);
|
||||||
}
|
}
|
||||||
if (m_shader_object != 0)
|
if (m_shader_object != 0)
|
||||||
|
@ -212,7 +212,7 @@ bool RendererShaderGL::WaitForCompiled()
|
||||||
tempLength = sizeof(infoLog) - 1;
|
tempLength = sizeof(infoLog) - 1;
|
||||||
glGetProgramInfoLog(m_program, std::min(infoLogLength, tempLength), (GLsizei*)&tempLength, (GLcharARB*)infoLog);
|
glGetProgramInfoLog(m_program, std::min(infoLogLength, tempLength), (GLsizei*)&tempLength, (GLcharARB*)infoLog);
|
||||||
infoLog[tempLength] = '\0';
|
infoLog[tempLength] = '\0';
|
||||||
forceLog_printf("Link error in shader. Log:", infoLog);
|
cemuLog_log(LogType::Force, "Link error in shader. Log:");
|
||||||
cemuLog_log(LogType::Force, infoLog);
|
cemuLog_log(LogType::Force, infoLog);
|
||||||
}
|
}
|
||||||
m_isCompiled = true;
|
m_isCompiled = true;
|
||||||
|
@ -273,7 +273,7 @@ void RendererShaderGL::ShaderCacheLoading_begin(uint64 cacheTitleId)
|
||||||
UNREACHABLE;
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
forceLog_printf("Using precompiled shaders: %s", usePrecompiled ? "true" : "false");
|
cemuLog_log(LogType::Force, "Using precompiled shaders: {}", usePrecompiled ? "true" : "false");
|
||||||
|
|
||||||
if (usePrecompiled)
|
if (usePrecompiled)
|
||||||
{
|
{
|
||||||
|
@ -292,4 +292,4 @@ void RendererShaderGL::ShaderCacheLoading_end()
|
||||||
s_isLoadingShaders = false;
|
s_isLoadingShaders = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
FileCache* RendererShaderGL::g_programBinaryCache{};
|
FileCache* RendererShaderGL::g_programBinaryCache{};
|
||||||
|
|
|
@ -52,7 +52,7 @@ VkSurfaceKHR CreateCocoaSurface(VkInstance instance, void* handle)
|
||||||
VkResult err;
|
VkResult err;
|
||||||
if ((err = vkCreateMetalSurfaceEXT(instance, &surface, nullptr, &result)) != VK_SUCCESS)
|
if ((err = vkCreateMetalSurfaceEXT(instance, &surface, nullptr, &result)) != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Cannot create a Metal Vulkan surface: %d", (sint32)err);
|
cemuLog_log(LogType::Force, "Cannot create a Metal Vulkan surface: {}", (sint32)err);
|
||||||
throw std::runtime_error(fmt::format("Cannot create a Metal Vulkan surface: {}", err));
|
throw std::runtime_error(fmt::format("Cannot create a Metal Vulkan surface: {}", err));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -210,7 +210,7 @@ VkSampler LatteTextureViewVk::GetDefaultTextureSampler(bool useLinearTexFilter)
|
||||||
|
|
||||||
if (vkCreateSampler(m_device, &samplerInfo, nullptr, &sampler) != VK_SUCCESS)
|
if (vkCreateSampler(m_device, &samplerInfo, nullptr, &sampler) != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to create default sampler");
|
cemuLog_log(LogType::Force, "Failed to create default sampler");
|
||||||
throw std::runtime_error("failed to create texture sampler!");
|
throw std::runtime_error("failed to create texture sampler!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,4 +236,4 @@ VkImageViewType LatteTextureViewVk::GetImageViewTypeFromGX2Dim(Latte::E_DIM dim)
|
||||||
cemu_assert_unimplemented();
|
cemu_assert_unimplemented();
|
||||||
}
|
}
|
||||||
return VK_IMAGE_VIEW_TYPE_2D;
|
return VK_IMAGE_VIEW_TYPE_2D;
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,7 +239,7 @@ void RendererShaderVk::CreateVkShaderModule(std::span<uint32> spirvBuffer)
|
||||||
VkResult result = vkCreateShaderModule(m_device, &createInfo, nullptr, &m_shader_module);
|
VkResult result = vkCreateShaderModule(m_device, &createInfo, nullptr, &m_shader_module);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Vulkan: Shader error");
|
cemuLog_log(LogType::Force, "Vulkan: Shader error");
|
||||||
throw std::runtime_error(fmt::format("Failed to create shader module: {}", result));
|
throw std::runtime_error(fmt::format("Failed to create shader module: {}", result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -450,4 +450,4 @@ void RendererShaderVk::ShaderCacheLoading_end()
|
||||||
{
|
{
|
||||||
// keep g_spirvCache open since we will write to it while the game is running
|
// keep g_spirvCache open since we will write to it while the game is running
|
||||||
s_isLoadingShadersVk = false;
|
s_isLoadingShadersVk = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -226,8 +226,8 @@ bool SwapchainInfoVk::AcquireImage(uint64 timeout)
|
||||||
|
|
||||||
void SwapchainInfoVk::UnrecoverableError(const char* errMsg)
|
void SwapchainInfoVk::UnrecoverableError(const char* errMsg)
|
||||||
{
|
{
|
||||||
forceLog_printf("Unrecoverable error in Vulkan swapchain");
|
cemuLog_log(LogType::Force, "Unrecoverable error in Vulkan swapchain");
|
||||||
forceLog_printf("Msg: %s", errMsg);
|
cemuLog_log(LogType::Force, "Msg: {}", errMsg);
|
||||||
throw std::runtime_error(errMsg);
|
throw std::runtime_error(errMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,7 +269,7 @@ SwapchainInfoVk::SwapchainSupportDetails SwapchainInfoVk::QuerySwapchainSupport(
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
if (result != VK_ERROR_SURFACE_LOST_KHR)
|
if (result != VK_ERROR_SURFACE_LOST_KHR)
|
||||||
forceLog_printf("vkGetPhysicalDeviceSurfaceCapabilitiesKHR failed. Error %d", (sint32)result);
|
cemuLog_log(LogType::Force, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR failed. Error {}", (sint32)result);
|
||||||
throw std::runtime_error(fmt::format("Unable to retrieve physical device surface capabilities: {}", result));
|
throw std::runtime_error(fmt::format("Unable to retrieve physical device surface capabilities: {}", result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,7 +277,7 @@ SwapchainInfoVk::SwapchainSupportDetails SwapchainInfoVk::QuerySwapchainSupport(
|
||||||
result = vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, nullptr);
|
result = vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, nullptr);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("vkGetPhysicalDeviceSurfaceFormatsKHR failed. Error %d", (sint32)result);
|
cemuLog_log(LogType::Force, "vkGetPhysicalDeviceSurfaceFormatsKHR failed. Error {}", (sint32)result);
|
||||||
throw std::runtime_error(fmt::format("Unable to retrieve the number of formats for a surface on a physical device: {}", result));
|
throw std::runtime_error(fmt::format("Unable to retrieve the number of formats for a surface on a physical device: {}", result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ SwapchainInfoVk::SwapchainSupportDetails SwapchainInfoVk::QuerySwapchainSupport(
|
||||||
result = vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, details.formats.data());
|
result = vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, details.formats.data());
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("vkGetPhysicalDeviceSurfaceFormatsKHR failed. Error %d", (sint32)result);
|
cemuLog_log(LogType::Force, "vkGetPhysicalDeviceSurfaceFormatsKHR failed. Error {}", (sint32)result);
|
||||||
throw std::runtime_error(fmt::format("Unable to retrieve the formats for a surface on a physical device: {}", result));
|
throw std::runtime_error(fmt::format("Unable to retrieve the formats for a surface on a physical device: {}", result));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -296,7 +296,7 @@ SwapchainInfoVk::SwapchainSupportDetails SwapchainInfoVk::QuerySwapchainSupport(
|
||||||
result = vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, nullptr);
|
result = vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, nullptr);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("vkGetPhysicalDeviceSurfacePresentModesKHR failed. Error %d", (sint32)result);
|
cemuLog_log(LogType::Force, "vkGetPhysicalDeviceSurfacePresentModesKHR failed. Error {}", (sint32)result);
|
||||||
throw std::runtime_error(fmt::format("Unable to retrieve the count of present modes for a surface on a physical device: {}", result));
|
throw std::runtime_error(fmt::format("Unable to retrieve the count of present modes for a surface on a physical device: {}", result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -306,7 +306,7 @@ SwapchainInfoVk::SwapchainSupportDetails SwapchainInfoVk::QuerySwapchainSupport(
|
||||||
result = vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, details.presentModes.data());
|
result = vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, details.presentModes.data());
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("vkGetPhysicalDeviceSurfacePresentModesKHR failed. Error %d", (sint32)result);
|
cemuLog_log(LogType::Force, "vkGetPhysicalDeviceSurfacePresentModesKHR failed. Error {}", (sint32)result);
|
||||||
throw std::runtime_error(fmt::format("Unable to retrieve the present modes for a surface on a physical device: {}", result));
|
throw std::runtime_error(fmt::format("Unable to retrieve the present modes for a surface on a physical device: {}", result));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -357,14 +357,14 @@ VkPresentModeKHR SwapchainInfoVk::ChoosePresentMode(const std::vector<VkPresentM
|
||||||
if (std::find(modes.cbegin(), modes.cend(), VK_PRESENT_MODE_MAILBOX_KHR) != modes.cend())
|
if (std::find(modes.cbegin(), modes.cend(), VK_PRESENT_MODE_MAILBOX_KHR) != modes.cend())
|
||||||
return VK_PRESENT_MODE_MAILBOX_KHR;
|
return VK_PRESENT_MODE_MAILBOX_KHR;
|
||||||
|
|
||||||
forceLog_printf("Vulkan: Can't find mailbox present mode");
|
cemuLog_log(LogType::Force, "Vulkan: Can't find mailbox present mode");
|
||||||
}
|
}
|
||||||
else if (vsyncState == VSync::Immediate)
|
else if (vsyncState == VSync::Immediate)
|
||||||
{
|
{
|
||||||
if (std::find(modes.cbegin(), modes.cend(), VK_PRESENT_MODE_IMMEDIATE_KHR) != modes.cend())
|
if (std::find(modes.cbegin(), modes.cend(), VK_PRESENT_MODE_IMMEDIATE_KHR) != modes.cend())
|
||||||
return VK_PRESENT_MODE_IMMEDIATE_KHR;
|
return VK_PRESENT_MODE_IMMEDIATE_KHR;
|
||||||
|
|
||||||
forceLog_printf("Vulkan: Can't find immediate present mode");
|
cemuLog_log(LogType::Force, "Vulkan: Can't find immediate present mode");
|
||||||
}
|
}
|
||||||
else if (vsyncState == VSync::SYNC_AND_LIMIT)
|
else if (vsyncState == VSync::SYNC_AND_LIMIT)
|
||||||
{
|
{
|
||||||
|
@ -373,7 +373,7 @@ VkPresentModeKHR SwapchainInfoVk::ChoosePresentMode(const std::vector<VkPresentM
|
||||||
//if (std::find(modes.cbegin(), modes.cend(), VK_PRESENT_MODE_IMMEDIATE_KHR) != modes.cend())
|
//if (std::find(modes.cbegin(), modes.cend(), VK_PRESENT_MODE_IMMEDIATE_KHR) != modes.cend())
|
||||||
// return VK_PRESENT_MODE_IMMEDIATE_KHR;
|
// return VK_PRESENT_MODE_IMMEDIATE_KHR;
|
||||||
//else
|
//else
|
||||||
// forceLog_printf("Vulkan: Present mode 'immediate' not available. Vsync might not behave as intended");
|
// cemuLog_log(LogType::Force, "Vulkan: Present mode 'immediate' not available. Vsync might not behave as intended");
|
||||||
return VK_PRESENT_MODE_FIFO_KHR;
|
return VK_PRESENT_MODE_FIFO_KHR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,7 @@ uint32 LatteTextureReadbackInfoVk::GetImageSize(LatteTextureView* textureView)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("Unsupported texture readback format %04x\n", (uint32)textureView->format);
|
cemuLog_log(LogType::Force, "Unsupported texture readback format {:04x}", (uint32)textureView->format);
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -231,9 +231,9 @@ uint32 VkTextureChunkedHeap::allocateNewChunk(uint32 chunkIndex, uint32 minimumA
|
||||||
allocationSize /= 2;
|
allocationSize /= 2;
|
||||||
if (allocationSize < minimumAllocationSize)
|
if (allocationSize < minimumAllocationSize)
|
||||||
break;
|
break;
|
||||||
forceLog_printf("Failed to allocate texture memory chunk with size %dMB. Trying again with smaller allocation size\n", allocationSize / 1024 / 1024);
|
cemuLog_log(LogType::Force, "Failed to allocate texture memory chunk with size {}MB. Trying again with smaller allocation size", allocationSize / 1024 / 1024);
|
||||||
}
|
}
|
||||||
forceLog_printf("Unable to allocate image memory chunk (%d heaps)", deviceLocalMemoryTypeIndices.size());
|
cemuLog_log(LogType::Force, "Unable to allocate image memory chunk ({} heaps)", deviceLocalMemoryTypeIndices.size());
|
||||||
throw std::runtime_error("failed to allocate image memory!");
|
throw std::runtime_error("failed to allocate image memory!");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -299,7 +299,7 @@ size_t VKRMemoryManager::GetTotalMemoryForBufferType(VkBufferUsageFlags usage, V
|
||||||
bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
if (vkCreateBuffer(logicalDevice, &bufferInfo, nullptr, &temporaryBuffer) != VK_SUCCESS)
|
if (vkCreateBuffer(logicalDevice, &bufferInfo, nullptr, &temporaryBuffer) != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Vulkan: GetTotalMemoryForBufferType() failed to create temporary buffer");
|
cemuLog_log(LogType::Force, "Vulkan: GetTotalMemoryForBufferType() failed to create temporary buffer");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -513,7 +513,7 @@ void VKRMemoryManager::imageMemoryFree(VkImageMemAllocation* imageMemAllocation)
|
||||||
auto heapItr = map_textureHeap.find(imageMemAllocation->typeFilter);
|
auto heapItr = map_textureHeap.find(imageMemAllocation->typeFilter);
|
||||||
if (heapItr == map_textureHeap.end())
|
if (heapItr == map_textureHeap.end())
|
||||||
{
|
{
|
||||||
forceLog_printf("Internal texture heap error");
|
cemuLog_log(LogType::Force, "Internal texture heap error");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
heapItr->second->freeMem(imageMemAllocation->mem);
|
heapItr->second->freeMem(imageMemAllocation->mem);
|
||||||
|
|
|
@ -33,7 +33,7 @@ public:
|
||||||
if ((alignment & (alignment - 1)) != 0)
|
if ((alignment & (alignment - 1)) != 0)
|
||||||
{
|
{
|
||||||
// not a power of two
|
// not a power of two
|
||||||
forceLog_printf("VkTextureChunkedHeap: Invalid alignment %d", alignment);
|
cemuLog_log(LogType::Force, "VkTextureChunkedHeap: Invalid alignment {}", alignment);
|
||||||
}
|
}
|
||||||
return this->alloc(size, alignment);
|
return this->alloc(size, alignment);
|
||||||
}
|
}
|
||||||
|
|
|
@ -129,7 +129,7 @@ private:
|
||||||
NTSTATUS r = pfnD3DKMTWaitForVerticalBlankEvent(&arg);
|
NTSTATUS r = pfnD3DKMTWaitForVerticalBlankEvent(&arg);
|
||||||
if (r != 0)
|
if (r != 0)
|
||||||
{
|
{
|
||||||
//forceLog_printf("Wait for VerticalBlank failed\n");
|
//cemuLog_log(LogType::Force, "Wait for VerticalBlank failed");
|
||||||
Sleep(1000 / 60);
|
Sleep(1000 / 60);
|
||||||
failCount++;
|
failCount++;
|
||||||
if (failCount >= 10)
|
if (failCount >= 10)
|
||||||
|
@ -214,4 +214,4 @@ void VsyncDriver_notifyWindowPosChanged()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -19,7 +19,7 @@ bool InitializeGlobalVulkan()
|
||||||
|
|
||||||
if (hmodule == nullptr)
|
if (hmodule == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("Vulkan loader not available. Outdated graphics driver or Vulkan runtime not installed?");
|
cemuLog_log(LogType::Force, "Vulkan loader not available. Outdated graphics driver or Vulkan runtime not installed?");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ bool InitializeGlobalVulkan()
|
||||||
|
|
||||||
if(!vkEnumerateInstanceVersion)
|
if(!vkEnumerateInstanceVersion)
|
||||||
{
|
{
|
||||||
forceLog_printf("vkEnumerateInstanceVersion not available. Outdated graphics driver or Vulkan runtime?");
|
cemuLog_log(LogType::Force, "vkEnumerateInstanceVersion not available. Outdated graphics driver or Vulkan runtime?");
|
||||||
FreeLibrary(hmodule);
|
FreeLibrary(hmodule);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@ bool InitializeGlobalVulkan()
|
||||||
|
|
||||||
if (!vulkan_so)
|
if (!vulkan_so)
|
||||||
{
|
{
|
||||||
forceLog_printf("Vulkan loader not available.");
|
cemuLog_log(LogType::Force, "Vulkan loader not available.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ bool InitializeGlobalVulkan()
|
||||||
|
|
||||||
if(!vkEnumerateInstanceVersion)
|
if(!vkEnumerateInstanceVersion)
|
||||||
{
|
{
|
||||||
forceLog_printf("vkEnumerateInstanceVersion not available. Outdated graphics driver or Vulkan runtime?");
|
cemuLog_log(LogType::Force, "vkEnumerateInstanceVersion not available. Outdated graphics driver or Vulkan runtime?");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,4 +125,4 @@ bool InitializeDeviceVulkan(VkDevice device)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -225,7 +225,7 @@ VkFormat PipelineCompiler::GetVertexFormat(uint8 format)
|
||||||
case FMT_2_10_10_10:
|
case FMT_2_10_10_10:
|
||||||
return VK_FORMAT_R32_UINT; // verified to match OpenGL
|
return VK_FORMAT_R32_UINT; // verified to match OpenGL
|
||||||
default:
|
default:
|
||||||
forceLog_printf("Unsupported vertex format: %02x", format);
|
cemuLog_log(LogType::Force, "Unsupported vertex format: {:02x}", format);
|
||||||
assert_dbg();
|
assert_dbg();
|
||||||
return VK_FORMAT_UNDEFINED;
|
return VK_FORMAT_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
@ -398,7 +398,7 @@ bool PipelineCompiler::InitShaderStages(VulkanRenderer* vkRenderer, RendererShad
|
||||||
(vkGeometryShader && vkGeometryShader->GetShaderModule() == VK_NULL_HANDLE) ||
|
(vkGeometryShader && vkGeometryShader->GetShaderModule() == VK_NULL_HANDLE) ||
|
||||||
(vkPixelShader && vkPixelShader->GetShaderModule() == VK_NULL_HANDLE))
|
(vkPixelShader && vkPixelShader->GetShaderModule() == VK_NULL_HANDLE))
|
||||||
{
|
{
|
||||||
forceLog_printf("Vulkan-Info: Pipeline creation failed due to invalid shader(s)");
|
cemuLog_log(LogType::Force, "Vulkan-Info: Pipeline creation failed due to invalid shader(s)");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -921,7 +921,7 @@ bool PipelineCompiler::InitFromCurrentGPUState(PipelineInfo* pipelineInfo, const
|
||||||
VkResult result = vkCreatePipelineLayout(vkRenderer->m_logicalDevice, &pipelineLayoutInfo, nullptr, &m_pipeline_layout);
|
VkResult result = vkCreatePipelineLayout(vkRenderer->m_logicalDevice, &pipelineLayoutInfo, nullptr, &m_pipeline_layout);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("%s", fmt::format("Failed to create pipeline layout: {}", result).c_str());
|
cemuLog_log(LogType::Force, "Failed to create pipeline layout: {}", result);
|
||||||
s_nvidiaWorkaround.unlock();
|
s_nvidiaWorkaround.unlock();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1041,7 +1041,7 @@ bool PipelineCompiler::Compile(bool forceCompile, bool isRenderThread, bool show
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to create graphics pipeline. Error %d", (sint32)result);
|
cemuLog_log(LogType::Force, "Failed to create graphics pipeline. Error {}", (sint32)result);
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
return true; // true indicates that caller should no longer attempt to compile this pipeline again
|
return true; // true indicates that caller should no longer attempt to compile this pipeline again
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,7 +112,7 @@ uint32 LatteQueryObjectVk::acquireQueryIndex()
|
||||||
{
|
{
|
||||||
if (m_rendererVk->m_occlusionQueries.list_availableQueryIndices.empty())
|
if (m_rendererVk->m_occlusionQueries.list_availableQueryIndices.empty())
|
||||||
{
|
{
|
||||||
forceLog_printf("Vulkan-Error: Exhausted query pool");
|
cemuLog_log(LogType::Force, "Vulkan-Error: Exhausted query pool");
|
||||||
assert_dbg();
|
assert_dbg();
|
||||||
}
|
}
|
||||||
uint32 queryIndex = m_rendererVk->m_occlusionQueries.list_availableQueryIndices.back();
|
uint32 queryIndex = m_rendererVk->m_occlusionQueries.list_availableQueryIndices.back();
|
||||||
|
@ -152,7 +152,7 @@ LatteQueryObject* VulkanRenderer::occlusionQuery_create()
|
||||||
auto r = vkCreateQueryPool(m_logicalDevice, &queryPoolCreateInfo, nullptr, &m_occlusionQueries.queryPool);
|
auto r = vkCreateQueryPool(m_logicalDevice, &queryPoolCreateInfo, nullptr, &m_occlusionQueries.queryPool);
|
||||||
if (r != VK_SUCCESS)
|
if (r != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Vulkan-Error: Failed to create query pool with error %d", (sint32)r);
|
cemuLog_log(LogType::Force, "Vulkan-Error: Failed to create query pool with error {}", (sint32)r);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -209,4 +209,4 @@ void VulkanRenderer::occlusionQuery_notifyBeginCommandBuffer()
|
||||||
for (auto& it : m_occlusionQueries.list_currentlyActiveQueries)
|
for (auto& it : m_occlusionQueries.list_currentlyActiveQueries)
|
||||||
if (it->m_hasActiveQuery)
|
if (it->m_hasActiveQuery)
|
||||||
it->beginFragment();
|
it->beginFragment();
|
||||||
}
|
}
|
||||||
|
|
|
@ -210,11 +210,11 @@ void VulkanRenderer::DetermineVendor()
|
||||||
if(driverId == VK_DRIVER_ID_MESA_RADV || driverId == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA)
|
if(driverId == VK_DRIVER_ID_MESA_RADV || driverId == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA)
|
||||||
m_vendor = GfxVendor::Mesa;
|
m_vendor = GfxVendor::Mesa;
|
||||||
|
|
||||||
forceLog_printf("Using GPU: %s", properties.properties.deviceName);
|
cemuLog_log(LogType::Force, "Using GPU: {}", properties.properties.deviceName);
|
||||||
|
|
||||||
if (m_featureControl.deviceExtensions.driver_properties)
|
if (m_featureControl.deviceExtensions.driver_properties)
|
||||||
{
|
{
|
||||||
forceLog_printf("Driver version: %s", driverProperties.driverInfo);
|
cemuLog_log(LogType::Force, "Driver version: {}", driverProperties.driverInfo);
|
||||||
|
|
||||||
if(m_vendor == GfxVendor::Nvidia)
|
if(m_vendor == GfxVendor::Nvidia)
|
||||||
{
|
{
|
||||||
|
@ -225,7 +225,7 @@ void VulkanRenderer::DetermineVendor()
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("Driver version (as stored in device info): %08X", properties.properties.driverVersion);
|
cemuLog_log(LogType::Force, "Driver version (as stored in device info): {:08}", properties.properties.driverVersion);
|
||||||
|
|
||||||
if(m_vendor == GfxVendor::Nvidia)
|
if(m_vendor == GfxVendor::Nvidia)
|
||||||
{
|
{
|
||||||
|
@ -291,11 +291,11 @@ void VulkanRenderer::GetDeviceFeatures()
|
||||||
{
|
{
|
||||||
if (m_featureControl.deviceExtensions.custom_border_color)
|
if (m_featureControl.deviceExtensions.custom_border_color)
|
||||||
{
|
{
|
||||||
forceLog_printf("VK_EXT_custom_border_color is present but only with limited support. Cannot emulate arbitrary border color");
|
cemuLog_log(LogType::Force, "VK_EXT_custom_border_color is present but only with limited support. Cannot emulate arbitrary border color");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("VK_EXT_custom_border_color not supported. Cannot emulate arbitrary border color");
|
cemuLog_log(LogType::Force, "VK_EXT_custom_border_color not supported. Cannot emulate arbitrary border color");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,11 +309,11 @@ VulkanRenderer::VulkanRenderer()
|
||||||
{
|
{
|
||||||
glslang::InitializeProcess();
|
glslang::InitializeProcess();
|
||||||
|
|
||||||
forceLog_printf("------- Init Vulkan graphics backend -------");
|
cemuLog_log(LogType::Force, "------- Init Vulkan graphics backend -------");
|
||||||
|
|
||||||
const bool useValidationLayer = cafeLog_isLoggingFlagEnabled(LOG_TYPE_VULKAN_VALIDATION);
|
const bool useValidationLayer = cafeLog_isLoggingFlagEnabled(LOG_TYPE_VULKAN_VALIDATION);
|
||||||
if (useValidationLayer)
|
if (useValidationLayer)
|
||||||
forceLog_printf("Validation layer is enabled");
|
cemuLog_log(LogType::Force, "Validation layer is enabled");
|
||||||
|
|
||||||
VkResult err;
|
VkResult err;
|
||||||
|
|
||||||
|
@ -397,19 +397,19 @@ VulkanRenderer::VulkanRenderer()
|
||||||
|
|
||||||
if (m_physicalDevice == VK_NULL_HANDLE && fallbackDevice != VK_NULL_HANDLE)
|
if (m_physicalDevice == VK_NULL_HANDLE && fallbackDevice != VK_NULL_HANDLE)
|
||||||
{
|
{
|
||||||
forceLog_printf("The selected GPU could not be found or is not suitable. Falling back to first available device instead");
|
cemuLog_log(LogType::Force, "The selected GPU could not be found or is not suitable. Falling back to first available device instead");
|
||||||
m_physicalDevice = fallbackDevice;
|
m_physicalDevice = fallbackDevice;
|
||||||
config.graphic_device_uuid = {}; // resetting device selection
|
config.graphic_device_uuid = {}; // resetting device selection
|
||||||
}
|
}
|
||||||
else if (m_physicalDevice == VK_NULL_HANDLE)
|
else if (m_physicalDevice == VK_NULL_HANDLE)
|
||||||
{
|
{
|
||||||
forceLog_printf("No physical GPU could be found with the required extensions and swap chain support.");
|
cemuLog_log(LogType::Force, "No physical GPU could be found with the required extensions and swap chain support.");
|
||||||
throw std::runtime_error("No physical GPU could be found with the required extensions and swap chain support.");
|
throw std::runtime_error("No physical GPU could be found with the required extensions and swap chain support.");
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckDeviceExtensionSupport(m_physicalDevice, m_featureControl); // todo - merge this with GetDeviceFeatures and separate from IsDeviceSuitable?
|
CheckDeviceExtensionSupport(m_physicalDevice, m_featureControl); // todo - merge this with GetDeviceFeatures and separate from IsDeviceSuitable?
|
||||||
if (m_featureControl.debugMarkersSupported)
|
if (m_featureControl.debugMarkersSupported)
|
||||||
forceLog_printf("Debug: Frame debugger attached, will use vkDebugMarkerSetObjectNameEXT");
|
cemuLog_log(LogType::Force, "Debug: Frame debugger attached, will use vkDebugMarkerSetObjectNameEXT");
|
||||||
|
|
||||||
DetermineVendor();
|
DetermineVendor();
|
||||||
GetDeviceFeatures();
|
GetDeviceFeatures();
|
||||||
|
@ -430,7 +430,7 @@ VulkanRenderer::VulkanRenderer()
|
||||||
}
|
}
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't create dxgi wrapper: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't create dxgi wrapper: {}", ex.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
// create logical device
|
// create logical device
|
||||||
|
@ -452,7 +452,7 @@ VulkanRenderer::VulkanRenderer()
|
||||||
if (m_vendor == GfxVendor::AMD)
|
if (m_vendor == GfxVendor::AMD)
|
||||||
{
|
{
|
||||||
deviceFeatures.robustBufferAccess = VK_TRUE;
|
deviceFeatures.robustBufferAccess = VK_TRUE;
|
||||||
forceLog_printf("Enable robust buffer access");
|
cemuLog_log(LogType::Force, "Enable robust buffer access");
|
||||||
}
|
}
|
||||||
if (m_featureControl.mode.useTFEmulationViaSSBO)
|
if (m_featureControl.mode.useTFEmulationViaSSBO)
|
||||||
{
|
{
|
||||||
|
@ -487,7 +487,7 @@ VulkanRenderer::VulkanRenderer()
|
||||||
VkResult result = vkCreateDevice(m_physicalDevice, &createInfo, nullptr, &m_logicalDevice);
|
VkResult result = vkCreateDevice(m_physicalDevice, &createInfo, nullptr, &m_logicalDevice);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Vulkan: Unable to create a logical device. Error %d", (sint32)result);
|
cemuLog_log(LogType::Force, "Vulkan: Unable to create a logical device. Error {}", (sint32)result);
|
||||||
throw std::runtime_error(fmt::format("Unable to create a logical device: {}", result));
|
throw std::runtime_error(fmt::format("Unable to create a logical device: {}", result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -514,7 +514,7 @@ VulkanRenderer::VulkanRenderer()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_featureControl.instanceExtensions.debug_utils)
|
if (m_featureControl.instanceExtensions.debug_utils)
|
||||||
forceLog_printf("Using available debug function: vkCreateDebugUtilsMessengerEXT()");
|
cemuLog_log(LogType::Force, "Using available debug function: vkCreateDebugUtilsMessengerEXT()");
|
||||||
|
|
||||||
// set initial viewport and scissor box size
|
// set initial viewport and scissor box size
|
||||||
m_state.currentViewport.width = 4;
|
m_state.currentViewport.width = 4;
|
||||||
|
@ -578,11 +578,11 @@ VulkanRenderer::VulkanRenderer()
|
||||||
|
|
||||||
if (m_featureControl.mode.useBufferSurfaceCopies)
|
if (m_featureControl.mode.useBufferSurfaceCopies)
|
||||||
{
|
{
|
||||||
//forceLog_printf("Enable surface copies via buffer");
|
//cemuLog_log(LogType::Force, "Enable surface copies via buffer");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//forceLog_printf("Disable surface copies via buffer (Requires 2GB. Has only %lluMB available)", availableSurfaceCopyBufferMem / 1024ull / 1024ull);
|
//cemuLog_log(LogType::Force, "Disable surface copies via buffer (Requires 2GB. Has only {}MB available)", availableSurfaceCopyBufferMem / 1024ull / 1024ull);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1212,11 +1212,11 @@ std::vector<const char*> VulkanRenderer::CheckInstanceExtensionSupport(FeatureCo
|
||||||
}
|
}
|
||||||
if (!requiredInstanceExtensions.empty())
|
if (!requiredInstanceExtensions.empty())
|
||||||
{
|
{
|
||||||
forceLog_printf("The following required Vulkan instance extensions are not supported:");
|
cemuLog_log(LogType::Force, "The following required Vulkan instance extensions are not supported:");
|
||||||
|
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
for (const auto& extension : requiredInstanceExtensions)
|
for (const auto& extension : requiredInstanceExtensions)
|
||||||
forceLog_printf("%s", extension);
|
cemuLog_log(LogType::Force, "{}", extension);
|
||||||
cemuLog_waitForFlush();
|
cemuLog_waitForFlush();
|
||||||
throw std::runtime_error(ss.str());
|
throw std::runtime_error(ss.str());
|
||||||
}
|
}
|
||||||
|
@ -1262,7 +1262,7 @@ VkSurfaceKHR VulkanRenderer::CreateWinSurface(VkInstance instance, HWND hwindow)
|
||||||
VkResult err;
|
VkResult err;
|
||||||
if ((err = vkCreateWin32SurfaceKHR(instance, &sci, nullptr, &result)) != VK_SUCCESS)
|
if ((err = vkCreateWin32SurfaceKHR(instance, &sci, nullptr, &result)) != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Cannot create a Win32 Vulkan surface: %d", (sint32)err);
|
cemuLog_log(LogType::Force, "Cannot create a Win32 Vulkan surface: {}", (sint32)err);
|
||||||
throw std::runtime_error(fmt::format("Cannot create a Win32 Vulkan surface: {}", err));
|
throw std::runtime_error(fmt::format("Cannot create a Win32 Vulkan surface: {}", err));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1283,7 +1283,7 @@ VkSurfaceKHR VulkanRenderer::CreateXlibSurface(VkInstance instance, Display* dpy
|
||||||
VkResult err;
|
VkResult err;
|
||||||
if ((err = vkCreateXlibSurfaceKHR(instance, &sci, nullptr, &result)) != VK_SUCCESS)
|
if ((err = vkCreateXlibSurfaceKHR(instance, &sci, nullptr, &result)) != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Cannot create a X11 Vulkan surface: %d", (sint32)err);
|
cemuLog_log(LogType::Force, "Cannot create a X11 Vulkan surface: {}", (sint32)err);
|
||||||
throw std::runtime_error(fmt::format("Cannot create a X11 Vulkan surface: {}", err));
|
throw std::runtime_error(fmt::format("Cannot create a X11 Vulkan surface: {}", err));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1302,7 +1302,7 @@ VkSurfaceKHR VulkanRenderer::CreateXcbSurface(VkInstance instance, xcb_connectio
|
||||||
VkResult err;
|
VkResult err;
|
||||||
if ((err = vkCreateXcbSurfaceKHR(instance, &sci, nullptr, &result)) != VK_SUCCESS)
|
if ((err = vkCreateXcbSurfaceKHR(instance, &sci, nullptr, &result)) != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Cannot create a XCB Vulkan surface: %d", (sint32)err);
|
cemuLog_log(LogType::Force, "Cannot create a XCB Vulkan surface: {}", (sint32)err);
|
||||||
throw std::runtime_error(fmt::format("Cannot create a XCB Vulkan surface: {}", err));
|
throw std::runtime_error(fmt::format("Cannot create a XCB Vulkan surface: {}", err));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1321,7 +1321,7 @@ VkSurfaceKHR VulkanRenderer::CreateWaylandSurface(VkInstance instance, wl_displa
|
||||||
VkResult err;
|
VkResult err;
|
||||||
if ((err = vkCreateWaylandSurfaceKHR(instance, &sci, nullptr, &result)) != VK_SUCCESS)
|
if ((err = vkCreateWaylandSurfaceKHR(instance, &sci, nullptr, &result)) != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Cannot create a Wayland Vulkan surface: %d", (sint32)err);
|
cemuLog_log(LogType::Force, "Cannot create a Wayland Vulkan surface: {}", (sint32)err);
|
||||||
throw std::runtime_error(fmt::format("Cannot create a Wayland Vulkan surface: {}", err));
|
throw std::runtime_error(fmt::format("Cannot create a Wayland Vulkan surface: {}", err));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1382,7 +1382,7 @@ void VulkanRenderer::CreateCommandBuffers()
|
||||||
const VkResult result = vkAllocateCommandBuffers(m_logicalDevice, &allocInfo, m_commandBuffers.data());
|
const VkResult result = vkAllocateCommandBuffers(m_logicalDevice, &allocInfo, m_commandBuffers.data());
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to allocate command buffers: %d", result);
|
cemuLog_log(LogType::Force, "Failed to allocate command buffers: {}", result);
|
||||||
throw std::runtime_error(fmt::format("Failed to allocate command buffers: {}", result));
|
throw std::runtime_error(fmt::format("Failed to allocate command buffers: {}", result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1561,8 +1561,8 @@ void VulkanRenderer::Shutdown()
|
||||||
|
|
||||||
void VulkanRenderer::UnrecoverableError(const char* errMsg) const
|
void VulkanRenderer::UnrecoverableError(const char* errMsg) const
|
||||||
{
|
{
|
||||||
forceLog_printf("Unrecoverable error in Vulkan renderer");
|
cemuLog_log(LogType::Force, "Unrecoverable error in Vulkan renderer");
|
||||||
forceLog_printf("Msg: %s", errMsg);
|
cemuLog_log(LogType::Force, "Msg: {}", errMsg);
|
||||||
throw std::runtime_error(errMsg);
|
throw std::runtime_error(errMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1632,14 +1632,14 @@ void VulkanRenderer::QueryMemoryInfo()
|
||||||
{
|
{
|
||||||
VkPhysicalDeviceMemoryProperties memProperties;
|
VkPhysicalDeviceMemoryProperties memProperties;
|
||||||
vkGetPhysicalDeviceMemoryProperties(m_physicalDevice, &memProperties);
|
vkGetPhysicalDeviceMemoryProperties(m_physicalDevice, &memProperties);
|
||||||
forceLog_printf("Vulkan device memory info:");
|
cemuLog_log(LogType::Force, "Vulkan device memory info:");
|
||||||
for (uint32 i = 0; i < memProperties.memoryHeapCount; i++)
|
for (uint32 i = 0; i < memProperties.memoryHeapCount; i++)
|
||||||
{
|
{
|
||||||
forceLog_printf("Heap %d - Size %dMB Flags 0x%08x", i, (sint32)(memProperties.memoryHeaps[i].size / 1024ll / 1024ll), (uint32)memProperties.memoryHeaps[i].flags);
|
cemuLog_log(LogType::Force, "Heap {} - Size {}MB Flags 0x{:08x}", i, (sint32)(memProperties.memoryHeaps[i].size / 1024ll / 1024ll), (uint32)memProperties.memoryHeaps[i].flags);
|
||||||
}
|
}
|
||||||
for (uint32 i = 0; i < memProperties.memoryTypeCount; i++)
|
for (uint32 i = 0; i < memProperties.memoryTypeCount; i++)
|
||||||
{
|
{
|
||||||
forceLog_printf("Memory %d - HeapIndex %d Flags 0x%08x", i, (sint32)memProperties.memoryTypes[i].heapIndex, (uint32)memProperties.memoryTypes[i].propertyFlags);
|
cemuLog_log(LogType::Force, "Memory {} - HeapIndex {} Flags 0x{:08x}", i, (sint32)memProperties.memoryTypes[i].heapIndex, (uint32)memProperties.memoryTypes[i].propertyFlags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1700,7 +1700,7 @@ void VulkanRenderer::QueryAvailableFormats()
|
||||||
|
|
||||||
if (fmtProp.optimalTilingFeatures == 0)
|
if (fmtProp.optimalTilingFeatures == 0)
|
||||||
{
|
{
|
||||||
forceLog_printf("%s not supported", it.name);
|
cemuLog_log(LogType::Force, "{} not supported", it.name);
|
||||||
}
|
}
|
||||||
else if ((fmtProp.optimalTilingFeatures & requestedBits) != requestedBits)
|
else if ((fmtProp.optimalTilingFeatures & requestedBits) != requestedBits)
|
||||||
{
|
{
|
||||||
|
@ -1716,7 +1716,7 @@ void VulkanRenderer::QueryAvailableFormats()
|
||||||
// missingStr.append(" TRANSFER_DST");
|
// missingStr.append(" TRANSFER_DST");
|
||||||
//if (!(fmtProp.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT))
|
//if (!(fmtProp.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT))
|
||||||
// missingStr.append(" SAMPLED_IMAGE");
|
// missingStr.append(" SAMPLED_IMAGE");
|
||||||
//forceLog_printf("%s", missingStr.c_str());
|
//cemuLog_log(LogType::Force, "{}", missingStr.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1765,7 +1765,7 @@ ImTextureID VulkanRenderer::GenerateTexture(const std::vector<uint8>& data, cons
|
||||||
}
|
}
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't generate imgui texture: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't generate imgui texture: {}", ex.what());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1888,7 +1888,7 @@ void VulkanRenderer::ProcessFinishedCommandBuffers()
|
||||||
// not signaled
|
// not signaled
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
forceLog_printf("vkGetFenceStatus returned unexpected error %d", (sint32)fenceStatus);
|
cemuLog_log(LogType::Force, "vkGetFenceStatus returned unexpected error {}", (sint32)fenceStatus);
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
}
|
}
|
||||||
if (finishedCmdBuffers)
|
if (finishedCmdBuffers)
|
||||||
|
@ -1904,11 +1904,11 @@ void VulkanRenderer::WaitForNextFinishedCommandBuffer()
|
||||||
VkResult result = vkWaitForFences(m_logicalDevice, 1, &m_cmd_buffer_fences[m_commandBufferSyncIndex], true, UINT64_MAX);
|
VkResult result = vkWaitForFences(m_logicalDevice, 1, &m_cmd_buffer_fences[m_commandBufferSyncIndex], true, UINT64_MAX);
|
||||||
if (result == VK_TIMEOUT)
|
if (result == VK_TIMEOUT)
|
||||||
{
|
{
|
||||||
forceLog_printf("vkWaitForFences: Returned VK_TIMEOUT on infinite fence");
|
cemuLog_log(LogType::Force, "vkWaitForFences: Returned VK_TIMEOUT on infinite fence");
|
||||||
}
|
}
|
||||||
else if (result != VK_SUCCESS)
|
else if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("vkWaitForFences: Returned unhandled error %d", (sint32)result);
|
cemuLog_log(LogType::Force, "vkWaitForFences: Returned unhandled error {}", (sint32)result);
|
||||||
}
|
}
|
||||||
// process
|
// process
|
||||||
ProcessFinishedCommandBuffers();
|
ProcessFinishedCommandBuffers();
|
||||||
|
@ -2040,7 +2040,7 @@ void VulkanRenderer::PipelineCacheSaveThread(size_t cache_size)
|
||||||
}
|
}
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't create vulkan pipeline cache directory \"%s\": %s", dir.generic_string().c_str(), ex.what());
|
cemuLog_log(LogType::Force, "can't create vulkan pipeline cache directory \"{}\": {}", _pathToUtf8(dir), ex.what());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2089,12 +2089,12 @@ void VulkanRenderer::PipelineCacheSaveThread(size_t cache_size)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("can't write pipeline cache to disk");
|
cemuLog_log(LogType::Force, "can't write pipeline cache to disk");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("can't retrieve pipeline cache data: 0x%x", res);
|
cemuLog_log(LogType::Force, "can't retrieve pipeline cache data: 0x{:x}", res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2205,7 +2205,7 @@ void VulkanRenderer::GetTextureFormatInfoVK(Latte::E_GX2SURFFMT format, bool isD
|
||||||
formatInfoOut->decoder = TextureDecoder_D32_S8_UINT_X24::getInstance();
|
formatInfoOut->decoder = TextureDecoder_D32_S8_UINT_X24::getInstance();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
forceLog_printf("Unsupported depth texture format %04x", (uint32)format);
|
cemuLog_log(LogType::Force, "Unsupported depth texture format {:04x}", (uint32)format);
|
||||||
// default to placeholder format
|
// default to placeholder format
|
||||||
formatInfoOut->vkImageFormat = VK_FORMAT_D16_UNORM;
|
formatInfoOut->vkImageFormat = VK_FORMAT_D16_UNORM;
|
||||||
formatInfoOut->vkImageAspect = VK_IMAGE_ASPECT_DEPTH_BIT;
|
formatInfoOut->vkImageAspect = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||||
|
@ -2458,7 +2458,7 @@ void VulkanRenderer::GetTextureFormatInfoVK(Latte::E_GX2SURFFMT format, bool isD
|
||||||
formatInfoOut->vkImageFormat = VK_FORMAT_R8G8B8A8_UINT; // todo - should we use ABGR format?
|
formatInfoOut->vkImageFormat = VK_FORMAT_R8G8B8A8_UINT; // todo - should we use ABGR format?
|
||||||
formatInfoOut->decoder = TextureDecoder_X24_G8_UINT::getInstance(); // todo - verify
|
formatInfoOut->decoder = TextureDecoder_X24_G8_UINT::getInstance(); // todo - verify
|
||||||
default:
|
default:
|
||||||
forceLog_printf("Unsupported color texture format %04x\n", (uint32)format);
|
cemuLog_log(LogType::Force, "Unsupported color texture format {:04x}", (uint32)format);
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2581,7 +2581,7 @@ VkPipeline VulkanRenderer::backbufferBlit_createGraphicsPipeline(VkDescriptorSet
|
||||||
result = vkCreateGraphicsPipelines(m_logicalDevice, m_pipeline_cache, 1, &pipelineInfo, nullptr, &pipeline);
|
result = vkCreateGraphicsPipelines(m_logicalDevice, m_pipeline_cache, 1, &pipelineInfo, nullptr, &pipeline);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to create graphics pipeline. Error %d", result);
|
cemuLog_log(LogType::Force, "Failed to create graphics pipeline. Error {}", result);
|
||||||
throw std::runtime_error(fmt::format("Failed to create graphics pipeline: {}", result));
|
throw std::runtime_error(fmt::format("Failed to create graphics pipeline: {}", result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3882,7 +3882,7 @@ VKRObjectRenderPass::VKRObjectRenderPass(AttachmentInfo_t& attachmentInfo, sint3
|
||||||
|
|
||||||
if (vkCreateRenderPass(VulkanRenderer::GetInstance()->GetLogicalDevice(), &renderPassInfo, nullptr, &m_renderPass) != VK_SUCCESS)
|
if (vkCreateRenderPass(VulkanRenderer::GetInstance()->GetLogicalDevice(), &renderPassInfo, nullptr, &m_renderPass) != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Vulkan-Error: Failed to create render pass");
|
cemuLog_log(LogType::Force, "Vulkan-Error: Failed to create render pass");
|
||||||
throw std::runtime_error("failed to create render pass!");
|
throw std::runtime_error("failed to create render pass!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -677,7 +677,7 @@ VkDescriptorSetInfo* VulkanRenderer::draw_getOrCreateDescriptorSet(PipelineInfo*
|
||||||
info.imageView = nullTexture1D.view;
|
info.imageView = nullTexture1D.view;
|
||||||
info.sampler = nullTexture1D.sampler;
|
info.sampler = nullTexture1D.sampler;
|
||||||
textureArray.emplace_back(info);
|
textureArray.emplace_back(info);
|
||||||
// forceLog_printf("Vulkan-Info: Shader 0x%016llx uses 1D texture but bound texture has mismatching type (dim: 0x%02x)", shader->baseHash, textureView->gx2Dim);
|
// cemuLog_log(LogType::Force, "Vulkan-Info: Shader 0x{:016x} uses 1D texture but bound texture has mismatching type (dim: 0x{:02x})", shader->baseHash, textureView->gx2Dim);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (textureDim == Latte::E_DIM::DIM_2D && (textureView->dim != Latte::E_DIM::DIM_2D && textureView->dim != Latte::E_DIM::DIM_2D_MSAA))
|
else if (textureDim == Latte::E_DIM::DIM_2D && (textureView->dim != Latte::E_DIM::DIM_2D && textureView->dim != Latte::E_DIM::DIM_2D_MSAA))
|
||||||
|
@ -688,7 +688,7 @@ VkDescriptorSetInfo* VulkanRenderer::draw_getOrCreateDescriptorSet(PipelineInfo*
|
||||||
info.imageView = nullTexture2D.view;
|
info.imageView = nullTexture2D.view;
|
||||||
info.sampler = nullTexture2D.sampler;
|
info.sampler = nullTexture2D.sampler;
|
||||||
textureArray.emplace_back(info);
|
textureArray.emplace_back(info);
|
||||||
// forceLog_printf("Vulkan-Info: Shader 0x%016llx uses 2D texture but bound texture has mismatching type (dim: 0x%02x)", shader->baseHash, textureView->gx2Dim);
|
// cemuLog_log(LogType::Force, "Vulkan-Info: Shader 0x{:016x} uses 2D texture but bound texture has mismatching type (dim: 0x{:02x})", shader->baseHash, textureView->gx2Dim);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -353,7 +353,7 @@ CopySurfacePipelineInfo* VulkanRenderer::copySurface_getOrCreateGraphicsPipeline
|
||||||
VkResult result = vkCreatePipelineLayout(m_logicalDevice, &pipelineLayoutInfo, nullptr, &vkObjPipeline->pipeline_layout);
|
VkResult result = vkCreatePipelineLayout(m_logicalDevice, &pipelineLayoutInfo, nullptr, &vkObjPipeline->pipeline_layout);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("%s", fmt::format("Failed to create pipeline layout: {}", result).c_str());
|
cemuLog_log(LogType::Force, "Failed to create pipeline layout: {}", result);
|
||||||
vkObjPipeline->pipeline = VK_NULL_HANDLE;
|
vkObjPipeline->pipeline = VK_NULL_HANDLE;
|
||||||
return copyPipeline;
|
return copyPipeline;
|
||||||
}
|
}
|
||||||
|
@ -413,7 +413,7 @@ CopySurfacePipelineInfo* VulkanRenderer::copySurface_getOrCreateGraphicsPipeline
|
||||||
result = vkCreateGraphicsPipelines(m_logicalDevice, m_pipeline_cache, 1, &pipelineInfo, nullptr, ©Pipeline->vkObjPipeline->pipeline);
|
result = vkCreateGraphicsPipelines(m_logicalDevice, m_pipeline_cache, 1, &pipelineInfo, nullptr, ©Pipeline->vkObjPipeline->pipeline);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to create graphics pipeline for surface copy. Error %d Info:", (sint32)result);
|
cemuLog_log(LogType::Force, "Failed to create graphics pipeline for surface copy. Error {} Info:", (sint32)result);
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
copyPipeline->vkObjPipeline->pipeline = VK_NULL_HANDLE;
|
copyPipeline->vkObjPipeline->pipeline = VK_NULL_HANDLE;
|
||||||
}
|
}
|
||||||
|
@ -806,7 +806,7 @@ void VulkanRenderer::surfaceCopy_viaBuffer(LatteTextureVk* srcTextureVk, sint32
|
||||||
memoryManager->CreateBuffer(m_surfaceCopyBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, m_surfaceCopyBuffer, m_surfaceCopyBufferMemory);
|
memoryManager->CreateBuffer(m_surfaceCopyBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, m_surfaceCopyBuffer, m_surfaceCopyBufferMemory);
|
||||||
if (m_surfaceCopyBuffer == VK_NULL_HANDLE)
|
if (m_surfaceCopyBuffer == VK_NULL_HANDLE)
|
||||||
{
|
{
|
||||||
forceLog_printf("Vulkan: Failed to allocate surface copy buffer with size %llu", allocSize);
|
cemuLog_log(LogType::Force, "Vulkan: Failed to allocate surface copy buffer with size {}", allocSize);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -339,7 +339,7 @@ namespace iosu
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("ACPGetTitleSaveMetaXml(): Meta file \"%s\" does not exist", xmlPath);
|
cemuLog_log(LogType::Force, "ACPGetTitleSaveMetaXml(): Meta file \"{}\" does not exist", xmlPath);
|
||||||
memset(acpMetaXml, 0, sizeof(acpMetaXml_t));
|
memset(acpMetaXml, 0, sizeof(acpMetaXml_t));
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -373,7 +373,7 @@ namespace iosu
|
||||||
free(metaBootMovieData);
|
free(metaBootMovieData);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
forceLog_printf("ACPGetTitleMetaData(): Unable to load \"%s\"", filePath);
|
cemuLog_log(LogType::Force, "ACPGetTitleMetaData(): Unable to load \"{}\"", filePath);
|
||||||
// bootLogoTex.tga
|
// bootLogoTex.tga
|
||||||
sprintf(filePath, "%smeta/bootLogoTex.tga", titlePath);
|
sprintf(filePath, "%smeta/bootLogoTex.tga", titlePath);
|
||||||
uint32 metaBootLogoSize = 0;
|
uint32 metaBootLogoSize = 0;
|
||||||
|
@ -384,7 +384,7 @@ namespace iosu
|
||||||
free(metaBootLogoData);
|
free(metaBootLogoData);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
forceLog_printf("ACPGetTitleMetaData(): Unable to load \"%s\"", filePath);
|
cemuLog_log(LogType::Force, "ACPGetTitleMetaData(): Unable to load \"{}\"", filePath);
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -418,7 +418,7 @@ namespace iosu
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("ACPGetTitleMetaXml(): Meta file \"%s\" does not exist", filePath);
|
cemuLog_log(LogType::Force, "ACPGetTitleMetaXml(): Meta file \"{}\" does not exist", filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -470,7 +470,7 @@ namespace iosu
|
||||||
FSCVirtualFile* fscDirIterator = fsc_openDirIterator(searchPath, &fscStatus);
|
FSCVirtualFile* fscDirIterator = fsc_openDirIterator(searchPath, &fscStatus);
|
||||||
if (fscDirIterator == nullptr)
|
if (fscDirIterator == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("ACPGetTitleSaveDirEx(): Failed to iterate directories in \"%s\"", searchPath);
|
cemuLog_log(LogType::Force, "ACPGetTitleSaveDirEx(): Failed to iterate directories in \"{}\"", searchPath);
|
||||||
*countOut = 0;
|
*countOut = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -611,4 +611,4 @@ namespace iosu
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -322,7 +322,7 @@ namespace iosu
|
||||||
forceLogDebug_printf("sslctx_function: adding ca cert: %d", (int)task_settings->settings[location]);
|
forceLogDebug_printf("sslctx_function: adding ca cert: %d", (int)task_settings->settings[location]);
|
||||||
if (!iosuCrypto_addCACertificate(sslctx, task_settings->settings[location]))
|
if (!iosuCrypto_addCACertificate(sslctx, task_settings->settings[location]))
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to load CA certificate file");
|
cemuLog_log(LogType::Force, "Failed to load CA certificate file");
|
||||||
assert_dbg();
|
assert_dbg();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -334,13 +334,13 @@ namespace iosu
|
||||||
{
|
{
|
||||||
if (!iosuCrypto_addCACertificate(sslctx, 105))
|
if (!iosuCrypto_addCACertificate(sslctx, 105))
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to load certificate file");
|
cemuLog_log(LogType::Force, "Failed to load certificate file");
|
||||||
assert_dbg();
|
assert_dbg();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!iosuCrypto_addClientCertificate(sslctx, 3))
|
if (!iosuCrypto_addClientCertificate(sslctx, 3))
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to load client certificate file");
|
cemuLog_log(LogType::Force, "Failed to load client certificate file");
|
||||||
assert_dbg();
|
assert_dbg();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -393,24 +393,24 @@ bool iosuCrypto_addClientCertificate(void* sslctx, sint32 certificateId)
|
||||||
{
|
{
|
||||||
if (SSL_CTX_use_certificate(ctx, iosuCryptoCertificates.certList[i].cert) != 1)
|
if (SSL_CTX_use_certificate(ctx, iosuCryptoCertificates.certList[i].cert) != 1)
|
||||||
{
|
{
|
||||||
forceLog_printf("Unable to setup certificate %d", certificateId);
|
cemuLog_log(LogType::Force, "Unable to setup certificate {}", certificateId);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (SSL_CTX_use_RSAPrivateKey(ctx, iosuCryptoCertificates.certList[i].pkey) != 1)
|
if (SSL_CTX_use_RSAPrivateKey(ctx, iosuCryptoCertificates.certList[i].pkey) != 1)
|
||||||
{
|
{
|
||||||
forceLog_printf("Unable to setup certificate %d RSA private key", certificateId);
|
cemuLog_log(LogType::Force, "Unable to setup certificate {} RSA private key", certificateId);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SSL_CTX_check_private_key(ctx) == false)
|
if (SSL_CTX_check_private_key(ctx) == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("Certificate private key could not be validated (verify required files for online mode or disable online mode)");
|
cemuLog_log(LogType::Force, "Certificate private key could not be validated (verify required files for online mode or disable online mode)");
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
forceLog_printf("Certificate not found (verify required files for online mode or disable online mode)");
|
cemuLog_log(LogType::Force, "Certificate not found (verify required files for online mode or disable online mode)");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,7 +438,7 @@ bool iosuCrypto_addCustomCACertificate(void* sslctx, uint8* certData, sint32 cer
|
||||||
X509* cert = d2i_X509(NULL, (const unsigned char**)&tempPtr, certLength);
|
X509* cert = d2i_X509(NULL, (const unsigned char**)&tempPtr, certLength);
|
||||||
if (cert == nullptr)
|
if (cert == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("Invalid custom server PKI certificate");
|
cemuLog_log(LogType::Force, "Invalid custom server PKI certificate");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
X509_STORE_add_cert(store, cert);
|
X509_STORE_add_cert(store, cert);
|
||||||
|
@ -571,7 +571,7 @@ void iosuCrypto_init()
|
||||||
// verify if OTP is ok
|
// verify if OTP is ok
|
||||||
if (length != 1024) // todo - should also check some fixed values to verify integrity of otp dump
|
if (length != 1024) // todo - should also check some fixed values to verify integrity of otp dump
|
||||||
{
|
{
|
||||||
forceLog_printf("IOSU_CRYPTO: otp.bin has wrong size (must be 1024 bytes)");
|
cemuLog_log(LogType::Force, "IOSU_CRYPTO: otp.bin has wrong size (must be 1024 bytes)");
|
||||||
hasOtpMem = false;
|
hasOtpMem = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -582,7 +582,7 @@ void iosuCrypto_init()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("IOSU_CRYPTO: No otp.bin found. Online mode cannot be used");
|
cemuLog_log(LogType::Force, "IOSU_CRYPTO: No otp.bin found. Online mode cannot be used");
|
||||||
hasOtpMem = false;
|
hasOtpMem = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -170,7 +170,7 @@ namespace iosu
|
||||||
inet_pton(AF_INET, nexTokenResult.nexToken.host, &hostIp);
|
inet_pton(AF_INET, nexTokenResult.nexToken.host, &hostIp);
|
||||||
g_fpd.nexFriendSession = new NexFriends(hostIp, nexTokenResult.nexToken.port, "ridfebb9", myPid, nexTokenResult.nexToken.nexPassword, nexTokenResult.nexToken.token, accountId, (uint8*)&miiData, (wchar_t*)screenName, (uint8)countryCode, g_fpd.myPresence);
|
g_fpd.nexFriendSession = new NexFriends(hostIp, nexTokenResult.nexToken.port, "ridfebb9", myPid, nexTokenResult.nexToken.nexPassword, nexTokenResult.nexToken.token, accountId, (uint8*)&miiData, (wchar_t*)screenName, (uint8)countryCode, g_fpd.myPresence);
|
||||||
g_fpd.nexFriendSession->setNotificationHandler(notificationHandler);
|
g_fpd.nexFriendSession->setNotificationHandler(notificationHandler);
|
||||||
forceLog_printf("IOSU_FPD: Created friend server session");
|
cemuLog_log(LogType::Force, "IOSU_FPD: Created friend server session");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1047,4 +1047,4 @@ namespace iosu
|
||||||
g_fpd.isThreadStarted = true;
|
g_fpd.isThreadStarted = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,7 +108,7 @@ namespace iosu
|
||||||
uint32be titleCountBE = titleCount;
|
uint32be titleCountBE = titleCount;
|
||||||
if (mcpGetTitleList(titleList, titleCount * sizeof(MCPTitleInfo), &titleCountBE) != 0)
|
if (mcpGetTitleList(titleList, titleCount * sizeof(MCPTitleInfo), &titleCountBE) != 0)
|
||||||
{
|
{
|
||||||
forceLog_printf("IOSU: nim failed to acquire title list");
|
cemuLog_log(LogType::Force, "IOSU: nim failed to acquire title list");
|
||||||
free(titleList);
|
free(titleList);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -218,7 +218,7 @@ namespace iosu
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
memset(idbeIconOutput, 0, sizeof(NAPI::IDBEIconDataV0));
|
memset(idbeIconOutput, 0, sizeof(NAPI::IDBEIconDataV0));
|
||||||
forceLog_printf("NIM: Unable to download IDBE icon");
|
cemuLog_log(LogType::Force, "NIM: Unable to download IDBE icon");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
// add new cache entry
|
// add new cache entry
|
||||||
|
@ -249,7 +249,7 @@ namespace iosu
|
||||||
{
|
{
|
||||||
if (g_nim.backgroundThreadStarted == false)
|
if (g_nim.backgroundThreadStarted == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("IOSU: Starting nim background thread");
|
cemuLog_log(LogType::Force, "IOSU: Starting nim background thread");
|
||||||
std::thread t(nim_backgroundThread);
|
std::thread t(nim_backgroundThread);
|
||||||
t.detach();
|
t.detach();
|
||||||
g_nim.backgroundThreadStarted = true;
|
g_nim.backgroundThreadStarted = true;
|
||||||
|
|
|
@ -71,7 +71,7 @@ uint32 ELF_LoadFromMemory(uint8* elfData, sint32 size, const char* name)
|
||||||
|
|
||||||
if (shOffset > (uint32)size)
|
if (shOffset > (uint32)size)
|
||||||
{
|
{
|
||||||
forceLog_printf("ELF section %d out of bounds", i);
|
cemuLog_log(LogType::Force, "ELF section {} out of bounds", i);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
uint32 copySize = std::min(shSize, size - shOffset);
|
uint32 copySize = std::min(shSize, size - shOffset);
|
||||||
|
@ -126,4 +126,4 @@ uint32 ELF_LoadFromMemory(uint8* elfData, sint32 size, const char* name)
|
||||||
// unsigned int addr_sgIsLoadingBuffer;
|
// unsigned int addr_sgIsLoadingBuffer;
|
||||||
// unsigned int addr_gDynloadInitialized;
|
// unsigned int addr_gDynloadInitialized;
|
||||||
// unsigned int orig_LiWaitOneChunkInstr;
|
// unsigned int orig_LiWaitOneChunkInstr;
|
||||||
//} OsSpecifics;
|
//} OsSpecifics;
|
||||||
|
|
|
@ -336,7 +336,7 @@ rplSectionEntryNew_t* RPLLoader_GetSection(RPLModule* rplLoaderContext, sint32 s
|
||||||
sint32 sectionCount = rplLoaderContext->rplHeader.sectionTableEntryCount;
|
sint32 sectionCount = rplLoaderContext->rplHeader.sectionTableEntryCount;
|
||||||
if (sectionIndex < 0 || sectionIndex >= sectionCount)
|
if (sectionIndex < 0 || sectionIndex >= sectionCount)
|
||||||
{
|
{
|
||||||
forceLog_printf("RPLLoader: Section index out of bounds");
|
cemuLog_log(LogType::Force, "RPLLoader: Section index out of bounds");
|
||||||
rplLoaderContext->hasError = true;
|
rplLoaderContext->hasError = true;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -363,7 +363,7 @@ RPLUncompressedSection* RPLLoader_LoadUncompressedSection(RPLModule* rplLoaderCo
|
||||||
if (!RPLLoader_CheckBounds(rplLoaderContext, section->fileOffset, section->sectionSize))
|
if (!RPLLoader_CheckBounds(rplLoaderContext, section->fileOffset, section->sectionSize))
|
||||||
{
|
{
|
||||||
// BSS
|
// BSS
|
||||||
forceLog_printf("RPLLoader: Raw data for section %d exceeds bounds of RPL file", sectionIndex);
|
cemuLog_log(LogType::Force, "RPLLoader: Raw data for section {} exceeds bounds of RPL file", sectionIndex);
|
||||||
rplLoaderContext->hasError = true;
|
rplLoaderContext->hasError = true;
|
||||||
delete uSection;
|
delete uSection;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -375,7 +375,7 @@ RPLUncompressedSection* RPLLoader_LoadUncompressedSection(RPLModule* rplLoaderCo
|
||||||
// decompress
|
// decompress
|
||||||
if (!RPLLoader_CheckBounds(rplLoaderContext, section->fileOffset, sizeof(uint32be)) )
|
if (!RPLLoader_CheckBounds(rplLoaderContext, section->fileOffset, sizeof(uint32be)) )
|
||||||
{
|
{
|
||||||
forceLog_printf("RPLLoader: Uncompressed data of section %d is too large", sectionIndex);
|
cemuLog_log(LogType::Force, "RPLLoader: Uncompressed data of section {} is too large", sectionIndex);
|
||||||
rplLoaderContext->hasError = true;
|
rplLoaderContext->hasError = true;
|
||||||
delete uSection;
|
delete uSection;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -383,7 +383,7 @@ RPLUncompressedSection* RPLLoader_LoadUncompressedSection(RPLModule* rplLoaderCo
|
||||||
uint32 uncompressedSize = *(uint32be*)(rplLoaderContext->RPLRawData.data() + (uint32)section->fileOffset);
|
uint32 uncompressedSize = *(uint32be*)(rplLoaderContext->RPLRawData.data() + (uint32)section->fileOffset);
|
||||||
if (uncompressedSize >= 1*1024*1024*1024) // sections bigger than 1GB not allowed
|
if (uncompressedSize >= 1*1024*1024*1024) // sections bigger than 1GB not allowed
|
||||||
{
|
{
|
||||||
forceLog_printf("RPLLoader: Uncompressed data of section %d is too large", sectionIndex);
|
cemuLog_log(LogType::Force, "RPLLoader: Uncompressed data of section {} is too large", sectionIndex);
|
||||||
rplLoaderContext->hasError = true;
|
rplLoaderContext->hasError = true;
|
||||||
delete uSection;
|
delete uSection;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -405,7 +405,7 @@ RPLUncompressedSection* RPLLoader_LoadUncompressedSection(RPLModule* rplLoaderCo
|
||||||
inflateEnd(&strm);
|
inflateEnd(&strm);
|
||||||
if ((ret != Z_OK && ret != Z_STREAM_END) || strm.avail_in != 0 || strm.avail_out != 0)
|
if ((ret != Z_OK && ret != Z_STREAM_END) || strm.avail_in != 0 || strm.avail_out != 0)
|
||||||
{
|
{
|
||||||
forceLog_printf("RPLLoader: Error while inflating data for section %d", sectionIndex);
|
cemuLog_log(LogType::Force, "RPLLoader: Error while inflating data for section {}", sectionIndex);
|
||||||
rplLoaderContext->hasError = true;
|
rplLoaderContext->hasError = true;
|
||||||
delete uSection;
|
delete uSection;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -454,7 +454,7 @@ bool RPLLoader_LoadSingleSection(RPLModule* rplLoaderContext, sint32 sectionInde
|
||||||
|
|
||||||
// update size in section (todo - use separate field)
|
// update size in section (todo - use separate field)
|
||||||
if (uncompressedSection->sectionData.size() < section->sectionSize)
|
if (uncompressedSection->sectionData.size() < section->sectionSize)
|
||||||
forceLog_printf("RPLLoader: Section %d uncompresses to %d bytes but sectionSize is %d", sectionIndex, uncompressedSection->sectionData.size(), (uint32)section->sectionSize);
|
cemuLog_log(LogType::Force, "RPLLoader: Section {} uncompresses to {} bytes but sectionSize is {}", sectionIndex, uncompressedSection->sectionData.size(), (uint32)section->sectionSize);
|
||||||
|
|
||||||
section->sectionSize = uncompressedSection->sectionData.size();
|
section->sectionSize = uncompressedSection->sectionData.size();
|
||||||
|
|
||||||
|
@ -956,7 +956,7 @@ bool RPLLoader_FixImportSymbols(RPLModule* rplLoaderContext, sint32 symtabSectio
|
||||||
char* symbolName = (char*)strtabData + nameOffset;
|
char* symbolName = (char*)strtabData + nameOffset;
|
||||||
if (nameOffset >= strtabSize)
|
if (nameOffset >= strtabSize)
|
||||||
{
|
{
|
||||||
forceLog_printf("RPLLoader: Symbol %d in section %d has out-of-bounds name offset", i, symSectionIndex);
|
cemuLog_log(LogType::Force, "RPLLoader: Symbol {} in section {} has out-of-bounds name offset", i, symSectionIndex);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1287,7 +1287,7 @@ bool RPLLoader_ApplyRelocs(RPLModule* rplLoaderContext, sint32 relaSectionIndex,
|
||||||
uint32 crc = rplLoaderContext->GetSectionCRC(relaSectionIndex);
|
uint32 crc = rplLoaderContext->GetSectionCRC(relaSectionIndex);
|
||||||
if (calcCRC != crc)
|
if (calcCRC != crc)
|
||||||
{
|
{
|
||||||
forceLog_printf("RPLLoader %s - Relocation section %d has CRC mismatch - Calc: %08x Actual: %08x", rplLoaderContext->moduleName2.c_str(), relaSectionIndex, calcCRC, crc);
|
cemuLog_log(LogType::Force, "RPLLoader {} - Relocation section {} has CRC mismatch - Calc: {:08x} Actual: {:08x}", rplLoaderContext->moduleName2.c_str(), relaSectionIndex, calcCRC, crc);
|
||||||
}
|
}
|
||||||
// process relocations
|
// process relocations
|
||||||
sint32 relocCount = relocSize / sizeof(rplRelocNew_t);
|
sint32 relocCount = relocSize / sizeof(rplRelocNew_t);
|
||||||
|
@ -1664,7 +1664,7 @@ RPLModule* rpl_loadFromMem(uint8* rplData, sint32 size, char* name)
|
||||||
// cancel if error
|
// cancel if error
|
||||||
if (rpl->hasError)
|
if (rpl->hasError)
|
||||||
{
|
{
|
||||||
forceLog_printf("RPLLoader: Unable to load RPL due to errors");
|
cemuLog_log(LogType::Force, "RPLLoader: Unable to load RPL due to errors");
|
||||||
delete rpl;
|
delete rpl;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -2120,7 +2120,7 @@ void RPLLoader_LoadDependency(rplDependency_t* dependency)
|
||||||
auto fileData = FileStream::LoadIntoMemory(filePath);
|
auto fileData = FileStream::LoadIntoMemory(filePath);
|
||||||
if (fileData)
|
if (fileData)
|
||||||
{
|
{
|
||||||
forceLog_printf("Loading RPL: /cafeLibs/%s", dependency->filepath);
|
cemuLog_log(LogType::Force, "Loading RPL: /cafeLibs/{}", dependency->filepath);
|
||||||
dependency->rplLoaderContext = rpl_loadFromMem(fileData->data(), fileData->size(), dependency->filepath);
|
dependency->rplLoaderContext = rpl_loadFromMem(fileData->data(), fileData->size(), dependency->filepath);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -175,14 +175,14 @@ void coreinitExport_OSGetSharedData(PPCInterpreter_t* hCPU)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// some games require a valid result or they will crash, return a pointer to our placeholder font
|
// some games require a valid result or they will crash, return a pointer to our placeholder font
|
||||||
forceLog_printf("OSGetSharedData() called by game but no shareddata fonts loaded. Use placeholder font");
|
cemuLog_log(LogType::Force, "OSGetSharedData() called by game but no shareddata fonts loaded. Use placeholder font");
|
||||||
if (placeholderFont == MPTR_NULL)
|
if (placeholderFont == MPTR_NULL)
|
||||||
{
|
{
|
||||||
// load and then return placeholder font
|
// load and then return placeholder font
|
||||||
uint8* placeholderFontPtr = extractCafeDefaultFont(&placeholderFontSize);
|
uint8* placeholderFontPtr = extractCafeDefaultFont(&placeholderFontSize);
|
||||||
placeholderFont = coreinit_allocFromSysArea(placeholderFontSize, 256);
|
placeholderFont = coreinit_allocFromSysArea(placeholderFontSize, 256);
|
||||||
if (placeholderFont == MPTR_NULL)
|
if (placeholderFont == MPTR_NULL)
|
||||||
forceLog_printf("Failed to alloc placeholder font sys memory");
|
cemuLog_log(LogType::Force, "Failed to alloc placeholder font sys memory");
|
||||||
memcpy(memory_getPointerFromVirtualOffset(placeholderFont), placeholderFontPtr, placeholderFontSize);
|
memcpy(memory_getPointerFromVirtualOffset(placeholderFont), placeholderFontPtr, placeholderFontSize);
|
||||||
free(placeholderFontPtr);
|
free(placeholderFontPtr);
|
||||||
}
|
}
|
||||||
|
@ -204,7 +204,7 @@ typedef struct
|
||||||
void coreinitExport_OSDriver_Register(PPCInterpreter_t* hCPU)
|
void coreinitExport_OSDriver_Register(PPCInterpreter_t* hCPU)
|
||||||
{
|
{
|
||||||
#ifdef CEMU_DEBUG_ASSERT
|
#ifdef CEMU_DEBUG_ASSERT
|
||||||
forceLog_printf("OSDriver_Register(0x%08x,0x%08x,0x%08x,0x%08x,0x%08x,0x%08x)", hCPU->gpr[3], hCPU->gpr[4], hCPU->gpr[5], hCPU->gpr[6], hCPU->gpr[7], hCPU->gpr[8]);
|
cemuLog_log(LogType::Force, "OSDriver_Register(0x{:08x},0x{:08x},0x{:08x},0x{:08x},0x{:08x},0x{:08x})", hCPU->gpr[3], hCPU->gpr[4], hCPU->gpr[5], hCPU->gpr[6], hCPU->gpr[7], hCPU->gpr[8]);
|
||||||
#endif
|
#endif
|
||||||
OSDriverCallbacks_t* driverCallbacks = (OSDriverCallbacks_t*)memory_getPointerFromVirtualOffset(hCPU->gpr[5]);
|
OSDriverCallbacks_t* driverCallbacks = (OSDriverCallbacks_t*)memory_getPointerFromVirtualOffset(hCPU->gpr[5]);
|
||||||
|
|
||||||
|
@ -271,7 +271,7 @@ namespace coreinit
|
||||||
|
|
||||||
void coreinit_exit(uint32 r)
|
void coreinit_exit(uint32 r)
|
||||||
{
|
{
|
||||||
forceLog_printf("coreinit.exit(%d)", r);
|
cemuLog_log(LogType::Force, "coreinit.exit({})", r);
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
// never return
|
// never return
|
||||||
while (true) std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
while (true) std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
|
|
|
@ -129,7 +129,7 @@ namespace coreinit
|
||||||
{
|
{
|
||||||
if (!_avoidCodeGenJIT)
|
if (!_avoidCodeGenJIT)
|
||||||
{
|
{
|
||||||
forceLog_printf("Disable JIT on dynamic code area");
|
cemuLog_log(LogType::Force, "Disable JIT on dynamic code area");
|
||||||
}
|
}
|
||||||
_avoidCodeGenJIT = true; // this function getting called is usually a sign that
|
_avoidCodeGenJIT = true; // this function getting called is usually a sign that
|
||||||
// does this have a return value?
|
// does this have a return value?
|
||||||
|
@ -145,4 +145,4 @@ namespace coreinit
|
||||||
|
|
||||||
cafeExportRegister("coreinit", OSSwitchSecCodeGenMode, LogType::Placeholder);
|
cafeExportRegister("coreinit", OSSwitchSecCodeGenMode, LogType::Placeholder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -186,7 +186,7 @@ namespace coreinit
|
||||||
|
|
||||||
void __FSErrorAndBlock(std::string_view msg)
|
void __FSErrorAndBlock(std::string_view msg)
|
||||||
{
|
{
|
||||||
forceLog_printf("Critical error in FS: %s", msg.data());
|
cemuLog_log(LogType::Force, "Critical error in FS: {}", msg);
|
||||||
while (true)
|
while (true)
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
|
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
|
||||||
}
|
}
|
||||||
|
@ -513,7 +513,7 @@ namespace coreinit
|
||||||
fsCmdBlockBody->asyncResult.fsStatusNew = (uint32)result;
|
fsCmdBlockBody->asyncResult.fsStatusNew = (uint32)result;
|
||||||
while (OSSendMessage(ioMsgQueue, &fsCmdBlockBody->asyncResult.msgUnion.osMsg, 0) == 0)
|
while (OSSendMessage(ioMsgQueue, &fsCmdBlockBody->asyncResult.msgUnion.osMsg, 0) == 0)
|
||||||
{
|
{
|
||||||
forceLog_printf("FS driver: Failed to add message to result queue. Retrying...");
|
cemuLog_log(LogType::Force, "FS driver: Failed to add message to result queue. Retrying...");
|
||||||
if (ppcInterpreterCurrentInstance)
|
if (ppcInterpreterCurrentInstance)
|
||||||
PPCCore_switchToScheduler();
|
PPCCore_switchToScheduler();
|
||||||
else
|
else
|
||||||
|
@ -626,15 +626,16 @@ namespace coreinit
|
||||||
{
|
{
|
||||||
if (fsCmdBlockBody->asyncResult.msgUnion.fsMsg.commandType != _swapEndianU32(8))
|
if (fsCmdBlockBody->asyncResult.msgUnion.fsMsg.commandType != _swapEndianU32(8))
|
||||||
{
|
{
|
||||||
forceLog_printf("Corrupted FS command detected in stage %s", stage);
|
cemuLog_log(LogType::Force, "Corrupted FS command detected in stage {}", stage);
|
||||||
forceLog_printf("Printing CMD block: ");
|
cemuLog_log(LogType::Force, "Printing CMD block: ");
|
||||||
for (uint32 i = 0; i < (sizeof(FSCmdBlockBody_t) + 31) / 32; i++)
|
for (uint32 i = 0; i < (sizeof(FSCmdBlockBody_t) + 31) / 32; i++)
|
||||||
{
|
{
|
||||||
uint8* p = ((uint8*)fsCmdBlockBody) + i * 32;
|
uint8* p = ((uint8*)fsCmdBlockBody) + i * 32;
|
||||||
forceLog_printf("%04x: %02x %02x %02x %02x - %02x %02x %02x %02x - %02x %02x %02x %02x - %02x %02x %02x %02x | %02x %02x %02x %02x - %02x %02x %02x %02x - %02x %02x %02x %02x - %02x %02x %02x %02x",
|
cemuLog_log(LogType::Force, "{:04x}: {:02x} {:02x} {:02x} {:02x} - {:02x} {:02x} {:02x} {:02x} - {:02x} {:02x} {:02x} {:02x} - {:02x} {:02x} {:02x} {:02x} | {:02x} {:02x} {:02x} {:02x} - {:02x} {:02x} {:02x} {:02x} - {:02x} {:02x} {:02x} {:02x} - {:02x} {:02x} {:02x} {:02x}",
|
||||||
i * 32,
|
i * 32,
|
||||||
p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15],
|
p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15],
|
||||||
p[16], p[17], p[18], p[19], p[20], p[21], p[22], p[23], p[24], p[25], p[26], p[27], p[28], p[29], p[30], p[31]);
|
p[16], p[17], p[18], p[19], p[20], p[21], p[22], p[23], p[24], p[25], p[26], p[27], p[28], p[29], p[30], p[31]);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -659,7 +660,7 @@ namespace coreinit
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// todo - error handling
|
// todo - error handling
|
||||||
forceLog_printf("FS handleAsyncResult(): unexpected error %08x", errHandling);
|
cemuLog_log(LogType::Force, "FS handleAsyncResult(): unexpected error {:08x}", errHandling);
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,7 +86,7 @@ namespace coreinit
|
||||||
}
|
}
|
||||||
if (mutexIndex == -1)
|
if (mutexIndex == -1)
|
||||||
{
|
{
|
||||||
forceLog_printf("__ghs_flock_create(): No flock available");
|
cemuLog_log(LogType::Force, "__ghs_flock_create(): No flock available");
|
||||||
cemu_assert(false); // no available mutex
|
cemu_assert(false); // no available mutex
|
||||||
}
|
}
|
||||||
// mark mutex as reserved
|
// mark mutex as reserved
|
||||||
|
@ -282,4 +282,4 @@ namespace coreinit
|
||||||
|
|
||||||
cafeExportRegister("coreinit", __tls_get_addr, LogType::Placeholder);
|
cafeExportRegister("coreinit", __tls_get_addr, LogType::Placeholder);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -100,7 +100,7 @@ namespace coreinit
|
||||||
{
|
{
|
||||||
// out of bounds
|
// out of bounds
|
||||||
#ifdef CEMU_DEBUG_ASSERT
|
#ifdef CEMU_DEBUG_ASSERT
|
||||||
forceLog_printf("LCDealloc(): Out of bounds");
|
cemuLog_log(LogType::Force, "LCDealloc(): Out of bounds");
|
||||||
#endif
|
#endif
|
||||||
osLib_returnFromFunction(hCPU, 0);
|
osLib_returnFromFunction(hCPU, 0);
|
||||||
return;
|
return;
|
||||||
|
@ -209,7 +209,7 @@ namespace coreinit
|
||||||
{
|
{
|
||||||
if (_lcDisableErrorCounter < 15)
|
if (_lcDisableErrorCounter < 15)
|
||||||
{
|
{
|
||||||
forceLog_printf("LC disabled but there is still memory allocated");
|
cemuLog_log(LogType::Force, "LC disabled but there is still memory allocated");
|
||||||
_lcDisableErrorCounter++;
|
_lcDisableErrorCounter++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -154,7 +154,7 @@ void coreinitExport_MCP_GetTitleInfo(PPCInterpreter_t* hCPU)
|
||||||
|
|
||||||
if (mcpRequest->titleListRequest.titleCount == 0)
|
if (mcpRequest->titleListRequest.titleCount == 0)
|
||||||
{
|
{
|
||||||
forceLog_printf("MCP_GetTitleInfo() failed to get title info");
|
cemuLog_log(LogType::Force, "MCP_GetTitleInfo() failed to get title info");
|
||||||
}
|
}
|
||||||
|
|
||||||
osLib_returnFromFunction(hCPU, mcpRequest->returnCode);
|
osLib_returnFromFunction(hCPU, mcpRequest->returnCode);
|
||||||
|
@ -558,4 +558,4 @@ void coreinitExport_UCReadSysConfig(PPCInterpreter_t* hCPU)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
osLib_returnFromFunction(hCPU, 0); // 0 -> success
|
osLib_returnFromFunction(hCPU, 0); // 0 -> success
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ MPTR coreinit_allocFromSysArea(uint32 size, uint32 alignment)
|
||||||
sysAreaAllocatorOffset += (size+3)&~3;
|
sysAreaAllocatorOffset += (size+3)&~3;
|
||||||
if( sysAreaAllocatorOffset >= mmuRange_CEMU_AREA.getSize() )
|
if( sysAreaAllocatorOffset >= mmuRange_CEMU_AREA.getSize() )
|
||||||
{
|
{
|
||||||
forceLog_printf("Ran out of system memory");
|
cemuLog_log(LogType::Force, "Ran out of system memory");
|
||||||
cemu_assert(false); // out of bounds
|
cemu_assert(false); // out of bounds
|
||||||
}
|
}
|
||||||
s_allocator_mutex.unlock();
|
s_allocator_mutex.unlock();
|
||||||
|
@ -645,4 +645,4 @@ namespace coreinit
|
||||||
cafeExportRegister("coreinit", MEMGetPrevListObject, LogType::CoreinitMem);
|
cafeExportRegister("coreinit", MEMGetPrevListObject, LogType::CoreinitMem);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -236,7 +236,7 @@ namespace coreinit
|
||||||
blockHeapHead->nextFreeBlock = _swapEndianU32(nextFreeBlockMPTR);
|
blockHeapHead->nextFreeBlock = _swapEndianU32(nextFreeBlockMPTR);
|
||||||
if (_swapEndianU32(blockHeapHead->freeBlocksLeft) == 0)
|
if (_swapEndianU32(blockHeapHead->freeBlocksLeft) == 0)
|
||||||
{
|
{
|
||||||
forceLog_printf("BlockHeap: No free blocks left\n");
|
cemuLog_log(LogType::Force, "BlockHeap: No free blocks left");
|
||||||
assert_dbg();
|
assert_dbg();
|
||||||
}
|
}
|
||||||
blockHeapHead->freeBlocksLeft = _swapEndianU32(_swapEndianU32(blockHeapHead->freeBlocksLeft) - 1);
|
blockHeapHead->freeBlocksLeft = _swapEndianU32(_swapEndianU32(blockHeapHead->freeBlocksLeft) - 1);
|
||||||
|
|
|
@ -452,7 +452,7 @@ void* MEMAllocFromExpHeapEx(MEMHeapHandle heap, uint32 size, sint32 alignment)
|
||||||
if (alignment == 0)
|
if (alignment == 0)
|
||||||
{
|
{
|
||||||
// this is a guaranteed crash on the actual console
|
// this is a guaranteed crash on the actual console
|
||||||
forceLog_printf("MEMAllocFromExpHeapEx(): Alignment 0 not allowed");
|
cemuLog_log(LogType::Force, "MEMAllocFromExpHeapEx(): Alignment 0 not allowed");
|
||||||
alignment = 4;
|
alignment = 4;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -550,7 +550,7 @@ namespace coreinit
|
||||||
if (fastMutex->owner != currentThread)
|
if (fastMutex->owner != currentThread)
|
||||||
{
|
{
|
||||||
// seen in Paper Mario Color Splash
|
// seen in Paper Mario Color Splash
|
||||||
//forceLog_printf("OSFastMutex_Unlock() called on mutex which is not owned by current thread");
|
//cemuLog_log(LogType::Force, "OSFastMutex_Unlock() called on mutex which is not owned by current thread");
|
||||||
_OSFastMutex_ReleaseContention(fastMutex);
|
_OSFastMutex_ReleaseContention(fastMutex);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -238,7 +238,7 @@ namespace coreinit
|
||||||
{
|
{
|
||||||
// workaround for games that restart threads to quickly
|
// workaround for games that restart threads to quickly
|
||||||
// seen in Fast Racing Neo at boot (0x020617BC OSCreateThread)
|
// seen in Fast Racing Neo at boot (0x020617BC OSCreateThread)
|
||||||
forceLog_printf("Game attempting to re-initialize existing thread");
|
cemuLog_log(LogType::Force, "Game attempting to re-initialize existing thread");
|
||||||
while ((thread->state == OSThread_t::THREAD_STATE::STATE_READY || thread->state == OSThread_t::THREAD_STATE::STATE_RUNNING) && thread->suspendCounter == 0)
|
while ((thread->state == OSThread_t::THREAD_STATE::STATE_READY || thread->state == OSThread_t::THREAD_STATE::STATE_RUNNING) && thread->suspendCounter == 0)
|
||||||
{
|
{
|
||||||
// wait for thread to finish
|
// wait for thread to finish
|
||||||
|
@ -248,7 +248,7 @@ namespace coreinit
|
||||||
}
|
}
|
||||||
if (__OSIsThreadActive(thread) && thread->state == OSThread_t::THREAD_STATE::STATE_MORIBUND)
|
if (__OSIsThreadActive(thread) && thread->state == OSThread_t::THREAD_STATE::STATE_MORIBUND)
|
||||||
{
|
{
|
||||||
forceLog_printf("Calling OSCreateThread() on thread which is still active (Thread exited without detached flag). Forcing OSDetachThread()...");
|
cemuLog_log(LogType::Force, "Calling OSCreateThread() on thread which is still active (Thread exited without detached flag). Forcing OSDetachThread()...");
|
||||||
__OSUnlockScheduler();
|
__OSUnlockScheduler();
|
||||||
OSDetachThread(thread);
|
OSDetachThread(thread);
|
||||||
__OSLockScheduler();
|
__OSLockScheduler();
|
||||||
|
|
|
@ -282,7 +282,7 @@ namespace GX2
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("GX2PatchDisplayList(): unsupported patchType %d", (uint32)patchType);
|
cemuLog_log(LogType::Force, "GX2PatchDisplayList(): unsupported patchType {}", (uint32)patchType);
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -305,4 +305,4 @@ namespace GX2
|
||||||
cafeExportRegister("gx2", GX2PatchDisplayList, LogType::GX2);
|
cafeExportRegister("gx2", GX2PatchDisplayList, LogType::GX2);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,7 +133,7 @@ namespace GX2
|
||||||
{
|
{
|
||||||
if ((size_t)eventType >= GX2CallbackEventTypeCount)
|
if ((size_t)eventType >= GX2CallbackEventTypeCount)
|
||||||
{
|
{
|
||||||
forceLog_printf("GX2SetEventCallback(): Unknown eventType\n");
|
cemuLog_log(LogType::Force, "GX2SetEventCallback(): Unknown eventType");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
s_eventCallback[(size_t)eventType].callbackFuncPtr = callbackFuncPtr;
|
s_eventCallback[(size_t)eventType].callbackFuncPtr = callbackFuncPtr;
|
||||||
|
@ -144,7 +144,7 @@ namespace GX2
|
||||||
{
|
{
|
||||||
if ((size_t)eventType >= GX2CallbackEventTypeCount)
|
if ((size_t)eventType >= GX2CallbackEventTypeCount)
|
||||||
{
|
{
|
||||||
forceLog_printf("GX2GetEventCallback(): Unknown eventType\n");
|
cemuLog_log(LogType::Force, "GX2GetEventCallback(): Unknown eventType");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (callbackFuncPtrOut)
|
if (callbackFuncPtrOut)
|
||||||
|
@ -308,4 +308,4 @@ namespace GX2
|
||||||
coreinit::OSInitEvent(s_updateRetirementEvent, coreinit::OSEvent::EVENT_STATE::STATE_NOT_SIGNALED, coreinit::OSEvent::EVENT_MODE::MODE_AUTO);
|
coreinit::OSInitEvent(s_updateRetirementEvent, coreinit::OSEvent::EVENT_STATE::STATE_NOT_SIGNALED, coreinit::OSEvent::EVENT_MODE::MODE_AUTO);
|
||||||
coreinit::OSInitSemaphore(s_eventCbQueueSemaphore, 0);
|
coreinit::OSInitSemaphore(s_eventCbQueueSemaphore, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ void gx2Export_GX2SetSwapInterval(PPCInterpreter_t* hCPU)
|
||||||
gx2Log_printf("GX2SetSwapInterval(%d)\n", hCPU->gpr[3]);
|
gx2Log_printf("GX2SetSwapInterval(%d)\n", hCPU->gpr[3]);
|
||||||
if( hCPU->gpr[3] >= 20 )
|
if( hCPU->gpr[3] >= 20 )
|
||||||
{
|
{
|
||||||
forceLog_printf("GX2SetSwapInterval() called with out of range value (%d)\n", hCPU->gpr[3]);
|
cemuLog_log(LogType::Force, "GX2SetSwapInterval() called with out of range value ({})", hCPU->gpr[3]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LatteGPUState.sharedArea->swapInterval = hCPU->gpr[3];
|
LatteGPUState.sharedArea->swapInterval = hCPU->gpr[3];
|
||||||
|
|
|
@ -577,7 +577,7 @@ namespace H264
|
||||||
WORD32 status = ih264d_api_function(m_codecCtx, &s_dec_ip, &s_dec_op);
|
WORD32 status = ih264d_api_function(m_codecCtx, &s_dec_ip, &s_dec_op);
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
{
|
{
|
||||||
forceLog_printf("H264: Unable to determine buffer sizes for stream");
|
cemuLog_log(LogType::Force, "H264: Unable to determine buffer sizes for stream");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
numByteConsumed = s_dec_op.u4_num_bytes_consumed;
|
numByteConsumed = s_dec_op.u4_num_bytes_consumed;
|
||||||
|
|
|
@ -167,7 +167,7 @@ void micExport_MICInit(PPCInterpreter_t* hCPU)
|
||||||
}
|
}
|
||||||
catch (std::runtime_error& ex)
|
catch (std::runtime_error& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't initialize audio input: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't initialize audio input: {}", ex.what());
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -467,4 +467,4 @@ namespace mic
|
||||||
osLib_addFunction("mic", "MICSetState", micExport_MICSetState);
|
osLib_addFunction("mic", "MICSetState", micExport_MICSetState);
|
||||||
osLib_addFunction("mic", "MICSetDataConsumed", micExport_MICSetDataConsumed);
|
osLib_addFunction("mic", "MICSetDataConsumed", micExport_MICSetDataConsumed);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1497,7 +1497,7 @@ void nnBossNsDataExport_DeleteRealFileWithHistory(PPCInterpreter_t* hCPU)
|
||||||
if (nsData->storage.storageKind == nn::boss::kStorageKind_NBDL)
|
if (nsData->storage.storageKind == nn::boss::kStorageKind_NBDL)
|
||||||
{
|
{
|
||||||
// todo
|
// todo
|
||||||
forceLog_printf("BOSS NBDL: Unsupported delete");
|
cemuLog_log(LogType::Force, "BOSS NBDL: Unsupported delete");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1505,7 +1505,7 @@ void nnBossNsDataExport_DeleteRealFileWithHistory(PPCInterpreter_t* hCPU)
|
||||||
std::string filePath = nnBossNsDataExport_GetPath(nsData).c_str();
|
std::string filePath = nnBossNsDataExport_GetPath(nsData).c_str();
|
||||||
fsc_remove((char*)filePath.c_str(), &fscStatus);
|
fsc_remove((char*)filePath.c_str(), &fscStatus);
|
||||||
if (fscStatus != 0)
|
if (fscStatus != 0)
|
||||||
forceLog_printf("Unhandeled FSC status in BOSS DeleteRealFileWithHistory()");
|
cemuLog_log(LogType::Force, "Unhandeled FSC status in BOSS DeleteRealFileWithHistory()");
|
||||||
}
|
}
|
||||||
osLib_returnFromFunction(hCPU, 0);
|
osLib_returnFromFunction(hCPU, 0);
|
||||||
}
|
}
|
||||||
|
@ -1551,7 +1551,7 @@ void nnBossNsDataExport_getSize(PPCInterpreter_t* hCPU)
|
||||||
bossStorageFadEntry_t fadEntry;
|
bossStorageFadEntry_t fadEntry;
|
||||||
if (nnBossStorageFad_getEntryByName(&nsData->storage, nsData->name, &fadEntry) == false)
|
if (nnBossStorageFad_getEntryByName(&nsData->storage, nsData->name, &fadEntry) == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("BOSS storage cant find file %s", nsData->name);
|
cemuLog_log(LogType::Force, "BOSS storage cant find file {}", nsData->name);
|
||||||
osLib_returnFromFunction(hCPU, 0);
|
osLib_returnFromFunction(hCPU, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1566,7 +1566,7 @@ void nnBossNsDataExport_getSize(PPCInterpreter_t* hCPU)
|
||||||
|
|
||||||
if (fscStorageFile == nullptr)
|
if (fscStorageFile == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("BOSS storage cant open file alias %s", nsData->name);
|
cemuLog_log(LogType::Force, "BOSS storage cant open file alias {}", nsData->name);
|
||||||
osLib_returnFromFunction(hCPU, 0);
|
osLib_returnFromFunction(hCPU, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1586,7 +1586,7 @@ uint32 nnBossNsData_read(nsData_t* nsData, uint64* sizeOutBE, void* buffer, sint
|
||||||
bossStorageFadEntry_t fadEntry;
|
bossStorageFadEntry_t fadEntry;
|
||||||
if (nnBossStorageFad_getEntryByName(&nsData->storage, nsData->name, &fadEntry) == false)
|
if (nnBossStorageFad_getEntryByName(&nsData->storage, nsData->name, &fadEntry) == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("BOSS storage cant find file %s for reading", nsData->name);
|
cemuLog_log(LogType::Force, "BOSS storage cant find file {} for reading", nsData->name);
|
||||||
return 0x80000000; // todo - proper error code
|
return 0x80000000; // todo - proper error code
|
||||||
}
|
}
|
||||||
// open file
|
// open file
|
||||||
|
@ -1600,7 +1600,7 @@ uint32 nnBossNsData_read(nsData_t* nsData, uint64* sizeOutBE, void* buffer, sint
|
||||||
|
|
||||||
if (!fscStorageFile)
|
if (!fscStorageFile)
|
||||||
{
|
{
|
||||||
forceLog_printf("BOSS storage cant open file alias %s for reading", nsData->name);
|
cemuLog_log(LogType::Force, "BOSS storage cant open file alias {} for reading", nsData->name);
|
||||||
return 0x80000000; // todo - proper error code
|
return 0x80000000; // todo - proper error code
|
||||||
}
|
}
|
||||||
// get size
|
// get size
|
||||||
|
@ -1635,7 +1635,7 @@ uint32 nnBossNsData_seek(nsData_t* nsData, uint64 seek, uint32 mode)
|
||||||
bossStorageFadEntry_t fadEntry;
|
bossStorageFadEntry_t fadEntry;
|
||||||
if (nnBossStorageFad_getEntryByName(&nsData->storage, nsData->name, &fadEntry) == false)
|
if (nnBossStorageFad_getEntryByName(&nsData->storage, nsData->name, &fadEntry) == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("BOSS storage cant find file %s for reading", nsData->name);
|
cemuLog_log(LogType::Force, "BOSS storage cant find file {} for reading", nsData->name);
|
||||||
return 0x80000000; // todo - proper error code
|
return 0x80000000; // todo - proper error code
|
||||||
}
|
}
|
||||||
// open file
|
// open file
|
||||||
|
@ -1649,7 +1649,7 @@ uint32 nnBossNsData_seek(nsData_t* nsData, uint64 seek, uint32 mode)
|
||||||
|
|
||||||
if (fscStorageFile == nullptr)
|
if (fscStorageFile == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("BOSS storage cant open file alias %s for reading", nsData->name);
|
cemuLog_log(LogType::Force, "BOSS storage cant open file alias {} for reading", nsData->name);
|
||||||
return 0x80000000; // todo - proper error code
|
return 0x80000000; // todo - proper error code
|
||||||
}
|
}
|
||||||
// get size
|
// get size
|
||||||
|
@ -1801,4 +1801,4 @@ void nnBoss_load()
|
||||||
osLib_addFunction("nn_boss", "Read__Q3_2nn4boss6NsDataFPLPvUi", nnBossNsDataExport_readWithSizeOut);
|
osLib_addFunction("nn_boss", "Read__Q3_2nn4boss6NsDataFPLPvUi", nnBossNsDataExport_readWithSizeOut);
|
||||||
osLib_addFunction("nn_boss", "Seek__Q3_2nn4boss6NsDataFLQ3_2nn4boss12PositionBase", nnBossNsDataExport_seek);
|
osLib_addFunction("nn_boss", "Seek__Q3_2nn4boss6NsDataFLQ3_2nn4boss12PositionBase", nnBossNsDataExport_seek);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -473,7 +473,7 @@ namespace nn
|
||||||
}
|
}
|
||||||
if (joinFlagMask == 0x65 || joinFlagMask == 0x66)
|
if (joinFlagMask == 0x65 || joinFlagMask == 0x66)
|
||||||
{
|
{
|
||||||
forceLog_printf("Unsupported friend invite");
|
cemuLog_log(LogType::Force, "Unsupported friend invite");
|
||||||
}
|
}
|
||||||
|
|
||||||
osLib_returnFromFunction(hCPU, 0);
|
osLib_returnFromFunction(hCPU, 0);
|
||||||
|
|
|
@ -89,12 +89,12 @@ namespace nn
|
||||||
nnIdbeHeader_t* idbeHeader = (nnIdbeHeader_t*)iconInput;
|
nnIdbeHeader_t* idbeHeader = (nnIdbeHeader_t*)iconInput;
|
||||||
if (idbeHeader->formatVersion != 0)
|
if (idbeHeader->formatVersion != 0)
|
||||||
{
|
{
|
||||||
forceLog_printf("idbe header version unknown (%d)", (sint32)idbeHeader->formatVersion);
|
cemuLog_log(LogType::Force, "idbe header version unknown ({})", (sint32)idbeHeader->formatVersion);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (idbeHeader->keyIndex >= 4)
|
if (idbeHeader->keyIndex >= 4)
|
||||||
{
|
{
|
||||||
forceLog_printf("idbe header key count invalid (%d)", (sint32)idbeHeader->keyIndex);
|
cemuLog_log(LogType::Force, "idbe header key count invalid ({})", (sint32)idbeHeader->keyIndex);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// decrypt data
|
// decrypt data
|
||||||
|
@ -175,4 +175,4 @@ namespace nn
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -214,9 +214,9 @@ void amiiboDecrypt()
|
||||||
bool isValidTagHMAC = memcmp(nfp_data.amiiboNFCData.tagHMAC, nfp_data.amiiboInternal.tagHMAC, 32) == 0;
|
bool isValidTagHMAC = memcmp(nfp_data.amiiboNFCData.tagHMAC, nfp_data.amiiboInternal.tagHMAC, 32) == 0;
|
||||||
bool isValidDataHMAC = memcmp(nfp_data.amiiboNFCData.dataHMAC, nfp_data.amiiboInternal.dataHMAC, 32) == 0;
|
bool isValidDataHMAC = memcmp(nfp_data.amiiboNFCData.dataHMAC, nfp_data.amiiboInternal.dataHMAC, 32) == 0;
|
||||||
if (!isValidTagHMAC)
|
if (!isValidTagHMAC)
|
||||||
forceLog_printf("Decrypt amiibo has invalid tag HMAC");
|
cemuLog_log(LogType::Force, "Decrypt amiibo has invalid tag HMAC");
|
||||||
if (!isValidDataHMAC)
|
if (!isValidDataHMAC)
|
||||||
forceLog_printf("Decrypt amiibo has invalid data HMAC");
|
cemuLog_log(LogType::Force, "Decrypt amiibo has invalid data HMAC");
|
||||||
nfp_data.hasInvalidHMAC = !isValidTagHMAC || !isValidDataHMAC;
|
nfp_data.hasInvalidHMAC = !isValidTagHMAC || !isValidDataHMAC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -667,7 +667,7 @@ void nnNfpExport_CreateApplicationArea(PPCInterpreter_t* hCPU)
|
||||||
// this API forces a flush (unsure, but without this data written by Smash doesn't stick)
|
// this API forces a flush (unsure, but without this data written by Smash doesn't stick)
|
||||||
if (!nnNfp_writeCurrentAmiibo())
|
if (!nnNfp_writeCurrentAmiibo())
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to write Amiibo file data when trying to remove appArea");
|
cemuLog_log(LogType::Force, "Failed to write Amiibo file data when trying to remove appArea");
|
||||||
osLib_returnFromFunction(hCPU, BUILD_NN_RESULT(NN_RESULT_LEVEL_STATUS, NN_RESULT_MODULE_NN_NFP, 0));
|
osLib_returnFromFunction(hCPU, BUILD_NN_RESULT(NN_RESULT_LEVEL_STATUS, NN_RESULT_MODULE_NN_NFP, 0));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -697,7 +697,7 @@ void nnNfpExport_DeleteApplicationArea(PPCInterpreter_t* hCPU)
|
||||||
// this API forces a flush
|
// this API forces a flush
|
||||||
if (!nnNfp_writeCurrentAmiibo())
|
if (!nnNfp_writeCurrentAmiibo())
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to write Amiibo file data when trying to remove appArea");
|
cemuLog_log(LogType::Force, "Failed to write Amiibo file data when trying to remove appArea");
|
||||||
osLib_returnFromFunction(hCPU, BUILD_NN_RESULT(NN_RESULT_LEVEL_STATUS, NN_RESULT_MODULE_NN_NFP, 0));
|
osLib_returnFromFunction(hCPU, BUILD_NN_RESULT(NN_RESULT_LEVEL_STATUS, NN_RESULT_MODULE_NN_NFP, 0));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -712,14 +712,14 @@ void nnNfpExport_Flush(PPCInterpreter_t* hCPU)
|
||||||
// write Amiibo data
|
// write Amiibo data
|
||||||
if (nfp_data.isReadOnly)
|
if (nfp_data.isReadOnly)
|
||||||
{
|
{
|
||||||
forceLog_printf("Cannot write to Amiibo when it is mounted in read-only mode");
|
cemuLog_log(LogType::Force, "Cannot write to Amiibo when it is mounted in read-only mode");
|
||||||
osLib_returnFromFunction(hCPU, BUILD_NN_RESULT(NN_RESULT_LEVEL_STATUS, NN_RESULT_MODULE_NN_NFP, 0));
|
osLib_returnFromFunction(hCPU, BUILD_NN_RESULT(NN_RESULT_LEVEL_STATUS, NN_RESULT_MODULE_NN_NFP, 0));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nnNfp_writeCurrentAmiibo())
|
if (!nnNfp_writeCurrentAmiibo())
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to write Amiibo data");
|
cemuLog_log(LogType::Force, "Failed to write Amiibo data");
|
||||||
osLib_returnFromFunction(hCPU, BUILD_NN_RESULT(NN_RESULT_LEVEL_STATUS, NN_RESULT_MODULE_NN_NFP, 0));
|
osLib_returnFromFunction(hCPU, BUILD_NN_RESULT(NN_RESULT_LEVEL_STATUS, NN_RESULT_MODULE_NN_NFP, 0));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -837,7 +837,7 @@ bool nnNfp_touchNfcTagFromFile(const wchar_t* filePath, uint32* nfcError)
|
||||||
|
|
||||||
if (serialCheckByte0 != bcc0 || serialCheckByte1 != bcc1)
|
if (serialCheckByte0 != bcc0 || serialCheckByte1 != bcc1)
|
||||||
{
|
{
|
||||||
forceLog_printf("nn_nfp: Mismatch in serial checksum of scanned NFC tag");
|
cemuLog_log(LogType::Force, "nn_nfp: Mismatch in serial checksum of scanned NFC tag");
|
||||||
}
|
}
|
||||||
nfp_data.amiiboProcessedData.uidLength = 7;
|
nfp_data.amiiboProcessedData.uidLength = 7;
|
||||||
memcpy(nfp_data.amiiboProcessedData.uid, serialNumber, 7);
|
memcpy(nfp_data.amiiboProcessedData.uid, serialNumber, 7);
|
||||||
|
|
|
@ -205,7 +205,7 @@ namespace nn
|
||||||
|
|
||||||
uint32 UploadPostDataByPostApp(void *postParam)
|
uint32 UploadPostDataByPostApp(void *postParam)
|
||||||
{
|
{
|
||||||
forceLog_printf("UploadPostDataByPostApp() called. Returning error");
|
cemuLog_log(LogType::Force, "UploadPostDataByPostApp() called. Returning error");
|
||||||
return BUILD_NN_RESULT(NN_RESULT_LEVEL_STATUS, NN_RESULT_MODULE_NN_OLV, 0); // undefined error
|
return BUILD_NN_RESULT(NN_RESULT_LEVEL_STATUS, NN_RESULT_MODULE_NN_OLV, 0); // undefined error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,4 +226,4 @@ namespace nn
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,7 +165,7 @@ namespace nsyshid
|
||||||
HIDDevice_t* hidDevice = getFreeDevice();
|
HIDDevice_t* hidDevice = getFreeDevice();
|
||||||
if (hidDevice == nullptr)
|
if (hidDevice == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("HID: Maximum number of supported devices exceeded");
|
cemuLog_log(LogType::Force, "HID: Maximum number of supported devices exceeded");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,12 +194,12 @@ namespace nsyshid
|
||||||
}
|
}
|
||||||
if (maxPacketInputLength <= 0 || maxPacketInputLength >= 0xF000)
|
if (maxPacketInputLength <= 0 || maxPacketInputLength >= 0xF000)
|
||||||
{
|
{
|
||||||
forceLog_printf("HID: Input packet length not available or out of range (length = %d)", maxPacketInputLength);
|
cemuLog_log(LogType::Force, "HID: Input packet length not available or out of range (length = {})", maxPacketInputLength);
|
||||||
maxPacketInputLength = 0x20;
|
maxPacketInputLength = 0x20;
|
||||||
}
|
}
|
||||||
if (maxPacketOutputLength <= 0 || maxPacketOutputLength >= 0xF000)
|
if (maxPacketOutputLength <= 0 || maxPacketOutputLength >= 0xF000)
|
||||||
{
|
{
|
||||||
forceLog_printf("HID: Output packet length not available or out of range (length = %d)", maxPacketOutputLength);
|
cemuLog_log(LogType::Force, "HID: Output packet length not available or out of range (length = {})", maxPacketOutputLength);
|
||||||
maxPacketOutputLength = 0x20;
|
maxPacketOutputLength = 0x20;
|
||||||
}
|
}
|
||||||
// setup HIDDevice struct
|
// setup HIDDevice struct
|
||||||
|
@ -487,7 +487,7 @@ namespace nsyshid
|
||||||
retryCount++;
|
retryCount++;
|
||||||
if (retryCount >= 40)
|
if (retryCount >= 40)
|
||||||
{
|
{
|
||||||
forceLog_printf("HID async SetReport failed");
|
cemuLog_log(LogType::Force, "HID async SetReport failed");
|
||||||
sint32 errorCode = -1;
|
sint32 errorCode = -1;
|
||||||
doHIDTransferCallback(callbackFuncMPTR, callbackParamMPTR, hidDeviceInfo->handle, errorCode, memory_getVirtualOffsetFromPointer(originalData), 0);
|
doHIDTransferCallback(callbackFuncMPTR, callbackParamMPTR, hidDeviceInfo->handle, errorCode, memory_getVirtualOffsetFromPointer(originalData), 0);
|
||||||
free(reportData);
|
free(reportData);
|
||||||
|
@ -545,7 +545,7 @@ namespace nsyshid
|
||||||
HIDDeviceInfo_t* hidDeviceInfo = getHIDDeviceInfoByHandle(hidHandle, true);
|
HIDDeviceInfo_t* hidDeviceInfo = getHIDDeviceInfoByHandle(hidHandle, true);
|
||||||
if (hidDeviceInfo == nullptr)
|
if (hidDeviceInfo == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("nsyshid.HIDSetReport(): Unable to find device with hid handle %d", hidHandle);
|
cemuLog_log(LogType::Force, "nsyshid.HIDSetReport(): Unable to find device with hid handle {}", hidHandle);
|
||||||
osLib_returnFromFunction(hCPU, -1);
|
osLib_returnFromFunction(hCPU, -1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -641,7 +641,7 @@ namespace nsyshid
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed HID read");
|
cemuLog_log(LogType::Force, "Failed HID read");
|
||||||
returnCode = -1;
|
returnCode = -1;
|
||||||
}
|
}
|
||||||
free(tempBuffer);
|
free(tempBuffer);
|
||||||
|
@ -677,7 +677,7 @@ namespace nsyshid
|
||||||
HIDDeviceInfo_t* hidDeviceInfo = getHIDDeviceInfoByHandle(hidHandle, true);
|
HIDDeviceInfo_t* hidDeviceInfo = getHIDDeviceInfoByHandle(hidHandle, true);
|
||||||
if (hidDeviceInfo == nullptr)
|
if (hidDeviceInfo == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("nsyshid.HIDRead(): Unable to find device with hid handle %d", hidHandle);
|
cemuLog_log(LogType::Force, "nsyshid.HIDRead(): Unable to find device with hid handle {}", hidHandle);
|
||||||
osLib_returnFromFunction(hCPU, -1);
|
osLib_returnFromFunction(hCPU, -1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -776,7 +776,7 @@ namespace nsyshid
|
||||||
HIDDeviceInfo_t* hidDeviceInfo = getHIDDeviceInfoByHandle(hidHandle, true);
|
HIDDeviceInfo_t* hidDeviceInfo = getHIDDeviceInfoByHandle(hidHandle, true);
|
||||||
if (hidDeviceInfo == nullptr)
|
if (hidDeviceInfo == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("nsyshid.HIDWrite(): Unable to find device with hid handle %d", hidHandle);
|
cemuLog_log(LogType::Force, "nsyshid.HIDWrite(): Unable to find device with hid handle {}", hidHandle);
|
||||||
osLib_returnFromFunction(hCPU, -1);
|
osLib_returnFromFunction(hCPU, -1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -841,4 +841,4 @@ namespace nsyshid
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -695,7 +695,7 @@ void nsysnetExport_inet_pton(PPCInterpreter_t* hCPU)
|
||||||
|
|
||||||
if (af != 2)
|
if (af != 2)
|
||||||
{
|
{
|
||||||
forceLog_printf("inet_pton() only supports AF_INET");
|
cemuLog_log(LogType::Force, "inet_pton() only supports AF_INET");
|
||||||
osLib_returnFromFunction(hCPU, 0);
|
osLib_returnFromFunction(hCPU, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -848,7 +848,7 @@ void nsysnetExport_accept(PPCInterpreter_t* hCPU)
|
||||||
|
|
||||||
if (memory_readU32(lenMPTR) != 16)
|
if (memory_readU32(lenMPTR) != 16)
|
||||||
{
|
{
|
||||||
forceLog_printf("invalid sockaddr len in accept()");
|
cemuLog_log(LogType::Force, "invalid sockaddr len in accept()");
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
osLib_returnFromFunction(hCPU, 0);
|
osLib_returnFromFunction(hCPU, 0);
|
||||||
return;
|
return;
|
||||||
|
@ -873,7 +873,7 @@ void nsysnetExport_accept(PPCInterpreter_t* hCPU)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// blocking accept is not supported yet
|
// blocking accept is not supported yet
|
||||||
forceLog_printf("blocking accept() not supported");
|
cemuLog_log(LogType::Force, "blocking accept() not supported");
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -901,7 +901,7 @@ void nsysnetExport_connect(PPCInterpreter_t* hCPU)
|
||||||
hostAddr.sa_family = _swapEndianU16(addr->sa_family);
|
hostAddr.sa_family = _swapEndianU16(addr->sa_family);
|
||||||
memcpy(hostAddr.sa_data, addr->sa_data, 14);
|
memcpy(hostAddr.sa_data, addr->sa_data, 14);
|
||||||
sint32 hr = connect(vs->s, &hostAddr, sizeof(sockaddr));
|
sint32 hr = connect(vs->s, &hostAddr, sizeof(sockaddr));
|
||||||
forceLog_printf("Attempt connect to %d.%d.%d.%d:%d", (sint32)(uint8)hostAddr.sa_data[2], (sint32)(uint8)hostAddr.sa_data[3], (sint32)(uint8)hostAddr.sa_data[4], (sint32)(uint8)hostAddr.sa_data[5], _swapEndianU16(*(uint16*)hostAddr.sa_data+0));
|
cemuLog_log(LogType::Force, "Attempt connect to {}.{}.{}.{}:{}", (sint32)(uint8)hostAddr.sa_data[2], (sint32)(uint8)hostAddr.sa_data[3], (sint32)(uint8)hostAddr.sa_data[4], (sint32)(uint8)hostAddr.sa_data[5], _swapEndianU16(*(uint16*)hostAddr.sa_data+0));
|
||||||
|
|
||||||
r = _translateError(hr, GETLASTERR, _ERROR_MODE_CONNECT);
|
r = _translateError(hr, GETLASTERR, _ERROR_MODE_CONNECT);
|
||||||
|
|
||||||
|
@ -1182,7 +1182,7 @@ void nsysnetExport_select(PPCInterpreter_t* hCPU)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//forceLog_printf("selectEndTime %d", timeGetTime());
|
//cemuLog_log(LogType::Force, "selectEndTime {}", timeGetTime());
|
||||||
|
|
||||||
|
|
||||||
//extern int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
|
//extern int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
|
||||||
|
@ -1353,7 +1353,7 @@ void nsysnetExport_gethostbyaddr(PPCInterpreter_t* hCPU)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("he->h_name not set or name too long");
|
cemuLog_log(LogType::Force, "he->h_name not set or name too long");
|
||||||
strcpy(_staticHostentName.GetPtr(), "");
|
strcpy(_staticHostentName.GetPtr(), "");
|
||||||
}
|
}
|
||||||
// setup wuHostent address list
|
// setup wuHostent address list
|
||||||
|
|
|
@ -262,7 +262,7 @@ namespace snd_core
|
||||||
if (numberOfDecodedAdpcmSamples >= 4096)
|
if (numberOfDecodedAdpcmSamples >= 4096)
|
||||||
{
|
{
|
||||||
memset(output, 0, sizeof(float)*sampleCount);
|
memset(output, 0, sizeof(float)*sampleCount);
|
||||||
forceLog_printf("Too many ADPCM samples to decode. ratio = %08x", ratio);
|
cemuLog_log(LogType::Force, "Too many ADPCM samples to decode. ratio = {:08x}", ratio);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
AX_readADPCMSamples(internalShadowCopy, adpcmSampleBuffer, numberOfDecodedAdpcmSamples);
|
AX_readADPCMSamples(internalShadowCopy, adpcmSampleBuffer, numberOfDecodedAdpcmSamples);
|
||||||
|
|
|
@ -436,7 +436,7 @@ namespace snd_core
|
||||||
}
|
}
|
||||||
catch (std::runtime_error& ex)
|
catch (std::runtime_error& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't initialize tv audio: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't initialize tv audio: {}", ex.what());
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -477,7 +477,7 @@ namespace snd_core
|
||||||
}
|
}
|
||||||
catch (std::runtime_error& ex)
|
catch (std::runtime_error& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't initialize pad audio: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't initialize pad audio: {}", ex.what());
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -574,4 +574,4 @@ namespace snd_core
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -233,13 +233,13 @@ namespace snd_core
|
||||||
{
|
{
|
||||||
if (voice == nullptr)
|
if (voice == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("AXVoiceBegin(): Invalid voice");
|
cemuLog_log(LogType::Force, "AXVoiceBegin(): Invalid voice");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
uint32 index = (uint32)voice->index;
|
uint32 index = (uint32)voice->index;
|
||||||
if (index >= AX_MAX_VOICES)
|
if (index >= AX_MAX_VOICES)
|
||||||
{
|
{
|
||||||
forceLog_printf("AXVoiceBegin(): Invalid voice index");
|
cemuLog_log(LogType::Force, "AXVoiceBegin(): Invalid voice index");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (AXIst_IsFrameBeingProcessed())
|
if (AXIst_IsFrameBeingProcessed())
|
||||||
|
@ -273,13 +273,13 @@ namespace snd_core
|
||||||
{
|
{
|
||||||
if (voice == nullptr)
|
if (voice == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("AXVoiceBegin(): Invalid voice");
|
cemuLog_log(LogType::Force, "AXVoiceBegin(): Invalid voice");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
uint32 index = (uint32)voice->index;
|
uint32 index = (uint32)voice->index;
|
||||||
if (index >= AX_MAX_VOICES)
|
if (index >= AX_MAX_VOICES)
|
||||||
{
|
{
|
||||||
forceLog_printf("AXVoiceBegin(): Invalid voice index");
|
cemuLog_log(LogType::Force, "AXVoiceBegin(): Invalid voice index");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (AXIst_IsFrameBeingProcessed())
|
if (AXIst_IsFrameBeingProcessed())
|
||||||
|
@ -428,7 +428,7 @@ namespace snd_core
|
||||||
__AXVoiceListSpinlock.lock();
|
__AXVoiceListSpinlock.lock();
|
||||||
if (vpb->priority == (uint32be)AX_PRIORITY_FREE)
|
if (vpb->priority == (uint32be)AX_PRIORITY_FREE)
|
||||||
{
|
{
|
||||||
forceLog_printf("AXFreeVoice() called on free voice\n");
|
cemuLog_log(LogType::Force, "AXFreeVoice() called on free voice");
|
||||||
__AXVoiceListSpinlock.unlock();
|
__AXVoiceListSpinlock.unlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -692,7 +692,7 @@ namespace snd_core
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("AXSetVoiceSrcType(): Unsupported src type %d", srcType);
|
cemuLog_log(LogType::Force, "AXSetVoiceSrcType(): Unsupported src type {}", srcType);
|
||||||
}
|
}
|
||||||
AXSetSyncFlag(vpb, AX_SYNCFLAG_SRCFILTER);
|
AXSetSyncFlag(vpb, AX_SYNCFLAG_SRCFILTER);
|
||||||
AXVoiceProtection_Acquire(vpb);
|
AXVoiceProtection_Acquire(vpb);
|
||||||
|
@ -843,7 +843,7 @@ namespace snd_core
|
||||||
MPTR sampleBase = _swapEndianU32(pbOffset->samples);
|
MPTR sampleBase = _swapEndianU32(pbOffset->samples);
|
||||||
if (sampleBase == MPTR_NULL)
|
if (sampleBase == MPTR_NULL)
|
||||||
{
|
{
|
||||||
forceLog_printf("AXSetVoiceOffsets(): Invalid sample address");
|
cemuLog_log(LogType::Force, "AXSetVoiceOffsets(): Invalid sample address");
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1283,4 +1283,4 @@ namespace snd_core
|
||||||
cafeExportRegister("sndcore2", AXGetVoiceOffsets, LogType::SoundAPI);
|
cafeExportRegister("sndcore2", AXGetVoiceOffsets, LogType::SoundAPI);
|
||||||
cafeExportRegister("sndcore2", AXGetVoiceCurrentOffsetEx, LogType::SoundAPI);
|
cafeExportRegister("sndcore2", AXGetVoiceCurrentOffsetEx, LogType::SoundAPI);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -453,7 +453,7 @@ void sysappExport__SYSLaunchMiiStudio(PPCInterpreter_t* hCPU)
|
||||||
void sysappExport__SYSReturnToCallerWithStandardResult(PPCInterpreter_t* hCPU)
|
void sysappExport__SYSReturnToCallerWithStandardResult(PPCInterpreter_t* hCPU)
|
||||||
{
|
{
|
||||||
ppcDefineParamU32BEPtr(resultPtr, 0);
|
ppcDefineParamU32BEPtr(resultPtr, 0);
|
||||||
forceLog_printf("_SYSReturnToCallerWithStandardResult(0x%08x) result: 0x%08x", hCPU->gpr[3], (uint32)*resultPtr);
|
cemuLog_log(LogType::Force, "_SYSReturnToCallerWithStandardResult(0x{:08x}) result: 0x{:08x}", hCPU->gpr[3], (uint32)*resultPtr);
|
||||||
while (true) std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
while (true) std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -263,7 +263,7 @@ void FileCache::fileCache_updateFiletable(sint32 extraEntriesToAllocate)
|
||||||
// update file table info in struct
|
// update file table info in struct
|
||||||
if (this->fileTableEntries[0].name1 != FILECACHE_FILETABLE_NAME1 || this->fileTableEntries[0].name2 != FILECACHE_FILETABLE_NAME2)
|
if (this->fileTableEntries[0].name1 != FILECACHE_FILETABLE_NAME1 || this->fileTableEntries[0].name2 != FILECACHE_FILETABLE_NAME2)
|
||||||
{
|
{
|
||||||
forceLog_printf("Corruption in cache file detected");
|
cemuLog_log(LogType::Force, "Corruption in cache file detected");
|
||||||
assert_dbg();
|
assert_dbg();
|
||||||
}
|
}
|
||||||
this->fileTableOffset = this->fileTableEntries[0].fileOffset;
|
this->fileTableOffset = this->fileTableEntries[0].fileOffset;
|
||||||
|
@ -390,7 +390,7 @@ void FileCache::_addFileInternal(uint64 name1, uint64 name2, const uint8* fileDa
|
||||||
{
|
{
|
||||||
if (name1 == FILECACHE_FILETABLE_NAME1 && name2 == FILECACHE_FILETABLE_NAME2)
|
if (name1 == FILECACHE_FILETABLE_NAME1 && name2 == FILECACHE_FILETABLE_NAME2)
|
||||||
{
|
{
|
||||||
forceLog_printf("Error in cache file");
|
cemuLog_log(LogType::Force, "Error in cache file");
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
}
|
}
|
||||||
// no free entry, recreate file table with larger size
|
// no free entry, recreate file table with larger size
|
||||||
|
@ -552,7 +552,7 @@ bool FileCache::GetFileByIndex(sint32 index, uint64* name1, uint64* name2, std::
|
||||||
FileTableEntry* entry = this->fileTableEntries + index;
|
FileTableEntry* entry = this->fileTableEntries + index;
|
||||||
if (this->fileTableEntries == nullptr)
|
if (this->fileTableEntries == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("GetFileByIndex() fileTable is NULL");
|
cemuLog_log(LogType::Force, "GetFileByIndex() fileTable is NULL");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (entry->name1 == FILECACHE_FILETABLE_FREE_NAME && entry->name2 == FILECACHE_FILETABLE_FREE_NAME)
|
if (entry->name1 == FILECACHE_FILETABLE_FREE_NAME && entry->name2 == FILECACHE_FILETABLE_FREE_NAME)
|
||||||
|
@ -657,4 +657,4 @@ void fileCache_test()
|
||||||
delete fcRead;
|
delete fcRead;
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -672,7 +672,7 @@ void DownloadManager::_handle_connect()
|
||||||
{
|
{
|
||||||
if (!_connect_refreshIASAccountIdAndDeviceToken())
|
if (!_connect_refreshIASAccountIdAndDeviceToken())
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to request IAS token");
|
cemuLog_log(LogType::Force, "Failed to request IAS token");
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
m_connectState.store(CONNECT_STATE::FAILED);
|
m_connectState.store(CONNECT_STATE::FAILED);
|
||||||
setStatusMessage(std::string(_("Login failed. Outdated or incomplete online files?")), DLMGR_STATUS_CODE::FAILED);
|
setStatusMessage(std::string(_("Login failed. Outdated or incomplete online files?")), DLMGR_STATUS_CODE::FAILED);
|
||||||
|
|
|
@ -253,7 +253,7 @@ namespace NAPI
|
||||||
result.deviceToken = responseNode.child_value("DeviceToken");
|
result.deviceToken = responseNode.child_value("DeviceToken");
|
||||||
|
|
||||||
if (boost::iequals(responseNode.child_value("DeviceTokenExpired"), "true"))
|
if (boost::iequals(responseNode.child_value("DeviceTokenExpired"), "true"))
|
||||||
forceLog_printf("Unexpected server response: Device token expired");
|
cemuLog_log(LogType::Force, "Unexpected server response: Device token expired");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
example response:
|
example response:
|
||||||
|
@ -363,7 +363,7 @@ namespace NAPI
|
||||||
else if (boost::iequals(serviceType, "NusURL"))
|
else if (boost::iequals(serviceType, "NusURL"))
|
||||||
result.serviceURLs.NusURL = url;
|
result.serviceURLs.NusURL = url;
|
||||||
else
|
else
|
||||||
forceLog_printf("GetAccountStatus: Unknown service URI type {}", serviceType);
|
cemuLog_log(LogType::Force, "GetAccountStatus: Unknown service URI type {}", serviceType);
|
||||||
}
|
}
|
||||||
|
|
||||||
// assign service URLs
|
// assign service URLs
|
||||||
|
|
|
@ -21,16 +21,16 @@ CURLcode _sslctx_function_NUS(CURL* curl, void* sslctx, void* param)
|
||||||
{
|
{
|
||||||
if (iosuCrypto_addCACertificate(sslctx, 102) == false)
|
if (iosuCrypto_addCACertificate(sslctx, 102) == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("Invalid CA certificate (102)");
|
cemuLog_log(LogType::Force, "Invalid CA certificate (102)");
|
||||||
}
|
}
|
||||||
if (iosuCrypto_addCACertificate(sslctx, 0x69) == false)
|
if (iosuCrypto_addCACertificate(sslctx, 0x69) == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("Invalid CA certificate (105)");
|
cemuLog_log(LogType::Force, "Invalid CA certificate (105)");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iosuCrypto_addClientCertificate(sslctx, 3) == false)
|
if (iosuCrypto_addClientCertificate(sslctx, 3) == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("Certificate error");
|
cemuLog_log(LogType::Force, "Certificate error");
|
||||||
}
|
}
|
||||||
SSL_CTX_set_mode((SSL_CTX*)sslctx, SSL_MODE_AUTO_RETRY);
|
SSL_CTX_set_mode((SSL_CTX*)sslctx, SSL_MODE_AUTO_RETRY);
|
||||||
SSL_CTX_set_verify_depth((SSL_CTX*)sslctx, 2);
|
SSL_CTX_set_verify_depth((SSL_CTX*)sslctx, 2);
|
||||||
|
@ -42,7 +42,7 @@ CURLcode _sslctx_function_IDBE(CURL* curl, void* sslctx, void* param)
|
||||||
{
|
{
|
||||||
if (iosuCrypto_addCACertificate(sslctx, 105) == false)
|
if (iosuCrypto_addCACertificate(sslctx, 105) == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("Invalid CA certificate (105)");
|
cemuLog_log(LogType::Force, "Invalid CA certificate (105)");
|
||||||
}
|
}
|
||||||
SSL_CTX_set_mode((SSL_CTX*)sslctx, SSL_MODE_AUTO_RETRY);
|
SSL_CTX_set_mode((SSL_CTX*)sslctx, SSL_MODE_AUTO_RETRY);
|
||||||
SSL_CTX_set_verify_depth((SSL_CTX*)sslctx, 2);
|
SSL_CTX_set_verify_depth((SSL_CTX*)sslctx, 2);
|
||||||
|
@ -54,12 +54,12 @@ CURLcode _sslctx_function_SOAP(CURL* curl, void* sslctx, void* param)
|
||||||
{
|
{
|
||||||
if (iosuCrypto_addCACertificate(sslctx, 102) == false)
|
if (iosuCrypto_addCACertificate(sslctx, 102) == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("Invalid CA certificate (102)");
|
cemuLog_log(LogType::Force, "Invalid CA certificate (102)");
|
||||||
forceLog_printf("Certificate error");
|
cemuLog_log(LogType::Force, "Certificate error");
|
||||||
}
|
}
|
||||||
if (iosuCrypto_addClientCertificate(sslctx, 1) == false)
|
if (iosuCrypto_addClientCertificate(sslctx, 1) == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("Certificate error");
|
cemuLog_log(LogType::Force, "Certificate error");
|
||||||
}
|
}
|
||||||
SSL_CTX_set_mode((SSL_CTX*)sslctx, SSL_MODE_AUTO_RETRY);
|
SSL_CTX_set_mode((SSL_CTX*)sslctx, SSL_MODE_AUTO_RETRY);
|
||||||
SSL_CTX_set_verify_depth((SSL_CTX*)sslctx, 2);
|
SSL_CTX_set_verify_depth((SSL_CTX*)sslctx, 2);
|
||||||
|
@ -374,7 +374,7 @@ namespace NAPI
|
||||||
// parse XML response
|
// parse XML response
|
||||||
if (!doc.load_buffer(soapHelper.getReceivedData().data(), soapHelper.getReceivedData().size()))
|
if (!doc.load_buffer(soapHelper.getReceivedData().data(), soapHelper.getReceivedData().size()))
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to parse GetRegistrationInfo() response");
|
cemuLog_log(LogType::Force, "Failed to parse GetRegistrationInfo() response");
|
||||||
result.apiError = NAPI_RESULT::XML_ERROR;
|
result.apiError = NAPI_RESULT::XML_ERROR;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,7 @@ namespace NAPI
|
||||||
pugi::xml_document doc;
|
pugi::xml_document doc;
|
||||||
if (!doc.load_buffer(receivedData.data(), receivedData.size()))
|
if (!doc.load_buffer(receivedData.data(), receivedData.size()))
|
||||||
{
|
{
|
||||||
forceLog_printf("Failed to parse update list XML");
|
cemuLog_log(LogType::Force, "Failed to parse update list XML");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
// example:
|
// example:
|
||||||
|
@ -100,4 +100,4 @@ namespace NAPI
|
||||||
result.isValid = true;
|
result.isValid = true;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -512,21 +512,21 @@ void nexServiceAuthentication_handleResponse_requestTicket(nexService* nex, nexS
|
||||||
authenticationService_t* authService = (authenticationService_t*)response->custom;
|
authenticationService_t* authService = (authenticationService_t*)response->custom;
|
||||||
if (response->isSuccessful == false)
|
if (response->isSuccessful == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("NEX: RPC error while requesting auth ticket with error code 0x%08x", response->errorCode);
|
cemuLog_log(LogType::Force, "NEX: RPC error while requesting auth ticket with error code 0x{:08x}", response->errorCode);
|
||||||
authService->hasError = true;
|
authService->hasError = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
uint32 returnValue = response->data.readU32();
|
uint32 returnValue = response->data.readU32();
|
||||||
if (returnValue & 0x80000000)
|
if (returnValue & 0x80000000)
|
||||||
{
|
{
|
||||||
forceLog_printf("NEX: Failed to request auth ticket with error code 0x%08x", returnValue);
|
cemuLog_log(LogType::Force, "NEX: Failed to request auth ticket with error code 0x{:08x}", returnValue);
|
||||||
authService->hasError = true;
|
authService->hasError = true;
|
||||||
}
|
}
|
||||||
authService->kerberosTicket2Size = response->data.readBuffer(authService->kerberosTicket2, sizeof(authService->kerberosTicket2));
|
authService->kerberosTicket2Size = response->data.readBuffer(authService->kerberosTicket2, sizeof(authService->kerberosTicket2));
|
||||||
if (response->data.hasReadOutOfBounds())
|
if (response->data.hasReadOutOfBounds())
|
||||||
{
|
{
|
||||||
authService->hasError = true;
|
authService->hasError = true;
|
||||||
forceLog_printf("NEX: Out of bounds error while reading auth ticket");
|
cemuLog_log(LogType::Force, "NEX: Out of bounds error while reading auth ticket");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
authService->done = true;
|
authService->done = true;
|
||||||
|
@ -538,7 +538,7 @@ void nexServiceAuthentication_handleResponse_login(nexService* nex, nexServiceRe
|
||||||
if (response->isSuccessful == false)
|
if (response->isSuccessful == false)
|
||||||
{
|
{
|
||||||
authService->hasError = true;
|
authService->hasError = true;
|
||||||
forceLog_printf("NEX: RPC error in login response 0x%08x", response->errorCode);
|
cemuLog_log(LogType::Force, "NEX: RPC error in login response 0x{:08x}", response->errorCode);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -546,7 +546,7 @@ void nexServiceAuthentication_handleResponse_login(nexService* nex, nexServiceRe
|
||||||
if (returnValue & 0x80000000)
|
if (returnValue & 0x80000000)
|
||||||
{
|
{
|
||||||
authService->hasError = true;
|
authService->hasError = true;
|
||||||
forceLog_printf("NEX: Error 0x%08x in login response (returnCode 0x%08x)", response->errorCode, returnValue);
|
cemuLog_log(LogType::Force, "NEX: Error 0x{:08x} in login response (returnCode 0x{:08x})", response->errorCode, returnValue);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,7 +571,7 @@ void nexServiceAuthentication_handleResponse_login(nexService* nex, nexServiceRe
|
||||||
if (response->data.hasReadOutOfBounds())
|
if (response->data.hasReadOutOfBounds())
|
||||||
{
|
{
|
||||||
authService->hasError = true;
|
authService->hasError = true;
|
||||||
forceLog_printf("NEX: Read out of bounds");
|
cemuLog_log(LogType::Force, "NEX: Read out of bounds");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// request ticket data
|
// request ticket data
|
||||||
|
@ -595,14 +595,14 @@ void nexServiceSecure_handleResponse_RegisterEx(nexService* nex, nexServiceRespo
|
||||||
uint32 returnCode = response->data.readU32();
|
uint32 returnCode = response->data.readU32();
|
||||||
if (response->isSuccessful == false || response->data.hasReadOutOfBounds())
|
if (response->isSuccessful == false || response->data.hasReadOutOfBounds())
|
||||||
{
|
{
|
||||||
forceLog_printf("NEX: RPC error in secure register");
|
cemuLog_log(LogType::Force, "NEX: RPC error in secure register");
|
||||||
info->isSuccessful = false;
|
info->isSuccessful = false;
|
||||||
info->isComplete = true;
|
info->isComplete = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (returnCode & 0x80000000)
|
if (returnCode & 0x80000000)
|
||||||
{
|
{
|
||||||
forceLog_printf("NEX: Secure register failed with error code 0x%08x", returnCode);
|
cemuLog_log(LogType::Force, "NEX: Secure register failed with error code 0x{:08x}", returnCode);
|
||||||
info->isSuccessful = false;
|
info->isSuccessful = false;
|
||||||
info->isComplete = true;
|
info->isComplete = true;
|
||||||
return;
|
return;
|
||||||
|
@ -627,7 +627,7 @@ nexService* nex_secureLogin(authServerInfo_t* authServerInfo, const char* access
|
||||||
if (prudpSecureSock->getConnectionState() == prudpClient::STATE_DISCONNECTED)
|
if (prudpSecureSock->getConnectionState() == prudpClient::STATE_DISCONNECTED)
|
||||||
{
|
{
|
||||||
// timeout or disconnected
|
// timeout or disconnected
|
||||||
forceLog_printf("NEX: Secure login connection time-out");
|
cemuLog_log(LogType::Force, "NEX: Secure login connection time-out");
|
||||||
delete prudpSecureSock;
|
delete prudpSecureSock;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -656,13 +656,13 @@ nexService* nex_secureLogin(authServerInfo_t* authServerInfo, const char* access
|
||||||
break;
|
break;
|
||||||
if (nex->getState() == nexService::STATE_DISCONNECTED)
|
if (nex->getState() == nexService::STATE_DISCONNECTED)
|
||||||
{
|
{
|
||||||
forceLog_printf("NEX: Connection error while registering");
|
cemuLog_log(LogType::Force, "NEX: Connection error while registering");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (secureRegisterExData.isSuccessful == false)
|
if (secureRegisterExData.isSuccessful == false)
|
||||||
{
|
{
|
||||||
forceLog_printf("NEX: Failed to register to secure server");
|
cemuLog_log(LogType::Force, "NEX: Failed to register to secure server");
|
||||||
nex->destroy();
|
nex->destroy();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -682,7 +682,7 @@ nexService* nex_establishSecureConnection(uint32 authServerIp, uint16 authServer
|
||||||
{
|
{
|
||||||
// error
|
// error
|
||||||
authConnection->destroy();
|
authConnection->destroy();
|
||||||
forceLog_printf("NEX: Failed to connect to the NEX server");
|
cemuLog_log(LogType::Force, "NEX: Failed to connect to the NEX server");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
// send auth login request
|
// send auth login request
|
||||||
|
@ -704,7 +704,7 @@ nexService* nex_establishSecureConnection(uint32 authServerIp, uint16 authServer
|
||||||
{
|
{
|
||||||
// error
|
// error
|
||||||
authConnection->destroy();
|
authConnection->destroy();
|
||||||
forceLog_printf("NEX: Error during authentication");
|
cemuLog_log(LogType::Force, "NEX: Error during authentication");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
// close connection to auth server
|
// close connection to auth server
|
||||||
|
@ -726,7 +726,7 @@ nexService* nex_establishSecureConnection(uint32 authServerIp, uint16 authServer
|
||||||
if (nexAuthService.kerberosTicket2Size < 16)
|
if (nexAuthService.kerberosTicket2Size < 16)
|
||||||
{
|
{
|
||||||
nexAuthService.hasError = true;
|
nexAuthService.hasError = true;
|
||||||
forceLog_printf("NEX: Kerberos ticket too short");
|
cemuLog_log(LogType::Force, "NEX: Kerberos ticket too short");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
// check hmac of ticket
|
// check hmac of ticket
|
||||||
|
@ -735,7 +735,7 @@ nexService* nex_establishSecureConnection(uint32 authServerIp, uint16 authServer
|
||||||
if (memcmp(hmacTicket, nexAuthService.kerberosTicket2 + nexAuthService.kerberosTicket2Size - 16, 16) != 0)
|
if (memcmp(hmacTicket, nexAuthService.kerberosTicket2 + nexAuthService.kerberosTicket2Size - 16, 16) != 0)
|
||||||
{
|
{
|
||||||
nexAuthService.hasError = true;
|
nexAuthService.hasError = true;
|
||||||
forceLog_printf("NEX: Kerberos ticket hmac invalid");
|
cemuLog_log(LogType::Force, "NEX: Kerberos ticket hmac invalid");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
// auth info
|
// auth info
|
||||||
|
@ -752,7 +752,7 @@ nexService* nex_establishSecureConnection(uint32 authServerIp, uint16 authServer
|
||||||
|
|
||||||
if (packetKerberosTicket.hasReadOutOfBounds())
|
if (packetKerberosTicket.hasReadOutOfBounds())
|
||||||
{
|
{
|
||||||
forceLog_printf("NEX: Parse error");
|
cemuLog_log(LogType::Force, "NEX: Parse error");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -762,4 +762,4 @@ nexService* nex_establishSecureConnection(uint32 authServerIp, uint16 authServer
|
||||||
authServerInfo->userPid = pid;
|
authServerInfo->userPid = pid;
|
||||||
|
|
||||||
return nex_secureLogin(authServerInfo.get(), accessKey, nexToken);
|
return nex_secureLogin(authServerInfo.get(), accessKey, nexToken);
|
||||||
}
|
}
|
||||||
|
|
|
@ -335,7 +335,7 @@ void NexFriends::handleResponse_getAllInformation(nexServiceResponse_t* response
|
||||||
uint8 isPreferenceInvalid = response->data.readU8(); // if not zero, preferences must be setup
|
uint8 isPreferenceInvalid = response->data.readU8(); // if not zero, preferences must be setup
|
||||||
if (isPreferenceInvalid)
|
if (isPreferenceInvalid)
|
||||||
{
|
{
|
||||||
forceLog_printf("NEX: First time login into friend account, setting up default preferences");
|
cemuLog_log(LogType::Force, "NEX: First time login into friend account, setting up default preferences");
|
||||||
session->updatePreferences(nexPrincipalPreference(1, 1, 0));
|
session->updatePreferences(nexPrincipalPreference(1, 1, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -972,7 +972,7 @@ void NexFriends::update()
|
||||||
}
|
}
|
||||||
if (timeSinceLastLoginAttempt < delayTime)
|
if (timeSinceLastLoginAttempt < delayTime)
|
||||||
return;
|
return;
|
||||||
forceLog_printf("NEX: Attempt async friend service login");
|
cemuLog_log(LogType::Force, "NEX: Attempt async friend service login");
|
||||||
initiateLogin();
|
initiateLogin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -980,7 +980,7 @@ void NexFriends::update()
|
||||||
{
|
{
|
||||||
if (this->nexCon == nullptr || this->nexCon->getState() != nexService::STATE_CONNECTED)
|
if (this->nexCon == nullptr || this->nexCon->getState() != nexService::STATE_CONNECTED)
|
||||||
{
|
{
|
||||||
forceLog_printf("NEX: Lost friend server session");
|
cemuLog_log(LogType::Force, "NEX: Lost friend server session");
|
||||||
if (this->nexCon)
|
if (this->nexCon)
|
||||||
{
|
{
|
||||||
this->nexCon->destroy();
|
this->nexCon->destroy();
|
||||||
|
|
|
@ -519,7 +519,7 @@ prudpClient::prudpClient(uint32 dstIp, uint16 dstPort, const char* key) : prudpC
|
||||||
{
|
{
|
||||||
if (tries == 4)
|
if (tries == 4)
|
||||||
{
|
{
|
||||||
forceLog_printf("PRUDP: Failed to bind UDP socket");
|
cemuLog_log(LogType::Force, "PRUDP: Failed to bind UDP socket");
|
||||||
currentConnectionState = STATE_DISCONNECTED;
|
currentConnectionState = STATE_DISCONNECTED;
|
||||||
srcPort = 0;
|
srcPort = 0;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -116,7 +116,7 @@ void DirectSoundAPI::AudioThread()
|
||||||
|
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
forceLog_printf("DirectSound: Dropped audio block due to locking failure");
|
cemuLog_log(LogType::Force, "DirectSound: Dropped audio block due to locking failure");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,14 +27,15 @@ IAudioAPI::IAudioAPI(uint32 samplerate, uint32 channels, uint32 samples_per_bloc
|
||||||
|
|
||||||
void IAudioAPI::PrintLogging()
|
void IAudioAPI::PrintLogging()
|
||||||
{
|
{
|
||||||
forceLog_printf("------- Init Audio backend -------");
|
cemuLog_log(LogType::Force, "------- Init Audio backend -------");
|
||||||
forceLog_printf("DirectSound: %s", s_availableApis[DirectSound] ? "available" : "not supported");
|
cemuLog_log(LogType::Force, "DirectSound: {}", s_availableApis[DirectSound] ? "available" : "not supported");
|
||||||
forceLog_printf("XAudio 2.8: %s", s_availableApis[XAudio2] ? "available" : "not supported");
|
cemuLog_log(LogType::Force, "XAudio 2.8: {}", s_availableApis[XAudio2] ? "available" : "not supported");
|
||||||
if (!s_availableApis[XAudio2])
|
if (!s_availableApis[XAudio2])
|
||||||
{
|
{
|
||||||
forceLog_printf("XAudio 2.7: %s", s_availableApis[XAudio27] ? "available" : "not supported")
|
cemuLog_log(LogType::Force, "XAudio 2.7: {}", s_availableApis[XAudio27] ? "available" : "not supported");
|
||||||
}
|
}
|
||||||
forceLog_printf("Cubeb: %s", s_availableApis[Cubeb] ? "available" : "not supported");
|
|
||||||
|
cemuLog_log(LogType::Force, "Cubeb: {}", s_availableApis[Cubeb] ? "available" : "not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
void IAudioAPI::InitWFX(sint32 samplerate, sint32 channels, sint32 bits_per_sample)
|
void IAudioAPI::InitWFX(sint32 samplerate, sint32 channels, sint32 bits_per_sample)
|
||||||
|
|
|
@ -16,8 +16,8 @@ IAudioInputAPI::IAudioInputAPI(uint32 samplerate, uint32 channels, uint32 sample
|
||||||
|
|
||||||
void IAudioInputAPI::PrintLogging()
|
void IAudioInputAPI::PrintLogging()
|
||||||
{
|
{
|
||||||
forceLog_printf("------- Init Audio input backend -------");
|
cemuLog_log(LogType::Force, "------- Init Audio input backend -------");
|
||||||
forceLog_printf("Cubeb: %s", s_availableApis[Cubeb] ? "available" : "not supported");
|
cemuLog_log(LogType::Force, "Cubeb: {}", s_availableApis[Cubeb] ? "available" : "not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
void IAudioInputAPI::InitializeStatic()
|
void IAudioInputAPI::InitializeStatic()
|
||||||
|
|
|
@ -49,8 +49,8 @@ XAudio2API::XAudio2API(std::wstring device_id, uint32 samplerate, uint32 channel
|
||||||
m_wfx.Format.nChannels = channels;
|
m_wfx.Format.nChannels = channels;
|
||||||
m_wfx.Format.nSamplesPerSec = samplerate;
|
m_wfx.Format.nSamplesPerSec = samplerate;
|
||||||
m_wfx.Format.wBitsPerSample = bits_per_sample;
|
m_wfx.Format.wBitsPerSample = bits_per_sample;
|
||||||
m_wfx.Format.nBlockAlign = (m_wfx.Format.nChannels * m_wfx.Format.wBitsPerSample) / 8; // must equal (nChannels × wBitsPerSample) / 8
|
m_wfx.Format.nBlockAlign = (m_wfx.Format.nChannels * m_wfx.Format.wBitsPerSample) / 8; // must equal (nChannels × wBitsPerSample) / 8
|
||||||
m_wfx.Format.nAvgBytesPerSec = m_wfx.Format.nSamplesPerSec * m_wfx.Format.nBlockAlign; // must equal nSamplesPerSec × nBlockAlign.
|
m_wfx.Format.nAvgBytesPerSec = m_wfx.Format.nSamplesPerSec * m_wfx.Format.nBlockAlign; // must equal nSamplesPerSec × nBlockAlign.
|
||||||
m_wfx.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
|
m_wfx.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
|
||||||
|
|
||||||
m_wfx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
|
m_wfx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
|
||||||
|
@ -258,7 +258,7 @@ const std::vector<XAudio2API::DeviceDescriptionPtr>& XAudio2API::RefreshDevices(
|
||||||
}
|
}
|
||||||
catch (const std::system_error& ex)
|
catch (const std::system_error& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("XAudio2API::RefreshDevices: error while refreshing device list (%s - code: 0x%08x)", ex.what(), ex.code().value());
|
cemuLog_log(LogType::Force, "XAudio2API::RefreshDevices: error while refreshing device list ({} - code: 0x{:08x})", ex.what(), ex.code().value());
|
||||||
}
|
}
|
||||||
|
|
||||||
CoUninitialize();
|
CoUninitialize();
|
||||||
|
|
|
@ -33,7 +33,7 @@ ActiveSettings::LoadOnce(const fs::path& user_data_path,
|
||||||
}
|
}
|
||||||
if (!TestWriteAccess(path))
|
if (!TestWriteAccess(path))
|
||||||
{
|
{
|
||||||
cemuLog_log(LogType::Force, "Failed to write to {}", path.generic_string());
|
cemuLog_log(LogType::Force, "Failed to write to {}", _pathToUtf8(path));
|
||||||
failed_write_access.insert(path);
|
failed_write_access.insert(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ void CemuConfig::SetMLCPath(fs::path path, bool save)
|
||||||
catch (const PSDisabledException&) {}
|
catch (const PSDisabledException&) {}
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't store custom mlc path in permanent storage: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't store custom mlc path in permanent storage: {}", ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ void CemuConfig::Load(XMLConfigParser& parser)
|
||||||
}
|
}
|
||||||
catch (const std::exception&)
|
catch (const std::exception&)
|
||||||
{
|
{
|
||||||
forceLog_printf("config load error: can't load recently launched game file: %s", path.c_str());
|
cemuLog_log(LogType::Force, "config load error: can't load recently launched game file: {}", path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ void CemuConfig::Load(XMLConfigParser& parser)
|
||||||
}
|
}
|
||||||
catch (const std::exception&)
|
catch (const std::exception&)
|
||||||
{
|
{
|
||||||
forceLog_printf("config load error: can't load recently launched nfc file: %s", path.c_str());
|
cemuLog_log(LogType::Force, "config load error: can't load recently launched nfc file: {}", path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ void CemuConfig::Load(XMLConfigParser& parser)
|
||||||
}
|
}
|
||||||
catch (const std::exception&)
|
catch (const std::exception&)
|
||||||
{
|
{
|
||||||
forceLog_printf("config load error: can't load game path: %s", path.c_str());
|
cemuLog_log(LogType::Force, "config load error: can't load game path: {}", path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,7 +186,7 @@ void CemuConfig::Load(XMLConfigParser& parser)
|
||||||
}
|
}
|
||||||
catch (const std::exception&)
|
catch (const std::exception&)
|
||||||
{
|
{
|
||||||
forceLog_printf("config load error: can't load game cache entry: %s", rpx);
|
cemuLog_log(LogType::Force, "config load error: can't load game cache entry: {}", rpx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_lock.unlock();
|
_lock.unlock();
|
||||||
|
@ -302,7 +302,7 @@ void CemuConfig::Load(XMLConfigParser& parser)
|
||||||
}
|
}
|
||||||
catch (const std::exception&)
|
catch (const std::exception&)
|
||||||
{
|
{
|
||||||
forceLog_printf("config load error: can't load tv device: %s", tv);
|
cemuLog_log(LogType::Force, "config load error: can't load tv device: {}", tv);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto pad = audio.get("PadDevice", "");
|
const auto pad = audio.get("PadDevice", "");
|
||||||
|
@ -312,7 +312,7 @@ void CemuConfig::Load(XMLConfigParser& parser)
|
||||||
}
|
}
|
||||||
catch (const std::exception&)
|
catch (const std::exception&)
|
||||||
{
|
{
|
||||||
forceLog_printf("config load error: can't load pad device: %s", pad);
|
cemuLog_log(LogType::Force, "config load error: can't load pad device: {}", pad);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto input_device_name = audio.get("InputDevice", "");
|
const auto input_device_name = audio.get("InputDevice", "");
|
||||||
|
@ -322,7 +322,7 @@ void CemuConfig::Load(XMLConfigParser& parser)
|
||||||
}
|
}
|
||||||
catch (const std::exception&)
|
catch (const std::exception&)
|
||||||
{
|
{
|
||||||
forceLog_printf("config load error: can't load input device: %s", input_device_name);
|
cemuLog_log(LogType::Force, "config load error: can't load input device: {}", input_device_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// account
|
// account
|
||||||
|
|
|
@ -252,7 +252,7 @@ bool LaunchSettings::ExtractorTool(std::wstring_view wud_path, std::string_view
|
||||||
}
|
}
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't write file: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't write file: {}", ex.what());
|
||||||
puts(fmt::format("can't write file: %s\n", ex.what()).c_str());
|
puts(fmt::format("can't write file: %s\n", ex.what()).c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ PermanentStorage::~PermanentStorage()
|
||||||
if (ec)
|
if (ec)
|
||||||
{
|
{
|
||||||
SystemException ex(ec);
|
SystemException ex(ec);
|
||||||
forceLog_printf("can't remove permanent storage: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't remove permanent storage: {}", ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -390,7 +390,7 @@ public:
|
||||||
fs::create_directories(fs::path(filename).parent_path(), err);
|
fs::create_directories(fs::path(filename).parent_path(), err);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't create parent path for save file: %s", err.message().c_str());
|
cemuLog_log(LogType::Force, "can't create parent path for save file: {}", err.message());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ bool CemuUpdateWindow::QueryUpdateInfo(std::string& downloadUrlOut, std::string&
|
||||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
|
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
|
||||||
if (http_code != 0 && http_code != 200)
|
if (http_code != 0 && http_code != 200)
|
||||||
{
|
{
|
||||||
forceLog_printf("Update check failed (http code: %d)", http_code);
|
cemuLog_log(LogType::Force, "Update check failed (http code: {})", http_code);
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -154,7 +154,7 @@ bool CemuUpdateWindow::QueryUpdateInfo(std::string& downloadUrlOut, std::string&
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
forceLog_printf("Update check failed with CURL error %d", (int)cr);
|
cemuLog_log(LogType::Force, "Update check failed with CURL error {}", (int)cr);
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,7 +261,7 @@ bool CemuUpdateWindow::DownloadCemuZip(const std::string& url, const fs::path& f
|
||||||
}
|
}
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't remove update.zip on error: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't remove update.zip on error: {}", ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -309,13 +309,13 @@ bool CemuUpdateWindow::ExtractUpdate(const fs::path& zipname, const fs::path& ta
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
SystemException sys(ex);
|
SystemException sys(ex);
|
||||||
forceLog_printf("can't create folder \"%s\" for update: %s", sb.name, sys.what());
|
cemuLog_log(LogType::Force, "can't create folder \"{}\" for update: {}", sb.name, sys.what());
|
||||||
}
|
}
|
||||||
// the root should have only one Cemu_... directory, we track it here
|
// the root should have only one Cemu_... directory, we track it here
|
||||||
if ((std::count(sb.name, sb.name + len, '/') + std::count(sb.name, sb.name + len, '\\')) == 1)
|
if ((std::count(sb.name, sb.name + len, '/') + std::count(sb.name, sb.name + len, '\\')) == 1)
|
||||||
{
|
{
|
||||||
if (!cemuFolderName.empty())
|
if (!cemuFolderName.empty())
|
||||||
forceLog_printf("update zip has multiple folders in root");
|
cemuLog_log(LogType::Force, "update zip has multiple folders in root");
|
||||||
cemuFolderName.assign(sb.name, len - 1);
|
cemuFolderName.assign(sb.name, len - 1);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
@ -325,7 +325,7 @@ bool CemuUpdateWindow::ExtractUpdate(const fs::path& zipname, const fs::path& ta
|
||||||
auto* zf = zip_fopen_index(za, i, 0);
|
auto* zf = zip_fopen_index(za, i, 0);
|
||||||
if (!zf)
|
if (!zf)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't open zip file \"%s\"", sb.name);
|
cemuLog_log(LogType::Force, "can't open zip file \"{}\"", sb.name);
|
||||||
zip_close(za);
|
zip_close(za);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -334,7 +334,7 @@ bool CemuUpdateWindow::ExtractUpdate(const fs::path& zipname, const fs::path& ta
|
||||||
const auto read = zip_fread(zf, buffer.data(), sb.size);
|
const auto read = zip_fread(zf, buffer.data(), sb.size);
|
||||||
if (read != (sint64)sb.size)
|
if (read != (sint64)sb.size)
|
||||||
{
|
{
|
||||||
forceLog_printf("could only read 0x%x of 0x%x bytes from zip file \"%s\"", read, sb.size, sb.name);
|
cemuLog_log(LogType::Force, "could only read 0x{:x} of 0x{:x} bytes from zip file \"{}\"", read, sb.size, sb.name);
|
||||||
zip_close(za);
|
zip_close(za);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -342,7 +342,7 @@ bool CemuUpdateWindow::ExtractUpdate(const fs::path& zipname, const fs::path& ta
|
||||||
auto* file = fopen(fname.string().c_str(), "wb");
|
auto* file = fopen(fname.string().c_str(), "wb");
|
||||||
if (file == nullptr)
|
if (file == nullptr)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't create update file \"%s\"", sb.name);
|
cemuLog_log(LogType::Force, "can't create update file \"{}\"", sb.name);
|
||||||
zip_close(za);
|
zip_close(za);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -460,7 +460,7 @@ void CemuUpdateWindow::WorkerThread()
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
SystemException sys(ex);
|
SystemException sys(ex);
|
||||||
forceLog_printf("can't remove extracted tmp files: %s", sys.what());
|
cemuLog_log(LogType::Force, "can't remove extracted tmp files: {}", sys.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -506,7 +506,7 @@ void CemuUpdateWindow::WorkerThread()
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
SystemException sys(ex);
|
SystemException sys(ex);
|
||||||
forceLog_printf("applying update error: %s", sys.what());
|
cemuLog_log(LogType::Force, "applying update error: {}", sys.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((counter++ % 10) == 0)
|
if ((counter++ % 10) == 0)
|
||||||
|
@ -529,7 +529,7 @@ void CemuUpdateWindow::WorkerThread()
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
SystemException sys(ex);
|
SystemException sys(ex);
|
||||||
forceLog_printf("update error: %s", sys.what());
|
cemuLog_log(LogType::Force, "update error: {}", sys.what());
|
||||||
|
|
||||||
// clean leftovers
|
// clean leftovers
|
||||||
if (exists(tmppath))
|
if (exists(tmppath))
|
||||||
|
|
|
@ -335,7 +335,7 @@ void ChecksumTool::LoadOnlineData() const
|
||||||
}
|
}
|
||||||
catch(const std::exception& ex)
|
catch(const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("error on updating json checksum data: %s", ex.what());
|
cemuLog_log(LogType::Force, "error on updating json checksum data: {}", ex.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
wxQueueEvent(m_verify_online, new wxCommandEvent(wxEVT_ENABLE));
|
wxQueueEvent(m_verify_online, new wxCommandEvent(wxEVT_ENABLE));
|
||||||
|
@ -778,4 +778,4 @@ void ChecksumTool::DoWork()
|
||||||
wxQueueEvent(this, new wxSetGaugeValue(100, m_progress, m_status, wxStringFormat2(_("Generated checksum of {} game files"), file_count)));
|
wxQueueEvent(this, new wxSetGaugeValue(100, m_progress, m_status, wxStringFormat2(_("Generated checksum of {} game files"), file_count)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,7 +136,7 @@ void DownloadGraphicPacksWindow::UpdateThread()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// cemu api request failed, use hardcoded github url
|
// cemu api request failed, use hardcoded github url
|
||||||
forceLog_printf("Graphic pack update request failed or returned invalid URL. Using default repository URL instead");
|
cemuLog_log(LogType::Force, "Graphic pack update request failed or returned invalid URL. Using default repository URL instead");
|
||||||
githubAPIUrl = "https://api.github.com/repos/slashiee/cemu_graphic_packs/releases/latest";
|
githubAPIUrl = "https://api.github.com/repos/slashiee/cemu_graphic_packs/releases/latest";
|
||||||
}
|
}
|
||||||
// github API request
|
// github API request
|
||||||
|
|
|
@ -105,7 +105,7 @@ bool GameUpdateWindow::ParseUpdate(const fs::path& metaPath)
|
||||||
}
|
}
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("GameUpdateWindow::ParseUpdate exist-error: %s at %s", ex.what(), target_location.generic_u8string().c_str());
|
cemuLog_log(LogType::Force, "GameUpdateWindow::ParseUpdate exist-error: {} at {}", ex.what(), _pathToUtf8(target_location));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1276,7 +1276,7 @@ void GeneralSettings2::OnAccountDelete(wxCommandEvent& event)
|
||||||
catch(const std::exception& ex)
|
catch(const std::exception& ex)
|
||||||
{
|
{
|
||||||
SystemException sys(ex);
|
SystemException sys(ex);
|
||||||
forceLog_printf((char*)sys.what());
|
cemuLog_log(LogType::Force, sys.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1743,7 +1743,7 @@ void GeneralSettings2::UpdateAudioDevice()
|
||||||
}
|
}
|
||||||
catch (std::runtime_error& ex)
|
catch (std::runtime_error& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't initialize tv audio: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't initialize tv audio: {}", ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1792,7 +1792,7 @@ void GeneralSettings2::UpdateAudioDevice()
|
||||||
}
|
}
|
||||||
catch (std::runtime_error& ex)
|
catch (std::runtime_error& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't initialize pad audio: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't initialize pad audio: {}", ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1840,7 +1840,7 @@ void GeneralSettings2::UpdateAudioDevice()
|
||||||
}
|
}
|
||||||
catch (std::runtime_error& ex)
|
catch (std::runtime_error& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("can't initialize pad audio: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't initialize pad audio: {}", ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1035,7 +1035,7 @@ void MainWindow::OnDebugSetting(wxCommandEvent& event)
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
SystemException sys(ex);
|
SystemException sys(ex);
|
||||||
forceLog_printf("error when creating dump curl folder: %s", sys.what());
|
cemuLog_log(LogType::Force, "error when creating dump curl folder: {}", sys.what());
|
||||||
ActiveSettings::EnableDumpLibcurlRequests(false);
|
ActiveSettings::EnableDumpLibcurlRequests(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1092,7 +1092,7 @@ void MainWindow::OnDebugDumpUsedTextures(wxCommandEvent& event)
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
SystemException sys(ex);
|
SystemException sys(ex);
|
||||||
forceLog_printf("can't create texture dump folder: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't create texture dump folder: {}", ex.what());
|
||||||
ActiveSettings::EnableDumpTextures(false);
|
ActiveSettings::EnableDumpTextures(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1113,7 +1113,7 @@ void MainWindow::OnDebugDumpUsedShaders(wxCommandEvent& event)
|
||||||
catch (const std::exception & ex)
|
catch (const std::exception & ex)
|
||||||
{
|
{
|
||||||
SystemException sys(ex);
|
SystemException sys(ex);
|
||||||
forceLog_printf("can't create shaders dump folder: %s", ex.what());
|
cemuLog_log(LogType::Force, "can't create shaders dump folder: {}", ex.what());
|
||||||
ActiveSettings::EnableDumpShaders(false);
|
ActiveSettings::EnableDumpShaders(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -535,7 +535,7 @@ void TitleManager::OnSaveDelete(wxCommandEvent& event)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!meta_file_edited)
|
if (!meta_file_edited)
|
||||||
forceLog_printf("TitleManager::OnSaveDelete: couldn't delete save entry in saveinfo.xml: %s", saveinfo.generic_u8string().c_str());
|
cemuLog_log(LogType::Force, "TitleManager::OnSaveDelete: couldn't delete save entry in saveinfo.xml: {}", _pathToUtf8(saveinfo));
|
||||||
|
|
||||||
// remove from title entry
|
// remove from title entry
|
||||||
auto& persistent_ids = entry->persistent_ids;
|
auto& persistent_ids = entry->persistent_ids;
|
||||||
|
|
|
@ -37,7 +37,7 @@ VulkanCanvas::VulkanCanvas(wxWindow* parent, const wxSize& size, bool is_main_wi
|
||||||
catch(const std::exception& ex)
|
catch(const std::exception& ex)
|
||||||
{
|
{
|
||||||
const auto msg = fmt::format(fmt::runtime(_("Error when initializing Vulkan renderer:\n{}").ToStdString()), ex.what());
|
const auto msg = fmt::format(fmt::runtime(_("Error when initializing Vulkan renderer:\n{}").ToStdString()), ex.what());
|
||||||
forceLog_printf(const_cast<char*>(msg.c_str()));
|
cemuLog_log(LogType::Force, msg);
|
||||||
wxMessageDialog dialog(this, msg, _("Error"), wxOK | wxCENTRE | wxICON_ERROR);
|
wxMessageDialog dialog(this, msg, _("Error"), wxOK | wxCENTRE | wxICON_ERROR);
|
||||||
dialog.ShowModal();
|
dialog.ShowModal();
|
||||||
exit(0);
|
exit(0);
|
||||||
|
|
|
@ -875,7 +875,7 @@ void wxTitleManagerList::OnContextMenuSelected(wxCommandEvent& event)
|
||||||
}
|
}
|
||||||
catch (const std::exception& ex)
|
catch (const std::exception& ex)
|
||||||
{
|
{
|
||||||
forceLog_printf("wxTitleManagerList::OnContextMenuSelected: can't launch title: %s", ex.what());
|
cemuLog_log(LogType::Force, "wxTitleManagerList::OnContextMenuSelected: can't launch title: {}", ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -232,7 +232,7 @@ void SaveImportWindow::OnImport(wxCommandEvent& event)
|
||||||
zip_stat_t sb{};
|
zip_stat_t sb{};
|
||||||
if (zip_stat_index(zip, i, 0, &sb) != 0)
|
if (zip_stat_index(zip, i, 0, &sb) != 0)
|
||||||
{
|
{
|
||||||
forceLog_printf("zip stat index failed on %d entry", i);
|
cemuLog_log(LogType::Force, "zip stat index failed on {} entry", i);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,7 +251,7 @@ void SaveImportWindow::OnImport(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
fs::create_directories(path, ec);
|
fs::create_directories(path, ec);
|
||||||
if (ec)
|
if (ec)
|
||||||
forceLog_printf("can't create directory %s: %s", sb.name, ec.message().c_str());
|
cemuLog_log(LogType::Force, "can't create directory {}: {}", sb.name, ec.message());
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -307,7 +307,7 @@ void SaveImportWindow::OnImport(wxCommandEvent& event)
|
||||||
timestamp.text().set(fmt::format("{:016x}", coreinit::coreinit_getOSTime() / ESPRESSO_TIMER_CLOCK).c_str()); // TODO time not initialized yet?
|
timestamp.text().set(fmt::format("{:016x}", coreinit::coreinit_getOSTime() / ESPRESSO_TIMER_CLOCK).c_str()); // TODO time not initialized yet?
|
||||||
|
|
||||||
if(!doc.save_file(saveinfo.c_str()))
|
if(!doc.save_file(saveinfo.c_str()))
|
||||||
forceLog_printf("couldn't insert save entry in saveinfo.xml: %s", saveinfo.generic_u8string().c_str());
|
cemuLog_log(LogType::Force, "couldn't insert save entry in saveinfo.xml: {}", _pathToUtf8(saveinfo));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue