Merge branch 'cemu-project:main' into main

This commit is contained in:
Gordie Schiebel 2022-09-07 22:53:18 -04:00 committed by GitHub
commit bd87209130
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 42 additions and 54 deletions

View file

@ -108,14 +108,8 @@ uint64 PPCTimer_tscToMicroseconds(uint64 us)
uint128_t r{}; uint128_t r{};
r.low = _umul128(us, 1000000ULL, &r.high); r.low = _umul128(us, 1000000ULL, &r.high);
uint64 remainder; uint64 remainder;
#if defined(_MSC_VER) && _MSC_VER >= 1923
const uint64 microseconds = _udiv128(r.high, r.low, _rdtscFrequency, &remainder); const uint64 microseconds = _udiv128(r.high, r.low, _rdtscFrequency, &remainder);
#else
const uint64 microseconds = udiv128(r.low, r.high, _rdtscFrequency, &remainder);
#endif
return microseconds; return microseconds;
} }
@ -159,12 +153,7 @@ uint64 PPCTimer_getFromRDTSC()
#endif #endif
uint64 remainder; uint64 remainder;
#if defined(_MSC_VER) && _MSC_VER >= 1923
uint64 elapsedTick = _udiv128(_rdtscAcc.high, _rdtscAcc.low, _rdtscFrequency, &remainder); uint64 elapsedTick = _udiv128(_rdtscAcc.high, _rdtscAcc.low, _rdtscFrequency, &remainder);
#else
uint64 elapsedTick = udiv128(_rdtscAcc.low, _rdtscAcc.high, _rdtscFrequency, &remainder);
#endif
_rdtscAcc.low = remainder; _rdtscAcc.low = remainder;
_rdtscAcc.high = 0; _rdtscAcc.high = 0;

View file

@ -242,7 +242,7 @@ LatteParsedGSCopyShader* LatteGSCopyShaderParser_parse(uint8* programData, uint3
// verify if all registers are exported // verify if all registers are exported
for(sint32 i=0; i<shaderContext->numParam; i++) for(sint32 i=0; i<shaderContext->numParam; i++)
{ {
if( shaderContext->paramMapping[i].exportParam == 0xFFFF ) if( shaderContext->paramMapping[i].exportParam == 0xFF )
debugBreakpoint(); debugBreakpoint();
} }
return shaderContext; return shaderContext;

View file

@ -76,23 +76,23 @@ typedef struct
struct struct
{ {
// CPU // CPU
volatile uint64 lastCycleCount; uint64 lastCycleCount;
volatile uint64 skippedCycles; uint64 skippedCycles;
volatile uint32 recompilerLeaveCount; // increased everytime the recompiler switches back to interpreter uint32 recompilerLeaveCount; // increased everytime the recompiler switches back to interpreter
volatile uint32 threadLeaveCount; // increased everytime a thread gives up it's timeslice uint32 threadLeaveCount; // increased everytime a thread gives up it's timeslice
// GPU // GPU
volatile uint32 lastUpdate; uint32 lastUpdate;
volatile uint32 frameCounter; uint32 frameCounter;
volatile uint32 drawCallCounter; uint32 drawCallCounter;
volatile uint32 shaderBindCount; uint32 shaderBindCount;
volatile uint64 vertexDataUploaded; // amount of vertex data uploaded to GPU (bytes) uint64 vertexDataUploaded; // amount of vertex data uploaded to GPU (bytes)
volatile uint64 vertexDataCached; // amount of vertex data reused from GPU cache (bytes) uint64 vertexDataCached; // amount of vertex data reused from GPU cache (bytes)
volatile uint64 uniformBankUploadedData; // amount of uniform buffer data (excluding remapped uniforms) uploaded to GPU uint64 uniformBankUploadedData; // amount of uniform buffer data (excluding remapped uniforms) uploaded to GPU
volatile uint64 uniformBankUploadedCount; // number of separate uploads for uniformBankDataUploaded uint64 uniformBankUploadedCount; // number of separate uploads for uniformBankDataUploaded
volatile uint64 indexDataUploaded; uint64 indexDataUploaded;
volatile uint64 indexDataCached; uint64 indexDataCached;
}cycle[PERFORMANCE_MONITOR_TRACK_CYCLES]; }cycle[PERFORMANCE_MONITOR_TRACK_CYCLES];
volatile sint32 cycleIndex; sint32 cycleIndex;
// new stats // new stats
LattePerfStatTimer gpuTime_frameTime; LattePerfStatTimer gpuTime_frameTime;
LattePerfStatTimer gpuTime_shaderCreate; LattePerfStatTimer gpuTime_shaderCreate;

View file

@ -10,6 +10,8 @@
#include "Cafe/Filesystem/fsc.h" #include "Cafe/Filesystem/fsc.h"
#include "Cafe/HW/Espresso/PPCState.h" #include "Cafe/HW/Espresso/PPCState.h"
#include <inttypes.h>
static_assert(sizeof(acpMetaXml_t) == 0x3440); static_assert(sizeof(acpMetaXml_t) == 0x3440);
static_assert(offsetof(acpMetaXml_t, title_id) == 0x0000); static_assert(offsetof(acpMetaXml_t, title_id) == 0x0000);
static_assert(offsetof(acpMetaXml_t, boss_id) == 0x0008); static_assert(offsetof(acpMetaXml_t, boss_id) == 0x0008);
@ -85,7 +87,7 @@ namespace iosu
return; return;
const char* text = subElement->GetText(); const char* text = subElement->GetText();
uint64 value; uint64 value;
if (sscanf(text, "%llx", &value) == 0) if (sscanf(text, "%" SCNx64, &value) == 0)
return; return;
*v = _swapEndianU64(value); *v = _swapEndianU64(value);
} }

View file

@ -1,5 +1,3 @@
#pragma once
#include "Cafe/OS/libs/coreinit/coreinit_Thread.h" #include "Cafe/OS/libs/coreinit/coreinit_Thread.h"
#include "util/helpers/fspinlock.h" #include "util/helpers/fspinlock.h"

View file

@ -470,7 +470,7 @@ namespace coreinit
// mark current block as free // mark current block as free
block->isFree = _swapEndianU32(1); block->isFree = _swapEndianU32(1);
// attempt to merge with previous block // attempt to merge with previous block
if (_swapEndianU32(block->previousBlock) != NULL) if (_swapEndianU32(block->previousBlock) != MPTR_NULL)
{ {
MPTR previousBlockMPTR = _swapEndianU32(block->previousBlock); MPTR previousBlockMPTR = _swapEndianU32(block->previousBlock);
MEMBlockHeapTrackDEPR* previousBlock = (MEMBlockHeapTrackDEPR*)memory_getPointerFromVirtualOffset(previousBlockMPTR); MEMBlockHeapTrackDEPR* previousBlock = (MEMBlockHeapTrackDEPR*)memory_getPointerFromVirtualOffset(previousBlockMPTR);
@ -494,7 +494,7 @@ namespace coreinit
} }
} }
// attempt to merge with next block // attempt to merge with next block
if (_swapEndianU32(block->nextBlock) != NULL) if (_swapEndianU32(block->nextBlock) != MPTR_NULL)
{ {
MPTR nextBlockMPTR = _swapEndianU32(block->nextBlock); MPTR nextBlockMPTR = _swapEndianU32(block->nextBlock);
MEMBlockHeapTrackDEPR* nextBlock = (MEMBlockHeapTrackDEPR*)memory_getPointerFromVirtualOffset(nextBlockMPTR); MEMBlockHeapTrackDEPR* nextBlock = (MEMBlockHeapTrackDEPR*)memory_getPointerFromVirtualOffset(nextBlockMPTR);

View file

@ -34,7 +34,7 @@ namespace coreinit
{ {
debug_printf("coreinitVirtualMemory_alloc(): Unable to allocate memory\n"); debug_printf("coreinitVirtualMemory_alloc(): Unable to allocate memory\n");
debugBreakpoint(); debugBreakpoint();
return NULL; return MPTR_NULL;
} }
// check for overlapping regions // check for overlapping regions
OSVirtMemory* virtMemItr = virtualMemoryList; OSVirtMemory* virtMemItr = virtualMemoryList;
@ -66,7 +66,7 @@ namespace coreinit
return currentAddress; return currentAddress;
} }
} }
return NULL; return MPTR_NULL;
} }
void coreinitExport_OSGetAvailPhysAddrRange(PPCInterpreter_t* hCPU) void coreinitExport_OSGetAvailPhysAddrRange(PPCInterpreter_t* hCPU)

View file

@ -99,7 +99,7 @@ namespace snd_core
} }
coreinit::OSInitMutexEx(__AXAppFrameCallbackMutex.GetPtr(), NULL); coreinit::OSInitMutexEx(__AXAppFrameCallbackMutex.GetPtr(), NULL);
for (sint32 i = 0; i < AX_DEV_COUNT; i++) for (sint32 i = 0; i < AX_DEV_COUNT; i++)
__AXDeviceFinalMixCallback[i] = NULL; __AXDeviceFinalMixCallback[i] = MPTR_NULL;
} }
sint32 AXRegisterAppFrameCallback(MPTR funcAddr) sint32 AXRegisterAppFrameCallback(MPTR funcAddr)

View file

@ -18,12 +18,12 @@ struct ParsedMetaXml
std::string GetShortName(CafeConsoleLanguage languageId) const std::string GetShortName(CafeConsoleLanguage languageId) const
{ {
return m_short_name[(size_t)languageId]; return m_short_name[(size_t)languageId].empty() ? m_short_name[(size_t)CafeConsoleLanguage::EN] : m_short_name[(size_t)languageId];
} }
std::string GetLongName(CafeConsoleLanguage languageId) const std::string GetLongName(CafeConsoleLanguage languageId) const
{ {
return m_long_name[(size_t)languageId]; return m_long_name[(size_t)languageId].empty() ? m_long_name[(size_t)CafeConsoleLanguage::EN] : m_long_name[(size_t)languageId];
} }
TitleId GetTitleId() const TitleId GetTitleId() const
@ -134,7 +134,7 @@ private:
else if (language == "ru") else if (language == "ru")
return (sint32)CafeConsoleLanguage::RU; return (sint32)CafeConsoleLanguage::RU;
else if (language == "zht") else if (language == "zht")
return (sint32)CafeConsoleLanguage::ZH; return (sint32)CafeConsoleLanguage::TW; // if return ZH here, xxx_zht values may cover xxx_zh values in function Parse()
return -1; return -1;
} }
}; };

View file

@ -3,11 +3,9 @@
// printf-style macros that are only active in non-release builds // printf-style macros that are only active in non-release builds
#ifdef PUBLIC_RELEASE #ifdef PUBLIC_RELEASE
#define debug_printf // #define debug_printf(...)
#define debug_puts //
static void debugBreakpoint() { } static void debugBreakpoint() { }
#else #else
#define debug_printf printf #define debug_printf(...) printf(__VA_ARGS__)
#define debug_puts puts
static void debugBreakpoint() {} static void debugBreakpoint() {}
#endif #endif

View file

@ -210,6 +210,15 @@ typedef union _LARGE_INTEGER {
inline T& operator^= (T& a, T b) { return reinterpret_cast<T&>( reinterpret_cast<std::underlying_type<T>::type&>(a) ^= static_cast<std::underlying_type<T>::type>(b) ); } inline T& operator^= (T& a, T b) { return reinterpret_cast<T&>( reinterpret_cast<std::underlying_type<T>::type&>(a) ^= static_cast<std::underlying_type<T>::type>(b) ); }
#endif #endif
#if !defined(_MSC_VER) || defined(__clang__) // clang-cl does not have built-in _udiv128
inline uint64 _udiv128(uint64 highDividend, uint64 lowDividend, uint64 divisor, uint64 *remainder)
{
unsigned __int128 dividend = (((unsigned __int128)highDividend) << 64) | ((unsigned __int128)lowDividend);
*remainder = (uint64)((dividend % divisor) & 0xFFFFFFFFFFFFFFFF);
return (uint64)((dividend / divisor) & 0xFFFFFFFFFFFFFFFF);
}
#endif
#if defined(_MSC_VER) #if defined(_MSC_VER)
#define UNREACHABLE __assume(false) #define UNREACHABLE __assume(false)
#elif defined(__GNUC__) #elif defined(__GNUC__)

View file

@ -1,5 +1,4 @@
#pragma once #pragma once
extern "C" uint64 ATTR_MS_ABI udiv128(uint64 low, uint64 hi, uint64 divisor, uint64 *remainder);
extern "C" void recompiler_fres(); extern "C" void recompiler_fres();
extern "C" void recompiler_frsqrte(); extern "C" void recompiler_frsqrte();

View file

@ -1,12 +1,5 @@
.code .code
udiv128 PROC
mov rax, rcx
div r8
mov [r9], rdx
ret
udiv128 ENDP
recompiler_fres PROC recompiler_fres PROC
; store all modified registers ; store all modified registers
push rdx push rdx

View file

@ -536,7 +536,7 @@ void wxGameList::OnContextMenuSelected(wxCommandEvent& event)
std::string customName = ""; std::string customName = "";
if (!GetConfig().GetGameListCustomName(title_id, customName)) if (!GetConfig().GetGameListCustomName(title_id, customName))
customName.clear(); customName.clear();
wxTextEntryDialog dialog(this, wxEmptyString, L"Enter a custom game title", customName); wxTextEntryDialog dialog(this, wxEmptyString, _("Enter a custom game title"), wxHelper::FromUtf8(customName));
if(dialog.ShowModal() == wxID_OK) if(dialog.ShowModal() == wxID_OK)
{ {
const auto custom_name = dialog.GetValue(); const auto custom_name = dialog.GetValue();
@ -859,7 +859,7 @@ void wxGameList::OnGameEntryUpdatedByTitleId(wxTitleIdEvent& event)
if(index == wxNOT_FOUND) if(index == wxNOT_FOUND)
{ {
// entry doesn't exist // entry doesn't exist
index = InsertItem(FindInsertPosition(baseTitleId), wxHelper::FromUtf8(gameInfo.GetTitleName())); index = InsertItem(FindInsertPosition(baseTitleId), wxHelper::FromUtf8(GetNameByTitleId(baseTitleId)));
SetItemPtrData(index, baseTitleId); SetItemPtrData(index, baseTitleId);
isNewEntry = true; isNewEntry = true;
} }

View file

@ -216,7 +216,7 @@ DefaultControllerSettings::DefaultControllerSettings(wxWindow* parent, const wxP
m_timer = new wxTimer(this); m_timer = new wxTimer(this);
Bind(wxEVT_TIMER, &DefaultControllerSettings::on_timer, this); Bind(wxEVT_TIMER, &DefaultControllerSettings::on_timer, this);
m_timer->Start(); m_timer->Start(100);
} }
DefaultControllerSettings::~DefaultControllerSettings() DefaultControllerSettings::~DefaultControllerSettings()

View file

@ -234,7 +234,7 @@ WiimoteControllerSettings::WiimoteControllerSettings(wxWindow* parent, const wxP
m_timer = new wxTimer(this); m_timer = new wxTimer(this);
Bind(wxEVT_TIMER, &WiimoteControllerSettings::on_timer, this); Bind(wxEVT_TIMER, &WiimoteControllerSettings::on_timer, this);
m_timer->Start(); m_timer->Start(100);
} }
WiimoteControllerSettings::~WiimoteControllerSettings() WiimoteControllerSettings::~WiimoteControllerSettings()