Previously Interlaced (Field) was displayed as Progressive which was wrong since the tested games didn't even support Progressive mode and it misleaded most of the users so let's just display Interlaced during Field mode.
The EE/IOP and VUs panels were disabled completely when presets are enabled,
which apparently also means disabling (graying out) the static texts, however,
re-enabling them (when disabling presets) didn't un-gray-out the static text.
This is likely a wxWidgets bug, but we can avoid it by just enabling/disabling
all items explicitly (and keeping the panels themselves always enabled).
For these panels, this means adding explicit enable/disable of the he EE-cache
checkbox and the Restore-Defaults buttons.
The issue doesn't seem to happen on other panels (though some earlier revisions
apparently also had this issue for the static text at the game fixes panel, but
apparently it's not an issue now).
Use close() instead of some dodgy read unblocking and thread cancelling
sequence - it fixes a race condition when closing PCSX2.
Move most of the setup/cleanup into LinuxPipeThread. In addition to
simplifying things, it should also mean that no messages to
stdout/stderr are lost - in the previous code there was a small period
of time where messages would disappear.
No one knows how any games even started in the broken state and we prefer code being sane('ish) over one game miraculously working. The change is pretty big so it needs some good testing!
There are 2 pages that contains a register context to handle Syscall/Interrupt.
Write protection is useless here.
The only purpose is to reduce the number of useless SIGSEGV at the start of a game
VIF recompilers: full size
EE/MVU/IOP: 1/4th of the size
Lazy allocation is still enabled but it will less triggered.
Next step is to always commit the first block
Let's the kernel manage the memory either with builtin lazy allocation or
swapped memory.
Avoid to handle SIGSEGV manually (nicer for debug) and removes 250 lines of code.
The window is redrawn when Layout() is used (I think), so the text is
repainted with the correct colour.
This fixes the gray/ungray behaviour in the Emulation Settings dialog.
(Specifically, it affected the GS, Speedhacks, and Game Fixes Panel).
From the comment, it used to be bad to gcc alignment issue.
Recent gcc align the stack on 16B boundary. Maybe it solved the issue.
I play severals minutes without any crashes but it requires more tests.
The current redirection code doesn't work on VS2015:
- It relies on undefined behaviour (*stdout/*stderr = *fp)
- stdin/stdout/stderr are not pre-opened when compiled with the v140*
toolkits
- It seems to be the reason PCSX2 fails to terminate properly.
Use a combination of named pipes and freopen to redirect stdout/stderr.
Note: The redirect stuff doesn't seem to work in debug builds, both
before and after the change.
CID 147025 (#1 of 1): Uninitialized pointer field (UNINIT_CTOR)8. uninit_member: Non-static class member m_current_count is not initialized in this constructor nor in any functions that it calls.
CID 147005 (#1 of 1): Uninitialized pointer field (UNINIT_CTOR)2. uninit_member: Non-static class member PrePrefix is not initialized in this constructor nor in any functions that it calls.
CID 146995 (#1 of 1): Uninitialized pointer field (UNINIT_CTOR)member_not_init_in_gen_ctor: The compiler-generated constructor for this class does not initialize cpu
CID 146990 (#1 of 1): Uninitialized scalar field (UNINIT_CTOR)6. uninit_member: Non-static class member PluginId is not initialized in this constructor nor in any functions that it calls.
CID 146984 (#1 of 1): Uninitialized scalar field (UNINIT_CTOR)6. uninit_member: Non-static class member m_performFileWrites is not initialized in this constructor nor in any functions that it calls.
CID 146980 (#1 of 1): Uninitialized pointer field (UNINIT_CTOR)2. uninit_member: Non-static class member m_panel is not initialized in this constructor nor in any functions that it calls.
CID 146979 (#1 of 1): Uninitialized pointer field (UNINIT_CTOR)2. uninit_member: Non-static class member m_miscGroup is not initialized in this constructor nor in any functions that it calls.
CID 146978 (#1 of 1): Uninitialized pointer field (UNINIT_CTOR)4. uninit_member: Non-static class member s_rightside_buttons is not initialized in this constructor nor in any functions that it calls.
CID 146977 (#1 of 1): Uninitialized scalar field (UNINIT_CTOR)6. uninit_member: Non-static class member SizeInMB is not initialized in this constructor nor in any functions that it calls.
-Fixes other Chessmaster hang.
-having it say it has data really quickly if the data incoming was huge seemed to throw it off. I suspect it may actually be the time it takes to fill 16qw (or whatever is incoming if lower) is the wait time but it seems rather happy with the incoming data size.
On linux, it breaks the 16B stack alignment requirement.
2 dispatchers were added to handle the call to the function. It avoid
any performance impact and remove the extra inlined asm
Fix#506
It changes nothing but it is more consistent
CID 146916 (#1 of 1): Arguments in wrong order i
(SWAPPED_ARGUMENTS)swapped_arguments: The positions of arguments in the call to disBranch do not match the ordering of the parameters:
rt is passed to rs
rs is passed to rt
Bind doesn't work on wx2.8. Replace with event tables and Connect.
wxString::Format also requires the format string to be L"something".
const char* requires an explicit conversion to wxString.
The show 128/64/32 bit menu column stuff doesn't have a direct wx2.8
replacement so just omit it - I'm not sure it's useful functionality
anyway.
-Coverity CID 152835 & 152834: The expression's value does not depend on the operands; often, this represents an inadvertent logic error.
In psxRcntWcount32(int, unsigned int): An operation with non-constant operands that computes a result with constant value (CWE-569)
CID 146889 (#1 of 1): Dereference null return value (NULL_RETURNS)4. dereference: Dereferencing a pointer that might be null wxGetApp()->GetDisassemblyPtr() when calling update
FindWindowById returns NULL if the Window with the given id is not found, no need to do a extra check for validation of the id. also do a check for wxGetApp()->GetDisassemblyPtr() to prevent a null deference.
-Fix up Vsync again, broken back in google code days, broke Fatal Fury, matches PS2 test again.
-Corrected the Vsync Gate 0, which was the wrong way around, Causing Legendz Gekitou not to work unless Vsync was wrong
Coverity seems to not like the assert trick and only considers the macro as a single statement, so let's rework branchAddr and branchAddrN to satisfy coverity and improve the code quality. The following patch fixes 8 coverity issues with the same problem , CID 151736 - 151743.
(#1 of 1): Misused comma operator (NO_EFFECT)extra_comma: Part !!((mVU.prog.IRinfo.curPC & 1U) == 0U) of statement (!!((mVU.prog.IRinfo.curPC & 1U) == 0U)) , ((mVU.prog.IRinfo.curPC + 2U + (s32)((mVU.code & 0x400U) ? 0xfffffc00U | (mVU.code & 0x3ffU) : (mVU.code & 0x3ffU)) * 2 & mVU.progMemMask) * 4U) has no effect due to the comma.
CID 146848 (#1 of 1): Using invalid iterator (INVALIDATE_ITERATOR)
8. use_iterator: Using invalid iterator existing.
Directly edit the value through the iterator.
There's only one plugin api for this, but GSdx also checks whether shift/ctrl
are held down, so PCSX2 needs to map those too to the same API.
Make this more systematic by only mapping one shortcut to this API, and then
deriving the other two from it amd mapping them too automatically.
This also makes it possible to override it at PCSX2_keys.ini since now it
doesn't need to handle different shortcuts for the same function (which it still
can't handle, but now it also doesn't need to for this function).
Apparently I logged the values incorrectly previously. I said
that shift-q gets parsed as Q without shift, but actually the shift flag
is set correctly on such case (though the letter is still upper case for shift-q
and it's still lower case for plain q)
So I retested all the 8 modifiers combination, and noticed that the modifiers
are always parsed and set correctly, but the letter ends up upper case if any
modifiers are used, but lower case if no modifiers are used.
We still need to make lower if it's upper, but don't need to add the shift flag.
This patch fixes 3 different issues for wx event key codes and the ini parser.
- The ini parser (for PCSX2_keys.ini) parses symbols and letters correctly,
but parsed `shift-q` as `Q` without shift. Now it's parsed as `q` with shift.
- the wx event keycode has the shift flag set correctly, but always has the
upper case code for letters (e.g. `Q` when `q` was pressed, and `Q` with shift
flag when shift-q is pressed). Now uses lower case for letters.
- For symbol-only keys (e.g. `-` or `=`), the keycode is the MS VK_.. thingy,
e.g. for `=` it passed 187 instead of 61, or for `.` it had 190 instead of 46.
Now returns the ascii code where possible (assuming US KB layout).
Also, when the DevCon is enabled, all key presses are printed to the console in
a format which could be copied to pcsx2_keys.ini, so this should allow also
non-US KBs to be set up for arbitrary symbols.
It should now be possible to use letters and symbols at PCSX2_keys.ini or as
default accelerators definitions within the code.
Note: this should have supposedly been fixed at r4918 ( 851bfba ), but neither
that build from the buildbot archive, nor the official 1.2.1 release (r5875),
nor the current builds have this working, which is really weird (tested on win8)
This allows to choose which items appear at the title and at which order, as
well as the text and some of the textual values (at PCSX2_ui.ini).
The template's variables (include % if relevant but not the surrounding text):
${slot}, ${limiter}, ${speed}, ${vfps}, ${cpuusage}, ${omodef}, ${omodei}, ${gsdx}
The system treats the GSdx info as a single unit, as well as the CPU usage info.
The UI section (at the CPU usage section) is only visible in devel/debug builds.
The current template values which also demonstrate all the configurable values:
[UiTemplates]
LimiterUnlimited=-unlimited
LimiterTurbo=-turbo
LimiterSlowmo=-slowmo
LimiterNormal=
OutputFrame=frame
OutputField=field
OutputProgressive=p
OutputInterlaced=i
TitleTemplate=Slot: ${slot} | Speed${limiter}: ${speed} (${vfps}) | ${cpuusage} | ${omodef}-${omodei} | ${gsdx}
The previous longer template values:
[UiTemplates]
LimiterUnlimited=None
LimiterTurbo=Turbo
LimiterSlowmo=Slomo
LimiterNormal=Normal
OutputFrame=Frame
OutputField=Field
OutputProgressive=Progressive
OutputInterlaced=Interlaced
TitleTemplate=${gsdx} | Limiter: ${limiter} | ${omodei} (${omodef}) | Speed: ${speed} (${vfps}) | ${cpuusage} | State: ${slot}
wxDataObjectSimple derived classes do not use a wxDataFormatId
parameter (only the wxDF_INVALID, wxDF_TEXT, wxDF_BITMAP, wxDF_METAFILE,
wxDF_FILENAME, and wxDF_HTML wxDataFormatIds are allowed because they
are implicitly converted). So drag and drop probably should have been
broken on Windows, but wasn't for whatever reason.
Let's fix and simplify the code by just using the built in
wxCustomDataObject. Also make move the default drag behaviour on both
Windows and Linux (previously default on Windows only).
It now works on Windows and Linux wx2.8/wx3.0 (previously only working
on Windows).
The goal here is to reduce clutter and to make it more useful by putting the
important values at the begining, and the less used values at the end. The GSdx
string is unmodified, and maybe we could simplify it too in the future.
Previously, the tile displayed the following items in this order:
<GSdx string> - (e.g. GSdx OGL HW | 514x224 | None)
<output mode> - Progressive/Interlaced (Frame/Field)
<limiter mode> - Limiter: None/Turbo/Slomo/Normal
<speed info> - Speed: <100-based-percentage> (<vfps>)
<CPU usage> - EE: <%> | GS: <%> | VU <%> | UI: <%>
<save state> - State: <slot-number>
This patch changes the following to this order and format:
- Move the save state value to the front since it's actually useful.
- The speed value, which now includes the limiter value if not "Normal".
- Then the CPU usage parts, but the UI value only shows on debug/devel builds.
- The output mode, shortened to Frame/Field-i/p
- the GSdx string same as before only at the end
So all the info is still there as before (except UI), but more readable format.
E.g. before (normal limiter and turbo limiter):
GSdx D3D11 HW | 640x512 | None | Interlaced (frame) | Limiter: Normal | Speed: 100% (50.01) | EE: 43% | GS: 4% | UI: 0% | State 0
GSdx D3D11 HW | 640x512 | None | Interlaced (frame) | Limiter: Turbo | Speed: 443% (221.31) | EE: 99% | GS: 16% | UI: 0% | State 0
E.g. after (normal limiter and turbo limiter) for the same values as above:
State 0 | Speed: 100% (50.01) | EE: 43% | GS: 4% | frame-i | GSdx D3D11 HW | 640x512 | None
State 0 | Speed (Turbo): 443% (221.31) | EE: 99% | GS: 16% | frame-i | GSdx D3D11 HW | 640x512 | None
Make sure we exit fullscreen only if the GS window is visible and in fullscreen.
While we don't currently have such cases, it's possible that the Sys_Suspend
command is called while it's already suspended (and the GS window is hidden)
but the code without this patch would have incorrectly made it visible again.
This tries to emulate LilyPad's "Safe fullscreen exit on escape" hack, and
hopefully also makes this LilyPad hack redundant, such that it would fix the
issue also with other input plugins.
The issue that fullscreen was not restored if the --noguiprompt confirmation
was aborted was already fixed implicitly via e4d8af0, therefore the comment
ended up incorrect. Also explain why it was broken when emulation was not
suspended before this commit, and how it could have been fixed.
When using --nogui and --noguiprompt and the user presses ESC, a prompt is
displayed asking the user to confirm exiting/closing PCSX2. This patch suspends
the emulation while this prompt is displayed.
Also updated the comment that if LilyPad has "safe fullscreen exit on ESC", then
full screen is not restored automatically if this prompt is canceled.
Specifying a minimum size for the filename text controls seems to mess
up the size calculations at higher DPIs and causes usability issues.
Use sizers and proportions instead.
Also scale the dialog widths with the DPI.
Retry and abort don't have default labels, so you end up with blank
buttons on both Windows and Linux. Fix it.
Retry is used by the portable mode settings dialog. I'm not sure if
abort is used anywhere.
A very slight refactor of commit 9eadf3 to also handle a future case where the
audio has a dialog but the GS doesn't (currently both conditions are false).
The dialog was already modal for the GS window, but the main window wasn't
blocked and pcsx2 could crash if, e.g. the user tried to close the main window
while the recording dialog was visible.
Fixes#879
CID 146870 (#1 of 1): Negative array index write (NEGATIVE_RETURNS)
5. negative_returns: Using variable xmmreg as an index to array ...
Open discussion: how to handle correctly bad register allocation?
Currently negative index is returned and a message printed. It means
we need to propagate the index check everywhere in order to not use it.
I suspect that Instruction Generation is more or less corrupted so
potentially we could just fire an exception.
There were bugs in the UI handling that allowed you to resume emulation
when the memory card dialog was opened, which could potentially cause
data loss/corruption.
Make the memory card dialog modal to prevent this. Although it's
possible to do with a modeless dialog, the solution will be much more
complicated and less future proof.
This also fixes the emulation resume bug after closing the memory card
dialog.
-This was actually a bug, may improve some games that were buggy in superVU, but these functions aren't often used.
-Coverity CID 146865 & 146864: In recVUMI_ESIN(VURegs *, int): Missing break statement between cases in switch statement (CWE-484)
-Coverity CID 146863 & 146862: In recVUMI_EEXP(VURegs *, int): Missing break statement between cases in switch statement (CWE-484)
-Coverity CID 146855 & 146854: In recVUMI_EATAN(VURegs *, int): Missing break statement between cases in switch statement (CWE-484)
-Left in so future checks can see what's going on.
-Coverity CID 146818: In ISOreadSector(unsigned char *, unsigned int, int): Code can never be reached because of a logical contradiction (CWE-561)
-Coverity CID 146868: In R5900::Dynarec::OpcodeImpl::recWritebackHILOMMX(int, int, int, int): Negative value used to index an array in a write operation (CWE-129)
-Coverity CID 146817: In R5900::Interpreter::OpcodeImpl::MMI::PMFHL(): Code can never be reached because of a logical contradiction (CWE-561)
-This code is used by both the Interpreter and Recompiler, however it was probably never checked because nothing much uses it. Out of 248 games, it was called 0 times.
-Coverity CID 146821: In _mVUflagPass(microVU &, unsigned int, unsigned int, unsigned int, std::vector<unsigned int, std::allocator<unsigned int>> &): Code can never be reached because of a logical contradiction (CWE-561)
-Coverity CID 146822: In mVUcompileSingleInstruction(microVU &, unsigned int, unsigned int, microFlagCycles &): Code can never be reached because of a logical contradiction (CWE-561)
CID 146904 (#1 of 1): Out-of-bounds write (OVERRUN)
10. overrun-local: Overrunning array VU->ialu of 8 16-byte elements at element index 8 (byte offset 128) using index i (which evaluates to 8).
CID 146903 (#1 of 1): Out-of-bounds write (OVERRUN)
10. overrun-local: Overrunning array VU->fmac of 8 32-byte elements at element index 8 (byte offset 256) using index i (which evaluates to 8).
Coverity:
CID 146846 (#1 of 1): Dereference after null check (FORWARD_NULL)
5. var_deref_model: Passing null pointer fp to fclose, which dereferences it
Without this patch, if a user initiates a recording and then cancels at the GSdx
dialog, the audio was recording anyway, which is probably highly unexpected.
However, while probably highly unexpected, it could still be useful to record
only audio, but with this patch it's now impossible.
We can reconsider if it turns out that people are actually using this "feature",
though one might as well set the video setting to be very unobtrusive (very low
resolution/bitrate) such that it uses very little CPU.
In order to flush data with some delay after save-to-memory-card, the code was
calling sioNextFrame() on each frames (60 times/s) continuously as long as the
emulation is active, regardless if FMC is in use or if memory cards in general
are in use.
Further to that, each call to sioNextFrame calls 8 times into the memory card
plugin even if FMC is not in use, resulting in overall ~500 calls/sec with the
sole goal of facilitating delayed flush after MCD save with folder memory cards.
This patch is a hack to call it once per second instead of 60 per second, but we
need to remove this call completely.
The delayed flush will now happen after 60-120 frames instead of exactly 60.
I'm not sure if it breaks the state of the folderMemoryCard (FMC) or not, but
at least it doesn't hang PCSX2.
Might need followup to make sure the state ends up valid.
When a custom PAL/NTSC frame rate is used, PCSX2 respects it for PAL and NTSC,
but disrespected it for NTSC-progressive mode (used hardcoded 30/60). Fixed.
Also, when a custom rate was used, the console message displayed half the rate
which was configured. Now print the actual rate.
The FPS has been Indicated in Paranthesis whereas Speed would provide the Integer percentage value based on the FPS limit for NTSC, PAL games. (59.94, 50)
Thanks to avih for the suggestions.
Out-of-bounds memory is no longer accessed if the realloc size is larger.
If reallocation fails, the old memory will not be freed and a memcpy
will not take place.
This should match the Windows _aligned_realloc behaviour, except that an
extra parameter is used.
Both fields are 10 bits but the ~ operation apply on the 32 bits.
Therefore msb bits were always '1' and the condition always false.
Code is only used on the interpreter but it could explain some hangs
CID 146917 (#1 of 1): Untrusted array index read (TAINTED_SCALAR)
tainted_data: Using tainted variable cdvd.Result[1] as an index into an array mg_zones
CID 146912 (#1 of 1): Sizeof not portable (SIZEOF_MISMATCH)
suspicious_sizeof: Passing argument recConstBuf of type u32 * and argument 131072U /* RECCONSTBUF_SIZE * sizeof (recConstBuf) */ to function memset is suspicious. In this case, sizeof (u32 *) is equal to sizeof (u32), but this is not a portable assumption.
CID 146728 (#1 of 1): Buffer not null terminated (BUFFER_SIZE_WARNING)
buffer_size_warning: Calling strncpy with a maximum size argument of 128 bytes on destination array mod.name of size 128 bytes might leave the destination string unterminated
There are a few odd things with Windows and the background logo.
1. The windows containing the logo is smaller than the logo.
2. The fitting algorithm doesn't work at 200% DPI.
Both make no sense, but can apparently be worked around.
This should reproduce the old non-DPI aware pre-wxWidgets 3.0 behaviour
for the main dialogs, except the font rendering should be better.
And add comments that I should have already added but didn't.
The wxImage Scale/Rescale methods with wxIMAGE_QUALITY_HIGH upsamples
and downsamples using the bicubic and box resampling methods
respectively, so let's just use that instead of the ResampleBox method,
which is undocumentated and probably shouldn't be used.
The Rescale function also modified the image when it was not supposed
to. Fix it, and rename it scale to avoid confusion with the wxWidgets
class.
Have listbook icons (Emulation Settings, Plugin BIOS selector) on the left for all platforms.
Don't set minimum widths for Framelimiter and Frameskip panels.
On Windows, this fixes the minimise/restore weird dialog bug on the
Emulation Settings and Plugin/BIOS selector dialogs. It also fixes a bug
at high DPI, where it becomes difficult to click on GUI elements at the
top of the dialog.
It also makes it easier for me to work on the Windows DPI stuff, I don't
have a 4k monitor.
This is the same problem that the Plugin Open and BIOS load exceptions
had - The message box pops up, intercepts the hide event for GSFrame and
leaves you with no alternative but to terminate PCSX2 via the Task
Manager.
The same solution applies - Close the GSFrame first.
Expand "Disable Framelimiting" and "Synchronised MTGS". Fixes message
truncation on Linux, and Windows at higher DPI.
Don't use pxFitDigits on Spin Controls - the sizing algorithm fails
horribly on GTK3, which means you can't see anything.
And don't use a row of spacers - it causes a minor display issue with
GTK3.
Fix Windows Lilypad local volume control GUI checkbox.
Make MicroVU E-bit delay slot warning a Dev warning.
Don't minimise GS Window if main window is minimised.
previously the GS window (rendering window) also gets minimized with the Main window (GUI) whenever it gets minimized. many users didn't like this behavior, hence make it so that GS window doesn't get minimized along with the main one.
The parent window pointer parameter is no longer needed, since the parent parameter at WX Frame has been replaced with Null which doesn't force minimize it due to no parent relationship.
The following E-bit delay slot warning initially used a console error message which has a sort of bright red which would cause users to provide a lot of attention towards to it, whereas it isn't much to be bothered since it doesn't cause any issues on the game according to refraction it was already dealt with on the code.
So, use a proper warning indicator instead of a error log message.
The PCSX2 log system isn't in place yet, so on Windows it's possible for
a language error message to pop up, which might cause alarm. Suppress
the error - it's harmless and it's done everywhere else for locales
(though perhaps the code should be reworked to avoid this).
No official game stores files there. You can easily check this by putting any file in the root dir and loading the PS2 BIOS, which will show it as corrupted data with an unknown filesize.
For the install version on Linux, PCSX2 now searches for cheats in $HOME
instead of /usr. For the install version on Windows, PCSX2 now searches
for cheats in Documents/PCSX2 instead of the cheats directory where
PCSX2 is installed.
Also make a few small consistency changes.