Logging: Add TextureReadback logtype and clean up code

This commit is contained in:
Exzap 2023-01-27 06:32:50 +01:00
parent 9bbfd33842
commit 387b712959
10 changed files with 112 additions and 96 deletions

View File

@ -224,7 +224,6 @@ void LatteCP_itIndirectBufferDepr(uint32 nWords)
uint32 physicalAddressHigh = readU32(); // unused
uint32 sizeInDWords = readU32();
uint32 displayListSize = sizeInDWords * 4;
cemu_assert_debug(displayListSize >= 4);
DrawPassContext drawPassCtx;
LatteCP_processCommandBuffer(memory_getPointerFromPhysicalOffset(physicalAddress), displayListSize, drawPassCtx);
if (drawPassCtx.isWithinDrawPass())

View File

@ -746,6 +746,8 @@ void LatteTextureLoader_writeReadbackTextureToMemory(LatteTextureDefinition* tex
return;
}
cemuLog_log(LogType::TextureReadback, "[WriteReadbackTex] PhysAddr {:08x} Res {}x{} Fmt {} Slice {} Mip {}", textureData->physAddress, textureData->width, textureData->height, textureData->format, sliceIndex, mipIndex);
if (textureData->tileMode == Latte::E_HWTILEMODE::TM_LINEAR_ALIGNED)
{
uint32 pitch = textureLoader.width;

View File

@ -283,7 +283,7 @@ namespace iosu
return -0x400;
}
*fileHandle = fsFileHandle;
cemuLog_log(LogType::File, "Open file {} (access: {} result: ok handle: 0x{})", path, accessModifierStr, (uint32)*fileHandle);
cemuLog_log(LogType::CoreinitFile, "Open file {} (access: {} result: ok handle: 0x{})", path, accessModifierStr, (uint32)*fileHandle);
return (FSStatus)FS_RESULT::SUCCESS;
}
@ -307,7 +307,7 @@ namespace iosu
return -0x400;
}
*dirHandle = fsDirHandle;
cemuLog_log(LogType::File, "Open directory {} (result: ok handle: 0x{})", path, (uint32)*dirHandle);
cemuLog_log(LogType::CoreinitFile, "Open directory {} (result: ok handle: 0x{})", path, (uint32)*dirHandle);
return (FSStatus)FS_RESULT::SUCCESS;
}

View File

@ -1564,96 +1564,96 @@ namespace coreinit
void InitializeFS()
{
cafeExportRegister("coreinit", FSInit, LogType::File);
cafeExportRegister("coreinit", FSShutdown, LogType::File);
cafeExportRegister("coreinit", FSInit, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSShutdown, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetMountSource, LogType::File);
cafeExportRegister("coreinit", FSGetMountSourceNext, LogType::File);
cafeExportRegister("coreinit", FSGetMountSource, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetMountSourceNext, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSMount, LogType::File);
cafeExportRegister("coreinit", FSBindMount, LogType::File);
cafeExportRegister("coreinit", FSMount, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSBindMount, LogType::CoreinitFile);
// client management
cafeExportRegister("coreinit", FSAddClientEx, LogType::File);
cafeExportRegister("coreinit", FSAddClient, LogType::File);
cafeExportRegister("coreinit", FSDelClient, LogType::File);
cafeExportRegister("coreinit", FSGetClientNum, LogType::File);
cafeExportRegister("coreinit", FSAddClientEx, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSAddClient, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSDelClient, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetClientNum, LogType::CoreinitFile);
// cmd
cafeExportRegister("coreinit", FSInitCmdBlock, LogType::File);
cafeExportRegister("coreinit", FSGetAsyncResult, LogType::File);
cafeExportRegister("coreinit", FSInitCmdBlock, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetAsyncResult, LogType::CoreinitFile);
// file operations
cafeExportRegister("coreinit", FSOpenFileAsync, LogType::File);
cafeExportRegister("coreinit", FSOpenFile, LogType::File);
cafeExportRegister("coreinit", FSOpenFileExAsync, LogType::File);
cafeExportRegister("coreinit", FSOpenFileEx, LogType::File);
cafeExportRegister("coreinit", FSCloseFileAsync, LogType::File);
cafeExportRegister("coreinit", FSCloseFile, LogType::File);
cafeExportRegister("coreinit", FSOpenFileAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSOpenFile, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSOpenFileExAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSOpenFileEx, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSCloseFileAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSCloseFile, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSReadFileAsync, LogType::File);
cafeExportRegister("coreinit", FSReadFile, LogType::File);
cafeExportRegister("coreinit", FSReadFileWithPosAsync, LogType::File);
cafeExportRegister("coreinit", FSReadFileWithPos, LogType::File);
cafeExportRegister("coreinit", FSReadFileAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSReadFile, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSReadFileWithPosAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSReadFileWithPos, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSWriteFileAsync, LogType::File);
cafeExportRegister("coreinit", FSWriteFile, LogType::File);
cafeExportRegister("coreinit", FSWriteFileWithPosAsync, LogType::File);
cafeExportRegister("coreinit", FSWriteFileWithPos, LogType::File);
cafeExportRegister("coreinit", FSWriteFileAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSWriteFile, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSWriteFileWithPosAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSWriteFileWithPos, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSSetPosFileAsync, LogType::File);
cafeExportRegister("coreinit", FSSetPosFile, LogType::File);
cafeExportRegister("coreinit", FSGetPosFileAsync, LogType::File);
cafeExportRegister("coreinit", FSGetPosFile, LogType::File);
cafeExportRegister("coreinit", FSSetPosFileAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSSetPosFile, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetPosFileAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetPosFile, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSAppendFileAsync, LogType::File);
cafeExportRegister("coreinit", FSAppendFile, LogType::File);
cafeExportRegister("coreinit", FSAppendFileAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSAppendFile, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSTruncateFileAsync, LogType::File);
cafeExportRegister("coreinit", FSTruncateFile, LogType::File);
cafeExportRegister("coreinit", FSTruncateFileAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSTruncateFile, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSRenameAsync, LogType::File);
cafeExportRegister("coreinit", FSRename, LogType::File);
cafeExportRegister("coreinit", FSRemoveAsync, LogType::File);
cafeExportRegister("coreinit", FSRemove, LogType::File);
cafeExportRegister("coreinit", FSMakeDirAsync, LogType::File);
cafeExportRegister("coreinit", FSMakeDir, LogType::File);
cafeExportRegister("coreinit", FSChangeDirAsync, LogType::File);
cafeExportRegister("coreinit", FSChangeDir, LogType::File);
cafeExportRegister("coreinit", FSGetCwdAsync, LogType::File);
cafeExportRegister("coreinit", FSGetCwd, LogType::File);
cafeExportRegister("coreinit", FSRenameAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSRename, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSRemoveAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSRemove, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSMakeDirAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSMakeDir, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSChangeDirAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSChangeDir, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetCwdAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetCwd, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSIsEofAsync, LogType::File);
cafeExportRegister("coreinit", FSIsEof, LogType::File);
cafeExportRegister("coreinit", FSIsEofAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSIsEof, LogType::CoreinitFile);
// directory operations
cafeExportRegister("coreinit", FSOpenDirAsync, LogType::File);
cafeExportRegister("coreinit", FSOpenDir, LogType::File);
cafeExportRegister("coreinit", FSReadDirAsync, LogType::File);
cafeExportRegister("coreinit", FSReadDir, LogType::File);
cafeExportRegister("coreinit", FSCloseDirAsync, LogType::File);
cafeExportRegister("coreinit", FSCloseDir, LogType::File);
cafeExportRegister("coreinit", FSOpenDirAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSOpenDir, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSReadDirAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSReadDir, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSCloseDirAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSCloseDir, LogType::CoreinitFile);
// stat
cafeExportRegister("coreinit", FSGetFreeSpaceSizeAsync, LogType::File);
cafeExportRegister("coreinit", FSGetFreeSpaceSize, LogType::File);
cafeExportRegister("coreinit", FSGetFreeSpaceSizeAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetFreeSpaceSize, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetStatAsync, LogType::File);
cafeExportRegister("coreinit", FSGetStat, LogType::File);
cafeExportRegister("coreinit", FSGetStatAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetStat, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetStatFileAsync, LogType::File);
cafeExportRegister("coreinit", FSGetStatFile, LogType::File);
cafeExportRegister("coreinit", FSGetStatFileAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetStatFile, LogType::CoreinitFile);
// misc
cafeExportRegister("coreinit", FSFlushQuotaAsync, LogType::File);
cafeExportRegister("coreinit", FSFlushQuota, LogType::File);
cafeExportRegister("coreinit", FSFlushQuotaAsync, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSFlushQuota, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSSetUserData, LogType::File);
cafeExportRegister("coreinit", FSGetUserData, LogType::File);
cafeExportRegister("coreinit", FSSetUserData, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetUserData, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetCurrentCmdBlock, LogType::File);
cafeExportRegister("coreinit", FSGetCurrentCmdBlock, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetVolumeState, LogType::File);
cafeExportRegister("coreinit", FSGetVolumeState, LogType::CoreinitFile);
cafeExportRegister("coreinit", FSGetErrorCodeForViewer, LogType::Placeholder);
cafeExportRegister("coreinit", FSGetLastErrorCodeForViewer, LogType::Placeholder);

View File

@ -748,8 +748,8 @@ namespace padscore
void load()
{
cafeExportRegister("padscore", WPADIsMplsAttached, LogType::Input);
cafeExportRegister("padscore", WPADGetAccGravityUnit, LogType::Input);
cafeExportRegister("padscore", WPADIsMplsAttached, LogType::InputAPI);
cafeExportRegister("padscore", WPADGetAccGravityUnit, LogType::InputAPI);
// wpad
//osLib_addFunction("padscore", "WPADInit", padscore::export_WPADInit);

View File

@ -1159,9 +1159,9 @@ namespace vpad
void load()
{
cafeExportRegister("vpad", VPADSetBtnRepeat, LogType::Input);
cafeExportRegister("vpad", VPADSetSamplingCallback, LogType::Input);
cafeExportRegister("vpad", VPADRead, LogType::Input);
cafeExportRegister("vpad", VPADSetBtnRepeat, LogType::InputAPI);
cafeExportRegister("vpad", VPADSetSamplingCallback, LogType::InputAPI);
cafeExportRegister("vpad", VPADRead, LogType::InputAPI);
osLib_addFunction("vpad", "VPADGetAccParam", vpadExport_VPADGetAccParam);
osLib_addFunction("vpad", "VPADSetAccParam", vpadExport_VPADSetAccParam);

View File

@ -33,16 +33,16 @@ struct _LogContext
const std::map<LogType, std::string> g_logging_window_mapping
{
{LogType::File, "Coreinit File-Access"},
{LogType::CoreinitFile, "Coreinit File-Access"},
{LogType::GX2, "GX2"},
{LogType::ThreadSync, "Coreinit Thread-Synchronization"},
{LogType::SoundAPI, "Audio"},
{LogType::Input, "Input"},
{LogType::InputAPI, "Input"},
{LogType::Socket, "Socket"},
{LogType::Save, "Save"},
{LogType::CoreinitMem, "Coreinit Memory"},
{LogType::H264, "H264"},
{LogType::OpenGL, "OpenGL"},
{LogType::OpenGLLogging, "OpenGL"},
{LogType::TextureCache, "Texture Cache"},
{LogType::nn_nfp, "NFP"},
};

View File

@ -5,17 +5,17 @@ enum class LogType : sint32
Placeholder = -2,
None = -1,
Force = 0, // this logging type is always on
File = 1, // coreinit file?
CoreinitFile = 1,
GX2 = 2,
UnsupportedAPI = 3,
ThreadSync = 4,
SoundAPI = 5, // any audio related API
Input = 6, // any input related API
InputAPI = 6, // any input related API
Socket = 7,
Save = 8,
CoreinitMem = 9, // coreinit memory functions
H264 = 10,
OpenGL = 11, // OpenGL debug logging
OpenGLLogging = 11, // OpenGL debug logging
TextureCache = 12, // texture cache warnings and info
VulkanValidation = 13, // Vulkan validation layer
nn_nfp = 14, // nn_nfp (Amiibo) API
@ -31,6 +31,8 @@ enum class LogType : sint32
ProcUi = 40,
TextureReadback = 60,
APIErrors = 0, // alias for 0. Logs bad parameters or other API errors in OS libs
};

View File

@ -516,3 +516,15 @@ inline uint32 GetTitleIdLow(uint64 titleId)
#include "Cafe/HW/MMU/MMU.h"
#include "Cafe/HW/Espresso/PPCState.h"
#include "Cafe/HW/Espresso/PPCCallback.h"
// useful C++23 stuff that isn't yet widely supported
// std::to_underlying
namespace stdx
{
template <typename EnumT, typename = std::enable_if_t < std::is_enum<EnumT>{} >>
constexpr std::underlying_type_t<EnumT> to_underlying(EnumT e) noexcept {
return static_cast<std::underlying_type_t<EnumT>>(e);
};
}

View File

@ -2113,26 +2113,27 @@ void MainWindow::RecreateMenu()
// debug->logging submenu
wxMenu* debugLoggingMenu = new wxMenu;
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_UNSUPPORTED_API, _("&Unsupported API calls"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_UNSUPPORTED_API));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_COREINIT_LOGGING, _("&Coreinit Logging (OSReport/OSConsole)"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_COREINIT_LOGGING));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_FILE, _("&Coreinit File-Access"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_FILE));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_THREADSYNC, _("&Coreinit Thread-Synchronization API"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_THREADSYNC));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_COREINIT_MEM, _("&Coreinit Memory API"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_COREINIT_MEM));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_COREINIT_MP, _("&Coreinit MP API"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_COREINIT_MP));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_COREINIT_THREAD, _("&Coreinit Thread API"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_COREINIT_THREAD));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_NFP, _("&NN NFP"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_NFP));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_GX2, _("&GX2 API"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_GX2));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_SNDAPI, _("&Audio API"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_SNDAPI));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_INPUT, _("&Input API"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_INPUT));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_SOCKET, _("&Socket API"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_SOCKET));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_SAVE, _("&Save API"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_SAVE));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_H264, _("&H264 API"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_H264));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::UnsupportedAPI), _("&Unsupported API calls"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::UnsupportedAPI));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::CoreinitLogging), _("&Coreinit Logging (OSReport/OSConsole)"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::CoreinitLogging));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::CoreinitFile), _("&Coreinit File-Access API"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::CoreinitFile));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::ThreadSync), _("&Coreinit Thread-Synchronization API"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::ThreadSync));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::CoreinitMem), _("&Coreinit Memory API"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::CoreinitMem));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::CoreinitMP), _("&Coreinit MP API"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::CoreinitMP));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::CoreinitThread), _("&Coreinit Thread API"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::CoreinitThread));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::nn_nfp), _("&NN NFP"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::nn_nfp));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::GX2), _("&GX2 API"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::GX2));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::SoundAPI), _("&Audio API"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::SoundAPI));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::InputAPI), _("&Input API"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::InputAPI));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::Socket), _("&Socket API"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::Socket));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::Save), _("&Save API"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::Save));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::H264), _("&H264 API"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::H264));
debugLoggingMenu->AppendSeparator();
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_PATCHES, _("&Graphic pack patches"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_PATCHES));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + LOG_TYPE_TEXTURE_CACHE, _("&Texture cache warnings"), wxEmptyString)->Check(cafeLog_isLoggingFlagEnabled(LOG_TYPE_TEXTURE_CACHE));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::Patches), _("&Graphic pack patches"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::Patches));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::TextureCache), _("&Texture cache warnings"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::TextureCache));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::TextureReadback), _("&Texture readback"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::TextureReadback));
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));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::OpenGLLogging), _("&OpenGL debug output"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::OpenGLLogging));
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_LOGGING0 + stdx::to_underlying(LogType::VulkanValidation), _("&Vulkan validation layer (slow)"), wxEmptyString)->Check(cemuLog_isLoggingEnabled(LogType::VulkanValidation));
#ifdef CEMU_DEBUG_ASSERT
debugLoggingMenu->AppendCheckItem(MAINFRAME_MENU_ID_DEBUG_ADVANCED_PPC_INFO, _("&Log PPC context for API"), wxEmptyString)->Check(cemuLog_advancedPPCLoggingEnabled());
#endif