{"action":"created","issue":{"url":"https://api.github.com/repos/hrydgard/ppsspp/issues/8006","labels_url":"https://api.github.com/repos/hrydgard/ppsspp/issues/8006/labels{/name}","comments_url":"https://api.github.com/repos/hrydgard/ppsspp/issues/8006/comments","events_url":"https://api.github.com/repos/hrydgard/ppsspp/issues/8006/events","html_url":"https://github.com/hrydgard/ppsspp/pull/8006","id":108467527,"number":8006,"title":"Introduce \"Compatibility Flags\".","user":{"login":"hrydgard","id":130929,"avatar_url":"https://avatars.githubusercontent.com/u/130929?v=3","gravatar_id":"","url":"https://api.github.com/users/hrydgard","html_url":"https://github.com/hrydgard","followers_url":"https://api.github.com/users/hrydgard/followers","following_url":"https://api.github.com/users/hrydgard/following{/other_user}","gists_url":"https://api.github.com/users/hrydgard/gists{/gist_id}","starred_url":"https://api.github.com/users/hrydgard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hrydgard/subscriptions","organizations_url":"https://api.github.com/users/hrydgard/orgs","repos_url":"https://api.github.com/users/hrydgard/repos","events_url":"https://api.github.com/users/hrydgard/events{/privacy}","received_events_url":"https://api.github.com/users/hrydgard/received_events","type":"User","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"milestone":null,"comments":9,"created_at":"2015-09-26T14:04:39Z","updated_at":"2015-10-08T06:23:41Z","closed_at":"2015-09-27T08:45:12Z","pull_request":{"url":"https://api.github.com/repos/hrydgard/ppsspp/pulls/8006","html_url":"https://github.com/hrydgard/ppsspp/pull/8006","diff_url":"https://github.com/hrydgard/ppsspp/pull/8006.diff","patch_url":"https://github.com/hrydgard/ppsspp/pull/8006.patch"},"body":"Compatibility fixes are controlled by assets/compat.ini.\r\n\r\nAlternatively, if PSP/SYSTEM/compat.ini exists, it is merged on top, to enable editing the file on Android for tests.\r\n\r\nThis file is not meant to be user-editable, although is kept as a separate ini file instead of compiled into the code for debugging purposes.\r\n\r\nThe uses cases are strict:\r\n  * Enable fixes for things we can't reasonably emulate without completely ruining\r\n    performance for other games, such as the screen copies in Dangan Ronpa\r\n  * Disabling accuracy features like 16-bit depth rounding, when we can't seem to\r\n    implement them at all in a 100% compatible way\r\n  * Emergency game-specific compatibility fixes before releases, such as the GTA\r\n    music problem where every attempted fix has reduced compatibility with other games\r\n  * Enable \"unsafe\" performance optimizations that some games can tolerate and\r\n    others cannot. We do not currently have any of those.\r\n\r\nThis functionality should NOT be used for any of the following:\r\n  * Cheats\r\n  * Fun hacks, like enlarged heads or whatever\r\n  * Fixing general compatibility issues. First try to find a general solution. Try hard.\r\n\r\nWe already have the Action Replay-based cheat system for such use cases.\r\n\r\nShould help #8004, by disabling depth rounding in Fight Night round 3."},"comment":{"url":"https://api.github.com/repos/hrydgard/ppsspp/issues/comments/146431571","html_url":"https://github.com/hrydgard/ppsspp/pull/8006#issuecomment-146431571","issue_url":"https://api.github.com/repos/hrydgard/ppsspp/issues/8006","id":146431571,"user":{"login":"unknownbrackets","id":191233,"avatar_url":"https://avatars.githubusercontent.com/u/191233?v=3","gravatar_id":"","url":"https://api.github.com/users/unknownbrackets","html_url":"https://github.com/unknownbrackets","followers_url":"https://api.github.com/users/unknownbrackets/followers","following_url":"https://api.github.com/users/unknownbrackets/following{/other_user}","gists_url":"https://api.github.com/users/unknownbrackets/gists{/gist_id}","starred_url":"https://api.github.com/users/unknownbrackets/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/unknownbrackets/subscriptions","organizations_url":"https://api.github.com/users/unknownbrackets/orgs","repos_url":"https://api.github.com/users/unknownbrackets/repos","events_url":"https://api.github.com/users/unknownbrackets/events{/privacy}","received_events_url":"https://api.github.com/users/unknownbrackets/received_events","type":"User","site_admin":false},"created_at":"2015-10-08T06:23:41Z","updated_at":"2015-10-08T06:23:41Z","body":"Yeah that documentation is very outdated.  I think they added more handlers in later firmware versions, and also slightly changed the behavior... I think it was in 2.00?\r\n\r\nBasically PAUSE just tells the list to keep going until END, at which point it pauses.  The essential process can be seen here:\r\n\r\nhttps://github.com/hrydgard/pspautotests/blob/master/tests/gpu/signals/pause.cpp\r\nhttps://github.com/hrydgard/pspautotests/blob/master/tests/gpu/signals/pause.expected\r\n\r\nAs you can see:\r\n * Pause acts the same on old and new firmware versions.\r\n * Pause does not call the signal callback immediately.\r\n * Pause doesn't actually pause right away; it pauses at the **next** FINISH command.\r\n * The signal callback is called when it pauses.\r\n * sceGeContinue() resumes the list and lets it complete.\r\n * Popularly, the signal callback may sceGeContinue(), and this must work to continue the list immediately.  Many games that use PAUSE do this.\r\n\r\nI guess it might be possible to try adding an sceUpdateStallAddr call here:\r\nhttps://github.com/hrydgard/pspautotests/blob/master/tests/gpu/signals/pause.cpp#L61\r\n\r\nIf it unpauses it before Continue, then the previous behavior is correct.  I think this might be covered by a new test, but might be clearer to add to this one or create a pause2 or something.\r\n\r\nAnyway, at this point based on all my testing, my thinking of `sceUpdateStallAddr` is that it really just updates the stall address and doesn't do any other status monkeying.  Someone told me once that its code looked like it was handcoded asm in ofw, since it is very important to preformance in some games.\r\n\r\nMost likely, what's happening in Armored core is that something ELSE is failing to sceGeContinue, or is doing so too early, or isn't getting scheduled, or whatever... and so this hack makes it work.  From the perspective of correctness, it's just a little landmine reset switch that magically unpauses lists at unexpected but *sometimes* not that problematic times.\r\n\r\n-[Unknown]"}}