Skip to content

Commit 68dc687

Browse files
authored
Merge branch 'grumpycoders:main' into capstone
2 parents bf4544f + a179173 commit 68dc687

File tree

10 files changed

+189
-53
lines changed

10 files changed

+189
-53
lines changed

.github/ISSUE_TEMPLATE/bug_report.yml

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
name: Report an issue with PCSX-Redux.
2+
description: Report an issue with PCSX-Redux.
3+
body:
4+
- type: markdown
5+
attributes:
6+
value: |
7+
This issue form is for reporting bugs only! If you have a feature or enhancement request, please make a proper feature request instead.
8+
- type: textarea
9+
validations:
10+
required: true
11+
attributes:
12+
label: Describe the bug
13+
description: >-
14+
A clear and concise description of what the bug is.
15+
16+
- type: textarea
17+
validations:
18+
required: true
19+
attributes:
20+
label: Expected behavior
21+
description: >-
22+
How the program should actually behave.
23+
24+
- type: textarea
25+
validations:
26+
required: true
27+
attributes:
28+
label: Steps to reproduce the bug
29+
description: >-
30+
Steps to reproduce the behavior
31+
placeholder:
32+
1. Go to '...'
33+
34+
2. Click on '...'
35+
36+
3. Press '...'
37+
38+
- type: input
39+
validations:
40+
required: true
41+
attributes:
42+
label: Operating System
43+
placeholder: (eg Windows 10, MacOS Big Sur, Ubuntu 20.04 LTS ...)
44+
description: >
45+
The OS of the system you're running Redux on
46+
47+
- type: input
48+
validations:
49+
required: true
50+
attributes:
51+
label: CPU model
52+
placeholder: (eg Intel Core i7-7700K)
53+
description: >
54+
The CPU model of the system you're running PCSX-Redux on
55+
56+
- type: input
57+
validations:
58+
required: true
59+
attributes:
60+
label: GPU model
61+
placeholder: (eg Nvidia GeForce GTX 980 Ti)
62+
description: >
63+
The GPU model of the system you're running PCSX-Redux on
64+
65+
- type: input
66+
validations:
67+
required: true
68+
attributes:
69+
label: BIOS version
70+
placeholder: (eg OpenBIOS, SCPH1001, etc)
71+
description: >
72+
The BIOS you're using to play games.
73+
74+
- type: dropdown
75+
validations:
76+
required: true
77+
attributes:
78+
label: CPU emulation mode
79+
description: >
80+
If the menu bar says "Interpreted" on the top right, pick "Interpreter". Otherwise, pick "Recompiler"
81+
options:
82+
- Interpreter
83+
- Recompiler
84+
85+
- type: textarea
86+
validations:
87+
required: true
88+
attributes:
89+
label: Additional information
90+
description: >-
91+
If you have any additional information for us, use the field below. Feel free to share your memory card if you think it'd help us reproduce and debug your problem.
92+
93+
For bugs where a screenshot or video would be useful (eg rendering or audio bugs), please attach one as well.

Makefile

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ PACKAGES := capstone freetype2 glfw3 libavcodec libavformat libavutil libswresam
1010

1111
LOCALES := fr
1212

13+
ifeq ($(wildcard third_party/imgui/imgui.h),)
14+
HAS_SUBMODULES = false
15+
else
16+
HAS_SUBMODULES = true
17+
endif
18+
1319
CXXFLAGS += -std=c++2a
1420
CPPFLAGS += `pkg-config --cflags $(PACKAGES)`
1521
CPPFLAGS += -I.
@@ -124,7 +130,16 @@ TESTS := $(patsubst %.cc,%,$(TESTS_SRC))
124130
CP ?= cp
125131
MKDIRP ?= mkdir -p
126132

127-
all: dep $(TARGET)
133+
all: check_submodules dep $(TARGET)
134+
135+
ifeq ($(HAS_SUBMODULES),true)
136+
check_submodules:
137+
138+
else
139+
check_submodules:
140+
@echo "You need to clone this repository recursively, in order to get its submodules."
141+
@false
142+
endif
128143

129144
strip: all
130145
strip $(TARGET)
@@ -213,7 +228,7 @@ runtests: pcsx-redux-tests
213228
./pcsx-redux-tests
214229

215230
psyq-obj-parser: $(SUPPORT_OBJECTS) tools/psyq-obj-parser/psyq-obj-parser.cc
216-
$(LD) -o $@ $(SUPPORT_OBJECTS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) tools/psyq-obj-parser/psyq-obj-parser.cc -Ithird_party/ELFIO
231+
$(LD) -o $@ $(SUPPORT_OBJECTS) $(CPPFLAGS) $(CXXFLAGS) tools/psyq-obj-parser/psyq-obj-parser.cc -Ithird_party/ELFIO
217232

218233
ps1-packer: $(SUPPORT_OBJECTS) tools/ps1-packer/ps1-packer.cc
219234
$(LD) -o $@ $(SUPPORT_OBJECTS) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) tools/ps1-packer/ps1-packer.cc
@@ -229,7 +244,9 @@ dep: $(DEPS)
229244
ifneq ($(MAKECMDGOALS), regen-i18n)
230245
ifneq ($(MAKECMDGOALS), clean)
231246
ifneq ($(MAKECMDGOALS), gitclean)
247+
ifeq ($(HAS_SUBMODULES), true)
232248
-include $(DEPS)
233249
endif
234250
endif
235251
endif
252+
endif

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ This is yet another fork of the Playstation Emulator, PCSX. While the work here
3232
The code is meant to be built using very modern compilers. Also it's still fairly experimental, and lots of things can break. If you still want to proceed, here are instructions to build it on Linux, MacOS and Windows. The code now comes in two big parts: the emulator itself, and [OpenBIOS](https://github.com/grumpycoders/pcsx-redux/tree/main/src/mips/openbios), which can be used as an alternative to the retail, copyright protected BIOS.
3333

3434
### Getting sources
35-
The only location for the source is [on github](https://github.com/grumpycoders/pcsx-redux/). Clone recursively, as the project uses submodules: `git clone https://github.com/grumpycoders/pcsx-redux.git --recursive`.
35+
The only location for the source is [on github](https://github.com/grumpycoders/pcsx-redux/).
36+
Clone recursively, as the project uses submodules:
37+
```
38+
git clone --recursive https://github.com/grumpycoders/pcsx-redux.git
39+
```
3640

3741
### Windows
3842
Install [Visual Studio 2022 Community Edition](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&rel=16) using the `Desktop development with C++` workload. Open the file `vsprojects\pcsx-redux.sln`, select `pcsx-redux -> pcsx-redux`, right click, `Set as Startup Project`, and hit `F7` to build. The project follows the open-and-build paradigm with no extra step, so no specific dependency ought to be needed, as [NuGet](https://www.nuget.org/) will take care of downloading them automatically for you on the first build.

src/core/DynaRec_x64/instructions.cc

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,13 +1343,13 @@ void DynaRecCPU::testSoftwareInterrupt() {
13431343
if constexpr (loadSR) {
13441344
gen.mov(eax, dword[contextPointer + COP0_OFFSET(12)]); // eax = SR
13451345
}
1346-
gen.test(eax, 1); // Check if interrupts are enabled
1347-
gen.jz(label, CodeGenerator::LabelType::T_NEAR); // If not, skip to the end
1346+
gen.test(eax, 1); // Check if interrupts are enabled
1347+
gen.jz(label); // If not, skip to the end
13481348

13491349
gen.mov(arg2, dword[contextPointer + COP0_OFFSET(13)]); // arg2 = CAUSE
13501350
gen.and_(eax, arg2);
1351-
gen.test(eax, 0x300); // Check if an interrupt was force-fired
1352-
gen.jz(label, CodeGenerator::LabelType::T_NEAR); // Skip to the end if not
1351+
gen.test(eax, 0x300); // Check if an interrupt was force-fired
1352+
gen.jz(label); // Skip to the end if not
13531353

13541354
// Fire the interrupt if it was triggered
13551355
// This object in arg1. Exception code is already in arg2 from before (will be masked by exception handler)
@@ -1602,7 +1602,6 @@ void DynaRecCPU::recBLEZ() {
16021602
gen.mov(dword[contextPointer + PC_OFFSET], eax);
16031603
}
16041604

1605-
// TODO: Handle INT_MIN / -1
16061605
void DynaRecCPU::recDIV() {
16071606
Label notIntMin, divisionByZero, end;
16081607
bool emitIntMinCheck = true;
@@ -1655,9 +1654,9 @@ void DynaRecCPU::recDIV() {
16551654
gen.mov(eax, m_regs[_Rs_].allocatedReg); // Dividend in eax
16561655
}
16571656

1658-
gen.mov(ecx, m_regs[_Rt_].allocatedReg); // Divisor in ecx
1659-
gen.test(ecx, ecx); // Check if divisor is 0
1660-
gen.jz(divisionByZero, CodeGenerator::LabelType::T_NEAR); // Jump to divisionByZero label if so
1657+
gen.mov(ecx, m_regs[_Rt_].allocatedReg); // Divisor in ecx
1658+
gen.test(ecx, ecx); // Check if divisor is 0
1659+
gen.jz(divisionByZero); // Jump to divisionByZero label if so
16611660
}
16621661

16631662
if (emitIntMinCheck) {
@@ -1677,8 +1676,8 @@ void DynaRecCPU::recDIV() {
16771676
gen.idiv(ecx); // Signed division by divisor
16781677

16791678
if (!m_regs[_Rt_].isConst()) { // Emit a division by 0 handler if the divisor is unknown at compile time
1680-
gen.jmp(end, CodeGenerator::LabelType::T_NEAR); // skip to the end if not a div by zero
1681-
gen.L(divisionByZero); // Here starts our division by 0 handler
1679+
gen.jmp(end); // skip to the end if not a div by zero
1680+
gen.L(divisionByZero); // Here starts our division by 0 handler
16821681

16831682
gen.mov(edx, eax); // Set hi to $rs
16841683
gen.shr(eax, 31);
@@ -1730,18 +1729,18 @@ void DynaRecCPU::recDIVU() {
17301729
gen.mov(eax, m_regs[_Rs_].allocatedReg); // Dividend in eax
17311730
}
17321731

1733-
gen.mov(ecx, m_regs[_Rt_].allocatedReg); // Divisor in ecx
1734-
gen.test(ecx, ecx); // Check if divisor is 0
1735-
gen.jz(divisionByZero, CodeGenerator::LabelType::T_NEAR); // Jump to divisionByZero label if so
1732+
gen.mov(ecx, m_regs[_Rt_].allocatedReg); // Divisor in ecx
1733+
gen.test(ecx, ecx); // Check if divisor is 0
1734+
gen.jz(divisionByZero); // Jump to divisionByZero label if so
17361735
}
17371736

1738-
gen.xor_(edx, edx); // Set top 32 bits of dividend to
1737+
gen.xor_(edx, edx); // Set top 32 bits of dividend to 0
17391738
gen.div(ecx); // Unsigned division by divisor
17401739

17411740
if (!m_regs[_Rt_].isConst()) { // Emit a division by 0 handler if the divisor is unknown at compile time
17421741
Label end;
1743-
gen.jmp(end, CodeGenerator::LabelType::T_NEAR); // skip to the end if not a div by zero
1744-
gen.L(divisionByZero); // Here starts our division by 0 handler
1742+
gen.jmp(end); // skip to the end if not a div by zero
1743+
gen.L(divisionByZero); // Here starts our division by 0 handler
17451744

17461745
gen.mov(edx, eax); // Set hi to $rs
17471746
gen.mov(eax, -1); // Set lo to -1

src/core/ix86/iR3000A.cc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2864,14 +2864,14 @@ const func_t DynaRecCPU::m_recSPC[64] = {
28642864
};
28652865

28662866
const func_t DynaRecCPU::m_recREG[32] = {
2867-
&DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, // 00
2868-
&DynaRecCPU::recNULL, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, // 04
2869-
&DynaRecCPU::recNULL, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, // 08
2870-
&DynaRecCPU::recNULL, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, // 0c
2871-
&DynaRecCPU::recBLTZAL, &DynaRecCPU::recBGEZAL, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, // 10
2872-
&DynaRecCPU::recNULL, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, // 14
2873-
&DynaRecCPU::recNULL, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, // 18
2874-
&DynaRecCPU::recNULL, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, &DynaRecCPU::recNULL, // 1c
2867+
&DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, &DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, // 00
2868+
&DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, &DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, // 04
2869+
&DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, &DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, // 08
2870+
&DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, &DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, // 0c
2871+
&DynaRecCPU::recBLTZAL, &DynaRecCPU::recBGEZAL, &DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, // 10
2872+
&DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, &DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, // 14
2873+
&DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, &DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, // 18
2874+
&DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ, &DynaRecCPU::recBLTZ, &DynaRecCPU::recBGEZ // 1c
28752875
};
28762876

28772877
const func_t DynaRecCPU::m_recCP0[32] = {

src/core/psxemulator.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,11 +184,13 @@ class Emulator {
184184
typedef Setting<bool, TYPESTRING("8Megs"), false> Setting8MB;
185185
typedef Setting<int, TYPESTRING("GUITheme"), 0> SettingGUITheme;
186186
typedef Setting<int, TYPESTRING("Dither"), 2> SettingDither;
187+
typedef Setting<bool, TYPESTRING("ReportGLErrors"), false> SettingGLErrorReporting;
187188

188189
Settings<SettingStdout, SettingLogfile, SettingMcd1, SettingMcd2, SettingBios, SettingPpfDir, SettingPsxExe,
189190
SettingXa, SettingSpuIrq, SettingBnWMdec, SettingScaler, SettingAutoVideo, SettingVideo, SettingCDDA,
190191
SettingFastBoot, SettingDebugSettings, SettingRCntFix, SettingIsoPath, SettingLocale, SettingMcd1Inserted,
191-
SettingMcd2Inserted, SettingBiosOverlay, SettingDynarec, Setting8MB, SettingGUITheme, SettingDither>
192+
SettingMcd2Inserted, SettingBiosOverlay, SettingDynarec, Setting8MB, SettingGUITheme, SettingDither,
193+
SettingGLErrorReporting>
192194
settings;
193195
class PcsxConfig {
194196
public:

src/core/psxinterpreter.cc

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,15 +1190,18 @@ const InterpretedCPU::intFunc_t InterpretedCPU::s_psxSPC[64] = {
11901190
&InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, // 3c
11911191
};
11921192

1193+
// The REGIMM instruction is actually valid for every single value that the rt field might have
1194+
// If the lowest bit of the rt field is 1 then the instruction is a BGEZ, otherwise it's a BLTZ.
1195+
// If ((_Rt_ >> 4) & 0xF) == 0x8 then the instruction should link the return address to $ra, otherwise not.
11931196
const InterpretedCPU::intFunc_t InterpretedCPU::s_psxREG[32] = {
1194-
&InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, // 00
1195-
&InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, // 04
1196-
&InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, // 08
1197-
&InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, // 0c
1198-
&InterpretedCPU::psxBLTZAL, &InterpretedCPU::psxBGEZAL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, // 10
1199-
&InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, // 14
1200-
&InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, // 18
1201-
&InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, &InterpretedCPU::psxNULL, // 1c
1197+
&InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, &InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, // 00
1198+
&InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, &InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, // 04
1199+
&InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, &InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, // 08
1200+
&InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, &InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, // 0c
1201+
&InterpretedCPU::psxBLTZAL, &InterpretedCPU::psxBGEZAL, &InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, // 10
1202+
&InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, &InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, // 14
1203+
&InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, &InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, // 18
1204+
&InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ, &InterpretedCPU::psxBLTZ, &InterpretedCPU::psxBGEZ // 1c
12021205
};
12031206

12041207
const InterpretedCPU::intFunc_t InterpretedCPU::s_psxCP0[32] = {

src/gui/gui.cc

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ end)(jit.status()))
345345

346346
setFullscreen(m_fullscreen);
347347
const auto currentTheme =
348-
g_emulator->settings.get<Emulator::SettingGUITheme>().value; // On boot: reload GUI theme
348+
emuSettings.get<Emulator::SettingGUITheme>().value; // On boot: reload GUI theme
349349
applyTheme(currentTheme);
350350

351351
if (emuSettings.get<Emulator::SettingMcd1>().empty()) {
@@ -409,8 +409,10 @@ end)(jit.status()))
409409
glfwSetKeyCallback(m_window, glfwKeyCallbackTrampoline);
410410
glfwSetJoystickCallback([](int jid, int event) { PCSX::g_emulator->m_pads->scanGamepads(); });
411411
ImGui_ImplOpenGL3_Init(GL_SHADER_VERSION);
412-
glEnable(GL_DEBUG_OUTPUT);
413-
if (glDebugMessageCallback) {
412+
413+
if (glDebugMessageCallback && g_emulator->settings.get<Emulator::SettingGLErrorReporting>()) {
414+
m_reportGLErrors = true;
415+
glEnable(GL_DEBUG_OUTPUT);
414416
glDebugMessageCallback(
415417
[](GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message,
416418
GLvoid* userParam) {
@@ -1088,7 +1090,7 @@ in Configuration->Emulation, restart PCSX-Redux, then try again.)"));
10881090
m_breakpoints.draw(_("Breakpoints"));
10891091
}
10901092

1091-
about();
1093+
changed |= about();
10921094
interruptsScaler();
10931095

10941096
if (m_dwarf.m_show) {
@@ -1520,8 +1522,10 @@ bool PCSX::GUI::showThemes() {
15201522
return changed;
15211523
}
15221524

1523-
void PCSX::GUI::about() {
1524-
if (!m_showAbout) return;
1525+
bool PCSX::GUI::about() {
1526+
if (!m_showAbout) return false;
1527+
bool changed = false;
1528+
15251529
ImGui::SetNextWindowPos(ImVec2(200, 100), ImGuiCond_FirstUseEver);
15261530
ImGui::SetNextWindowSize(ImVec2(880, 600), ImGuiCond_FirstUseEver);
15271531
if (ImGui::Begin(_("About"), &m_showAbout)) {
@@ -1541,16 +1545,28 @@ void PCSX::GUI::about() {
15411545
ImGui::EndTabItem();
15421546
}
15431547
if (ImGui::BeginTabItem(_("OpenGL information"))) {
1544-
if (glDebugMessageCallback) {
1548+
if (m_reportGLErrors) {
15451549
ImGui::TextUnformatted(_("OpenGL error reporting: enabled"));
15461550
} else {
15471551
ImGui::TextUnformatted(_("OpenGL error reporting: disabled"));
1548-
ShowHelpMarker(
1549-
_("OpenGL error reporting has been disabled because your OpenGL driver is too old. Error "
1550-
"reporting requires at least OpenGL 4.3. Please update your graphics drivers, or contact "
1551-
"your GPU vendor for correct OpenGL drivers. Disabled OpenGL error reporting won't have a "
1552-
"negative impact on the performances of this software, but user code such as the shader "
1553-
"editor won't be able to properly report problems accurately."));
1552+
if (!glDebugMessageCallback) {
1553+
ShowHelpMarker(_(
1554+
"OpenGL error reporting has been disabled because your OpenGL driver is too old. Error "
1555+
"reporting requires at least OpenGL 4.3. Please update your graphics drivers, or contact "
1556+
"your GPU vendor for correct OpenGL drivers. Disabled OpenGL error reporting won't have a "
1557+
"negative impact on the performances of this software, but user code such as the shader "
1558+
"editor won't be able to properly report problems accurately."));
1559+
}
1560+
}
1561+
1562+
if (glDebugMessageCallback) {
1563+
changed |= ImGui::Checkbox(_("Enable OpenGL error reporting"),
1564+
&g_emulator->settings.get<Emulator::SettingGLErrorReporting>().value);
1565+
1566+
ShowHelpMarker(_(
1567+
"OpenGL error reporting is necessary for properly reporting OpenGL problems. "
1568+
"However it requires OpenGL 4.3+ and might have performance repercussions on "
1569+
"some PCs. (Requires reboot)"));
15541570
}
15551571
ImGui::Text(_("Core profile: %s"), m_hasCoreProfile ? "yes" : "no");
15561572
someString(_("Vendor"), GL_VENDOR);
@@ -1572,6 +1588,7 @@ void PCSX::GUI::about() {
15721588
}
15731589
}
15741590
ImGui::End();
1591+
return changed;
15751592
}
15761593

15771594
void PCSX::GUI::update(bool vsync) {

0 commit comments

Comments
 (0)