Remove PUBLIC_RELEASE flag and tie asserts to debug config (#287)

Removes the -DPUBLIC_RELEASE flag. Cemu's debug asserts are now only enabled if the build configuration is Debug. Similarly, on Windows the console is only shown for Debug builds.
This commit is contained in:
Exzap 2022-09-24 08:43:27 +02:00 committed by GitHub
parent b720d17a97
commit 3bceb39966
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
68 changed files with 154 additions and 186 deletions

View File

@ -27,7 +27,7 @@ jobs:
if: ${{ inputs.deploymode == 'release' }}
run: |
echo "BUILD_MODE=release" >> $GITHUB_ENV
echo "BUILD_FLAGS=-DPUBLIC_RELEASE=ON" >> $GITHUB_ENV
echo "BUILD_FLAGS=" >> $GITHUB_ENV
echo "Build mode is release"
- name: Setup debug mode parameters (for continous build)
if: ${{ inputs.deploymode != 'release' }}
@ -99,7 +99,7 @@ jobs:
if: ${{ inputs.deploymode == 'release' }}
run: |
echo "BUILD_MODE=release" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
echo "BUILD_FLAGS=-DPUBLIC_RELEASE=ON" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
echo "BUILD_FLAGS=" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
echo "Build mode is release"
- name: Setup debug mode parameters (for continous build)
@ -173,7 +173,7 @@ jobs:
if: ${{ inputs.deploymode == 'release' }}
run: |
echo "BUILD_MODE=release" >> $GITHUB_ENV
echo "BUILD_FLAGS=-DPUBLIC_RELEASE=ON" >> $GITHUB_ENV
echo "BUILD_FLAGS=" >> $GITHUB_ENV
echo "Build mode is release"
- name: Setup debug mode parameters (for continous build)
if: ${{ inputs.deploymode != 'release' }}

View File

@ -30,7 +30,7 @@ To compile Cemu, a recent enough compiler and STL with C++20 support is required
*Additionally, for Ubuntu 22.04 only:*
- `sudo apt install -y clang-12`
- At step 3 while building, use
`cmake -S . -B build -DCMAKE_BUILD_TYPE=release -DPUBLIC_RELEASE=ON -DCMAKE_C_COMPILER=/usr/bin/clang-12 -DCMAKE_CXX_COMPILER=/usr/bin/clang++-12 -G Ninja -DCMAKE_MAKE_PROGRAM=/usr/bin/ninja`
`cmake -S . -B build -DCMAKE_BUILD_TYPE=release -DCMAKE_C_COMPILER=/usr/bin/clang-12 -DCMAKE_CXX_COMPILER=/usr/bin/clang++-12 -G Ninja -DCMAKE_MAKE_PROGRAM=/usr/bin/ninja`
#### For Arch and derivatives:
`sudo pacman -S git cmake clang ninja nasm base-devel linux-headers gtk3 libsecret libgcrypt systemd freeglut zip unzip libpulse`
@ -41,14 +41,14 @@ To compile Cemu, a recent enough compiler and STL with C++20 support is required
### Build Cemu using cmake and clang
1. `git clone --recursive https://github.com/cemu-project/Cemu`
2. `cd Cemu`
3. `cmake -S . -B build -DCMAKE_BUILD_TYPE=release -DPUBLIC_RELEASE=ON -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++ -G Ninja`
3. `cmake -S . -B build -DCMAKE_BUILD_TYPE=release -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++ -G Ninja`
4. `cmake --build build`
5. You should now have a Cemu executable file in the /bin folder, which you can run using `./bin/Cemu_release`.
#### Using GCC
While we use and test Cemu using clang, using GCC might work better with your distro (they should be fairly similar performance/issues wise and should only be considered if compilation is the issue).
You can use it by replacing the step 3 with the following:
`cmake -S . -B build -DCMAKE_BUILD_TYPE=release -DPUBLIC_RELEASE=ON -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ -G Ninja`
`cmake -S . -B build -DCMAKE_BUILD_TYPE=release -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ -G Ninja`
#### Troubleshooting steps
- If step 3 gives you an error about not being able to find ninja, try appending `-DCMAKE_MAKE_PROGRAM=/usr/bin/ninja` to the command and running it again.

View File

@ -1,6 +1,5 @@
cmake_minimum_required(VERSION 3.21.1)
option(PUBLIC_RELEASE "Compile with debug asserts disabled and no console" OFF)
option(ENABLE_VCPKG "Enable the vcpkg package manager" ON)
set(EXPERIMENTAL_VERSION "" CACHE STRING "") # used by CI script to set experimental version
@ -29,13 +28,14 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if (PUBLIC_RELEASE)
add_compile_definitions(PUBLIC_RELEASE)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) # enable LTO
endif()
add_compile_definitions($<$<CONFIG:Debug>:CEMU_DEBUG_ASSERT>) # if build type is debug, set CEMU_DEBUG_ASSERT
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# enable link time optimization for release builds
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE ON)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO ON)
if (MSVC)
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT CemuBin)
# floating point model: precise, fiber safe optimizations
@ -48,10 +48,9 @@ if (MSVC)
else()
add_compile_options(/GT)
endif()
if (PUBLIC_RELEASE)
message(STATUS "Using additional optimization flags for MSVC")
add_compile_options(/Oi /Ot) # enable intrinsic functions, favor speed
endif()
# enable additional optimization flags for release builds
add_compile_options($<$<CONFIG:Release,RelWithDebInfo>:/Oi>) # enable intrinsic functions
add_compile_options($<$<CONFIG:Release,RelWithDebInfo>:/Ot>) # favor speed
endif()
if (APPLE)

View File

@ -1,7 +1,7 @@
{
"configurations": [
{
"name": "Release",
"name": "RelWithDebInfo",
"configurationType": "RelWithDebInfo",
"generator": "Ninja",
"inheritEnvironments": [ "msvc_x64_x64" ],
@ -9,13 +9,12 @@
"installRoot": "${projectDir}\\out\\install\\${name}"
},
{
"name": "Public Release",
"configurationType": "RelWithDebInfo",
"name": "Release",
"configurationType": "Release",
"generator": "Ninja",
"inheritEnvironments": [ "msvc_x64_x64" ],
"buildRoot": "${projectDir}\\out\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}",
"cmakeCommandArgs": "-DPUBLIC_RELEASE=ON"
},
{
"name": "Debug",

View File

@ -1,2 +1,2 @@
"C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\2022\COMMUNITY\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\CMake\bin\cmake.exe" -B build/ -DPUBLIC_RELEASE=ON
"C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\2022\COMMUNITY\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\CMake\bin\cmake.exe" -B build/
pause

View File

@ -54,17 +54,10 @@ add_subdirectory(imgui)
add_subdirectory(resource)
add_subdirectory(asm)
if(PUBLIC_RELEASE)
add_executable(CemuBin WIN32
add_executable(CemuBin
main.cpp
mainLLE.cpp
)
else()
add_executable(CemuBin
main.cpp
mainLLE.cpp
)
endif()
)
if(WIN32)
target_sources(CemuBin PRIVATE
@ -73,6 +66,7 @@ if(WIN32)
endif()
set_property(TARGET CemuBin PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
set_property(TARGET CemuBin PROPERTY WIN32_EXECUTABLE $<NOT:$<CONFIG:Debug>>)
set_target_properties(CemuBin PROPERTIES
# multi-configuration generators will add a config subdirectory to RUNTIME_OUTPUT_DIRECTORY if no generator expression is used

View File

@ -199,7 +199,7 @@ MPTR hle_locate(uint8* data, uint8* mask, sint32 dataLength)
}
else
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (mask[0] != 0xFF)
assert_dbg();
#endif
@ -299,7 +299,7 @@ void GamePatch_scan()
hleAddr = hle_locate(xcx_gpuHangDetection_degradeFramebuffer, NULL, sizeof(xcx_gpuHangDetection_degradeFramebuffer));
if( hleAddr )
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
forceLog_printf("HLE: XCX GPU hang detection");
#endif
// remove the ADDI r25, r25, 1 instruction
@ -309,7 +309,7 @@ void GamePatch_scan()
hleAddr = hle_locate(xcx_framebufferReductionSignature, xcx_framebufferReductionMask, sizeof(xcx_framebufferReductionSignature));
if( hleAddr )
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
forceLog_printf("HLE: Prevent XCX rendertarget reduction");
#endif
uint32 bl = memory_readU32(hleAddr+0x14);
@ -325,7 +325,7 @@ void GamePatch_scan()
hleAddr = hle_locate(botw_busyLoopSignature, botw_busyLoopMask, sizeof(botw_busyLoopSignature));
if (hleAddr)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
forceLog_printf("HLE: Patch BotW busy loop 1 at 0x%08x", hleAddr);
#endif
sint32 functionIndex = hleIndex_h000000001;
@ -336,7 +336,7 @@ void GamePatch_scan()
hleAddr = hle_locate(botw_busyLoopSignature2, botw_busyLoopMask2, sizeof(botw_busyLoopSignature2));
if (hleAddr)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
forceLog_printf("HLE: Patch BotW busy loop 2 at 0x%08x", hleAddr);
#endif
sint32 functionIndex = hleIndex_h000000002;

View File

@ -384,7 +384,7 @@ static void PPCInterpreter_MULHW_(PPCInterpreter_t* hCPU, uint32 opcode)
hCPU->gpr[rD] = ((uint64)c) >> 32;
if (opcode & PPC_OPC_RC) {
// update cr0 flags
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
#endif
ppc_update_cr0(hCPU, hCPU->gpr[rD]);

View File

@ -139,7 +139,7 @@ public:
return vAddr;
}
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (hCPU->memoryException)
assert_dbg(); // should not be set anymore
#endif
@ -456,7 +456,7 @@ public:
{
case 0:
debug_printf("ZERO[NOP] | 0x%08X\n", (unsigned int)hCPU->instructionPointer);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
while (true) std::this_thread::sleep_for(std::chrono::seconds(1));
#endif
@ -712,7 +712,7 @@ public:
PPCInterpreter_CMP(hCPU, opcode);
break;
case 4:
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
debug_printf("TW instruction executed at %08x\n", hCPU->instructionPointer);
#endif
PPCInterpreter_TW(hCPU, opcode);
@ -998,7 +998,7 @@ public:
break;
default:
debug_printf("Unknown execute %04X as [31] at %08X\n", PPC_getBits(opcode, 30, 10), hCPU->instructionPointer);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
#endif
hCPU->instructionPointer += 4;

View File

@ -559,7 +559,7 @@ static void PPCSprSupervisor_set(PPCInterpreter_t* hCPU, uint32 spr, uint32 newV
break;
default:
debug_printf("[C%d] Set unhandled SPR 0x%x to %08x (supervisor mode)\n", hCPU->spr.UPIR, spr, newValue);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
#endif
break;
@ -598,7 +598,7 @@ static void PPCSpr_set(PPCInterpreter_t* hCPU, uint32 spr, uint32 newValue)
break;
default:
debug_printf("[C%d] Set unhandled SPR %d to %08x\n", hCPU->spr.UPIR, spr, newValue);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
#endif
break;
@ -782,7 +782,7 @@ static uint32 PPCSprSupervisor_get(PPCInterpreter_t* hCPU, uint32 spr)
break;
default:
debug_printf("[C%d] Get unhandled SPR %d\n", hCPU->spr.UPIR, spr);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
#endif
break;
@ -840,7 +840,7 @@ static uint32 PPCSpr_get(PPCInterpreter_t* hCPU, uint32 spr)
break;
default:
debug_printf("[C%d] Get unhandled SPR %d\n", hCPU->spr.UPIR, spr);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
#endif
break;

View File

@ -153,7 +153,7 @@ private:
void checkForCollisions()
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
uint32 endOfPrevious = 0;
for (auto itr : map_ranges)
{

View File

@ -78,7 +78,7 @@ void PPCRecompiler_enter(PPCInterpreter_t* hCPU, PPCREC_JUMP_ENTRY funcPtr)
PPCRecompiler_enterRecompilerCode((uint64)funcPtr, (uint64)hCPU);
_controlfp(prevState, _MCW_RC);
// debug recompiler exit - useful to find frequently executed functions which couldn't be recompiled
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (hCPU->remainingCycles > 0 && GetAsyncKeyState(VK_F4))
{
auto t = std::chrono::high_resolution_clock::now();

View File

@ -415,7 +415,7 @@ uint32 PPCRecompilerImlGen_loadOverwriteFPRRegister(ppcImlGenContext_t* ppcImlGe
void PPCRecompilerImlGen_TW(ppcImlGenContext_t* ppcImlGenContext, uint32 opcode)
{
//#ifndef PUBLIC_RELEASE
//#ifdef CEMU_DEBUG_ASSERT
// PPCRecompilerImlGen_generateNewInstruction_macro(ppcImlGenContext, PPCREC_IML_MACRO_DEBUGBREAK, ppcImlGenContext->ppcAddressOfCurrentInstruction, 0, 0);
//#endif
PPCRecompilerImlGen_generateNewInstruction_macro(ppcImlGenContext, PPCREC_IML_MACRO_LEAVE, ppcImlGenContext->ppcAddressOfCurrentInstruction, 0, 0);
@ -2271,7 +2271,7 @@ bool PPCRecompilerImlGen_LSWI(ppcImlGenContext_t* ppcImlGenContext, uint32 opcod
// if nb == 4 this instruction immitates LWZ
if( rA == 0 )
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg(); // special form where gpr is ignored and only imm is used
#endif
return false;
@ -2291,7 +2291,7 @@ bool PPCRecompilerImlGen_LSWI(ppcImlGenContext_t* ppcImlGenContext, uint32 opcod
// if nb == 2 this instruction immitates a LHZ but the result is shifted left by 16 bits
if( rA == 0 )
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg(); // special form where gpr is ignored and only imm is used
#endif
return false;
@ -2313,7 +2313,7 @@ bool PPCRecompilerImlGen_LSWI(ppcImlGenContext_t* ppcImlGenContext, uint32 opcod
// if nb == 3 this instruction loads a 3-byte big-endian and the result is shifted left by 8 bits
if( rA == 0 )
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg(); // special form where gpr is ignored and only imm is used
#endif
return false;
@ -4560,7 +4560,7 @@ bool PPCRecompiler_generateIntermediateCode(ppcImlGenContext_t& ppcImlGenContext
if( ppcImlGenContext.imlList[i].type == PPCREC_IML_TYPE_JUMPMARK )
{
ppcImlGenContext.imlList[i].op_jumpmark.flags |= PPCREC_IML_OP_FLAG_UNUSED;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (map_jumpMarks.find(ppcImlGenContext.imlList[i].op_jumpmark.address) != map_jumpMarks.end())
assert_dbg();
#endif

View File

@ -2151,7 +2151,7 @@ void _reorderConditionModifyInstructions(PPCRecImlSegment_t* imlSegment)
}
// move CR setter instruction
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if ((unsafeInstructionIndex + 1) <= crSetterInstructionIndex)
assert_dbg();
#endif

View File

@ -6,7 +6,7 @@
void PPCRecRARange_addLink_perVirtualGPR(raLivenessSubrange_t** root, raLivenessSubrange_t* subrange)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if ((*root) && (*root)->range->virtualRegister != subrange->range->virtualRegister)
assert_dbg();
#endif
@ -35,7 +35,7 @@ void PPCRecRARange_removeLink_perVirtualGPR(raLivenessSubrange_t** root, raLiven
(*root) = subrange->link_sameVirtualRegisterGPR.next;
if (subrange->link_sameVirtualRegisterGPR.next)
subrange->link_sameVirtualRegisterGPR.next->link_sameVirtualRegisterGPR.prev = tempPrev;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
subrange->link_sameVirtualRegisterGPR.prev = (raLivenessSubrange_t*)1;
subrange->link_sameVirtualRegisterGPR.next = (raLivenessSubrange_t*)1;
#endif
@ -50,7 +50,7 @@ void PPCRecRARange_removeLink_allSubrangesGPR(raLivenessSubrange_t** root, raLiv
(*root) = subrange->link_segmentSubrangesGPR.next;
if (subrange->link_segmentSubrangesGPR.next)
subrange->link_segmentSubrangesGPR.next->link_segmentSubrangesGPR.prev = tempPrev;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
subrange->link_segmentSubrangesGPR.prev = (raLivenessSubrange_t*)1;
subrange->link_segmentSubrangesGPR.next = (raLivenessSubrange_t*)1;
#endif
@ -162,7 +162,7 @@ void PPCRecRA_mergeRanges(ppcImlGenContext_t* ppcImlGenContext, raLivenessRange_
void PPCRecRA_mergeSubranges(ppcImlGenContext_t* ppcImlGenContext, raLivenessSubrange_t* subrange, raLivenessSubrange_t* absorbedSubrange)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
PPCRecRA_debugValidateSubrange(subrange);
PPCRecRA_debugValidateSubrange(absorbedSubrange);
if (subrange->imlSegment != absorbedSubrange->imlSegment)
@ -212,7 +212,7 @@ void PPCRecRA_explodeRange(ppcImlGenContext_t* ppcImlGenContext, raLivenessRange
PPCRecRA_deleteRange(ppcImlGenContext, range);
}
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
void PPCRecRA_debugValidateSubrange(raLivenessSubrange_t* subrange)
{
// validate subrange
@ -236,7 +236,7 @@ void PPCRecRA_debugValidateSubrange(raLivenessSubrange_t* subrange) {}
raLivenessSubrange_t* PPCRecRA_splitLocalSubrange(ppcImlGenContext_t* ppcImlGenContext, raLivenessSubrange_t* subrange, sint32 splitIndex, bool trimToHole)
{
// validation
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (subrange->end.index == RA_INTER_RANGE_END || subrange->end.index == RA_INTER_RANGE_START)
assert_dbg();
if (subrange->start.index >= splitIndex)
@ -364,7 +364,7 @@ sint32 PPCRecRARange_estimateAdditionalCostAfterRangeExplode(raLivenessRange_t*
sint32 PPCRecRARange_estimateAdditionalCostAfterSplit(raLivenessSubrange_t* subrange, sint32 splitIndex)
{
// validation
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (subrange->end.index == RA_INTER_RANGE_END)
assert_dbg();
#endif

View File

@ -91,7 +91,7 @@ raRegisterState_t* PPCRecRA_getRegisterState(raRegisterState_t* regState, sint32
{
if (regState[i].virtualRegister == virtualRegister)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (regState[i].physicalRegister < 0)
assert_dbg();
#endif
@ -300,7 +300,7 @@ void _sortSegmentAllSubrangesLinkedList(PPCRecImlSegment_t* imlSegment)
subrangeList[i]->link_segmentSubrangesGPR.next = subrangeList[i + 1];
}
// validate list
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
sint32 count2 = 0;
subrangeItr = imlSegment->raInfo.linkedList_allSubranges;
sint32 currentStartIndex = RA_INTER_RANGE_START;
@ -342,7 +342,7 @@ bool PPCRecRA_assignSegmentRegisters(ppcImlGenContext_t* ppcImlGenContext, PPCRe
raLivenessSubrange_t* liverange = liveInfo.liveRangeList[f];
if (liverange->end.index <= currentIndex && liverange->end.index != RA_INTER_RANGE_END)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (liverange->subrangeBranchTaken || liverange->subrangeBranchNotTaken)
assert_dbg(); // infinite subranges should not expire
#endif
@ -356,7 +356,7 @@ bool PPCRecRA_assignSegmentRegisters(ppcImlGenContext_t* ppcImlGenContext, PPCRe
if (subrangeItr->range->physicalRegister >= 0)
{
// verify if register is actually available
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
for (sint32 f = 0; f < liveInfo.liveRangesCount; f++)
{
raLivenessSubrange_t* liverangeItr = liveInfo.liveRangeList[f];
@ -778,7 +778,7 @@ void PPCRecRA_generateSegmentInstructions(ppcImlGenContext_t* ppcImlGenContext,
{
liveInfo.liveRangeList[liveInfo.liveRangesCount] = subrangeItr;
liveInfo.liveRangesCount++;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
// load GPR
if (subrangeItr->_noLoad == false)
{

View File

@ -105,7 +105,7 @@ void PPCRecRA_createSegmentLivenessRanges(ppcImlGenContext_t* ppcImlGenContext,
for (sint32 i = 0; i < PPC_REC_MAX_VIRTUAL_GPR; i++)
{
vGPR2Subrange[i] = imlSegment->raInfo.linkedList_perVirtualGPR[i];
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (vGPR2Subrange[i] && vGPR2Subrange[i]->link_sameVirtualRegisterGPR.next != nullptr)
assert_dbg();
#endif
@ -129,7 +129,7 @@ void PPCRecRA_createSegmentLivenessRanges(ppcImlGenContext_t* ppcImlGenContext,
bool isWrite = (t == 3);
// add location
PPCRecRA_updateOrAddSubrangeLocation(vGPR2Subrange[virtualRegister], index, isWrite == false, isWrite);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (index < vGPR2Subrange[virtualRegister]->start.index)
assert_dbg();
if (index+1 > vGPR2Subrange[virtualRegister]->end.index)
@ -172,7 +172,7 @@ void PPCRecRA_extendRangeToBeginningOfSegment(ppcImlGenContext_t* ppcImlGenConte
void _PPCRecRA_connectRanges(ppcImlGenContext_t* ppcImlGenContext, sint32 vGPR, PPCRecImlSegment_t** route, sint32 routeDepth)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (routeDepth < 2)
assert_dbg();
#endif
@ -226,7 +226,7 @@ void _PPCRecRA_checkAndTryExtendRange(ppcImlGenContext_t* ppcImlGenContext, PPCR
void PPCRecRA_checkAndTryExtendRange(ppcImlGenContext_t* ppcImlGenContext, PPCRecImlSegment_t* currentSegment, sint32 vGPR)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (currentSegment->raDistances.reg[vGPR].usageEnd < 0)
assert_dbg();
#endif
@ -239,7 +239,7 @@ void PPCRecRA_checkAndTryExtendRange(ppcImlGenContext_t* ppcImlGenContext, PPCRe
else
instructionsUntilEndOfSeg = currentSegment->imlListCount - currentSegment->raDistances.reg[vGPR].usageEnd;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (instructionsUntilEndOfSeg < 0)
assert_dbg();
#endif
@ -269,7 +269,7 @@ void PPCRecRA_mergeCloseRangesForSegmentV2(ppcImlGenContext_t* ppcImlGenContext,
// check and extend if possible
PPCRecRA_checkAndTryExtendRange(ppcImlGenContext, imlSegment, i);
}
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (imlSegment->list_prevSegments.empty() == false && imlSegment->isEnterable)
assert_dbg();
if ((imlSegment->nextSegmentBranchNotTaken != nullptr || imlSegment->nextSegmentBranchTaken != nullptr) && imlSegment->nextSegmentIsUncertain)

View File

@ -505,7 +505,7 @@ LatteFetchShader* LatteFetchShader::FindByGPUState()
lookupInfo->programSize = _getFSProgramSize();
lookupInfo->lastFrameAccessed = LatteGPUState.frameCounter;
g_fetchShaderLookupCache.store(fsPhysAddr24, lookupInfo);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
cemu_assert_debug(g_fetchShaderLookupCache.lookup(fsPhysAddr24) == lookupInfo);
#endif
}

View File

@ -87,7 +87,7 @@ public:
return; // do nothing if added range is already covered
rangeBegin = (std::min)(rangeBegin, (*itr).first.rangeBegin);
// DEBUG - make sure this is the start point of the merge process (the first entry that starts below minValue)
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (itr != m_map.cbegin())
{
// check previous result

View File

@ -136,7 +136,7 @@ uint32 LatteCP_readU32Deprc()
}
v = *(uint32*)gxRingBufferReadPtr;
gxRingBufferReadPtr += 4;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (v == 0xcdcdcdcd)
assert_dbg();
#endif
@ -299,7 +299,7 @@ LatteCMDPtr LatteCP_itSetRegistersGeneric(LatteCMDPtr cmd, uint32 nWords)
uint32 registerIndex = TRegisterBase + registerOffset;
uint32 registerStartIndex = registerIndex;
uint32 registerEndIndex = registerStartIndex + nWords;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
cemu_assert_debug((registerIndex + nWords) <= LATTE_MAX_REGISTER);
#endif
uint32* outputReg = (uint32*)(LatteGPUState.contextRegister + registerIndex);
@ -340,7 +340,7 @@ LatteCMDPtr LatteCP_itSetRegistersGeneric(LatteCMDPtr cmd, uint32 nWords, TRegRa
uint32 registerIndex = TRegisterBase + registerOffset;
uint32 registerStartIndex = registerIndex;
uint32 registerEndIndex = registerStartIndex + nWords;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
cemu_assert_debug((registerIndex + nWords) <= LATTE_MAX_REGISTER);
#endif
cbRegRange(registerStartIndex, registerEndIndex);
@ -1069,7 +1069,7 @@ void LatteCP_processCommandBuffer(uint8* cmdBuffer, sint32 cmdSize, DrawPassCont
{
uint32 itCode = (itHeader >> 8) & 0xFF;
uint32 nWords = ((itHeader >> 16) & 0x3FFF) + 1;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
LatteCMDPtr expectedPostCmd = cmd + nWords;
#endif
switch (itCode)
@ -1126,7 +1126,7 @@ void LatteCP_processCommandBuffer(uint8* cmdBuffer, sint32 cmdSize, DrawPassCont
return;
cemu_assert_debug(!drawPassCtx.isWithinDrawPass());
}
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
expectedPostCmd = cmd;
#endif
}
@ -1156,7 +1156,7 @@ void LatteCP_processCommandBuffer(uint8* cmdBuffer, sint32 cmdSize, DrawPassCont
cmd = LatteCP_itDrawIndex2(cmd, nWords, drawPassCtx);
cmd = LatteCP_processCommandBuffer_continuousDrawPass(cmd, cmdStart, cmdEnd, drawPassCtx);
cemu_assert_debug(cmd == cmdEnd || drawPassCtx.isWithinDrawPass() == false); // draw sequence should have ended if we didn't reach the end of the command buffer
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
expectedPostCmd = cmd;
#endif
}
@ -1167,7 +1167,7 @@ void LatteCP_processCommandBuffer(uint8* cmdBuffer, sint32 cmdSize, DrawPassCont
cmd = LatteCP_itDrawIndexAuto(cmd, nWords, drawPassCtx);
cmd = LatteCP_processCommandBuffer_continuousDrawPass(cmd, cmdStart, cmdEnd, drawPassCtx);
cemu_assert_debug(cmd == cmdEnd || drawPassCtx.isWithinDrawPass() == false); // draw sequence should have ended if we didn't reach the end of the command buffer
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
expectedPostCmd = cmd;
#endif
#ifdef FAST_DRAW_LOGGING
@ -1313,7 +1313,7 @@ void LatteCP_processCommandBuffer(uint8* cmdBuffer, sint32 cmdSize, DrawPassCont
cemu_assert_debug(false);
LatteSkipCMD(nWords);
}
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if(cmd != expectedPostCmd)
debug_printf("cmd %016p expectedPostCmd %016p\n", cmd, expectedPostCmd);
cemu_assert_debug(cmd == expectedPostCmd);

View File

@ -402,7 +402,7 @@ void LatteOverlay_RenderNotifications(ImVec2& position, ImVec2& pivot, sint32 di
ImRotateEnd(0.001f * ticks.time_since_epoch().count());
ImGui::SameLine();
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
uint64 totalTime = g_compiling_pipelines_syncTimeSum / 1000000ull;
if (s_pipeline_count_async > 0)
{

View File

@ -506,7 +506,7 @@ bool LatteMRT::UpdateCurrentFBO()
}
else if (rtEffectiveSize->width != effectiveWidth && rtEffectiveSize->height != effectiveHeight)
{
#ifndef PUBLIC_RELEASE
#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);
#endif
}

View File

@ -11,7 +11,7 @@ LatteRingBuffer_t* LatteRingBuffer_create(uint8* data, uint32 size)
uint8* LatteRingBuffer_allocate(LatteRingBuffer_t* rb, sint32 size, sint32 alignment)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
cemu_assert_debug(size < rb->size);
#endif
// align

View File

@ -236,7 +236,7 @@ void LatteShader_UpdatePSInputs(uint32* contextRegisters)
}
// semantic imports from vertex shader
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
uint8 semanticMask[256 / 8] = { 0 };
#endif
cemu_assert_debug(numPSInputs <= GPU7_PS_MAX_INPUTS);
@ -273,7 +273,7 @@ void LatteShader_UpdatePSInputs(uint32* contextRegisters)
}
else
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (semanticMask[psSemanticId >> 3] & (1 << (psSemanticId & 7)))
{
forceLogDebug_printf("SemanticId already used");

View File

@ -252,7 +252,7 @@ float LatteSoftware_omod(uint32 omod, float f)
return 0.0f;
}
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
#define _clamp(__v) if(destClamp != 0) cemu_assert_unimplemented()
#else
#define _clamp(__v) // todo

View File

@ -100,7 +100,7 @@ void LatteStreamout_PrepareDrawcall(uint32 count, uint32 instanceCount)
uint32 streamoutWriteMask = 0;
if (geometryShader)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
cemu_assert_debug(vertexShader->streamoutBufferWriteMask2.any() == false);
#endif
for (sint32 i = 0; i < LATTE_NUM_STREAMOUT_BUFFER; i++)

View File

@ -1089,7 +1089,7 @@ LatteTextureView* LatteTexture_CreateMapping(MPTR physAddr, MPTR physMipAddr, si
// for accesses to mips/slices using a physAddress offset we manually need to create a new view lookup
// by default views only create a lookup for the base texture physAddress
view->CreateLookupForSubTexture(relativeMipIndex, relativeSliceIndex);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
LatteTextureView* testView = LatteTextureViewLookupCache::lookup(physAddr, width, height, depth, pitch, firstMip, numMip, firstSlice, numSlice, format, dimView);
cemu_assert(testView);
#endif

View File

@ -275,7 +275,7 @@ void LatteTexture_updateTexturesForStage(LatteDecompilerShader* shaderContext, u
// check for changes
if (LatteTC_HasTextureChanged(textureView->baseTexture) || swizzleChanged)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
debug_printf("Reload texture 0x%08x res %dx%d memRange %08x-%08x SwizzleChange: %s\n", textureView->baseTexture->physAddress, textureView->baseTexture->width, textureView->baseTexture->height, textureView->baseTexture->texDataPtrLow, textureView->baseTexture->texDataPtrHigh, swizzleChanged ? "yes" : "no");
#endif
// update swizzle / changed mip address

View File

@ -736,7 +736,7 @@ void LatteTextureLoader_writeReadbackTextureToMemory(LatteTextureDefinition* tex
LatteTextureLoaderCtx textureLoader = { 0 };
LatteTextureLoader_begin(&textureLoader, sliceIndex, mipIndex, textureData->physAddress, textureData->physMipAddress, textureData->format, textureData->dim, textureData->width, textureData->height, textureData->depth, textureData->mipLevels, textureData->pitch, textureData->tileMode, textureData->swizzle);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (textureData->depth != 1)
forceLog_printf("_writeReadbackTextureToMemory(): Texture has multiple slices (not supported)");
#endif

View File

@ -233,7 +233,7 @@ bool _isIntegerInstruction(const LatteDecompilerALUInstruction& aluInstruction)
case ALU_OP2_INST_SETNE_DX10:
return true;
default:
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
debug_printf("_isIntegerInstruction(): OP3=%s opcode=%02x\n", aluInstruction.isOP3 ? "true" : "false", aluInstruction.opcode);
cemu_assert_debug(false);
#endif
@ -259,7 +259,7 @@ bool _isIntegerInstruction(const LatteDecompilerALUInstruction& aluInstruction)
case ALU_OP3_INST_CMOVGE_INT:
return true;
default:
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
debug_printf("_isIntegerInstruction(): OP3=%s opcode=%02x\n", aluInstruction.isOP3?"true":"false", aluInstruction.opcode);
#endif
break;

View File

@ -2643,7 +2643,7 @@ void _emitTEXSampleTextureCode(LatteDecompilerShaderContext* shaderContext, Latt
src->add(");");
// debug
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if(texInstruction->opcode == GPU7_TEX_INST_LD )
src->add(" // TEX_INST_LD");
else if(texInstruction->opcode == GPU7_TEX_INST_SAMPLE )
@ -3460,7 +3460,7 @@ void _emitStreamWriteCode(LatteDecompilerShaderContext* shaderContext, LatteDeco
StringBuf* src = shaderContext->shaderSource;
if (shaderContext->analyzer.hasStreamoutEnable == false)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
src->add("// omitted streamout write" _CRLF);
#endif
return;
@ -3842,7 +3842,7 @@ void LatteDecompiler_emitGLSLHelperFunctions(LatteDecompilerShaderContext* shade
void _addPixelShaderExtraDebugInfo(LatteDecompilerShaderContext* shaderContext, StringBuf* fCStr_shaderSource)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
fCStr_shaderSource->add("// Color buffers:" _CRLF);
for(uint32 i=0; i<8; i++)
{
@ -3958,7 +3958,7 @@ void LatteDecompiler_emitGLSLShader(LatteDecompilerShaderContext* shaderContext,
// debug info
src->addFmt("// shader %08x%08x" _CRLF, (uint32)(shaderContext->shaderBaseHash >> 32), (uint32)(shaderContext->shaderBaseHash & 0xFFFFFFFF));
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
src->addFmt("// usesIntegerValues: {}" _CRLF, shaderContext->analyzer.usesIntegerValues?"true":"false");
src->addFmt(_CRLF);

View File

@ -35,7 +35,7 @@ LatteTextureGL::LatteTextureGL(uint32 textureUnit, Latte::E_DIM dim, MPTR physAd
LatteTextureGL::InitTextureState();
// set debug name
bool useGLDebugNames = false;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
useGLDebugNames = true;
#endif
if (LaunchSettings::NSightModeEnabled())

View File

@ -97,7 +97,7 @@ void LatteTextureViewGL::InitAliasView()
// set debug name
bool useGLDebugNames = false;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
useGLDebugNames = true;
#endif
if (LaunchSettings::NSightModeEnabled())

View File

@ -21,7 +21,7 @@ public:
cemu_assert_debug(refCount == 0);
// remove references
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
for (auto itr : refs)
{
auto& rev = itr->ref->reverseRefs;
@ -58,7 +58,7 @@ public:
this->refs.emplace_back(refTarget->selfRef);
refTarget->refCount++;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
// add reverse ref
refTarget->reverseRefs.emplace_back(this->selfRef);
#endif
@ -80,7 +80,7 @@ protected:
private:
VKRMoveableRefCounterRef* selfRef;
std::vector<VKRMoveableRefCounterRef*> refs;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
std::vector<VKRMoveableRefCounterRef*> reverseRefs;
#endif

View File

@ -54,7 +54,7 @@ const std::vector<const char*> kRequiredDeviceExtensions =
VKAPI_ATTR VkBool32 VKAPI_CALL DebugUtilsCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (strstr(pCallbackData->pMessage, "consumes input location"))
return VK_FALSE; // false means we dont care
@ -636,7 +636,7 @@ VulkanRenderer::~VulkanRenderer()
VulkanRenderer* VulkanRenderer::GetInstance()
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
cemu_assert_debug(g_renderer && dynamic_cast<VulkanRenderer*>(g_renderer.get()));
// Use #if here because dynamic_casts dont get optimized away even if the result is not stored as with cemu_assert_debug
#endif

View File

@ -334,7 +334,7 @@ PipelineInfo* VulkanRenderer::draw_getOrCreateGraphicsPipeline(uint32 indexCount
if (cache_object != nullptr)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
cemu_assert_debug(cache_object->vertexShader == LatteSHRC_GetActiveVertexShader());
cemu_assert_debug(cache_object->geometryShader == LatteSHRC_GetActiveGeometryShader());
cemu_assert_debug(cache_object->pixelShader == LatteSHRC_GetActivePixelShader());
@ -1456,7 +1456,7 @@ void VulkanRenderer::draw_execute(uint32 baseVertex, uint32 baseInstance, uint32
else
{
pipeline_info = m_state.activePipelineInfo;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
auto pipeline_info2 = draw_getOrCreateGraphicsPipeline(count);
if (pipeline_info != pipeline_info2)
{

View File

@ -606,7 +606,7 @@ namespace iosu
FSCVirtualFile* fscFile = sFileHandleTable.GetByHandle(fileHandle);
if (!fscFile)
return (FSStatus)FS_RESULT::ERR_PLACEHOLDER;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
cemuLog_force("FSAProcessCmd_appendFile(): size 0x{:08x} count 0x{:08x} (todo)\n", _swapEndianU32(cmd->cmdAppendFile.size), _swapEndianU32(cmd->cmdAppendFile.count));
#endif
return _swapEndianU32(cmd->cmdAppendFile.size) * _swapEndianU32(cmd->cmdAppendFile.count);

View File

@ -10,7 +10,7 @@ namespace iosu
static void _assume_lock()
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
cemu_assert_debug(!sInternalMutex.try_lock());
#endif
}

View File

@ -485,7 +485,7 @@ namespace iosu
CURL* curl = it->curl.get();
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 2);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
char errbuf[CURL_ERROR_SIZE]{};
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
@ -579,7 +579,7 @@ namespace iosu
if (curl_result != CURLE_OK)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
forceLogDebug_printf("curl error buff: %s", errbuf);
#endif
it->turn_state = kError;

View File

@ -1015,7 +1015,7 @@ bool RPLLoader_FixImportSymbols(RPLModule* rplLoaderContext, sint32 symtabSectio
}
if (foundExport == false)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (nameOffset > 0)
{
forceLogDebug_printf("export not found - force lookup in function exports");

View File

@ -119,7 +119,7 @@ void coreinitExport_OSPanic(PPCInterpreter_t* hCPU)
debug_printf("File: %s:%d\n", memory_getPointerFromVirtualOffset(hCPU->gpr[3]), hCPU->gpr[4]);
debug_printf("Msg: %s\n", memory_getPointerFromVirtualOffset(hCPU->gpr[5]));
DebugLogStackTrace(coreinit::OSGetCurrentThread(), coreinit::OSGetStackPointer());
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
while (true) std::this_thread::sleep_for(std::chrono::milliseconds(100));
#endif
@ -203,7 +203,7 @@ typedef struct
void coreinitExport_OSDriver_Register(PPCInterpreter_t* hCPU)
{
#ifndef PUBLIC_RELEASE
#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]);
#endif
OSDriverCallbacks_t* driverCallbacks = (OSDriverCallbacks_t*)memory_getPointerFromVirtualOffset(hCPU->gpr[5]);

View File

@ -70,7 +70,7 @@ namespace coreinit
return;
// debug begin
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
uint64 prevTick = 0;
auto itr = g_activeAlarmList.begin();
while (itr != g_activeAlarmList.end())

View File

@ -349,7 +349,7 @@ namespace coreinit
}
if (entryFound == false)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
#endif
}

View File

@ -99,7 +99,7 @@ namespace coreinit
if (deallocAddr < lcAddr[coreIndex] || deallocAddr >= (lcAddr[coreIndex] + LC_LOCKED_CACHE_SIZE))
{
// out of bounds
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
forceLog_printf("LCDealloc(): Out of bounds");
#endif
osLib_returnFromFunction(hCPU, 0);
@ -198,7 +198,7 @@ namespace coreinit
assert_dbg();
#endif
LCIsEnabled[PPCInterpreter_getCoreIndex(hCPU)]--;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (LCIsEnabled[PPCInterpreter_getCoreIndex(hCPU)] == 0)
{
uint32 coreIndex = PPCInterpreter_getCoreIndex(hCPU);

View File

@ -462,7 +462,7 @@ namespace coreinit
if (block != NULL)
{
MPTR blockMPTR = memory_getVirtualOffsetFromPointer(block);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (block->isFree != 0)
assert_dbg();
_blockHeapDebugVerifyLinkOrder(blockHeapHead);

View File

@ -938,7 +938,7 @@ void export_MEMSetGroupIDForExpHeap(PPCInterpreter_t* hCPU)
ppcDefineParamMEMPTR(heap, MEMHeapBase, 0);
ppcDefineParamU16(groupId, 1);
coreinitMemLog_printf("MEMSetGroupIDForExpHeap(0x%08x, %d)", heap.GetMPTR(), groupId);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg(); // someone test this and the entire groupId feature
#endif
uint16 oldGroupId = MEMSetGroupIDForExpHeap(heap.GetPtr(), groupId);

View File

@ -149,7 +149,7 @@ namespace coreinit
void _debugCheckChain(OSThread_t* thread, OSThreadLink* threadLink)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
cemu_assert_debug(tail.IsNull() == head.IsNull());
size_t linkOffset = getLinkOffset(thread, threadLink);
// expects thread to be in the chain

View File

@ -20,7 +20,7 @@ void gx2Export_GX2InitColorBufferRegs(PPCInterpreter_t* hCPU)
LatteAddrLib::GX2CalculateSurfaceInfo(colorBuffer->surface.format, colorBuffer->surface.width, colorBuffer->surface.height, colorBuffer->surface.depth, colorBuffer->surface.dim, colorBuffer->surface.tileMode, colorBuffer->surface.aa, _swapEndianU32(colorBuffer->viewMip), &surfaceInfo);
uint32 pitchHeight = (surfaceInfo.height * surfaceInfo.pitch) >> 6;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (colorBuffer->viewNumSlices != _swapEndianU32(1))
forceLogDebug_printf("GX2InitColorBufferRegs(): With unsupported slice count %d", _swapEndianU32(colorBuffer->viewNumSlices));
if (surfaceInfo.pitch < 7)
@ -139,7 +139,7 @@ void gx2Export_GX2SetColorBuffer(PPCInterpreter_t* hCPU)
GX2ColorBuffer* colorBufferBE = (GX2ColorBuffer*)memory_getPointerFromVirtualOffset(hCPU->gpr[3]);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
gx2Log_printf("ColorBuffer tileMode %01x PhysAddr %08x fmt %04x res %dx%d Mip %d Slice %d", (uint32)colorBufferBE->surface.tileMode.value(), (uint32)colorBufferBE->surface.imagePtr, (uint32)colorBufferBE->surface.format.value(), (uint32)colorBufferBE->surface.width, (uint32)colorBufferBE->surface.height, _swapEndianU32(colorBufferBE->viewMip), _swapEndianU32(colorBufferBE->viewFirstSlice));
#endif

View File

@ -397,7 +397,7 @@ void gx2Export_GX2CopySurfaceEx(PPCInterpreter_t* hCPU)
forceLogDebug_printf("rect left-top: %d/%d size: %d/%d", _swapEndianU32(rectSrc->left), _swapEndianU32(rectSrc->top), _swapEndianU32(rectSrc->right) - _swapEndianU32(rectSrc->left), _swapEndianU32(rectSrc->bottom) - _swapEndianU32(rectSrc->top));
}
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if( rectCount != 1 )
assert_dbg();
if( srcMip != 0 )
@ -440,7 +440,7 @@ void gx2Export_GX2ResolveAAColorBuffer(PPCInterpreter_t* hCPU)
uint32 srcSlice = _swapEndianU32(srcColorBuffer->viewFirstSlice);
uint32 dstSlice = hCPU->gpr[6];
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if( _swapEndianU32(srcColorBuffer->viewMip) != 0 || _swapEndianU32(srcColorBuffer->viewFirstSlice) != 0 )
assert_dbg();
#endif

View File

@ -839,7 +839,7 @@ size_t header_callback(char* buffer, size_t size, size_t nitems, void* userdata)
if (msg.order != QueueOrder_CBDone)
cemu_assert_suspicious();
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
char debug[500];
cemu_assert_debug((size*nitems) < 500);
memcpy(debug, buffer, size*nitems);

View File

@ -592,7 +592,7 @@ namespace nn
ppcDefineParamMPTR(funcMPTR, 1);
ppcDefineParamMPTR(customParam, 2);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
#endif
fpdPrepareRequest();

View File

@ -537,7 +537,7 @@ namespace nsyshid
_debugPrintHex("HIDSetReport", data, dataLength);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (reportRelatedUkn != 2 || reportId != 0)
assert_dbg();
#endif

View File

@ -116,7 +116,7 @@ sint32 _translateError(sint32 returnCode, sint32 wsaError, sint32 mode = _ERROR_
break;
case WSAECONNABORTED:
debug_printf("WSAECONNABORTED\n");
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
#endif
break;
@ -652,7 +652,7 @@ void nsysnetExport_inet_pton(PPCInterpreter_t* hCPU)
invalidIp = true;
if (d3 < 0 || d3 > 255)
invalidIp = true;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (invalidIp)
assert_dbg();
#endif
@ -1245,7 +1245,7 @@ void nsysnetExport_gethostbyaddr(PPCInterpreter_t* hCPU)
return;
}
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (he->h_addrtype != AF_INET)
assert_dbg();
if (he->h_length != sizeof(in_addr))

View File

@ -692,7 +692,7 @@ namespace snd_core
{
if (internalShadowCopy->biquad.on == AX_BIQUAD_OFF)
return;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (internalShadowCopy->biquad.on != 0x0200)
{
forceLogDebug_printf("AX_ApplyBiquad() with incorrect biquad.on value 0x%04x", _swapEndianU16(internalShadowCopy->biquad.on));

View File

@ -702,7 +702,7 @@ namespace snd_core
{
AXVPBInternal_t* internal = __AXVPBInternalVoiceArray + (sint32)vpb->index;
ratio *= 65536.0f;
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (ratio >= 4294967296.0f)
assert_dbg();
#endif

View File

@ -309,13 +309,13 @@ void cbDeserializeArg_MiiMaker(deserializedArg_t* deserializedArg, void* customP
}
else if (strcmp(deserializedArg->argument, "slot_id") == 0)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
#endif
}
else
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
#endif
}

View File

@ -2,7 +2,7 @@
// printf-style macros that are only active in non-release builds
#ifdef PUBLIC_RELEASE
#ifndef CEMU_DEBUG_ASSERTS
#define debug_printf(...)
static void debugBreakpoint() { }
#else

View File

@ -121,12 +121,8 @@ void cemuLog_writeLineToLog(std::string_view text, bool date, bool new_line)
const auto temp_time = std::chrono::system_clock::to_time_t(now);
const auto& time = *std::localtime(&temp_time);
#ifdef PUBLIC_RELEASE
auto time_str = fmt::format("[{:02d}:{:02d}:{:02d}] ", time.tm_hour, time.tm_min, time.tm_sec);
#else
auto time_str = fmt::format("[{:02d}:{:02d}:{:02d}.{:03d}] ", time.tm_hour, time.tm_min, time.tm_sec,
std::chrono::duration_cast<std::chrono::milliseconds>(now - std::chrono::time_point_cast<std::chrono::seconds>(now)).count());
#endif
LogContext.text_cache.emplace_back(std::move(time_str));
}

View File

@ -91,7 +91,7 @@ bool cemuLog_log(LogType type, const T* format, TArgs&&... args)
template<typename TFmt, typename ... TArgs>
bool cemuLog_logDebug(LogType type, TFmt format, TArgs&&... args)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
return cemuLog_log(type, format, std::forward<TArgs>(args)...);
#else
return false;
@ -164,7 +164,7 @@ void cemuLog_force(TFmt format, TArgs&&... args)
#define saveLog_printf(...) if( cafeLog_isLoggingFlagEnabled(LOG_TYPE_SAVE) ) cafeLog_log(LOG_TYPE_SAVE, __VA_ARGS__);
#define nfpLog_printf(...) if( cafeLog_isLoggingFlagEnabled(LOG_TYPE_NFP) ) cafeLog_log(LOG_TYPE_NFP, __VA_ARGS__);
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
#define forceLogDebug_printf(...) cafeLog_log(LOG_TYPE_FORCE, __VA_ARGS__);
#define forceLogDebug_printfW(...) cafeLog_logW(LOG_TYPE_FORCE, __VA_ARGS__);

View File

@ -3497,7 +3497,7 @@ void ppcAsmTestDisassembler()
void ppcAsmTest()
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
ppcAsmTestDisassembler();
#endif
}

View File

@ -29,7 +29,7 @@ sint32 nexService_parseResponse(uint8* data, sint32 length, nexServiceResponse_t
protocolId &= 0x7F;
if (isRequest)
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg(); // should never reach since we handle requests before this function is called
#endif
}

View File

@ -452,7 +452,7 @@ prudpIncomingPacket::prudpIncomingPacket(prudpStreamSettings_t* streamSettings,
}
else
{
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
assert_dbg();
#endif
}
@ -607,7 +607,7 @@ void prudpClient::sortIncomingDataPacket(prudpIncomingPacket* incomingPacket)
uint16 seqDif = sequenceIdIncomingPacket - queue_incomingPackets[insertIndex]->sequenceId;
if (seqDif&0x8000)
break; // negative seqDif -> insert before current element
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
if (seqDif == 0)
assert_dbg(); // same sequence id, sort by fragment index?
#endif

View File

@ -361,7 +361,7 @@ inline void cemu_assert(bool _condition)
}
}
#ifdef PUBLIC_RELEASE
#ifndef CEMU_DEBUG_ASSERT
//#define cemu_assert_debug(__cond) -> Forcing __cond not to be evaluated currently has unexpected side-effects
inline void cemu_assert_debug(bool _condition)

View File

@ -7,10 +7,8 @@
// the minor version is used for experimental builds to indicate the build index. Set by command line option from CI build script
// if zero, the version text will be constructed as LEAD.MAJOR, otherwise as LEAD.MAJOR-MINOR
#if !defined(PUBLIC_RELEASE)
#define EMULATOR_VERSION_SUFFIX " (dev)"
#elif defined(EMULATOR_VERSION_MINOR) && EMULATOR_VERSION_MINOR == 0
#define EMULATOR_VERSION_SUFFIX "" // stable
#if defined(EMULATOR_VERSION_MINOR) && EMULATOR_VERSION_MINOR == 0
#define EMULATOR_VERSION_SUFFIX ""
#else
#define EMULATOR_VERSION_SUFFIX " (experimental)"
#endif

View File

@ -1375,11 +1375,7 @@ void MainWindow::OnKeyUp(wxKeyEvent& event)
SetFullScreen(false);
else if (code == WXK_RETURN && event.AltDown())
SetFullScreen(!IsFullScreen());
#ifdef PUBLIC_RELEASE
else if (code == WXK_F12)
#else
else if (code == WXK_F11)
#endif
g_window_info.has_screenshot_request = true; // async screenshot request
}
@ -2058,7 +2054,7 @@ void MainWindow::RecreateMenu()
else
{
// add 'Stop emulation' menu entry to file menu
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
m_fileMenu->Append(MAINFRAME_MENU_ID_FILE_END_EMULATION, _("End emulation"));
#endif
}
@ -2179,7 +2175,7 @@ void MainWindow::RecreateMenu()
debugLoggingMenu->AppendSeparator();
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_OPENGL, _("&OpenGL debug output"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_OPENGL));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_VULKAN_VALIDATION, _("&Vulkan validation layer (slow)"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_VULKAN_VALIDATION));
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_ADVANCED_PPC_INFO, _("&Log PPC context for API"), wxEmptyString)->Check(cemuLog_advancedPPCLoggingEnabled());
#endif
m_loggingSubmenu = debugLoggingMenu;
@ -2205,12 +2201,12 @@ void MainWindow::RecreateMenu()
debugMenu->AppendSeparator();
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
auto audioAuxOnly = debugMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_AUDIO_AUX_ONLY, _("&Audio AUX only"), wxEmptyString);
audioAuxOnly->Check(ActiveSettings::AudioOutputOnlyAux());
#endif
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
debugMenu->Append(MAINFRAME_MENU_ID_DEBUG_VIEW_LOGGING_WINDOW, _("&Open logging window"));
#endif
debugMenu->Append(MAINFRAME_MENU_ID_DEBUG_VIEW_PPC_THREADS, _("&View PPC threads"));

View File

@ -246,7 +246,7 @@ int mainEmulatorHLE()
wxMessageBox("Cemu doesn't have write access to it's own directory.\nPlease move it to a different location or run Cemu as administrator!", "Warning", wxOK|wxICON_ERROR); // todo - different error messages per OS
LatteOverlay_init();
// run a couple of tests if in non-release mode
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
unitTests();
#endif
// init common
@ -338,39 +338,30 @@ void ToolShaderCacheMerger();
#if BOOST_OS_WINDOWS
#ifndef PUBLIC_RELEASE
#include <crtdbg.h>
int wmain(int argc, wchar_t* argv[])
{
SDL_SetMainReady();
_CrtSetDbgFlag(_CRTDBG_CHECK_DEFAULT_DF);
//ToolShaderCacheMerger();
if (!LaunchSettings::HandleCommandline(argc, argv))
return 0;
ActiveSettings::LoadOnce();
HandlePostUpdate();
return mainEmulatorHLE();
}
#else
// entrypoint for release builds
int wWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nShowCmd)
{
SDL_SetMainReady();
if (!LaunchSettings::HandleCommandline(lpCmdLine))
return 0;
ActiveSettings::LoadOnce();
HandlePostUpdate();
return mainEmulatorHLE();
}
#endif
// entrypoint for debug builds with console
int main(int argc, char* argv[])
{
SDL_SetMainReady();
if (!LaunchSettings::HandleCommandline(argc, argv))
return 0;
ActiveSettings::LoadOnce();
HandlePostUpdate();
return mainEmulatorHLE();
}
#else
int main(int argc, char *argv[])
{
#if BOOST_OS_LINUX

View File

@ -95,7 +95,7 @@ namespace ZirEmitter
void GLSL::GenerateBasicBlockCode(ZpIR::ZpIRBasicBlock& basicBlock)
{
// init context
#ifndef PUBLIC_RELEASE
#ifdef CEMU_DEBUG_ASSERT
for (auto& itr : m_blockContext.regInlinedExpression)
{
cemu_assert_debug(itr == nullptr); // leaked buffer

View File

@ -139,8 +139,6 @@ typedef struct tagTHREADNAME_INFO
void SetThreadName(const char* name)
{
#if BOOST_OS_WINDOWS
#ifndef _PUBLIC_RELEASE
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = name;
@ -154,9 +152,6 @@ void SetThreadName(const char* name)
__except (EXCEPTION_EXECUTE_HANDLER) {
}
#pragma warning(pop)
#endif
#elif BOOST_OS_MACOS
pthread_setname_np(name);
#else